Compare commits

...

3613 Commits

Author SHA1 Message Date
48d9afea41 tag new version 2025-04-19 11:06:46 -04:00
da4ed503c8 add magicindicator license 2025-03-21 18:18:32 -04:00
78a0a2b5f4 bump test 2025-03-18 14:47:24 -04:00
42202cc4d2 Fix exploratory tunnel fragment crash 2025-03-18 14:22:46 -04:00
49f4562bf7 Revert "force it into landscape mode for now until I can fix tunnel display in portrait mode"
This reverts commit 96bb2cf161.
2025-03-18 14:08:13 -04:00
ca6031ab47 update changelog 2025-03-18 14:06:58 -04:00
6c83285e04 Increment version numbers 2025-03-15 14:28:22 -04:00
96bb2cf161 force it into landscape mode for now until I can fix tunnel display in portrait mode 2025-03-15 14:25:22 -04:00
ddb2482623 Fixes tunnel listing in landscape mode bot not in portrait mode 2025-03-14 18:28:53 -04:00
bf2dea5e0a Merge branch 'master' of i2pgit.org:i2p-hackers/i2p.android.base into i2p-android-2.8.0-androidx 2025-03-14 16:22:28 -04:00
2d784dbef2 fix crashes in landscape mode 2025-03-10 19:29:53 -04:00
554a65987b Fix the SAM lifecycle error. Migrate the other MagicIndicator components 2025-03-10 18:40:29 -04:00
846795dea6 Update the whole thing to use Androidx and MagicIndicator because it's marginally more comprehensible than trying to get ViewPageIndicator 2.4.4 to compile 2025-03-10 17:35:47 -04:00
7a22ce4bee Add new version of CustomViewPager.java 2025-03-05 21:48:23 -05:00
0e25d89bd8 Finish most migrating to androidx. Dependency issues remain 2025-03-05 21:46:18 -05:00
61010b2c93 migrating to androidx 2025-03-05 21:12:15 -05:00
zzz
5fac82a915 pull translations from tx 2024-11-26 12:33:56 -05:00
zzz
c8c36540eb Add complete Gan Chinese translation 2024-11-26 12:32:12 -05:00
59b1da6950 Fix version number and re-create tag 2024-10-16 18:51:39 -04:00
40894d8d04 Fix version number and re-create tag 2024-10-16 18:50:38 -04:00
d0f38397cd Fix version number and re-create tag 2024-10-16 18:48:59 -04:00
17b86fffdd Fix version number and re-create tag 2024-10-16 18:48:19 -04:00
a06b449bfb Fix permissions, Fix ForegroundService on Android>=34, remove all TitlePageIndicators. 2024-10-16 14:01:56 -04:00
128f1df0ac update gradle plugin version 2024-10-11 18:09:43 -04:00
ed085194e6 Update for GPlay compliance issues 2024-10-11 18:06:56 -04:00
52a4c2f430 Increment version code 2024-10-11 17:46:39 -04:00
784918d220 Update libraries and fix unit test 2024-10-11 17:44:07 -04:00
f129773255 Merge branch 'master' of i2pgit.org:i2p-hackers/i2p.android.base 2024-10-11 15:46:46 -04:00
b304771eca Update build.gradle and I2P dependencies, move es_rAR to es-rAR 2024-10-11 15:45:12 -04:00
f87e8d036b Release: bump I2P version, I2P for Android version, and Build Number 2024-07-18 15:31:05 -04:00
zzz
16c1277935 Add new translation: Argentinian Spanish 2024-07-14 10:25:40 -04:00
zzz
a6aa76f9dd Pull translations from tx 2024-06-10 17:55:27 -04:00
zzz
a0ced4133d Pull translations from tx 2024-05-16 09:23:37 -04:00
e024950567 Update pull translation instructions 2024-05-16 09:09:28 -04:00
ea68f116e1 Increment build 2024-05-15 20:04:41 -04:00
3cb746594c Fix url text 2024-05-05 10:23:46 -04:00
27adae63eb Update forum URLs 2024-05-05 10:11:45 -04:00
85890d3b68 update CI files 2024-04-29 20:49:41 -04:00
96b045eb2a update CI files 2024-04-29 20:45:05 -04:00
8d00c5fa31 fix sync CI file 2024-04-29 20:28:08 -04:00
fc93a71552 Use CI to sync with gitlab 2024-04-29 18:59:34 -04:00
18e4aef4ca I2P for Android 2.5.0 2024-04-08 23:31:40 -04:00
5315e35adc I2P for Android 2.5.0 2024-04-08 23:23:24 -04:00
9ad9bc07ff Fix keystore name to produce signed build 2024-04-06 23:18:15 -04:00
bde92be29d Fix keystore path to produce signed build 2024-04-06 23:13:25 -04:00
849150ffa6 list keystore location at final step of CI so I can fix properties file 2024-04-06 23:08:51 -04:00
52dad19c7a list keystore location at final step of CI so I can fix properties file 2024-04-06 23:03:52 -04:00
e84a51097d fix base64 decode syntax 2024-04-05 16:13:54 -04:00
5289f5068a fix base64 decode syntax 2024-04-05 16:10:02 -04:00
09c7d9cfd8 fix base64 decode syntax 2024-04-05 16:06:12 -04:00
14d293fe6f Move keystore directory to runner user 2024-04-05 16:01:37 -04:00
7cd08cfd4c Assure keystore directory exists 2024-04-05 15:58:05 -04:00
aa22d83a44 fix syntax error 2024-04-05 15:10:11 -04:00
a1fd8d41b2 fix syntax error 2024-04-05 15:09:13 -04:00
9d24e68b57 remove secrets from sign.yml 2024-04-05 15:02:42 -04:00
d5e2804ea4 fix secret access to sign.yml 2024-04-05 14:58:33 -04:00
1edabd7252 fix secret access to sign.yml 2024-04-05 14:56:42 -04:00
52c1901eba fix secret access to sign.yml 2024-04-05 14:55:41 -04:00
a6f5221975 add secret access to sign.yml 2024-04-05 14:52:41 -04:00
caa57bbc3a add secret access to sign.yml 2024-04-05 14:51:34 -04:00
b28e5d741e add secret access to sign.yml 2024-04-05 14:50:20 -04:00
0f3a61390c fix typo in sign.yml 2024-04-05 14:46:58 -04:00
30a1f1d800 Create signing keys for dev-build specific builds 2024-04-05 14:41:38 -04:00
22d5d126f6 Create signing keys for dev-build specific builds 2024-04-05 14:36:18 -04:00
70e4ea810f Attempt signed CI builds(will fail right now) 2024-04-03 15:38:53 -04:00
b5c6e1489a Attempt signed CI builds(will fail right now) 2024-04-03 15:37:35 -04:00
333a1a49b1 Attempt CI builds 2024-04-03 15:26:58 -04:00
2ea93f106e unzip only tagged apk 2024-03-25 15:05:28 -04:00
d99ed0e5da Reduce timeout for release uploader 2024-03-25 14:53:34 -04:00
3881966ddb see if I can get trunk builds to work 2024-03-25 14:46:55 -04:00
9de9f46489 when a release is tagged copy over artifacts 2024-03-25 14:30:17 -04:00
149881522e specify a tag for non-trunk CI builds 2024-03-25 14:25:52 -04:00
df26d89310 attempt a trunk build too 2024-03-25 14:18:37 -04:00
707dcbbc78 create local.properties for routerjars 2024-03-25 14:08:25 -04:00
812aea9873 clone i2p.i2p in CI 2024-03-25 14:04:49 -04:00
aeb7614b62 clone i2p.i2p in CI 2024-03-25 14:00:30 -04:00
9bf9d27c5a use Java 11 in CI 2024-03-25 13:58:07 -04:00
f2cfe4cee5 start a CI build of the Android APK 2024-03-25 13:55:38 -04:00
45865ff5b9 Increment version code and upload to GPlay 2023-12-19 13:45:24 -05:00
96f9905952 Update I2P library version to 2.4.0 2023-12-19 13:44:04 -05:00
idk
41ca3fe527 tx pull 2023-07-05 18:18:32 -04:00
idk
c5468e4829 migrate transifex configs 2023-07-05 18:17:16 -04:00
idk
174bb7f827 increment version code 2023-07-05 15:51:33 -04:00
idk
3d92f32c13 update I2P library 2023-07-05 13:54:21 -04:00
idk
2fae27a3b3 bump version code 2023-04-15 05:46:17 +00:00
idk
71d38c64e0 fix version 2023-04-15 02:37:48 +00:00
idk
ddb651a602 pull in new translations 2023-03-18 04:04:56 +00:00
idk
a8ad1d8d47 update changelog 2023-03-18 04:02:13 +00:00
idk
912602bfc0 bump versioncode 2023-03-18 04:01:16 +00:00
idk
24e3358ffa check in stats page translation fix, update for release 2023-03-18 01:29:12 +00:00
idk
fcc51c429d update version code again 2023-03-04 23:09:41 +00:00
idk
de0ee87db3 bump versionCode and I2P_ANDROID_VERSION 2023-03-04 23:05:24 +00:00
idk
2102d55315 update javadoc on long copypasta section 2023-02-10 00:21:36 +00:00
idk
2f900ebe2d blocklist entries first attempt 2023-02-10 00:20:48 +00:00
idk
5c03981a61 don't overwrite subscriptions.txt TODO look into possible permissions issues obscuring the behavior of cRTFIA 2023-01-31 22:34:12 +00:00
idk
c68f0ff23a Add broadcast intent change from @RyeMantis to changelog 2023-01-23 00:36:14 +00:00
idk
b01f44ae1f enable adding base32 destinations from the addressbook interface. Allow base32 addresses which contain ports to validate 2023-01-23 00:32:26 +00:00
idk
05aeb0cf37 Merge branch 'remote-start' into 'master'
Allow third-party apps to start I2P on Android via a Bradcast Intent

Closes #39

See merge request i2p-hackers/i2p.android.base!3
2023-01-22 23:28:43 +00:00
fd8d596064 Allow third-party apps to start I2P on Android via a Bradcast Intent 2023-01-22 23:28:43 +00:00
idk
ea3fe136e4 bump versionCode for gplay release 2023-01-11 16:38:32 +00:00
idk
47f4530f6f bump version for release, add jcenter repository to app/build.gradle to resolve missing packages 2023-01-11 16:00:52 +00:00
idk
016a7a47fd check in new translations 2023-01-07 19:54:33 +00:00
idk
f8410deeba -f pull just in case, at some point translation got out-of-sync on my end and needed refreshed, probably good to be sure at release time 2022-12-11 16:25:55 +00:00
idk
7268132ddd Add tag freeze note to RELEASE_PROCESS.md 2022-12-11 02:55:40 +00:00
idk
62545f1247 Target latest SDK version, which requires updating gradle plugin. Add TODO: for maven plugin which breaks on newer versions of gradle 2022-12-09 21:32:59 +00:00
zzz
99b6992b5c Build: Disable lint which fails with a class conflict.
As recommended by idk
2022-12-09 12:56:28 -05:00
zzz
e8ebb0a569 Pull translations from tx 2022-12-06 13:45:55 -05:00
idk
3ab2c83b7b bump release version and version code 2022-11-23 14:53:47 -05:00
idk
cb46abca82 Always compile with the TARGET_SDK_VERSION even if we're compatible with lower versions 2022-11-23 14:09:28 -05:00
idk
63b345e329 Add FLAG_IMMUTABLE recent Android versions, should fix #49 but still untested 2022-11-23 13:30:36 -05:00
idk
794b8433d8 update changelog 2022-11-22 22:12:59 -05:00
idk
a7891a3674 check in version 2.0.0 2022-11-22 11:53:02 -05:00
idk
7076785ec1 add instructions for Privacy Browser 2022-11-09 01:16:17 -05:00
idk
f8eda45409 promote privacybrowser back to supported, demote non-fennec firefoxes to unsupported 2022-11-09 00:53:52 -05:00
idk
8d0f1689c1 Merge branch 'android-build-updates' into 'master'
Android build updates

See merge request idk/i2p.android.base!1
2022-10-19 01:38:22 +00:00
idk
25ef37cddf Merge branch 'master' into 'android-build-updates'
# Conflicts:
#   gradle.properties
2022-10-19 01:38:08 +00:00
idk
c5936858a2 fix Android 12 builds 2022-10-18 21:33:43 -04:00
idk
17d2e2fc93 list all browsers in prep for VPN mode 2022-10-18 20:32:43 -04:00
idk
a0e41e5171 update the changelog 2022-09-08 11:51:50 -04:00
idk
2d1244f339 update versions for F-Droid main 2022-09-04 11:23:37 -04:00
idk
9eec1d3348 checkin android build updates 2022-08-30 11:07:40 -04:00
idk
5824fd4efa update the version code 2022-08-26 22:29:07 -04:00
idk
9c87bfcb51 After un-breaking the gradle build, bump the version to 1.9.0 2022-08-26 22:27:43 -04:00
idk
0c380f2ef5 Fix backward base32 validator condition 2022-08-21 12:10:37 -04:00
idk
dafe3d0002 make base32's greater than 64 chars in length validate 2022-08-08 14:23:20 -04:00
idk
255ac60691 update changelog and fix string 2022-08-08 14:08:59 -04:00
idk
23f681dd7d start retroactively fixing the changelog which I did not update for a while. 2022-07-18 12:47:46 -04:00
idk
d6a55a122a switch back I2P_VERSION 2022-06-26 18:41:02 -04:00
idk
454937d345 checkin release update 2022-06-25 10:16:47 -04:00
idk
ec8cf76fc4 reverse changes to settings_net.xml 2022-06-24 13:34:05 -04:00
idk
6788f9a663 make speed_values an integer array 2022-06-24 01:34:40 -04:00
idk
dc96c6251f remove less-good family keys workaround 2022-06-17 03:13:30 -04:00
idk
c2bced68bb fix missing cert issue 2022-06-16 15:59:40 -04:00
idk
e21b4e5cbd fix .gitignore 2022-05-28 02:13:42 -04:00
idk
1f434d8a05 re-do the AndroidSAMSecureSession so it doesn't require me to ask permission to draw over other apps. Permission to draw over other apps gives apps the power to take screenshots, so it's a special permission on Android. 2022-05-28 02:12:23 -04:00
idk
cd12d84d47 get rid of buggy new-version check which prevents merging of new hosts files. More refactoring of interactive SAM Auth interface. 2022-05-19 18:29:31 -04:00
idk
82b92caa55 only loop for 1 minute before returning false by default 2022-05-19 15:51:56 -04:00
idk
49e4fcc49c refactor SAMSecureSession implementation 2022-05-19 15:41:48 -04:00
idk
a9abe05325 check in new turkish strings 2022-05-19 13:29:24 -04:00
idk
ea6705374f Make the SAM approver do UI stuff on the main thread 2022-04-22 00:46:31 -04:00
idk
3e28f2bf93 A do even more early logging. Certs need to be kept up to date and should be updated regardless of whether it's a new version or not 2022-04-21 17:10:57 -04:00
idk
4c881525f9 Use localized strings for interactive SAM auth 2022-04-21 12:30:34 -04:00
idk
9280c80a53 Add SAM interstitial 2022-04-20 14:11:40 -04:00
idk
e465a6d232 Check in translations 2022-04-18 14:29:54 -04:00
idk
d7f79e7b0b do much more logging in the initialization process. Account for differences in application path when seen from aab vs apk viewpoint. 2022-03-02 17:22:55 -05:00
idk
68f44b8ec1 Bump for release and tag 2022-02-22 15:27:48 -05:00
idk
0835a42fbd Replace donate references with gitlab references 2022-01-07 15:52:02 -05:00
idk
78e649dc9b Bump GPlay version 2022-01-06 20:02:04 -05:00
idk
84e73a693c Bump 1.6.1 2022-01-06 19:32:45 -05:00
idk
c0ad7dfc09 Fix zip path traversal issue(we are likely unaffected since we do not unzip arbitrary zip files, just certificates_zip. Update certificates_zip. 2022-01-06 19:31:25 -05:00
idk
dec68432bc Check in translations. Fix dockerfile. Bump I2P_VERSION. Bump versionCode. 2021-11-30 19:57:51 -05:00
idk
f93fc155ef Merge branch 'Battery-Optimization-Fix' into 'master'
Battery optimization fix

See merge request i2p-hackers/i2p.android.base!2
2021-09-05 20:19:42 +00:00
e348af340a Battery optimization fix 2021-09-05 20:19:41 +00:00
idk
aa3631ed33 Merge branch 'start-on-boot-fix' into 'master'
Fixed start on boot

See merge request i2p-hackers/i2p.android.base!1
2021-09-02 16:04:07 +00:00
idk
f2088ad1e5 bump versions and tag 2021-08-30 09:58:27 -04:00
008e9b7961 Fixed start on boot 2021-08-27 04:22:06 -07:00
idk
90a46bcc3f make sure gitignore and dockerignore are checked in 2021-08-15 14:49:54 -04:00
idk
f69f748064 Checkin release 0.9.50 2021-05-19 09:32:41 -04:00
idk
640a2e1918 Add Docker release instructions, since it takes a bunch of the toolchain-management difficulty and automates it 2021-05-07 02:00:36 -04:00
idk
8aead91700 Add GPG to docker container builds 2021-05-06 17:06:16 -04:00
idk
b18a2e6241 Dockerize the build process to save time setting up releases in the future 2021-05-04 15:02:37 -04:00
idk
09c3e6e12c Remove docker instructions until I have time to write them better 2021-05-03 21:35:28 -04:00
idk
74bf0eade2 Merge branch 'master' of 127.0.0.1:i2p-hackers/i2p.android.base 2021-05-03 21:33:40 -04:00
idk
2fa6e7f3cb Enable Docker builds 2021-05-03 21:32:53 -04:00
idk
24b741be1e Enable Docker builds 2021-05-03 21:32:02 -04:00
zzz
ac8ce6f916 Update and remove old links in welcome_html 2021-05-02 11:50:14 -04:00
idk
cd7d0ad723 Android release 2021-02-28
-----BEGIN PGP SIGNATURE-----
 
 iQFMBAABCgA2FiEEcNIGBzi++AUjrK/311wDs5teFOEFAmAugowYHGhhbmtoaWxs
 MTk1ODBAZ21haWwuY29tAAoJENdcA7ObXhThwQsIAK0A284NXvJsJ7an3CCIf1Ws
 DEYmG1fibJA3BwgSYxgFUy5bgN3tEAEvwldo8PyRq6EBxe419/Ab9awoepx1wmN+
 NtfOOTuB0kHTRKUreZNuhwYUKddNrr7o10WJgHhyj6PPGIau/4XYvTVuQ70hOoI4
 Vw809u7bk5mM4cGCAnxnsgNus7khcwzbDeYZI5CbbEClk+QcKHTDkC1sMCo9vqTo
 bbS+zIoy9G+4k6LCaiC0QL6GeLcwns2vtRfDaXgImjoDGx9TL0nm/USBwsllkkmW
 +GZAvbck43yh8DixuERHN6NncuF0EI01etgvl4H8no31tQxVU+7UsZWTkz1uyKQ=
 =tJK3
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQFMBAABCgA2FiEEcNIGBzi++AUjrK/311wDs5teFOEFAmCFoG4YHGhhbmtoaWxs
 MTk1ODBAZ21haWwuY29tAAoJENdcA7ObXhThM08H/2+D0RCbP0/2QxYxFsf3NuZp
 UizMCnVqKCoomN1dChLs1kw00dJXAEAGtFZqzT8nbUHD8W98pljFc5j0qJ3BLQNU
 xrNHkE3KiwHU0ACZvrIPN9X1bj3uhNnziblPlpEBpMq/p3W8oKUWnLr9Zv8Gyetu
 Cpqjr/p4OaYpTUHLzp9NWltUpDDul0Mgy+lmhtUbYfNW4NtlVMAfOpNvBwFDcYGn
 FW4cP7t8nPzv4Cdzn5SD19KFCgGxHEFkWCF2uiJTiXOdi7LNsljKEgdMVNokO5Av
 zF97Cr+alLhg/GnxYeUB/Tgn4mTOBqzM4ir8EhIb+APWYowoWUossr68mgZ5aco=
 =BGmd
 -----END PGP SIGNATURE-----

Merge tag 'android-0.9.49'

Android release 2021-02-28
2021-04-25 13:01:31 -04:00
zzz
c5a0c3608d Drop .mtn-ignore 2021-04-25 07:11:49 -04:00
idk
3863c0e183 Increase version numbers for release 2021-02-18 10:05:20 -05:00
idk
69ea3d8bde remove trailing slash from gradle.properties 2021-02-10 17:25:32 -05:00
idk
7cafe6da48 add gitlab SSH and HTTP to i2ptunnel_config. Invalidate the view containing the I2P tunnel lists, in order to force them to redraw when a new tunnel is created. Closes #4 2021-02-04 12:41:03 -05:00
idk
9464b46ad0 Change the foreground service notification priorities from PRIORITY_MIN to PRIORITY_LOW. Don't check if we're restarting on Android versions greater than O since it uses the notificationChannel. Closes #5 2021-02-03 14:25:08 -05:00
idk
c230a5a101 Create the notification channel right before updating the statusbar notification. 2021-02-02 01:22:37 -05:00
idk
3d37f2ae07 use a toast for clipboard notification instead 2021-02-02 00:38:50 -05:00
idk
f88aafe292 fix the notification channel for the main status 2021-02-01 21:22:51 -05:00
idk
aa2dab1d3c Re-enable NTCP because it fixes the firewalled but inbound TCP not enabled issue 2021-01-29 16:45:07 -05:00
idk
8e85eaa2f0 SAM needs run() instead of start() to work correctly 2021-01-29 16:05:41 -05:00
zzz
6a1848caf6 Startup: Don't sleep in startup Jobs, requeue instead, to not clog the job queue 2021-01-27 09:09:52 -05:00
idk
aa36b4cb14 add facility to copy base32 URL of a tunnel by long-pressing the tunnel name 2021-01-18 11:58:48 -05:00
idk
78d4b12142 Remove nonsense comment at the end of the line which was covered up by the terminal 2021-01-11 10:46:15 -05:00
idk
c2f3a80dec Correctly fetch new SAM API preference when starting the SAM API job 2021-01-11 10:45:19 -05:00
idk
a679784aab Fix some build issues(Stemming from resources moving to wars) and add a SAM API option 2021-01-10 09:23:43 -05:00
idk
835667437b Fix some build issues(Stemming from resources moving to wars) and add a SAM API option 2021-01-10 09:20:45 -05:00
idk
f016edec7a add logo 2021-01-09 17:26:18 -05:00
1e3b517219 Bump target requirement to 29 for GPlay 2020-12-03 04:19:24 +00:00
f4e3b15fcf add new translation 'tk' 2020-12-02 22:51:06 +00:00
fc4154be67 Bump version for release 2020-12-02 22:48:07 +00:00
5bf0b18767 Add IceRaven configuration recommendation. 2020-11-11 05:28:17 +00:00
eb5ef3129b Add IceRaven configuration recommendation. 2020-11-11 05:26:05 +00:00
6e87d248c0 update changelog for 0.9.47-1 2020-10-30 12:39:27 +00:00
c9b0aff142 Add pushing mtn tags to the RELEASE-PROCESS.md so nobody confuses gitisms and mtnisms again 2020-10-30 02:44:26 +00:00
5acac0dbc4 increment version code 2020-10-29 19:38:28 +00:00
0b42a7ee64 add an example override.properties 2020-10-29 04:00:53 +00:00
c3a798ee3d add an example override.properties 2020-10-29 04:00:27 +00:00
e682369311 slightly better bootclasspath example in RELEASE-PROCESS.md 2020-10-28 21:40:28 +00:00
14b953f145 add classpath and Java Version requirements to RELEASE-PROCESS.md 2020-10-28 20:29:19 +00:00
036c807d6b Explicitly enable NTCP2 2020-10-28 02:00:52 +00:00
a41fca95df disable ntcp 2020-10-27 23:13:33 +00:00
26fdf40f25 merge of '5285d38e1dec9ca4af6fed9b10029de9c622a443'
and '890c3b02b48b2ff11946ccea164dad683aa2e8fd'
2020-10-27 20:29:03 +00:00
070af6529c Only ever pop the batter interstitial one time, no matter what, since we can't rely on the Android API to tell us the right thing 2020-10-27 20:28:41 +00:00
zzz
7ba0892351 Remove outproxy that's down 2020-10-26 17:30:52 +00:00
5b9cdb9f9f update release process again 2020-09-13 14:45:07 +00:00
zzz
b79d39a74a date format fixes 2020-09-03 15:07:09 +00:00
5fc5aed0c9 update the maven release instructions 2020-09-03 14:13:56 +00:00
aec25ab374 update build files for the release 2020-08-26 20:07:21 +00:00
zzz
9d5c495936 remove old subscription 2020-07-04 12:31:16 +00:00
4dc2bb6b01 check in new string for new foreground task 2020-06-29 23:28:18 +00:00
373e013911 fix foreground service notification issue on android 8.1 and greater 2020-06-29 20:12:32 +00:00
83bb7096a7 merge of '412007995e44aa866ff698a168742c4c330a62ef'
and '5bb8ab81cd3ab734f3c6b6d67d53eff28c5f5558'
2020-06-07 16:11:38 +00:00
cc1c4690a2 fix unchecked-in version code bump 2020-06-05 16:13:01 +00:00
69ad581235 update the changelog 2020-06-03 04:51:36 +00:00
4be227631d Bump version to 0.9.46 2020-06-03 00:20:01 +00:00
3f3f1f8e3d Catch the AndroidRuntimeException and warn if we can't change the power save permission 2020-06-02 22:40:58 +00:00
22290da1a4 merge of '01b01ebb27ab903f97975265856546c244185909'
and 'ac15ee2b1ce53342c8bfea5ccd3360220e615471'
2020-03-28 17:16:03 +00:00
7caf21d552 I2P Android 0.9.45 release commit 2020-03-08 04:51:08 +00:00
701860a525 Translations update in helper 2020-03-08 04:50:35 +00:00
7615aca89e Translations update 2020-03-08 04:50:07 +00:00
cae8ed2ae3 Remove arch x86 and mips due to google requirements 2020-03-08 04:49:49 +00:00
zzz
a523e1cb4a update default irc server list 2020-03-04 13:29:13 +00:00
5e048af9c1 Google said no. The 0.9.44 release would be based off this commit instead as it's has the current minimum target sdk. 2019-12-03 15:42:13 +00:00
77b6c4d30f Release commit for Android I2P 0.9.44 2019-12-03 15:33:29 +00:00
zzz
983a94e1c4 Update changelog after revert of:
Revision: 034402ca4ed4243122bd88857c7d306e295c9fbe
  Parent:   9f9a905cf75324471b3a8eb41da2feebf620207c
  Author:   meeh@mail.i2p
  Date:     10/27/2019 15:00:33
  Branch:   i2p.android.base
  Changelog:
  Merged two heads
2019-10-28 15:09:23 +00:00
zzz
1f79323d66 merge of '1d4693c3e133c94344da0418287d05613bfe34f5'
and 'cab71a0c3af65109945e3b7e4f927825e8e7deb4'
2019-10-28 15:05:50 +00:00
zzz
d86d3ad5ae disapproval of revision '034402ca4ed4243122bd88857c7d306e295c9fbe' 2019-10-28 15:05:37 +00:00
c41b064045 Android version 0.9.43 2019-10-27 15:01:28 +00:00
4c299ecda3 Merged two heads 2019-10-27 15:00:33 +00:00
761f427366 Translations update 2019-10-27 15:00:12 +00:00
f4c4bfe8be string improvements and remove redundancy in battery optimization fix 2019-10-12 17:49:06 +00:00
7f15a6f1e1 Inform the user of improved perfomance by excepting us from battery optimizations and prompt for permission to do so 2019-10-11 21:34:46 +00:00
zzz
5734760d58 Hide tunnel actions while TCG is starting 2019-10-11 17:12:33 +00:00
zzz
3244adfcd2 Rework fix for ticket #2629 to catch the null TCG sooner
javadocs
2019-10-11 16:52:43 +00:00
zzz
ce62b0fb97 Force logo to stopped if no router
Set logo for graceful shutdown
2019-10-11 16:25:43 +00:00
zzz
64673ee185 Change message for tunnel list when TCG not running yet 2019-10-11 16:20:06 +00:00
zzz
a36cabdcc8 Fix ISE in language dialog (ticket #2631) 2019-10-10 12:48:14 +00:00
1e8531c731 Fix for #2629, at least this is what we can do in the android end without adding new strings. 2019-10-09 20:19:24 +00:00
zzz
0935659d6d Save state to preferences in background thread (tickets #2595, #2632) 2019-10-08 15:45:34 +00:00
zzz
bef5f7e746 more README updates 2019-10-08 14:16:32 +00:00
zzz
d64e8359c1 Add dev build info to README 2019-10-08 14:11:20 +00:00
5fd77ea62d changelog reminder in RELEASE-PROCESS.md 2019-08-31 00:22:36 +00:00
8626ac2913 Changelog update 2019-08-31 00:21:05 +00:00
1258f18bc3 Android 0.9.42 2019-08-30 17:32:06 +00:00
8b677abd3c Hopefully a fix for #2598 2019-08-27 13:40:45 +00:00
f3d1e89002 Release commit for 0.9.41 2019-07-05 09:29:04 +00:00
zzz
f39c9a0fc4 changelog
one final
2019-06-30 16:00:48 +00:00
3186caa6bb use a timed task.get to avoid the issue in 2491 2019-06-30 15:43:35 +00:00
fc1259d8a8 fix gradle.properties 2019-06-21 14:22:01 +00:00
848d07331e fix the missing import 2019-06-21 03:28:33 +00:00
zzz
9794d26d0c Update client and helper lib min SDK to 14
Update helper support lib dependency version
2019-06-20 17:43:16 +00:00
76cd9c85ef merge of '668d7d7863ed98df6cac1ba0fe2d435570a36efb'
and 'adf749373c41853aa682a705dae3a5da0c52713b'
2019-06-20 16:30:22 +00:00
d4c7c480fb merge of '36107760d6d841ea86b860db02529fb4d089febc'
and '6f181c44ff5071894c19222047b2e90ad3ab4af5'
2019-06-20 16:24:54 +00:00
00aa80d104 fixed 2522, browsers may be installed while the application is running 2019-06-20 16:24:47 +00:00
zzz
20086685aa lint 2019-06-20 14:21:48 +00:00
zzz
86a8effd82 lint: This broadcast receiver declares an intent-filter for
a protected broadcast action string, which can only be sent by the system,
not third-party applications. However, the receiver's onReceive method
does not appear to call getAction to ensure that the received Intent's action string
matches the expected value, potentially making it possible
for another actor to send a spoofed intent with no action string
or a different action string and cause undesired behavior.
2019-06-20 14:13:10 +00:00
zzz
55d6e6d24e suppress lint 2019-06-20 13:52:37 +00:00
zzz
3b05046df3 Catch WindowManager$BadTokenException in WebViewClient (ticket #2390) 2019-06-20 13:03:37 +00:00
zzz
b8587cd0ab Don't store ContentResolver with a Context ref in AppCache static ref;
pass the Context to each call instead.
This may be the cause of some WebView leaks/crashes
2019-06-20 12:46:37 +00:00
zzz
61dd550040 lint: Remove NewsFetcher static ref;
Turn it into a ClientApp and register with the ClientAppManager
so NewsFragment can find it.
Let ClientAppManager start and stop it.
2019-06-19 15:06:38 +00:00
478ff63889 remove ! emphasis 2019-06-19 14:03:21 +00:00
e747619b85 merge of '0d35cf2746cae62a4bec33eaaf8f58302c3485aa'
and '327097d70c3dd5045a07be4e0367d91e3073a321'
2019-06-19 14:01:18 +00:00
zzz
f043bb3d72 lint: Bump espresso-core dependency from 2.2.2 to 3.0.2 2019-06-19 12:45:30 +00:00
zzz
98d8106f56 lint: Replace HashMap with SparseArray
finals
2019-06-19 12:37:01 +00:00
zzz
74eb0ce4f6 add lint notes 2019-06-18 19:37:12 +00:00
zzz
d79813d6d1 lint:
Consider using apply() instead; commit writes its data to persistent storage immediately,
whereas apply will handle it in the background

javadocs:
Unlike commit(), which writes its preferences out to persistent storage synchronously,
apply() commits its changes to the in-memory SharedPreferences immediately
but starts an asynchronous commit to disk and you won't be notified of any failures.
If another editor on this SharedPreferences does a regular commit() while a apply() is still outstanding,
the commit() will block until all async commits are completed as well as the commit itself.

As SharedPreferences instances are singletons within a process,
it's safe to replace any instance of commit() with apply() if you were already ignoring the return value.

You don't need to worry about Android component lifecycles and their interaction with apply() writing to disk.
The framework makes sure in-flight disk writes from apply() complete before switching states.
2019-06-18 19:25:44 +00:00
zzz
8f60c6ce9e lint: Specify locale in case conversion 2019-06-18 19:12:32 +00:00
zzz
7e0d017858 lint:
Must be one or more of: Service.START_FLAG_REDELIVERY, Service.START_FLAG_RETRY
2019-06-18 19:05:12 +00:00
zzz
8470435ee2 lint:
The WIFI_SERVICE must be looked up on the Application context or memory will leak on devices < Android N.
Try changing context to context.getApplicationContext()
2019-06-18 18:54:25 +00:00
5023d69222 This solves #2552 hopefully. 2019-06-18 18:09:03 +00:00
34c7464f5b fix inconsistency 2019-06-18 01:44:54 +00:00
2da6fe9c62 experimental browser documentation 2019-06-18 01:08:03 +00:00
1927c9e5a3 extend instructions for Firefox 2019-06-17 21:50:07 +00:00
1ace085d13 updating browser documentation 2019-06-17 20:09:31 +00:00
zzz
95e6c1f7a6 New 64 bit libjbigi (ticket #2503), update 32 bit jbigi
With GMP 6.1.2 and Android NDK r19c
From i2p.i2p/core/c/jbigi:
TARGET=android BITS=64 mbuild_all.sh
TARGET=android BITS=32 mbuild_all.sh
Both tested on phones.
Note lib/client/src/main/jniLibs/build.sh is broken
2019-06-05 18:37:19 +00:00
zzz
03bdd575a7 New translations: Add cs, da, el
Add missing translations to menu: ar, fi, gl, hu, zh_TW
2019-06-02 12:23:10 +00:00
zzz
98c5313d75 Add spacer between addresses in RI output 2019-06-02 11:41:45 +00:00
zzz
c047bdf085 Use new 0.9.41 TCG.getInstance() method for Android
so instance with stale context is not returned.
2019-06-02 11:10:04 +00:00
zzz
e113ef0002 build: Add streaming dependencies
(fixed streaming not found at runtime)
2019-06-01 18:40:26 +00:00
zzz
3e9b47307d i2ptunnel: Drop welterde IRC tunnel 2019-06-01 17:57:48 +00:00
zzz
2d864ad8b1 Don't start Addressbook and NewsFetcher until i2ptunnel starts
Changelog updates
2019-06-01 15:00:14 +00:00
zzz
5b7f9bd452 If router stops before ready, stop RunI2PTunnel job 2019-06-01 14:04:00 +00:00
zzz
3c89749f94 Set disableInterface property string like the others 2019-06-01 12:07:06 +00:00
zzz
edbd5fd7ea Don't zero-pad slider value 2019-06-01 12:05:45 +00:00
zzz
faf8bf74af add some padding to the tables 2019-06-01 00:25:38 +00:00
zzz
851e774e7a Update home page floating menu visibility when clicked, not just when page is loaded
Put our router info at the top of the list
Release process additions
2019-06-01 00:07:23 +00:00
zzz
dcea801116 UPnP: Add multicast permissions, use callback for MulticastLock (ticket #2499) 2019-05-31 21:51:12 +00:00
zzz
cb5235e6da add new outproxy 2019-05-31 21:26:32 +00:00
zzz
5c7eaf2484 remove BOB 2019-05-31 21:16:15 +00:00
764cfc91ec Instructions for development builds 2019-05-29 18:11:51 +00:00
177a2c6dc1 Required changes to gradle for development builds. 2019-05-29 17:37:48 +00:00
4dccd1dbae Clarify that the client library should always be released 2019-05-16 08:18:32 +00:00
50141eb24b release docs update 2019-05-13 20:03:34 +00:00
4dab632bc8 Release process docs update 2019-05-13 14:21:12 +00:00
350515041a I2P Android release commit for 0.9.40 2019-05-10 22:26:04 +00:00
5ba294c2c2 Updated the release docs with a lot more information. 2019-05-10 22:23:57 +00:00
a215363206 merge of '252f48089a9d496c609cf1b886d8d56c65836851'
and '2c8389bae9c93fb46e31edc66f1c292a95bf87eb'
2019-05-10 22:16:39 +00:00
4bd647c67c Translation updates. 2019-05-10 22:16:29 +00:00
zzz
b951892c05 Util: Check for NTCP2 in getNetStatus() 2019-05-02 14:29:59 +00:00
zzz
16e05e0dd8 Fix NPE in ViewPager (ticket #2488)
See code comments for references
2019-05-01 17:34:45 +00:00
5bdf119b81 merge of '67e6f911bbdcd72a5910ab653cf40eca13f08659'
and 'f846922ebab446b76ccee6c4d10f873af2d3d4ac'
2019-05-01 13:00:34 +00:00
b73b72c9c8 Fix for trac ticket #2485. 2019-05-01 12:59:56 +00:00
zzz
0bae211da5 Fix addressbook crash (ticket #2489) 2019-04-30 21:14:52 +00:00
zzz
709392e8b6 UI: Classify NTCP2 as NTCP
Don't crash on unknown transport configuration (ticket #2482)
2019-04-30 14:25:29 +00:00
zzz
80ed1e71da i2ptunnel: Possible NPE fix (ticket #2483) 2019-04-29 16:33:32 +00:00
6c0a60892f Fix for trac issue #2481. 2019-04-29 16:18:43 +00:00
zzz
7f13aa26fb i2ptunnel: more finals 2019-04-29 13:34:11 +00:00
zzz
7167a11844 i2ptunnel: finals 2019-04-29 13:28:18 +00:00
zzz
1f140bf95a Settings: Fix saving I2CP config (hopefully) 2019-04-29 12:47:21 +00:00
zzz
940b2b83a1 New translations: ar, gl, hu 2019-04-24 14:10:53 +00:00
zzz
bdbebe11c4 reduce min translate percentage 2019-04-24 14:07:07 +00:00
zzz
51ca137102 Update news URLs 2019-04-23 18:34:52 +00:00
f0ff4eeab7 Temporary fix for Javadoc errors 2019-04-22 07:35:37 +00:00
zzz
93d103e5ad Re-enable the advanced config for i2cp.disable,
so third-party apps can connect via the standard socket.
Domain sockets don't work on recent androids for 3rd party apps.
Bote can continue to use the domain socket if it's signed by the same key
and has the same ID.
2019-04-12 17:05:25 +00:00
b87d77d5e3 Android release commit 0.9.39
* translation updates.
* changed IPC uid to match bote.
2019-03-23 12:18:13 +00:00
ffbd8cfb76 I2P Android 0.9.38 Release commit. 2019-01-27 14:23:08 +00:00
2d1664574d "Fix" for ticket #2404 2019-01-24 18:33:26 +00:00
5d3aa1f625 Strings update 2019-01-24 18:21:20 +00:00
3fa53c7654 Expanded code to hunt NPE - ticket #2389 2019-01-24 18:21:01 +00:00
84ecf55ff8 Play store required a new android number even the first wasn't published. 2018-10-10 18:07:28 +00:00
72ad40ecfc Hotfix update cause of play console warnings.
Short: We had to upgrade to sdk 26 to ensure the app can run on all devices.
2018-10-10 17:56:38 +00:00
2f48898235 Release commit for I2P Android 0.9.37 2018-10-10 17:00:45 +00:00
39758c8cf4 Disable the SSL option for now. See trac issue #2296 2018-10-10 16:09:19 +00:00
ecc5509007 Gradle wrapper update 2018-10-10 16:07:28 +00:00
0e75b3e957 Android studio gave me some warnings against using ellipsize and maxLines together and suggested singleLine. 2018-10-10 16:06:39 +00:00
7b4c80216d Translations update. 2018-10-10 16:03:39 +00:00
70bbc18054 merge of 'bc6eaecbdac3f21b425ed335e348b1c505094d70'
and 'cd8c7bf753e03b16fd44f0516d6fd4fbd649fc5f'
2018-08-27 16:14:56 +00:00
09fcef23a4 Updates for the new i2p android 0.9.36 release. 2018-08-26 15:45:25 +00:00
zzz
333f09073a minor updates from tx 2018-07-04 13:58:17 +00:00
58cb33aa77 Updates for the new i2p android 0.9.35 release. 2018-07-03 21:42:09 +00:00
9654fa24cc Pushing 0.9.34 changes. This is the release commit. 2018-04-25 14:34:08 +00:00
7843b37a7e Release process document 2018-02-18 21:17:41 +00:00
1db9128afc 0.9.33 2018-02-17 14:57:43 +00:00
c03d3a8b92 Updated translations 2018-02-17 14:07:52 +00:00
80b7455602 Add release date to CHANGELOG 2017-11-28 10:03:51 +00:00
1fcf5aa49b 0.9.32, helper 0.9.5 2017-11-28 09:44:50 +00:00
640803418d Bump to I2P 0.9.32 2017-11-28 09:42:39 +00:00
56fa0b0302 Rename _() for translation to _t() for Java 9 compatibility 2017-11-26 13:25:58 +00:00
9c10eef0e3 Attempt to fix WindowManager$BadTokenException crash
Use the parent fragment's Context, which should be more reliable than the one
from the WebView.
2017-11-26 13:17:00 +00:00
9fd5e43115 NPE fix 2017-11-25 23:58:38 +00:00
d5bd9b8eaa Unused import 2017-11-25 23:42:01 +00:00
5b1203a1c6 IAE fix 2017-11-25 23:39:58 +00:00
fbe79eee2e Replace PNG icons with SVG
This doesn't shrink the APK size (yet), as we still generate the PNGs for older
API levels.
2017-11-25 23:31:32 +00:00
ffa21fc1e0 Drop unused icons 2017-11-25 22:39:59 +00:00
5faf1f5bb0 Add a "sync" icon to more clearly indicate tunnel "starting" status 2017-11-25 22:33:10 +00:00
e15efb6537 ActivityNotFoundException fix 2017-11-25 22:06:47 +00:00
cd1702d53c Update classname in logger.config 2017-11-25 21:06:38 +00:00
5a6ca8a0a4 Add note about possible ANR to watch for 2017-11-25 19:58:35 +00:00
82d184cf90 Fix ANR when restarting all tunnels 2017-11-25 19:43:14 +00:00
5162bb604b Delay loading of tunnels and addressbook until router is running
This should help avoid a race condition where the RouterContext is available
before the Router is fully-initialised (see ticket #2092).
2017-11-25 19:22:49 +00:00
3aff2a7a9d SecurityException fix 2017-11-25 17:01:55 +00:00
cae565761d IAE fix 2017-11-25 16:00:46 +00:00
c2b6cee9a2 ActivityNotFoundException fix 2017-11-25 15:44:47 +00:00
84e7b1f41c Update Firefox browser config instructions for Firefox Quantum 2017-11-25 15:37:48 +00:00
7ebed1e6d2 NetworkOnMainThreadException fixes 2017-11-25 14:27:10 +00:00
2e68122b8d Updated translations 2017-11-25 14:18:52 +00:00
899a3f4cfc ISE fix 2017-11-24 17:33:38 +00:00
52d49a4ab6 NPE fix 2017-11-24 17:07:49 +00:00
75f705125f ISE fix 2017-11-24 17:00:11 +00:00
722ddf8a47 NPE fix
The advanced menu options used to be in a sub-toolbar, so onPrepareOptionsMenu
was called to set their visibility. When we moved to a FAM, we didn't remove
this call, and in some newer Android versions this results in a race condition.
2017-11-24 16:21:56 +00:00
524d21631e ISE fix
Switch to using Router directly, which means we don't have a potential race
condition looking up the RouterContext.
2017-11-24 16:08:56 +00:00
86e6060217 NPE fix 2017-11-24 15:54:24 +00:00
b5c7fad876 ISE fix 2017-11-24 15:50:49 +00:00
5f3ca0fe69 NPE fix 2017-11-24 15:34:10 +00:00
ddd9bea786 Upgrade test dependencies 2017-11-24 15:13:41 +00:00
6aac99e7ea Upgrade to Gradle 4.1 and Android Gradle Tools 3.0.1
Required dropping gradle-witness because it does not support modern Gradle.
2017-11-24 14:35:07 +00:00
da763a7c81 0.9.31 2017-08-19 22:22:56 +00:00
6cb46c3168 Helper library 0.9.4 2017-08-19 22:01:34 +00:00
610e963d22 Update translations 2017-08-19 21:54:46 +00:00
96b8ed43e0 Fix NFEs 2017-08-19 00:07:22 +00:00
812c28cd33 Fix tunnel details IOOBE, expose errors to user 2017-08-18 23:20:42 +00:00
3f7312653a Update translations 2017-08-18 23:10:45 +00:00
c89d3992c7 Add Firefox Focus to unsupported browsers list 2017-08-18 23:08:48 +00:00
d9394685c9 Show tunnel status on details page, use it for transition in place of text 2017-08-18 23:04:46 +00:00
b140158b24 Fix tunnel details IAE, expose errors to user 2017-08-18 21:30:53 +00:00
4f5b0bd21a Correct Ed25519 name 2017-08-18 21:14:00 +00:00
1d17d89ccb Change default tunnel SigType to Ed25519 2017-08-18 21:13:05 +00:00
b6074da7c4 NPE fix 2017-08-18 20:41:22 +00:00
c0fdb4aff7 Validate numbers in tunnel wizard
This shouldn't be necessary, because the TextView is constrained to only accept
numbers, but someone on Google Play ran into a NumberFormatException, so...
2017-08-18 20:28:53 +00:00
e00c9cc449 Try to fix obscure NPE where none should occur 2017-08-18 19:34:55 +00:00
423ca46672 Target SDK 25
Initial testing doesn't show any permissions problems, and enabling this will
help uncover user issues.
2017-08-18 19:18:45 +00:00
66ed9d94a7 Update Firefox browser config instructions
Closes #1977.
2017-08-18 18:03:04 +00:00
a68ef9d372 Update translations 2017-08-18 16:10:26 +00:00
cb389123c5 Hide peers FAM item
From 0.9.31 the backend used to render the HTML table has been moved. We either
need to create a dedicated Android UI for this at some point, or remove it.
2017-08-18 15:39:09 +00:00
62cca0ed50 Bump I2P dependencies to 0.9.31 2017-08-18 15:36:07 +00:00
c99e3c0b41 0.9.30 2017-05-20 14:35:50 +00:00
302c51ccfa Handle IAE 2017-05-20 10:59:12 +00:00
1e34bc2159 Ensure debug build is debuggable 2017-05-20 10:39:14 +00:00
24f6f4789d Fetch WebView Context on UI thread 2017-05-20 10:31:33 +00:00
2de11a4067 Update translations 2017-05-20 09:32:23 +00:00
d83a2f9919 Updated translations 2017-05-15 12:09:43 +00:00
bf36b4c2e6 Replace anonymous DialogFragment subclasses with full subclasses
Closes #1916, #1917, #1923.
2017-05-15 12:05:10 +00:00
daa0b739a3 Use NamingService.requestUpdate()
Closes #1972.
2017-05-15 01:07:41 +00:00
5e1b0d9b50 Upgrade Android build tools, Android and I2P dependencies 2017-05-14 23:58:44 +00:00
917742847a 0.9.29 2017-03-27 03:31:16 +00:00
9460e3202f Helper library 0.9.3 2017-03-27 01:36:52 +00:00
5f388a7c6b Updated translations 2017-03-27 01:22:51 +00:00
39d5de7eb4 Upgrade I2P dependencies to 0.9.29 2017-03-27 01:20:24 +00:00
0fb1ef881c Upgrade Android dependencies 2017-03-27 00:40:05 +00:00
8230769191 Upgrade Android support libraries to 25.3.0 2017-03-26 09:22:22 +00:00
19036a71cb 0.9.28 2017-01-02 12:33:56 +00:00
40f3fbf9c5 Add -dontobfuscate to ProGuard rules 2017-01-02 12:08:30 +00:00
1127fb0195 Helper library 0.9.2 2017-01-02 12:06:26 +00:00
df81efe6bc Fix height of address book list entries 2017-01-02 10:57:40 +00:00
784ca3691b Collate TODO items 2017-01-02 10:07:26 +00:00
0fa4241ce6 New translations 2017-01-02 09:44:58 +00:00
5063d276de Updated translations 2017-01-02 09:44:39 +00:00
81d0e43f0f Upgrade Android Gradle tools to 2.2.3 2017-01-02 09:42:40 +00:00
1637a9007d Upgrade Android support libraries to 25.0.1 2017-01-02 09:41:58 +00:00
ce0f01cf46 Update I2P dependencies to 0.9.28 2017-01-02 09:35:15 +00:00
dd579d4f5b 0.9.27 2016-11-20 07:12:16 +00:00
5703d8cc6d Updated translations 2016-11-20 06:06:09 +00:00
b8768ae9fe Helper library 0.9.1 2016-11-20 05:50:53 +00:00
54dc2c88bf Make it easier to test helper library against debug I2P Android builds 2016-11-20 05:50:35 +00:00
dba01b8c18 Remove debugging lines 2016-11-20 00:18:34 +00:00
b7b3eb7019 Refactor libraries:
- Remove client library dependency on helper library
- Separate client and helper library versions             
- Bump client library version to track I2P library version
2016-11-20 00:00:03 +00:00
430e2ab826 Remove kytv's IRC server from default tunnel list 2016-11-12 19:27:39 +00:00
87383a2ec8 Upgrade Espresso to 2.2.2, update tests 2016-11-12 19:19:38 +00:00
f63bfe1dea Bump build tools to 25.0.0 2016-11-08 06:45:08 +00:00
ff2021c0aa Upgrade Android support libraries to 25.0.0 2016-11-08 06:20:05 +00:00
51f7e07080 Remove unnecessary dependency from client library 2016-11-08 06:02:07 +00:00
7797e067a5 Upgrade I2P dependencies to 0.9.27
The router JAR is now fetched instead of built locally
2016-11-08 05:52:40 +00:00
cf09a21f1e Upgrade Android Gradle plugin 2016-11-08 05:51:40 +00:00
914294927d Updated CHANGELOG 2016-06-13 13:12:50 +00:00
bd0455c413 0.9.26 2016-06-13 13:12:28 +00:00
97f3d937ee Client library 0.9 2016-06-13 12:26:32 +00:00
ff102bfe73 Update dependencies 2016-06-13 12:12:37 +00:00
e31a350398 Enable use of debug builds of I2P with release versions of helper library 2016-06-13 12:03:59 +00:00
43a8f29794 New translations 2016-06-13 11:59:59 +00:00
bbca783b20 Updated translations 2016-06-13 11:59:14 +00:00
6d4fe52f8e Fixed crash when adding tunnel to empty list 2016-06-13 09:57:58 +00:00
ecb08a54fb Upgrade Android support libraries 2016-06-13 09:56:41 +00:00
7bd4524fd8 Update README 2016-06-13 08:41:08 +00:00
40f08d56f6 Use uploaded I2P client libraries instead of locally-built 2016-06-13 08:38:43 +00:00
fe61e35146 Undo accidental checkin 2016-05-29 11:50:34 +00:00
be3f74d71f Fixed "I2CP already listening" bug 2016-05-29 05:09:51 +00:00
8dcfa816e3 Migrate to dynamically-loaded Android-specific classes
Requires i2p.i2p revision fc46f2d84625265a3899b5ad50af5e91d396ba01 or upcoming
release 0.9.26
2016-05-28 23:52:37 +00:00
ae05e22670 Fix legacy package name in helper lib 2016-05-28 23:50:46 +00:00
79a4fa0407 Upgrade Android Gradle plugin 2016-05-28 23:49:50 +00:00
bb958b969a Updated CHANGELOG 2016-04-17 14:05:34 +00:00
02030454d1 0.9.25 2016-04-17 14:00:47 +00:00
e396b0b614 Client library 0.8
i2p.i2p tag: i2p-0.9.25
2016-04-17 13:08:33 +00:00
91cac6b743 Updated CHANGELOG 2016-04-17 12:53:16 +00:00
2a6015d890 Update README 2016-04-17 12:50:47 +00:00
049b094627 Updated translations 2016-04-17 12:41:59 +00:00
077d062e19 Update ignores 2016-04-17 12:39:33 +00:00
4ad483db71 Set colour of news notification to match persistent one 2016-04-17 12:29:47 +00:00
3edb8ad0c2 Fix client lib build system 2016-04-17 12:27:52 +00:00
769f41afe6 Update Gradle wrapper to 2.12 2016-03-28 10:30:49 +00:00
5a9d943a6c Upgrade support libs in client and helper libs, partially fix ProGuard issue
A release build can now be made (ProGuard no longer complains about duplicate
JARs), but the first build attempt after a clean fails because the I2P JARs
needed by the client library aren't on the javac classpath.
2016-03-28 10:27:16 +00:00
44fb246288 Upgrade support libraries to 23.2.1 2016-03-28 03:06:46 +00:00
3cc7498e66 Upgrade Androidplot, sort remote dependencies 2016-03-28 02:33:27 +00:00
84ce883285 Missing witness hash from previous commit 2016-03-28 02:17:43 +00:00
f8dd9df285 Migrate to support library PreferenceFragmentCompat 2016-03-28 02:15:32 +00:00
860cf6a658 Update Samsung 4.2 workaround for support lib 23.1.1 2016-03-09 20:39:15 +00:00
a24a50ce44 Missing files 2016-03-05 15:34:47 +00:00
fc9187297b Update CHANGELOG 2016-03-05 00:34:00 +00:00
eb26df874d NPE fix 2016-03-05 00:33:08 +00:00
27cbb1e57b Cut off speed at KBps 2016-03-05 00:10:16 +00:00
66aa79f90f Missing from previous commit 2016-03-04 23:44:31 +00:00
8b9a70b386 Fix localisation path 2016-03-04 23:35:17 +00:00
872a2d15e2 Update translations 2016-03-04 23:27:12 +00:00
7085567a08 Try to fix ClassNotFoundException 2016-03-04 23:15:58 +00:00
19b07a8a8c Add UI for copying server tunnel B32 2016-03-04 04:49:34 +00:00
0ed78a4806 Extract UI helper and AIDL interfaces to a helper library
For apps that only want to use e.g. HTTP proxy tunnel, this will decrease the
size of their APK by over 1.3 MB.
2015-11-23 03:44:22 +00:00
ca8fb4663f Missing from previous commit 2015-11-23 03:14:33 +00:00
ec34ce481e Moved client library into subdir 2015-11-23 03:04:43 +00:00
b0c4089e26 NPE fix 2015-11-22 04:52:13 +00:00
b23148c71d Updated translations 2015-11-22 04:37:39 +00:00
c9a336a0a5 Updated dependencies 2015-11-22 04:34:43 +00:00
0744426c15 Workaround for Samsung Android 4.2 bug 2015-11-22 03:39:54 +00:00
e6f4bd5531 Updated CHANGELOG 2015-10-10 22:16:07 +00:00
ab6f4799c9 0.9.22 2015-10-10 22:10:41 +00:00
f4beecead3 Added new client library translations 2015-10-10 11:43:12 +00:00
17e6d56bb7 Add false.i2p as SSL outproxy to default httpclient tunnel 2015-10-10 11:25:16 +00:00
29881b73f9 Fixed elevation of tabs 2015-10-10 11:16:50 +00:00
8c30582b9a Updated dependencies 2015-10-10 11:07:48 +00:00
06de8abb44 Re-add fixed translations for big text notification 2015-10-10 08:43:55 +00:00
a65ee65606 Updated translations 2015-10-09 22:56:07 +00:00
a6f49168b7 Add color to notification icon 2015-10-09 11:06:40 +00:00
1d1e6121fa Show addressbook tab when selecting address 2015-10-09 02:42:49 +00:00
30b86499cd Fix tab changing on rotate 2015-10-09 01:38:10 +00:00
bb8daa81d2 Translation bugfix 2015-10-09 00:12:13 +00:00
763ce08902 Updated CHANGELOG 2015-10-08 23:43:39 +00:00
a4e1055d86 Fixed bandwidth units in notification 2015-10-08 23:43:29 +00:00
ed89afd1bd Updated translations 2015-10-08 23:38:26 +00:00
13e26b4a1c Fix Activity transitions on Lollipop 2015-10-08 23:04:26 +00:00
3be56767a1 Move Lightning to recommended, Orweb to supported 2015-10-04 05:36:45 +00:00
d184019a8e Fix CalledFromWrongThreadException 2015-06-21 00:42:58 +00:00
6df542a162 Only linkify "irc://" in first start dialog if user can open them 2015-06-20 22:36:44 +00:00
96ca1d1a37 Updated CHANGELOG 2015-06-18 05:27:54 +00:00
6b585822f1 0.9.20
i2p.i2p revision: 747e9d409223a108623b0b38d084097335d6c195
2015-06-18 05:26:44 +00:00
c81c57daa0 Updated translations 2015-06-16 11:39:36 +00:00
f28be9cb02 Updated CHANGELOG 2015-06-16 11:35:28 +00:00
6582f67ed5 Fix tunnel backup quantity fetching in advanced tunnel prefs 2015-06-16 11:35:10 +00:00
d138c482d9 Change to bar plot, update range step when plot updates 2015-06-16 09:12:28 +00:00
fc2d962cad Hide stats in final shutdown 2015-06-16 07:32:48 +00:00
c541ae0347 Remove HTML entities from clock skew error, code style 2015-06-15 11:32:19 +00:00
d6e79ed0a7 Improved graph axes 2015-06-15 11:30:54 +00:00
7ec20fe60c Updated TODO 2015-06-15 11:30:13 +00:00
f3464c5095 SU3 news 2015-06-06 10:36:12 +00:00
32512fecbc Code style 2015-06-06 07:36:16 +00:00
1d7fcd47ef Filter proxy error page resources to remove routerconsole links 2015-06-06 03:56:44 +00:00
f156c591ad Disable countries table in netDB page (because no GeoIP data) 2015-06-06 00:07:18 +00:00
fb6ca0d61e Fixed NPE (linked to previous commit) 2015-06-05 23:50:33 +00:00
a4662984a7 Added missing setContentView() 2015-06-05 23:38:49 +00:00
6cccf1fb23 Don't change lights for graceful shutdown 2015-06-05 23:13:09 +00:00
39f32acd5b Update release notes 2015-06-04 10:45:21 +00:00
3d60d10f8e Make tunnel length default 2 in tunnel prefs, to match default i2ptunnel.config 2015-06-04 10:43:23 +00:00
8cbc11dff0 Updated translations 2015-06-03 00:03:14 +00:00
858f007e21 Client library 0.7
i2p.i2p tag: i2p-0.9.20
2015-06-02 23:53:02 +00:00
02f830e472 Upgraded support libraries 2015-06-02 23:40:26 +00:00
d32ef0bb9b Unregister onLocaleChanged broadcast listener 2015-05-29 11:02:21 +00:00
6ae103373e Helper method to check if tunnels are active 2015-05-27 10:41:33 +00:00
b2a82b9809 Use state to define isStarted() 2015-05-26 03:20:40 +00:00
73b6898d76 Bugfix: hard-code IRouterState action string so it always matches the manifest 2015-05-26 03:19:11 +00:00
be9336228c New helper bind method with callback to notify caller as soon as helper is bound 2015-05-26 03:18:43 +00:00
62546a779a Updated ignores 2015-05-24 07:20:33 +00:00
b4afc3b4b2 Initial unit tests for client library 2015-05-24 07:17:53 +00:00
4415a5fc25 Updated translations 2015-05-23 22:34:41 +00:00
bddb02f6ba Handle edge cases with ViewPager disabling after shutting down router 2015-05-21 12:14:34 +00:00
f2c3f30224 Move process killing on exit into I2PActivity 2015-05-21 02:57:51 +00:00
90ff16009c Improve usage stats unit handling 2015-05-21 02:25:56 +00:00
4cd97536c5 Center text in the three console status labels 2015-05-20 12:55:30 +00:00
4f2a5fdc1f Dynamically include proxy header files
These get translated with the proxy message classes included in i2ptunnel.jar,
but the footer appended by I2PTunnelHTTPClientBase.writeErrorMessage() is not
because its strings are included in i2ptunnel.war.
2015-05-20 12:51:08 +00:00
c35d13270a Scroll padding fix 2015-05-20 12:46:43 +00:00
6c9bb31da7 Dropped unused images 2015-05-20 06:03:15 +00:00
d5f6be4428 Better side shadow for two-pane tunnel details 2015-05-20 01:56:29 +00:00
77c6e8702d Side shadow for console status 2015-05-20 01:53:29 +00:00
c4fc10f552 Bugfix 2015-05-20 01:27:46 +00:00
4b0f8eb571 Performance tweak 2015-05-20 00:20:21 +00:00
f94d2c57db Move findViewById() calls into onCreateView() for efficiency 2015-05-20 00:18:20 +00:00
fc2d6f5f09 Fix landscape view when router not running 2015-05-19 23:59:37 +00:00
c6ab6f64e9 Reorganized console status view to only show net status when no internet 2015-05-19 23:54:07 +00:00
5315771118 Updated translations 2015-05-19 23:30:22 +00:00
39b8bff6a2 Updated translations 2015-05-19 11:42:46 +00:00
c2a7c8ebde String tweaks 2015-05-19 11:38:54 +00:00
32a8c71bf1 Show net status level 2015-05-19 11:32:30 +00:00
f35257fc65 Handle all net statuses, extract console strings 2015-05-19 11:22:07 +00:00
3ab1fa7c97 Extracted more strings for translation 2015-05-18 23:13:36 +00:00
551910abce Updated translations 2015-05-18 02:13:36 +00:00
170f8afafd Console layout fixes 2015-05-17 12:31:08 +00:00
20c08b1929 New console status layout 2015-05-17 12:22:21 +00:00
e943c31ef9 Improve layout performance 2015-05-17 06:44:25 +00:00
601b979d4e Re-increase routerlogo size, center portrait, fix view bounds issue 2015-05-17 05:15:19 +00:00
973808b392 Reduced size of routerlogo, moved usage stats to bottom toolbar 2015-05-17 05:01:02 +00:00
25811b742f Do full i2p.i2p rebuild after clean 2015-05-15 09:29:16 +00:00
2d57d7cad7 Updated translations 2015-05-15 08:13:03 +00:00
687a62656b Extracted remaining hard-coded strings that won't be changed 2015-05-15 08:05:53 +00:00
5a7c33d9b9 Updated translations 2015-05-15 05:44:31 +00:00
e66c98fbfe Language name tweak 2015-05-14 06:31:56 +00:00
2897bfcb77 Updated translations after string push 2015-05-13 11:34:18 +00:00
b8aca7badc Updated translations 2015-05-13 11:14:39 +00:00
edb2506083 Renamed addressbook page headers 2015-05-13 11:05:06 +00:00
eceb7f14a4 Change "No client tunnels..." to "No tunnels..." 2015-05-13 10:47:35 +00:00
b165f41266 Separate "graphs not ready" dialog, make dialogs non-cancelable 2015-05-13 10:45:01 +00:00
9dd15e550d Added icons to main settings categories 2015-05-12 10:41:53 +00:00
e94984901d Moved graphs from advanced to general 2015-05-12 10:17:06 +00:00
55d682fdfc Updated translations 2015-05-12 05:27:46 +00:00
c231a9f851 Fixed libjbigi building for x86 and mips 2015-05-11 12:13:12 +00:00
bbde471e99 Updated target SDK and build tools to API 22 2015-05-11 11:28:08 +00:00
51c5409f12 Updated Gradle plugin version 2015-05-11 11:24:10 +00:00
1ff96d5530 Updated translations after removing strings 2015-05-11 10:13:53 +00:00
5e099d0e3b Removed some old strings 2015-05-11 10:09:59 +00:00
c27e8ff513 Updated translations 2015-05-11 10:04:34 +00:00
632ed5b4b3 Extract more hard-coded strings 2015-05-11 09:44:35 +00:00
407b5c1441 Moved start/stop/restart all tunnels to TunnelsContainer 2015-05-10 13:41:14 +00:00
fd2050bc1f Updated translations 2015-05-09 13:35:59 +00:00
c615497a9e Translate news strings 2015-05-09 13:30:40 +00:00
e48b2f1dff Translate "shared clients" properly in-house 2015-05-09 13:21:31 +00:00
44cd0a6d55 Update router.config with language 2015-05-09 11:06:57 +00:00
196b6ffbbc Fixed plurals to match Transifex language rules 2015-05-08 13:17:30 +00:00
6cf01e3db0 Updated translations 2015-05-08 13:01:33 +00:00
204f2d8adc Lint 2015-05-08 13:01:14 +00:00
93853bd6b6 Lint: Unnecessary (un)boxing 2015-05-08 11:23:13 +00:00
4095b48a82 Lint 2015-05-08 11:20:49 +00:00
3ab1a68b94 Collated constants 2015-05-08 11:03:22 +00:00
7675d78d0d Converted hard-coded log strings to translatable strings 2015-05-08 10:59:19 +00:00
1b2fa9bda6 Rate graph styling 2015-05-08 10:36:01 +00:00
8819bbfa44 Removed redundant text 2015-05-08 08:58:46 +00:00
2e6ff0ac07 Fix default graphs 2015-05-08 08:18:22 +00:00
8d9a532424 Fixed console FAM visibility 2015-05-08 04:15:50 +00:00
6f5e3e2386 Replaced hard-coded activity titles with translatable strings 2015-05-08 04:07:30 +00:00
fb63f1eee7 Material design for TextResourceDialog 2015-05-07 02:08:20 +00:00
8c65812fa0 Add Ok button to FirstStartDialog 2015-05-07 01:37:55 +00:00
adfc6415b3 Display up button on Licenses 2015-05-07 01:37:39 +00:00
bb2a1c7c62 Prevent race condition if language choice restarts Activity 2015-05-06 22:15:38 +00:00
3d63269286 Choose language on first start 2015-05-06 13:04:53 +00:00
6dde8d2a88 Added Ok button to About dialog 2015-05-06 11:45:31 +00:00
d0c6bcff7d Tunnel interfaces for bidir and Streamr server tunnels 2015-05-06 06:50:26 +00:00
b938bc9698 NPE fix 2015-05-06 02:34:35 +00:00
2cb877d61b List available interfaces in tunnel preferences 2015-05-06 02:34:06 +00:00
77368e370b Updated translations 2015-05-06 02:04:50 +00:00
2e6589ea74 Status bar fixes 2015-05-06 01:56:28 +00:00
90367b0f9c Mark notification statuses for translation 2015-05-06 01:46:58 +00:00
97a350c482 Fixed deprecation 2015-05-06 01:26:53 +00:00
57d7708ae6 Enable language to be changed from default 2015-05-05 04:17:14 +00:00
913d39a9a2 Updated language code rewrites
See https://developer.android.com/reference/java/util/Locale.html for details
2015-05-05 03:15:50 +00:00
fa83742386 New client translations for ca 2015-05-05 03:14:42 +00:00
94539b8ebb Updated translations 2015-05-05 03:14:16 +00:00
bccbe30074 AppCompat v22.1.*: more deprecations 2015-05-02 11:54:21 +00:00
4e954eef50 AppCompat v22.1.*: Material design dialogs 2015-05-02 11:27:39 +00:00
6eeafb64f5 AppCompat v22.1.*: deprecations 2015-05-02 11:14:33 +00:00
d7184e9c99 Add up nav to one-pane tunnel details 2015-05-02 11:09:04 +00:00
be8016c02c Display selected tunnel setting in ListPreference summary 2015-05-02 04:59:32 +00:00
11d4e05518 Fix tunnel preference ordering 2015-05-02 00:02:19 +00:00
fdccadda04 Prevent PERSISTENT_KEY and NEW_KEYS from being set simultaneously 2015-05-01 23:42:46 +00:00
ccb1c73cf3 Lint 2015-05-01 12:29:39 +00:00
f3168f0dc2 Updated CHANGELOG 2015-05-01 12:08:40 +00:00
b4210cfb33 propagate from branch 'i2p.android.base.fragments' (head d590551a58afc8cebc67722afc73494e4f8836c0)
to branch 'i2p.android.base' (head e20ea0056b24eb0050ae3be6d84aac6e5157503d)
2015-05-01 10:25:16 +00:00
6e0a66292d Lint 2015-05-01 09:57:13 +00:00
71856397de Lint 2015-05-01 09:01:09 +00:00
568cdeca36 Lint: Rename values-id to values-in
See java.util.Locale for details
2015-05-01 08:58:15 +00:00
4e64fb3095 Updated translations 2015-05-01 08:48:16 +00:00
f33f26987b Fix adding entries to private addressbook 2015-05-01 08:39:13 +00:00
99fa7fbec6 Fix loading B64 from file 2015-05-01 08:37:35 +00:00
315931a032 Move from Maven Central to JCenter, fix up some dependencies
- JCenter is now the Android Studio default, it imports from MC
- Updated to materialish-progress 1.5
- Fixed viewpagerindicator hash (author accidentally overwrote it on MC)
2015-04-29 12:52:31 +00:00
8c63fb0ce2 Updated Android plugin
The IDE class path issue is fixed with Android Studio 1.2
2015-04-29 12:16:41 +00:00
31b7e18aad Updated Android support libraries
According to https://code.google.com/p/android/issues/detail?id=160591#c16 the
button theme bug is fixed. I still see it with API 10 (but fixed in 19+) in the
Android Studio renderer, but apparently it does work on Gingerbread devices.
2015-04-29 12:14:42 +00:00
b51ca8b27c Fix child fragments not getting an updated two-pane status on screen rotate 2015-04-28 12:51:22 +00:00
13af3d7869 Fix default router lights in landscape 2015-04-28 12:50:32 +00:00
c91de6f7ab Don't allow users to stop the router until it has finished starting 2015-04-25 05:35:08 +00:00
d961b5f8b1 Added scrolling to tunnel details 2015-04-21 13:05:07 +00:00
7d8141f62b Downgrade Android Support libraries to 21.0.3
Waiting on this issue to be resolved:
https://code.google.com/p/android/issues/detail?id=160591
2015-04-21 12:16:38 +00:00
6ef5d793f4 Save and restore console light status 2015-04-21 07:49:24 +00:00
c5c97366b8 Create the WizardModel before super.onCreate() to prevent NPEs in Fragments 2015-04-21 05:15:40 +00:00
124692db8e Reverse the Lollipop transition when finishing TunnelDetailActivity 2015-04-21 03:58:16 +00:00
72461cb678 Lollipop shared-element transition when opening TunnelDetailActivity 2015-04-21 03:52:29 +00:00
6f84f3ce06 Enable devices on API 21+ to use nice transitions 2015-04-21 03:08:05 +00:00
cbe21d94c9 Fix reloading of toolbar to update start/stop buttons in TDF 2015-04-21 02:47:19 +00:00
9c8c462089 Fixed up navigation issues from EditTunnelActivity and SettingsActivity 2015-04-20 22:56:09 +00:00
cc7c67c494 Updated TODO 2015-04-20 12:45:59 +00:00
0e14ed20e6 Split tunnel preferences into two Fragments
This prevents the advanced PreferenceScreen from going fullscreen.
2015-04-20 12:44:07 +00:00
d620535246 Fix ISE if screen rotating while router state changes 2015-04-20 12:40:19 +00:00
350d8a1363 Handle ActionBar up nav properly in SettingsActivity 2015-04-20 05:19:17 +00:00
23e80ec72b Split preferences into individual support PreferenceFragments 2015-04-20 04:11:05 +00:00
fd052f1b38 "Fix" race between RouterContext initialization and first console status update 2015-04-19 12:17:06 +00:00
865f5d271a Updated translations 2015-04-19 11:39:33 +00:00
d1293f5949 Mark property strings as non-translatable 2015-04-19 11:36:49 +00:00
2a354288bf Updated TODO 2015-04-19 11:26:14 +00:00
f20e82a25e Scroll entire console fragment in portrait (so stats are more visible on phones) 2015-04-19 11:24:23 +00:00
4a7899ce59 Update menus, FAMs etc. on router state change 2015-04-19 07:12:04 +00:00
2adc368307 Clear console status info as soon as the router has stopped 2015-04-19 07:02:12 +00:00
2bb57d2c4d Divider and margins for addressbook two-pane view 2015-04-19 05:15:07 +00:00
e649ac448b Added link icon to tunnel details page 2015-04-19 05:02:23 +00:00
337c93bb6c Updated TODO 2015-04-19 04:47:25 +00:00
f5624cf259 Differentiate between router shutting down and not running when tabs disabled 2015-04-19 04:46:28 +00:00
6afd9b950d Remove padding from top of addressbook list (headers do the job) 2015-04-19 04:45:56 +00:00
94c46d4a43 Divider for tunnel details, fixed strings 2015-04-19 04:33:05 +00:00
dcf072905c Move tunnel open link to details page 2015-04-19 04:19:52 +00:00
c67aeddb3b Material design: master-detail tunnel view
Detail shadowing method credit:
http://sapandiwakar.in/adding-shadows-to-views-in-android-using-9-patch-image/
2015-04-19 03:52:51 +00:00
f125079aa5 Added elevation to main toolbar
Pre-21 shadow uses code from the I/O 2014 source:
https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/DrawShadowFrameLayout.java
2015-04-19 03:49:41 +00:00
0ddd9e5f4c Material design tablet margins 2015-04-19 02:22:39 +00:00
0074cf5a19 Use separate toolbar for tunnel details menu 2015-04-19 02:22:11 +00:00
19082db9a6 Start unifying list styles, first pass at improving tunnel details 2015-04-19 01:06:59 +00:00
109aeb7796 Disable tunnels and addressbook when router not running 2015-04-18 12:38:38 +00:00
3e06a11017 Updated TODO 2015-04-18 12:37:57 +00:00
dafd438982 Common style for pager indicators 2015-04-18 03:57:37 +00:00
063fd63fe2 Updated comment to match 2015-04-18 03:18:25 +00:00
5e27a93df9 Only show tunnels in two-pane for w720dp 2015-04-18 03:14:59 +00:00
c428195127 Attempted fix of IllegalStateException 2015-04-18 00:55:21 +00:00
1fba23a144 Use correct parent for TunnelDetailListener 2015-04-18 00:41:48 +00:00
3cc1e2b4bb Hide unusable console options when router is not running 2015-04-18 00:39:28 +00:00
77b05fa6e0 Open correct help page for correct tab 2015-04-18 00:32:55 +00:00
3553065ce2 Don't show start/stop/restart until TCG has started 2015-04-18 00:28:35 +00:00
167c06225f Added missing FAB to two-pane tunnels container 2015-04-18 00:10:00 +00:00
3420c04735 Improved title indicator for container ViewPagers 2015-04-17 23:42:50 +00:00
973282ab59 Updated TODO 2015-04-17 22:22:50 +00:00
7c04a96639 Re-enable tunnel editing 2015-04-17 22:22:36 +00:00
b2db1f4a6c Start TCG in LoadClientsJob 2015-04-17 11:24:08 +00:00
e3e0960ed8 Test settings navigation (to help pick up bugs like the IntListPreference one) 2015-04-16 11:24:08 +00:00
78ad153c47 Fixed integration tests for swapped tabs 2015-04-16 11:11:58 +00:00
fa6ba6bdce Updated CHANGELOG 2015-04-16 00:52:06 +00:00
8f302e6eeb 0.9.19.1
i2p.i2p tag: 0.9.19
2015-04-16 00:51:40 +00:00
93d2677b34 Fix for when an IntListPreference was previously stored in a ListPreference 2015-04-16 00:51:15 +00:00
1d02535158 StackOverflowException fix 2015-04-15 23:30:29 +00:00
955e40b0fc Updated client library dependencies 2015-04-13 12:06:01 +00:00
b4367843cd Gradle build script lint 2015-04-13 12:05:23 +00:00
76fd69544d Updated library versions 2015-04-13 12:03:18 +00:00
99b582a005 propagate from branch 'i2p.android.base' (head d8a24ace7d2d7616fcc2b12ac9a663f4cdbb7be8)
to branch 'i2p.android.base.fragments' (head 376be71890e893e97d2b8fed60d2a567c235ba99)
2015-04-13 08:29:00 +00:00
8e0e5ed5c4 Updated CHANGELOG 2015-04-13 02:21:38 +00:00
234bc6e5a0 0.9.19
i2p.i2p tag: i2p-0.9.19
2015-04-13 02:20:51 +00:00
b0131843ae Handle saved strings from older version 2015-04-13 01:52:24 +00:00
c32bda66b5 Client library 0.9.19
i2p.i2p tag: i2p-0.9.19
2015-04-13 01:18:21 +00:00
6d726df1dc Updated translations 2015-04-13 00:01:20 +00:00
5b5a99f512 Removed duplicate info from tunnel details page 2015-04-10 10:32:19 +00:00
a11dd1e4e6 Rebuilt libjbigi.so for armeabi with new build.sh, new build for armeabi-v7a
Both tested on my local device, router starts and builds tunnels.

armeabi:     native = 77% of pure java time
armeabi-v7a: native = 62% of pure java time
2015-04-10 04:03:36 +00:00
2190c59d73 Updated jbigi build.sh to support building all ABIs
Now uses make-standalone-toolchain.sh and flags obtained from
https://github.com/Rupan/gmp
2015-04-10 03:59:24 +00:00
c6e06e25a8 Updated translations 2015-04-09 23:50:36 +00:00
a559eb4fab Fixed location of uk translations 2015-04-09 23:49:02 +00:00
d1110aefc4 Fixes for jbigi building 2015-04-09 13:56:10 +00:00
9a5c63f620 Updated translations 2015-04-08 21:53:41 +00:00
d4e9195a6c Updated translations 2015-04-07 12:27:17 +00:00
e9d2b9f53c String fix 2015-04-07 12:26:01 +00:00
c124cafe3c Dividers and touch feedback for browser config list 2015-04-07 12:18:06 +00:00
24f0d72aae Touch feedback for tunnels and addresses in RecyclerView 2015-04-07 12:13:44 +00:00
8780d69be5 Decrease height of addressbook section headers 2015-04-07 12:11:59 +00:00
1853f5bcfd Add divider below addressbook labels in two pane mode 2015-04-07 12:10:32 +00:00
3f6caf18b4 Added missing headers to two-pane addressbook 2015-04-07 10:42:34 +00:00
97aa6e64bc Added dividers to tunnels and addressbook 2015-04-07 09:41:47 +00:00
f1bfd7d4aa Updated TODO 2015-04-06 23:31:49 +00:00
70ede5a370 Added alphanumeric section headers to addressbook 2015-04-06 23:31:14 +00:00
d1d06840fd Migrated tunnels list to RecyclerView 2015-04-06 03:25:05 +00:00
5f62418513 Moved state request to onResume() 2015-04-06 02:16:09 +00:00
5e6dab9bf1 Better handling of router state in AddressbookFragment 2015-04-06 00:49:28 +00:00
ef65a94e4c Migrated changes that merge didn't handle 2015-04-06 00:19:23 +00:00
c2e00ecf26 propagate from branch 'i2p.android.base' (head 83cce028d4603503d9530fcd828c4d9fa2a9ad7d)
to branch 'i2p.android.base.fragments' (head 049d93b11a6300da3b5b69212ba4f06d7720a080)
2015-04-06 00:11:03 +00:00
40f3d91ebb Tunnel logic bugfix 2015-04-05 13:12:14 +00:00
fae4b7e42d Bugfix in converting wizard data to TunnelConfig 2015-04-05 13:11:53 +00:00
eb700e34ba Migrated TunnelUtil.createConfigFromWizard() to use TunnelLogic 2015-04-05 12:32:56 +00:00
6828d985d2 Updated TODO 2015-04-05 05:00:06 +00:00
05a2132295 Updated translations 2015-04-05 04:58:43 +00:00
dbee390bba Updated changelog 2015-04-05 04:42:10 +00:00
0b5ae4edf8 Updated @since 2015-04-05 04:38:35 +00:00
bd741cd500 Use two buttons for graceful shutdown, restore notification title on cancel 2015-04-05 04:30:44 +00:00
4d7bc0f92b propagate from branch 'i2p.android.base' (head b76931f62977a8f15bd906d380795eddb0419d2a)
to branch 'i2p.android.base.zzz.graceful' (head 73baffc0c318d0c1b8c7ba05327ceefb2c84b341)
2015-04-05 02:41:52 +00:00
dac63d4401 NPE fix 2015-04-05 02:37:42 +00:00
8ed2ce3e3d Move AddressbookFragment to RecyclerView 2015-04-05 02:34:19 +00:00
c95f140fb4 NPE fix 2015-04-05 00:31:47 +00:00
4e21cc890f Better state handling for main UI fragments 2015-04-05 00:31:19 +00:00
cf3594962d NPE fix 2015-04-03 22:11:58 +00:00
9fa38c2840 Fixed addressbook search 2015-04-03 22:01:45 +00:00
2da8bbf214 Better descriptions for postman's tunnels 2015-04-03 12:03:55 +00:00
c984206f8e ActionBar up navigation 2015-04-03 12:03:42 +00:00
4a8b87d50c Reorder front UI tabs for better utility 2015-04-03 11:35:28 +00:00
a5a08a7282 Replace sub-toolbar with FAM for console menu 2015-04-03 11:33:08 +00:00
80f8469154 Some simple tests of the new tab UI 2015-04-03 00:12:41 +00:00
490137adc3 propagate from branch 'i2p.android.base' (head b76931f62977a8f15bd906d380795eddb0419d2a)
to branch 'i2p.android.base.fragments' (head 9af06a6f08e89e96c637b427e237538b600edc29)
2015-04-02 12:30:21 +00:00
d2959ddc3f Espresso testing support 2015-04-02 12:17:06 +00:00
6556156486 Fixed toolbar usage in activities 2015-04-01 12:40:15 +00:00
0095777a63 Replaced missing menu items 2015-04-01 12:24:58 +00:00
d8fc177b2d Better main tab locations for portrait and landscape 2015-04-01 11:36:22 +00:00
fcd5b2a503 Remove last of RouterContextProvider/RouterContextUser 2015-04-01 05:42:34 +00:00
0a5312e81b Missing from previous commit 2015-04-01 05:41:55 +00:00
7b67cf1581 Use Util.getRouterContext() for netDb list logic 2015-04-01 05:39:46 +00:00
2975b811d0 Use Util.getRouterContext() for tunnel list logic 2015-04-01 05:32:12 +00:00
ecb071ee88 Disable tunnel editing until ticket #815 is closed 2015-04-01 02:23:02 +00:00
624aa27e31 Updated README 2015-04-01 01:03:25 +00:00
a213ac51cd Finished diff after merge 2015-04-01 00:46:23 +00:00
db4a817ded propagate from branch 'i2p.android.base' (head 1b2db1a609968406ce50b5ab85bf3fe026d29d6f)
to branch 'i2p.android.base.fragments' (head d7c9088779c79670fb3be17fa039902345a5dc0e)
2015-04-01 00:40:08 +00:00
2407e9be46 Use LocalBroadcastManager to broadcast router state within the app 2015-03-31 23:51:18 +00:00
50973b5c06 Bugfix 2015-03-31 23:50:20 +00:00
8165e49300 Make handler static to prevent leaks 2015-03-31 22:43:59 +00:00
77749dd7f9 Lint removal 2015-03-31 13:57:21 +00:00
ef7e4cf610 Updated translations 2015-03-31 13:37:44 +00:00
a7b2bf148b Missing strings 2015-03-31 13:36:40 +00:00
3de78063f2 Missed changes 2015-03-31 12:36:38 +00:00
601d3c0ee3 Propagate visibility hints to TunnelListFragments too 2015-03-31 12:35:54 +00:00
3bcbd8c876 Store AddressbookFragment references, use to propagate visibility hints 2015-03-31 12:16:52 +00:00
e33be52b97 Only show "Reload subscriptions" for router addressbook 2015-03-31 12:15:20 +00:00
f513580525 Use Util.getRouterContext() in addressbook logic 2015-03-31 11:28:21 +00:00
ca2fde0b57 Changes missing from 1d97c209bb5a1634973da11e3dda3e96dad904e5 2015-03-31 11:27:51 +00:00
b442552146 NPE fix 2015-03-31 11:22:34 +00:00
9aee319607 Put tabs inside toolbar so action bar features can be used 2015-03-31 11:20:46 +00:00
d112e1a415 Listen for naming service changes 2015-03-31 03:20:03 +00:00
9cd6ab51ac Reorganize menus 2015-03-31 02:56:23 +00:00
6477f7d43f Common add button for tunnel views 2015-03-31 02:14:57 +00:00
65d1e6e089 NPE fix 2015-03-31 02:12:30 +00:00
6aff527456 Extracted FragmentPagerAdapter fragment recall into separate class 2015-03-30 22:42:31 +00:00
f32b896bb1 Fragment transaction bugfixes 2015-03-27 12:48:06 +00:00
58624ebf9d Add tabs using classes from Google IO sample code 2015-03-27 12:35:18 +00:00
db8355c477 Replaced navigation drawer and spinner with ViewPagers
First pass. Runs, but broken in many places.
2015-03-27 12:22:12 +00:00
a2278179f9 Missing file 2015-03-27 01:49:59 +00:00
3b3bcb30da Save tunnel config in onStop() if possible 2015-03-26 23:59:10 +00:00
d78b68d285 Tunnel preference bugfixes 2015-03-26 21:52:58 +00:00
00de9e98d2 Revert change accidentally checked into f4375e1bcf14aed1c7a94628599bead3bf866844 2015-03-26 13:49:57 +00:00
a543280a56 Updated translations 2015-03-26 13:23:27 +00:00
f036544744 Support numeric values for ListPreferences 2015-03-23 00:45:14 +00:00
8aa9ce9303 Bugfixes 2015-03-23 00:44:38 +00:00
1c605c16cf Edit tunnel UI 2015-03-20 03:58:23 +00:00
fc7f703658 Missing new widget from previous commit 2015-03-19 21:37:11 +00:00
163ef0512b Preferences XML for tunnel properties 2015-03-19 21:36:49 +00:00
6709bebc6f EditTextPreference that updates its summary (from Bote) 2015-03-12 23:01:11 +00:00
c7fad6940a IntEditTextPreference: default summary, use default value 2015-03-12 23:00:08 +00:00
4b1ee639b7 Tweaks after upstream changes 2015-03-12 00:07:35 +00:00
d2fa17fa66 Updates for upstream changes 2015-03-11 04:07:40 +00:00
87e12846b3 i2ptunnel.jar doesn't depend on I2PTunnelGUI anymore 2015-03-11 01:10:24 +00:00
97d1367180 Use TunnelConfig now in i2ptunnel.jar 2015-03-10 20:52:59 +00:00
a0419c9eb7 Add support-v4-preferencefragment as a dependency 2015-03-09 01:56:40 +00:00
5191118b87 Updated CHANGELOG 2015-03-05 22:24:39 +00:00
f5214e4b99 Include priority for logged strings (per upstream) 2015-03-04 19:07:57 +00:00
9564855cce Rewrite LogWriter to use LogWriterBase from upstream 2015-03-04 12:15:22 +00:00
17ab043a4b 0.9.18
i2p.i2p tag: i2p-0.9.18
2015-03-04 12:13:45 +00:00
32b2b0ce75 Updated TODO with Silent Store checklist (useful reference) 2015-03-04 12:12:44 +00:00
b77e2ebbe5 Updated translations 2015-03-04 01:11:48 +00:00
9eeab68cdb String translation fix 2015-03-04 01:11:44 +00:00
96257015a9 Language cleanups 2015-03-03 23:37:56 +00:00
d7f6e3688c UDP and NTCP ports, part 4 2015-03-03 22:50:26 +00:00
5ef434e29f Updated translations 2015-03-03 13:23:16 +00:00
852d695dac UDP and NTCP ports, part 3 2015-03-03 13:21:32 +00:00
96cb8ab410 Bugfix 2015-03-03 00:19:36 +00:00
cd158cca84 Updated translations 2015-03-02 22:57:37 +00:00
b71a0a27d3 Fixed help Activity back and up nav 2015-03-02 22:57:03 +00:00
64268c7af8 Activity title fixes 2015-03-02 21:45:13 +00:00
95749f032e I2PTunnel -> Tunnels / Hidden Services Manager; string tweaks 2015-03-02 21:29:34 +00:00
0ac1ae56b0 Dropped unnecessary part of tunnels guide 2015-03-02 21:17:43 +00:00
c52bc45910 Client library 0.5.1
i2p.i2p tag: i2p-0.9.18
2015-03-02 21:16:57 +00:00
064ebc6857 Moved missing class into client library 2015-03-02 11:03:02 +00:00
6352cd9412 Client library 0.5
i2p.i2p tag: i2p-0.9.18
2015-03-02 00:51:30 +00:00
db6c74b4b8 Updated translations 2015-03-02 00:02:40 +00:00
a8d699bea2 (Hopefully) prevent NPE 2015-03-01 23:49:13 +00:00
5d9cb0029f Fixed style API bug 2015-03-01 23:28:11 +00:00
51f7fca1ea Updated translations 2015-03-01 11:08:55 +00:00
c61ccd32ba UDP and NTCP ports, part 2 2015-02-28 12:36:59 +00:00
1debd64bc3 Pull property definitions into one location 2015-02-28 10:19:42 +00:00
561bcfe3fa New translations 2015-02-28 04:59:15 +00:00
1c1f77f5c5 Updated translations 2015-02-28 04:58:27 +00:00
420526a7c4 Updated changelog 2015-02-28 04:57:10 +00:00
99496be412 Settings options for UDP and NTCP ports 2015-02-28 04:49:18 +00:00
b6f1cdc769 Enable Java 1.7 features 2015-02-28 00:46:49 +00:00
75e4153f4e Fix stringOptionsRequiringRestart handling; add NTCP and SSU port parsing 2015-02-27 23:28:01 +00:00
eefa5b8064 Prep work for supporting removal of router.config properties 2015-02-27 22:52:39 +00:00
bae8c7ec00 propagate from branch 'i2p.android.base' (head 2cc736f12cfa9d56a7df3ab4be399cb256cbfc2c)
to branch 'i2p.android.base.zzz.graceful' (head deb95d5a40b64c460483f1e5af1a5624ff95fa6f)
2015-02-27 11:04:12 +00:00
9d32e44547 Logger: Configurable flush interval
From i2p.i2p rev 2f451e3579eb5df2d316c1b507950d119d59a8da
2015-02-27 11:04:03 +00:00
80c8069769 propagate from branch 'i2p.android.base' (head 473e458dab49137f8211dcad60554cd90078807d)
to branch 'i2p.android.base.zzz.graceful' (head 57a30f761ea3d230301347dbb8b79bd3540f97a2)
2015-02-27 10:49:50 +00:00
42a0d552c7 Fixed potential leak 2015-02-27 10:45:42 +00:00
65848dd22b Fix NPE in AddressEntryLoader 2015-02-27 10:20:00 +00:00
610de188a4 Downgrade to Gradle tools 1.0.1
1.1.* cause "Cannot resolve symbol" errors in Android Studio, even though Gradle
can build the app.
2015-02-27 09:50:34 +00:00
f1cd3032c5 Updated FAB library 2015-02-27 01:54:29 +00:00
1a922ba04a Updated build tools 2015-02-27 01:54:17 +00:00
bdd59734ec Updated Android support libraries 2015-02-26 23:34:49 +00:00
fe162e4f5c Updated Android Gradle build tools 2015-02-26 23:34:31 +00:00
69e30e97b8 Updated TODO 2015-02-26 23:33:53 +00:00
zzz
5b4b151079 Preliminary support for graceful shutdown.
New buttons not yet implemented.
Untested.
2015-02-08 00:02:56 +00:00
513fbe0c9f Updated translations 2015-01-15 10:34:13 +00:00
de23a76e6b Option to start I2P on boot 2015-01-15 10:31:25 +00:00
c9936894d8 Updated TODO 2015-01-15 05:47:01 +00:00
cb6efd9ed8 Updated translations 2015-01-01 23:18:19 +00:00
ad245003bf Updated browser config instructions for Firefox and Orfox 2014-12-29 11:40:04 +00:00
9f27aedc49 Added postman's tunnels to default i2ptunnel.config 2014-12-27 21:43:00 +00:00
d8f883dce8 Feedback from zzz 2014-12-25 09:48:26 +00:00
7db1fbac94 Updated translations 2014-12-23 23:39:13 +00:00
19464124d6 Fixed NPE on browser refresh 2014-12-23 22:30:04 +00:00
5ba616facc Updated TODO (thx for testing zzz) 2014-12-22 00:22:54 +00:00
590a8183aa Fix settings menu Intents in debug build 2014-12-17 02:42:13 +00:00
9a45bbd18c 0.9.17.1
i2p.i2p tag: i2p-0.9.17
2014-12-14 05:15:16 +00:00
c5eedc0a5e Updated translations 2014-12-14 04:28:50 +00:00
715302c813 Upgraded floatingactionbutton to 1.3.0, dropped unused cardview-v7 2014-12-14 04:26:38 +00:00
3327ed722a I2PTunnel: Ask to install app for tunnel, if none are installed when opening 2014-12-12 13:59:02 +00:00
40afd69a54 Enable debug versions to be installed alongside release versions 2014-12-12 13:55:31 +00:00
241381c7fa Fix copy tasks to run every time 2014-12-12 13:17:48 +00:00
7a7ba093db Added CHANGELOG 2014-12-12 06:03:41 +00:00
f0e6744760 Prevent NPE 2014-12-10 12:03:34 +00:00
99002c1c5c Updated translations 2014-12-10 11:51:41 +00:00
605a6c1cf4 Bumped support-v4 dependency in client library to 21.0.2 2014-12-09 21:43:26 +00:00
954a9cc46b Bumped gradle plugin to 1.0.0 2014-12-09 11:56:19 +00:00
1ef838b966 Fixed NPE 2014-12-04 06:56:52 +00:00
c672ca05f5 0.9.17
i2p.i2p tag: i2p-0.9.17
2014-12-02 00:40:17 +00:00
c493e73889 Client library 0.4
i2p.i2p tag: i2p-0.9.17
2014-12-01 08:40:48 +00:00
2b7c280f5b Tunnel details 2014-12-01 08:39:25 +00:00
23eab8a90a FloatingActionButton for I2PTunnel and addressbook 2014-12-01 03:57:21 +00:00
c59103eb76 Comments 2014-12-01 03:14:55 +00:00
f00a35ee09 Move versionCode and versionName definitions to build.gradle 2014-11-30 21:24:47 +00:00
af93725c01 Binding for Services 2014-11-30 11:35:15 +00:00
3953301c57 Fix intent generation 2014-11-30 10:55:34 +00:00
2dab9d5d4f Upgraded support libraries to 21.0.2 2014-11-27 11:42:48 +00:00
b77666fa26 New client library translations for ro 2014-11-25 11:44:46 +00:00
eca931c1b5 Updated translations 2014-11-25 11:44:22 +00:00
86ae77701f 0.9.16-rc1
i2p.i2p: cb66382d9716f7d9cd9441830face910705253e0
2014-11-25 04:48:48 +00:00
c1ee0c4d9e Updated Gradle Witness
Source: https://github.com/WhisperSystems/gradle-witness
Git commit: 10f1269c0aafdc1d478efc005ed48f3a47d44278
2014-11-25 03:51:52 +00:00
e632b35862 Bind to IRouterState using explicit intents (required for API 21 and up) 2014-11-16 18:49:11 +00:00
20d2dcd891 Updated translations 2014-11-16 03:06:29 +00:00
61d5ba5a7c Toolbar back navigation 2014-11-10 11:59:54 +00:00
339f688b7c I2PTunnel help 2014-11-10 11:55:33 +00:00
fed11e703a Don't start new activity if we are already there 2014-11-10 11:33:36 +00:00
438df8142a Settings back navigation 2014-11-10 11:27:11 +00:00
7b3730be24 Updated i2ptunnel.config, dropped Telecomix and Nameless 2014-11-10 10:43:11 +00:00
d6c20bafb3 Material design: one-line text lists 2014-11-10 10:42:05 +00:00
b8998db3a3 Revert to general Intent for selected addressbook entries 2014-11-10 05:39:48 +00:00
9ab1c84878 Material design: settings 2014-11-10 03:41:49 +00:00
2f3335d361 Material design: list items 2014-11-10 02:30:00 +00:00
0e8d900ed4 I2PTunnel secondary action to open linkable tunnels 2014-11-10 01:56:35 +00:00
2c7ce0b7c6 News fragment margins 2014-11-09 12:24:59 +00:00
3e2bdacf89 Material design: I2PTunnel list 2014-11-09 12:13:32 +00:00
64c32076a1 Show correct browser config activity 2014-11-08 07:50:50 +00:00
4d75ce7de1 Missing files 2014-11-08 07:50:30 +00:00
269ae2f569 Help details back nav in toolbar 2014-11-08 06:46:04 +00:00
a42a4b2c99 Reworked help navigation 2014-11-08 03:41:14 +00:00
96f5c2b488 Change property names to match original script (better interop with other repos) 2014-11-08 03:40:48 +00:00
09ab9779aa Addressbook doesn't use two columns yet 2014-11-05 00:50:55 +00:00
97ed0a3a8f NPE fix 2014-11-04 12:18:56 +00:00
ec6d225dc6 Icons for uninstalled supported browsers 2014-11-04 12:07:41 +00:00
800a332691 Swap Orfox with Firefox in supported browsers (no official Orfox release yet) 2014-11-04 12:02:02 +00:00
45eae17561 Simplify browser list UX 2014-11-04 11:54:22 +00:00
092365cab2 Help twopane view 2014-11-04 03:06:03 +00:00
c98c2f101d Updated TODO 2014-11-04 02:46:20 +00:00
8e86634a41 Recommended browsers, Orfox config, link to app store from browser list 2014-11-04 02:43:34 +00:00
7424e5b707 Browser configuration guides for embedded, Orweb, unknown and unsupported 2014-11-04 01:03:59 +00:00
5175c937a9 Help: List browsers, detect ones we know can (not) be configured for I2P 2014-11-03 12:26:58 +00:00
2692a567ab BetterAsyncTaskLoader from Bote 2014-11-03 12:23:24 +00:00
2de971fb52 New translations 2014-11-03 11:46:17 +00:00
403b2e8cd9 Material design: toolbar for help screen 2014-11-03 03:22:29 +00:00
22141e723a Fix back button when drawer indicator disabled 2014-11-02 23:20:13 +00:00
419758125e Updated translations 2014-11-02 12:42:44 +00:00
6db307c681 Client library 0.3
i2p.i2p tag: i2p-0.9.16
2014-11-02 01:46:33 +00:00
cdec6d2f98 Updated README 2014-11-02 01:36:11 +00:00
18a6dc9719 Use mavenLocal() repository instead of a local file repo 2014-11-02 01:35:55 +00:00
fb92d7858a Upgraded build tools to 21.0.2 2014-10-30 23:10:36 +00:00
b8e005bdd5 Copy tasks can only have one destination directory 2014-10-30 23:10:00 +00:00
6568489b27 Upgraded gradle wrapper and build tools 2014-10-30 12:15:49 +00:00
3ff3e14fc2 New Gradle Witness build
Includes a fix for Gradle 2.+ that is not yet pulled in:
https://github.com/WhisperSystems/gradle-witness/pull/3
2014-10-30 12:15:04 +00:00
092591f4ec Material theme: toolbar
Navigation tabs have all been replaced with spinners, because there are no nice
tab libraries for API 9+.
2014-10-29 11:47:53 +00:00
895a3a1dcc Fix deprecation 2014-10-27 21:37:52 +00:00
dc4ce3f8c7 Updated translations 2014-10-27 07:31:36 +00:00
7e3b9d5065 Updated translations 2014-10-22 21:15:55 +00:00
e58ffc9fd4 Material theme: nav drawer 2014-10-19 06:48:33 +00:00
0d029988c3 Material theme color definitions 2014-10-19 06:05:08 +00:00
6f01989a4b Nav drawer icon changed 2014-10-19 06:04:07 +00:00
19aeaec406 New material theme menu icons 2014-10-19 06:03:14 +00:00
b4d1241a9e Implement material styles properly with appcompat 2014-10-18 21:08:33 +00:00
fef4aa0e86 Initial migration to API 21 2014-10-18 06:11:39 +00:00
766266b147 Updated translations 2014-10-18 02:36:53 +00:00
93410c07bb Updated ignores 2014-10-17 08:02:24 +00:00
dc27a782b0 Fixed NPE in client library with State unparceling
This only fixes the symptom, but the crash log on Google Play doesn't shed light
on what the problem is.
2014-10-17 06:54:26 +00:00
zzz
b633df73c0 Update imports for move of router data structures 2014-10-16 23:10:32 +00:00
41d1200df7 0.9.15.1 2014-10-16 10:47:27 +00:00
c9a62fba9a Drop interface that isn't in source yet 2014-10-16 10:25:12 +00:00
c9598fa831 Update default subscriptions 2014-10-16 10:16:06 +00:00
9965c31b2d Pass dir and file to Util.mergeResourceToFile() in the correct order 2014-10-16 10:15:13 +00:00
43de6425b2 New translations for client library 2014-10-16 10:13:56 +00:00
b98cdf3e0b 0.9.15 2014-10-16 04:32:52 +00:00
26c11ebaed Updated translations 2014-10-16 04:30:49 +00:00
c9c3de1d04 Updated Androidplot to 0.6.1 2014-10-16 04:30:25 +00:00
9b29b56982 Upgrade support libraries to v20.0.0 2014-10-15 22:19:58 +00:00
8956fd7ce0 Updated translation strings 2014-10-15 21:52:46 +00:00
f1f94ea3e0 New translations 2014-10-15 21:49:32 +00:00
94b433aead Padding fix 2014-10-15 21:31:27 +00:00
5623d54114 Basic help page with HTML content 2014-10-15 21:21:11 +00:00
9133a2f848 Prepare for material theme 2014-10-15 10:36:55 +00:00
70324c3ecc Missing class 2014-10-15 02:50:37 +00:00
5613d21324 Replace first start warning dialog with browser config dialog 2014-10-14 11:15:14 +00:00
9036bf3f6b Re-enable (blank) help activity 2014-10-14 11:14:28 +00:00
94991d2df3 New type and status styles for tunnel list 2014-10-07 06:22:09 +00:00
76f23946f0 Don't show dialog on new version until we have something new to tell them 2014-10-05 04:12:29 +00:00
862e856913 Fixed graphs settings page notice when router not running 2014-10-05 03:38:17 +00:00
cf3de34cb6 Removed "participating" option from settings UI
Temporarily hidden because of problems with changing defaults. We don't want to
cause network instability because we have thousands of new unstable routers
churning the network, and can't change their default settings.

In future, we should look at the user's network and settings, and try to have 
"smart" defaults based on a user-chosen profile, or based on net type - see
Connectivity.isConnectionFast().
2014-10-05 02:59:18 +00:00
81de79c725 Remove "enable I2CP" from settings UI
Android apps should use the client library to connect to I2P Android. The TCP    
interface would only be useful if using the Android device as a gateway or 
dedicated router, but it would need to listen globally, not locally. If someone
asks for that in future, we can add this back and improve the configuration.
2014-10-05 02:53:09 +00:00
228b6f1baa Comment out disabling UPnP until other changes are finished 2014-10-05 01:17:31 +00:00
8e395cfd4e Detect more config options requiring restart 2014-10-05 01:16:17 +00:00
6d6123df9b Inform user that changing uPnP setting will require a router restart 2014-10-03 01:09:32 +00:00
321a49156c Display news in TextView instead of WebView 2014-10-03 01:04:26 +00:00
e8a47e17fb Developer note in default router.config 2014-10-02 11:02:06 +00:00
9df27ea168 Move property file writing methods to Util 2014-10-02 04:06:17 +00:00
cb6b7c4f48 getRouterContext() helper function 2014-10-02 03:55:24 +00:00
ca623e6b18 New class for connectivity checks
Source: https://gist.github.com/str4d/22cac7a3f70bc227cdca
License: http://opensource.org/licenses/MIT
2014-10-02 02:02:26 +00:00
8b6e02136e Fix TextResourceDialog scrolling 2014-10-01 21:06:07 +00:00
6a0493a578 Updated release notes 2014-10-01 20:58:22 +00:00
bf2a437a82 Initial news space fixes 2014-10-01 20:47:02 +00:00
ac949e3f5e Don't use wide view for news webview 2014-10-01 10:50:09 +00:00
7483251393 Copy log entries to clipboard, tweak copy text 2014-10-01 10:31:28 +00:00
d690b7d861 Copy logs to clipboard 2014-10-01 10:23:36 +00:00
829695d690 Move licenses menu option to about dialog button 2014-10-01 03:31:18 +00:00
05c2dbd388 Javadoc improvements
This is the client library 0.2 commit
2014-09-29 23:54:28 +00:00
c8e1643326 New client library translations for ru 2014-09-29 23:53:48 +00:00
d72c936a0e Fix addressbook settings header Intent bug 2014-09-29 23:52:59 +00:00
06d4d7d10d New client lib translations for fr 2014-09-29 04:08:30 +00:00
b506b5e740 New translations for client library 2014-09-26 23:19:38 +00:00
2d65bd373c Configure Transifex for client library strings 2014-09-26 12:28:15 +00:00
7c869adf58 Client library helper class
Based on OrbotHelper from libnetcipher, with logic from i2p.i2p-bote.android
2014-09-26 12:27:51 +00:00
61a7566007 Client library 0.2
i2p.i2p tag: i2p-0.9.15
2014-09-25 05:00:28 +00:00
9d42901079 Updated translations 2014-09-25 04:57:47 +00:00
fb31818a3c 0.9.14.1-rc3 2014-08-23 01:24:52 +00:00
6355214b5f Updated translations 2014-08-23 01:01:37 +00:00
d5c0704477 Updated TODO 2014-08-23 00:45:18 +00:00
411131b8a6 Updated translations 2014-08-23 00:45:04 +00:00
10ed266d2c Clarify property inversion 2014-08-23 00:25:40 +00:00
bccfe03b5d Sync settings XML defaults with router.config defaults 2014-08-22 23:30:35 +00:00
a44ac8a45c Another domain name fix 2014-08-22 14:02:23 +00:00
5610752c6d Updated old domain names 2014-08-22 14:01:19 +00:00
7047913b45 Updated translations 2014-08-22 13:57:33 +00:00
a41aa79920 Explain to users that graphs need to be configured 2014-08-22 13:22:38 +00:00
4fcc1121b7 Padding tweak 2014-08-22 12:09:55 +00:00
514aa51224 Fixed images in peers WebView 2014-08-22 11:50:53 +00:00
0c46dc9bd0 Display auto-start setting in I2PTunnel details 2014-08-22 11:27:11 +00:00
4b7f951e32 0.9.14.1-rc2 2014-08-21 14:37:40 +00:00
a58a9d7540 Fixed "called on wrong thread" issue in browser 2014-08-21 14:33:39 +00:00
d3eaebd324 Temporary fix for a settings bug 2014-08-21 13:40:59 +00:00
37c366a528 Client library 0.1.1 2014-08-21 10:55:32 +00:00
8f6289984b 0.9.14.1-rc1 2014-08-20 11:19:33 +00:00
7629bb54ce Feature graphic for Google Play 2014-08-20 06:41:41 +00:00
ee7d227990 Fixed sq translation 2014-08-20 04:34:44 +00:00
4cc940c995 Updated TODO 2014-08-20 04:28:19 +00:00
2336eebdd0 New translations: sq U id 2014-08-20 04:02:50 +00:00
62035050c5 Padding tweak, prevent status headings flicker when opening app 2014-08-20 03:37:20 +00:00
6775d57c22 Rearranged nav drawer, only show graphs peers and netdb for advanced users 2014-08-20 03:02:29 +00:00
d3a1910b2e Return null on unknown State in Parcel 2014-08-20 02:37:27 +00:00
aa43d960dc Revert AndroidManifest.xml package name change
Changing this requires changing the import path of the generated R file, which
will unnecessarily affect most of the code. R is built in a package based on
the AndroidManifest.xml package name, whereas the final app package name is
overridden in app/build.gradle for free and donate versions.
2014-08-18 14:50:54 +00:00
2e3047274e Added legacy flavor with old app ID, fixed package names in manifests 2014-08-18 13:11:47 +00:00
a3cef11e08 Updated ignores 2014-08-17 23:13:23 +00:00
543fb51d76 Simplify adding client library to a local flatDir repo 2014-08-15 01:41:16 +00:00
4328db1908 Fixed source and javadoc jar creation 2014-08-07 13:25:02 +00:00
69fbb5dc92 Updated translations 2014-08-07 06:57:43 +00:00
0c5d8f8e9e Moved jbigi to client library, so clients get benefit 2014-08-06 22:45:06 +00:00
b88e150803 Final changes, x86 and MIPS libjbigi.so now build
Untested, we need to find x86 and MIPS devices to test with.
2014-08-06 10:52:22 +00:00
35fe44fc59 Initial x86 and MIPS support (not enabled, missing --host parameters) 2014-08-06 00:08:03 +00:00
464adb9e71 More non-ABI-specific script 2014-08-05 23:31:01 +00:00
66d370abeb Reorganized to run non-ABI-specific parts of script first 2014-08-05 23:25:10 +00:00
11aded07ca Refactored to pull out ABI-specific settings 2014-08-04 01:29:04 +00:00
5d0861e22e Only allow numbers in I2PTunnel wizard port fields (ticket #1331) 2014-08-03 21:18:05 +00:00
5778eb9d1c Updated translations 2014-07-26 02:44:45 +00:00
0e47bc5042 Updated translations 2014-07-19 23:26:55 +00:00
8f9a6922ad Bugfixes 2014-07-17 06:40:17 +00:00
05cc0634b7 Updated README 2014-07-17 06:31:04 +00:00
583666695c Improved Maven upload code, collected parameters in gradle.properties
maven-push.gradle source:
https://github.com/chrisbanes/gradle-mvn-push
2014-07-17 06:29:40 +00:00
e67ba59e51 Uploading to the Central Repository 2014-07-17 05:41:57 +00:00
ab619f904d Reverted to Enum for State, make it Parcelable
Talked with zzz and did more research, the overhead of Enum is minimal compared
to the benefits it provides.
2014-07-17 00:56:04 +00:00
f2f7418c8b Ignore old Enum state 2014-07-16 05:26:44 +00:00
23c55d50fb Remove I2CP port starting, clients can use domain sockets now 2014-07-16 04:20:40 +00:00
e0acb322a5 Lint 2014-07-16 03:47:17 +00:00
2a1427054d Use static int constants for State instead of Enums
Enums often require more than twice as much memory as static constants, and
should be strictly avoided on Android.
https://developer.android.com/training/articles/memory.html#Overhead

The advantage of this change is that client library users can directly compare
the status values they get from IRouterState to the constants, instead of
parsing a string representation of an Enum.
2014-07-16 01:28:49 +00:00
d878d2d8a4 Moved AIDL interfaces to client library 2014-07-16 01:25:19 +00:00
5386829edf Implemented I2CP connections over Android Local[Server]Sockets 2014-07-15 13:03:33 +00:00
5d74e7ffef Comments 2014-07-15 11:13:55 +00:00
332ec1e0ad Corrected client library package group 2014-07-15 11:08:39 +00:00
060262ee52 Separated client library version 2014-07-15 10:16:07 +00:00
c75fe55e56 Updated client library package 2014-07-15 08:56:41 +00:00
bccf5e0965 Bundle I2P libs in client AAR 2014-07-15 06:19:31 +00:00
6bd905a027 Fixed client building (thanks alkemist from Freenode#gradle) 2014-07-15 03:40:47 +00:00
fc0b393b14 Markdown fix 2014-07-15 01:52:59 +00:00
f2acde73fe Specify full version for Android Gradle plugin so script compiles when offline 2014-07-14 12:39:32 +00:00
77a7f5f603 Client library AndroidManifest.xml 2014-07-13 21:56:26 +00:00
d235da093f Build script for client library 2014-07-11 05:18:46 +00:00
795d3ab314 Updated translations 2014-07-07 02:58:49 +00:00
dd40931a23 Correct version code for current release
If we move to increment-by-one instead of calculating the version code, we need
to keep the code above the current highest generated code, so that F-Droid will
order new builds correctly above old builds.

If we decide to go back to calculating version codes later, it is possible - we
can increment the version code 2047 times before it will clash with the one for
0.9.14.
2014-07-07 02:43:16 +00:00
8b71e4fc2e Fixed CacheProvider authorities clash 2014-07-07 02:38:51 +00:00
ed61f0414e Padding tweak 2014-07-07 01:24:57 +00:00
06ef95c7ac Better layout padding for main view 2014-07-07 01:14:58 +00:00
2936bfc2b7 wrap long lines 2014-07-04 00:41:33 +00:00
9c655ffebf move from cat|grep|sed to awk 2014-07-04 00:41:17 +00:00
9d8fb684d2 Fixed building armeabi libjbigi.so 2014-07-03 22:36:20 +00:00
0d744e269c Static verification of remote dependencies using Gradle Witness
https://github.com/WhisperSystems/gradle-witness
2014-07-01 05:06:48 +00:00
36ffb6eda4 Default to ../i2p.i2p for copying I2P resources 2014-07-01 04:54:19 +00:00
df7ee4bd05 Updated README 2014-06-29 02:58:32 +00:00
d98d6abff3 Updated android gradle plugin version 2014-06-29 02:33:47 +00:00
260cc8a5a2 Updated gradle specified in wrapper to 1.12 2014-06-28 23:42:13 +00:00
zzz
a0a1df8093 Remove local copies of I2P Secure* utilities since we are
now on Java 6 (API 9).
2014-06-28 15:37:59 +00:00
e4110eb894 Signing instructions 2014-06-28 04:21:45 +00:00
d0264bf475 Addressbook license is copied over, should not be checked in 2014-06-28 02:04:12 +00:00
7ec8b0a592 Copy I2P resources 2014-06-28 02:03:39 +00:00
e3ecac8fec Rquirement: Android Support Repository 2014-06-28 00:40:02 +00:00
4fdc7940dd Version 2014-06-27 17:26:04 +00:00
9920ad34cd Renamed package to net.i2p.android, added free and donate flavors 2014-06-27 17:08:44 +00:00
8a7025038a New translations 2014-06-27 16:40:17 +00:00
a47c80df8c Updated Transifex config 2014-06-27 16:40:10 +00:00
a1a5aeaf6c Don't abort on lint errors 2014-06-27 16:34:01 +00:00
3a8eeabe3e Improved handling of signing keys 2014-06-27 16:29:43 +00:00
3e34bac295 Updated README 2014-06-27 16:19:36 +00:00
66d0dce40c Dropped Eclipse files 2014-06-27 15:55:20 +00:00
c8d3ee7aac Updated ignores 2014-06-27 15:51:55 +00:00
959537adc2 Reflowed AndroidManifest.xml, added missing parent meta-data for below API 16 2014-06-27 15:46:34 +00:00
7ca050fdf5 Cleaned up routerjars 2014-06-27 15:20:58 +00:00
07130abf23 Update min API to 9 (Gingerbread) 2014-06-27 15:15:15 +00:00
ba82d59b89 merge of '3a37cc3435714b0ed267c4f01159b77e1e59cd87'
and 'b1d84ce6fa493115c9ddc12b5a5a5a62c4dadee6'
2014-06-27 15:13:02 +00:00
8819dc5f30 Build scripts 2014-06-27 15:11:49 +00:00
zzz
a034b78dfd Update min API to 9 (Gingerbread).
API 8 (Froyo) is now less than 1% of active devices, and
these devices are generally too low-powered to run I2P effectively.
This allows us to move the remaining I2P jars to Java 6.
2014-06-27 13:52:29 +00:00
2dc56d57d4 Reorganized files 2014-06-27 11:42:20 +00:00
3aff1c4f75 Added gradle wrapper 2014-06-27 06:56:12 +00:00
55509adda6 Ask user to enable I2CP if app requests start with I2CP disabled 2014-06-20 02:33:22 +00:00
zzz
19def413c1 Make shared clients (IRC) delay-open since the HTTP proxy
is not a shared client any more.
2014-06-14 11:31:27 +00:00
63a0e2117f Copy i2ptunnel.config from resource for new installs 2014-06-12 23:17:05 +00:00
21e0b2a667 Listen for START_I2P action 2014-06-03 23:49:10 +00:00
6ce15e27de Updated translations 2014-06-02 22:08:00 +00:00
7a0a56373d Fixed remote usage of IRouterStatus 2014-06-02 21:40:23 +00:00
37da05ca98 Pull in changes to defaults while maintaining user settings 2014-06-01 02:50:15 +00:00
f003bbbfa4 Fixed settings parsing 2014-05-31 23:56:30 +00:00
zzz
a6978bb161 fix net status text 2014-04-27 18:59:34 +00:00
b1ec76de5a Missing change in landscape layout 2014-04-18 11:28:36 +00:00
dc58796c97 Updated TODO 2014-04-09 02:03:38 +00:00
c7075c3fc4 Pull API level from routerjars/AndroidManifest.xml.in 2014-04-09 02:03:25 +00:00
8d4f1b174d Check routerjars/local.properties for NDK dir (ticket #1032) 2014-04-09 01:52:39 +00:00
6f29991829 Updated translations 2014-04-08 12:38:39 +00:00
a414b10ce8 Long press to start/stop router (prevents accidental presses) 2014-04-08 01:12:52 +00:00
030fc60445 Updated i2ptunnel.config from upstream 2014-04-08 00:47:52 +00:00
9d215353e8 Updated release notes 2014-04-08 00:27:29 +00:00
f0a2166ae0 Correct Android forum URL 2014-04-08 00:27:17 +00:00
af097474de Padding 2014-04-08 00:25:43 +00:00
5a1fc32da4 All logging is conditional 2014-04-07 23:53:52 +00:00
7218b79643 Hide Help page until it is finished 2014-04-07 22:48:40 +00:00
ccd5ae45df Removed old translations that have no default string 2014-04-07 22:47:47 +00:00
3584890277 HTTP client tunnel bug disappeared...? 2014-04-07 22:27:47 +00:00
4e17010f59 New translations for nb 2014-04-07 21:22:50 +00:00
aa8009cb70 Updated translations 2014-04-07 21:22:03 +00:00
30d1816c43 Updated translations 2014-03-31 21:25:04 +00:00
02c25ba174 Updated translations 2014-03-16 21:50:14 +00:00
8f8bbcb19f Show "router not ready" message on graph settings page 2014-03-16 10:50:00 +00:00
696ae2bfc0 Prevent graph settings being wiped just after router start 2014-03-15 21:33:31 +00:00
0ea468ea71 Updated TODO 2014-03-15 12:37:40 +00:00
a2d9adb071 Implement required API 19 method override 2014-03-09 09:36:36 +00:00
b8cc64d4ea Updated translations 2014-03-07 21:48:14 +00:00
6e3e99c62f Fixed unzipping resources 2014-03-04 03:28:05 +00:00
84a63cc911 Updated TODO 2014-03-04 03:14:43 +00:00
b8c3b7e3df merge of '1af98386e3efe227cfa78be17a8c4a7785aeea8a'
and '87e720357989c67de7752f3616a85c09b5975eda'
2014-03-04 03:07:32 +00:00
04e190d2d0 Updated translations 2014-03-04 03:07:23 +00:00
ce2a762db2 Temporarily enable inbuilt browser until an alternative is ready 2014-03-04 03:00:13 +00:00
76014f2081 Move hardcoded strings to strings.xml 2014-03-03 22:01:26 +00:00
6d570646f1 Build addressbook.jar instead of addressbook.war (no Jetty dependency) 2014-03-03 03:50:23 +00:00
104c17cb9c Dropped unnecessary drawables 2014-03-01 21:32:49 +00:00
0860ee83b0 propagate from branch 'i2p.android.base' (head 76695da8c3e4ec8e9a3034baa1d60babbef279ac)
to branch 'i2p.android.base.fragments' (head 912c186827c29b8237045712fb25b7500a994fb3)
2014-03-01 21:29:51 +00:00
zzz
707c0e9aa8 url updates 2014-03-01 16:19:02 +00:00
163bc2ce58 only build router once 2014-02-27 02:58:59 +00:00
cec1f8fe52 propagate from branch 'i2p.android.base' (head 13ee72756c9d5407dafed769cda7c7dd5bd66cce)
to branch 'i2p.android.base.fragments' (head 29d48eb27592b749718622a683371d10f07431b2)
2014-02-27 01:57:16 +00:00
97f52f8139 remove res/raw/license_fatcowicons_txt in the clean target 2014-02-27 01:45:00 +00:00
0094cc5637 Only build the router.....when building (ticket #1214) 2014-02-27 01:31:52 +00:00
01c994e7b2 fix tag 2014-02-27 01:30:07 +00:00
b60ae00fd7 19 isn't a valid target anymore; it's now android-19 2014-02-26 23:50:28 +00:00
2340500083 Updated Irc2P servers 2014-02-24 01:14:11 +00:00
zzz
a91261f5ca JNI Build:
- Update JNI build script to use GCC 4.6, required for
   NDK r9b and higher (ticket #1202)
 - Add more checks in build script, to fail quicker on problems
 - Move default NDK build location up one directory level
 - Fix setting JAVA_HOME
 - Fixes for running script in the directory

 I did not replace the checked-in 4.4.3 libjbigi.so with
 the new 4.6 version, as there's no need.
 The 4.6 version will be tested by nextloop in the F-Droid build.
2014-02-23 16:40:47 +00:00
a145729353 Updated .mtn-ignore 2014-02-21 06:32:00 +00:00
0270444a94 Added missing drawables 2014-02-21 06:12:11 +00:00
01e22f4fb5 Updated TODO 2014-02-21 00:14:21 +00:00
2e892841cb Display text from initial news when router is first started 2014-02-21 00:14:07 +00:00
e271dc90ae Removed License button from VersionDialog 2014-02-21 00:13:03 +00:00
77ced0bd1f Revert to RouterLaunch.main(null) (upstream fixed) 2014-02-20 23:06:42 +00:00
ac67533ef2 Moved classes around 2014-02-20 21:42:25 +00:00
305c834aa1 Updated TODO 2014-02-20 11:18:02 +00:00
cbb2973b36 Linkify .i2p URLs 2014-02-20 10:35:22 +00:00
f360ab4d5d Updated RouterService with changes to RouterLaunch.main() 2014-02-20 06:38:51 +00:00
296d21d1d0 Added notifications for clients; notify on news update 2014-02-20 06:36:57 +00:00
a5dd751227 Register shutdown hook in NewsFetcher 2014-02-19 07:16:01 +00:00
d47bdf85d2 New translations 2014-02-07 04:30:04 +00:00
c2a33541b3 Updated translations 2014-02-07 04:28:55 +00:00
3e46d98481 Use the tunnel type ImageView to show tunnel status 2014-01-27 06:18:11 +00:00
124b1499b4 Show list of running tunnels 2014-01-27 06:02:12 +00:00
2d8529e691 Show full router stats as advanced option 2014-01-27 03:37:57 +00:00
4a135023b9 Layout id renaming 2014-01-27 02:51:48 +00:00
e9fbe8c2ef Removed website and FAQ links from nav drawer, added website link to about 2014-01-27 02:31:10 +00:00
228d0204fc Updated TODO 2014-01-26 06:47:32 +00:00
0ebecd9b64 Changed navbar first-use mechanics to match Android design pattern 2014-01-26 06:38:34 +00:00
c062a0f803 Missing change in layout-land 2014-01-26 05:35:46 +00:00
4f24517de9 Hide status ScrollView if router not running 2014-01-26 05:12:45 +00:00
d8636ff563 Added About dialog 2014-01-26 04:59:16 +00:00
4e57f78931 Disable WebActivity from receiving URL Intents 2014-01-26 00:19:17 +00:00
ccbbc3c368 Added link from Log Activity to Logging settings
TODO: Fix link for Preference headers
2014-01-25 20:21:11 +00:00
b9374b5ead Manually set state to WAITING 2014-01-22 15:18:14 +00:00
ceaff935d6 New status image for "no internet" 2014-01-21 07:00:01 +00:00
255702b6bb Updated TODO 2014-01-21 06:52:31 +00:00
2e68aa900b Change to RI tab when viewing RI from LS 2014-01-17 14:57:47 +00:00
67eddba621 Display current default log level in settings 2014-01-17 00:17:54 +00:00
29fb1f0689 Added missing file 2014-01-16 23:56:59 +00:00
de605a1d5b Removed unused import 2014-01-16 23:48:31 +00:00
41b49b7bc8 Call onRouterBind() of detail fragment in two-pane mode 2014-01-16 23:47:49 +00:00
c691a11c3d Added scrolling to RI and LS detail fragments 2014-01-16 19:29:02 +00:00
2f6b1189ae Hide edit action in I2PTunnel 2014-01-16 19:10:33 +00:00
a7a328238b Added TODO list 2014-01-16 18:15:46 +00:00
c9c31ccb76 Stubbed out code for log-level overrides 2014-01-16 18:05:01 +00:00
8457f279f2 Moved debug log entries to Util.d() 2014-01-16 17:40:14 +00:00
fbf353858e Added settings page for logging, config option for default log level 2014-01-15 17:45:40 +00:00
99ef07d1fc Added action to manually reload subscriptions 2014-01-15 02:40:20 +00:00
a5f5e97e37 Use new ClientApp interface to start/stop BOB 2014-01-15 02:04:36 +00:00
165bcc1c9d Removed temp changes 2014-01-11 23:41:02 +00:00
45efd6670f Adjusted labels 2014-01-11 23:40:07 +00:00
b601722b31 Removed temp changes 2014-01-11 23:39:48 +00:00
14e1a2dca1 Notify user if router not running when opening graph settings 2014-01-11 22:40:10 +00:00
d2385166cb Fixed race between router binding and onCreateOptionsMenu() 2014-01-11 22:30:12 +00:00
ed17d59896 Fix WebActivity handling of indirect Intents 2014-01-11 22:06:38 +00:00
55cfd455ca Use indirect Intents to open URLs 2014-01-11 22:06:09 +00:00
f207cf3116 Removed unneeded import 2014-01-11 21:07:42 +00:00
5825d1d2a5 Fetch router state in onResume() 2014-01-11 21:07:22 +00:00
zzz
077f9902a9 update to API 19 2014-01-11 17:36:45 +00:00
d77cbde3b3 Updated target API to 19 2014-01-05 06:00:57 +00:00
62ff63665f Fixed check for state on shutdown 2014-01-04 07:34:02 +00:00
1377aceb18 Use images derived from I2P logo for status 2014-01-04 07:31:59 +00:00
c7617ba856 Ensure state image is correct when router has shut down 2013-12-30 00:08:29 +00:00
08c6018483 Added State.ACTIVE to indicate when router is ready for use 2013-12-30 00:03:08 +00:00
f9f283409d Fixed out-by-one error in logs 2013-12-29 23:34:04 +00:00
4ef42cb462 Scrolling for log entries 2013-12-29 23:30:04 +00:00
65428dda8e Fix IRouterState Service connection leak properly 2013-12-29 23:29:49 +00:00
6311ab4b67 Comment to explain dual-pane criterion for preference headers 2013-12-29 19:22:31 +00:00
0c20a45207 Don't update filter list if content not loaded 2013-12-29 19:18:48 +00:00
6712148010 Fixed potential leak of IRouterState Service connector 2013-12-29 19:07:09 +00:00
07e6e293bc AIDL interface for getting router status, used for MainFragment status images
Other apps can use this interface by copying the AIDL files into their source
tree.
2013-12-29 18:04:39 +00:00
2dd1655e1e Type argument changes caused by i2p.i2p cleanup 2013-12-18 05:26:58 +00:00
97037fe1d8 New translations 2013-12-06 12:20:31 +00:00
d79f797558 Reorganized source files by section instead of by type 2013-12-06 07:56:09 +00:00
42649e02ea Replaced logo with status images, combined start and stop buttons 2013-12-06 02:20:32 +00:00
c6aeb79944 Created some status indication images for the main page based on I2P logo dots 2013-12-06 02:16:48 +00:00
fb66ec62d6 Improved IRC tunnel names/descs 2013-12-05 00:49:50 +00:00
15f1e18da1 Added Nameless IRC to default tunnels 2013-12-05 00:47:32 +00:00
15caf8a97c Reorder main fragment 2013-12-05 00:36:38 +00:00
44989a42f2 Remove bigText when replacing status 2013-11-25 20:29:44 +00:00
3867eb6fda Fixed positional substitution 2013-11-25 20:24:43 +00:00
0755e79b1a Status bar: Show status details as bigText, mirror router status in title 2013-11-25 20:23:31 +00:00
3a1e43b322 Use NotificationCompat.Builder 2013-11-25 11:33:39 +00:00
6a2d494921 Show full Log entry in a detail page 2013-11-19 11:39:55 +00:00
be14d65899 Renamed Log listitem layout, limit list to max 3 lines 2013-11-19 10:50:58 +00:00
c42dc725d6 Migrated LogFragment to use loader 2013-11-19 02:34:58 +00:00
83ab1d09ae Don't crash if RI or LS lookup returns null
Todo: determine why some lookups of OBEPs can be null, and handle the null case
in the UI.
2013-11-18 06:29:07 +00:00
af30dc8e24 Fixed addressbook crash 2013-11-18 06:10:35 +00:00
0268ce13ad Missing change to strings 2013-11-17 20:11:31 +00:00
5b897bc993 Show number of search results in addressbook 2013-11-17 20:09:16 +00:00
1fbf6b1b72 State that File Manager is needed 2013-11-17 12:13:40 +00:00
8095eed241 Added wizard page to read B64 from text file 2013-11-17 12:05:59 +00:00
8916c123ef Hide actions when router not running 2013-11-17 10:40:48 +00:00
b742dd8ee8 Use callback for TunnelListFragment 2013-11-17 10:27:05 +00:00
b02b446e46 Fixed addressbook crash when router not running 2013-11-17 06:26:32 +00:00
01b07fed5b Simplified callback system 2013-11-17 06:19:50 +00:00
2fa205daec Router-down fixes 2013-11-17 05:58:32 +00:00
3644d738ee Cleanups 2013-11-16 22:29:21 +00:00
c044c4de4d Use new callbacks for NetDbDetailFragment 2013-11-16 22:18:04 +00:00
c705527113 Handle corner case where onRouterBind() not called but RouterContext available 2013-11-16 22:13:39 +00:00
8b79af434e Use new callbacks for NetDB 2013-11-16 22:07:32 +00:00
2c8e9d62be Use new callbacks in AddressbookFragment 2013-11-16 21:57:33 +00:00
9832779a50 New callback system to make getRouterContext() reliable 2013-11-16 21:56:10 +00:00
9f535a3260 Save data from add wizard in private book
This does nothing. getRouterContext() is always null when onActivityResult() is
called. Todo: implement callback that fires when the Router has bound and the
Fragment has an Activity.
2013-11-16 10:10:22 +00:00
0beaec366f Use ns.getEntries() to get both name and Dest, and for filtering 2013-11-15 20:30:57 +00:00
8c288ad559 Basic add-to-private-book wizard, does nothing 2013-11-15 10:04:49 +00:00
df5d5ad38e Abstracted most of TunnelWizardActivity 2013-11-13 09:55:53 +00:00
8b1648c37b Only allow adding to private book 2013-11-13 07:57:58 +00:00
cea42e9ec4 Enable privatehosts.txt 2013-11-12 09:54:36 +00:00
64c44838a8 Hide list when loading, remove Toast notification from onLoadFinished()
Addressbook Loader works (from previous commit). Todo: put name count
in list header.
2013-11-12 05:35:08 +00:00
76f9259ee7 Filter addressbook in the Loader 2013-11-12 02:42:46 +00:00
d437f45132 Use TreeSet to sort Addressbook names 2013-11-12 02:33:19 +00:00
fc618ad9e5 Disabled country lookup, no GeoIP file 2013-11-12 02:20:39 +00:00
15275680e8 First pass at migrating Addressbook to use Loaders
Broken, addresses do not load into mAdapter after a tab change.
2013-11-12 01:10:29 +00:00
7848a81110 Added tabs to Addressbook 2013-11-12 01:01:34 +00:00
207f9837d0 Don't duplicate RouterContextProvider interface 2013-11-12 00:42:14 +00:00
cda09ea4f5 Suppress "unchecked" warnings 2013-11-11 21:41:26 +00:00
2a15994a76 Load real stats into NetDb ViewPager
getRouterContext() returns null in onActivityCreated(), there is a race
condition to fix somewhere, use refresh action to load.
2013-11-11 20:23:07 +00:00
e954953130 Reconnect to existing loader when screen rotated 2013-11-11 19:57:58 +00:00
8b51c26a6b Expanded NetDB detail pages to match /netdb 2013-11-11 10:02:52 +00:00
d40f806be6 Use Util.e() 2013-11-11 04:06:04 +00:00
bf5b29da76 Fixed NetDB detail filling 2013-11-11 04:03:08 +00:00
18c4276ba0 Fixed id 2013-11-11 04:01:39 +00:00
a4107e974a First pass at NetDB details, runs but View is not filled 2013-11-11 03:26:32 +00:00
8dd35f6c0f New translations 2013-11-11 03:23:40 +00:00
5a4be4ae86 Added missing file 2013-11-11 03:17:12 +00:00
9527725760 Process RI/LS in NetDbEntry, use DatabaseEntry when possible 2013-11-11 03:15:34 +00:00
b6a8fc02f5 Removed unused import 2013-11-11 01:25:21 +00:00
7794a7db5b Use manual action to refresh NetDB list instead of timer 2013-11-11 01:22:52 +00:00
c03debf332 Implemented Entry/Loader/Adapter for NetDbListFragment 2013-11-10 22:30:52 +00:00
fbc56d4eb9 Only use ViewPager for NetDb stats 2013-11-09 12:25:03 +00:00
2a050b3ca1 Updated AndroidManifest for renamed class 2013-11-09 12:20:28 +00:00
48c8d84d2f Fixed new version dialog text 2013-11-08 20:56:52 +00:00
b6d6258e95 Renamed Rate graph code 2013-11-08 19:41:17 +00:00
47215495ed add patch from ticket #1103, consistency fixes, remove some unneeded bashisms, set proper JAVA_HOME on OSX 2013-11-01 02:01:15 +00:00
9e45f1998b remove executable bit 2013-11-01 01:59:40 +00:00
788445f6ce New translations 2013-10-15 19:52:39 +00:00
a057e4a512 Show dialog if graphs are not ready 2013-09-28 13:36:31 +00:00
7a09670097 Removed unused import 2013-09-28 12:15:58 +00:00
c92d881a51 Dynamically fetch current list of graphs 2013-09-28 12:11:30 +00:00
8c2ba03880 Added settings for which graphs to plot
The onPause() method in SettingsFragment was removed as it is unnecessary. The
parent SettingsActivity onPause() is sufficient to save config changes.
2013-09-28 11:34:54 +00:00
9c9f871667 Fixed some warnings 2013-09-28 02:39:41 +00:00
7f9758197d Missing changes from previous commit 2013-09-28 02:18:11 +00:00
f6d1c093e4 Migrated SettingsActivity to preference headers 2013-09-28 02:17:35 +00:00
5e045bc23b Show current value in exploratory tunnel settings menu
TODO: Refresh summary when a setting is changed.
2013-09-26 21:23:30 +00:00
f667a81c6d Stop TunnelDetailFragment crashing if mTunnel is null
TODO: determine why mTunnel is not being set.
2013-09-25 03:52:27 +00:00
a13a405b49 Created white itoopie SVG, exported new notification icons 2013-09-25 03:38:36 +00:00
383ece497f Pulled in (and cleaned) SVG from i2p.itoopie, exported cleaner launcher icons 2013-09-25 02:16:30 +00:00
075c7c09d7 First draft of NetDB page: nav drawer w/ ViewPager, tabbed categories 2013-09-20 05:28:18 +00:00
7cec48e55f Combined error log and log views into a drop-down list 2013-09-08 06:48:58 +00:00
7ddd3c69c8 Save and restore selected rate graph 2013-09-07 13:49:16 +00:00
9d965a5504 Removed hard-coded title from graph (drop-down is more informative) 2013-09-07 13:44:55 +00:00
abd4a99654 Moved hard-coded list of graphs from nav drawer to actionbar drop-down 2013-09-07 13:42:27 +00:00
92c734624d Save and restore selected tunnel tab 2013-09-07 13:15:40 +00:00
81d0441d2b Implemented stat graphing
StatSummarizer and SummaryListener are based on the same-named classes from the
routerconsole. Data is stored in memory using an AndroidPlot SimpleXYSeries.
Only the last 30 points are currently stored.
2013-09-07 08:07:15 +00:00
9c7b2142cf AndroidPlot library version 0.6.0 from http://androidplot.com/download/
License: Apache 2.0
2013-09-07 08:05:33 +00:00
3da41888b7 Don't delete libs/ 2013-09-07 07:58:16 +00:00
bf47b901b7 Restored reload action (needed to update webpage if cached), fixed back nav 2013-09-06 00:53:03 +00:00
54a446ebdb Fixed Addressbook domain opening in left column of two-pane mode 2013-09-05 23:45:55 +00:00
0eb0c67616 Moved remaining links on main page to nav drawer
A WebActivity has been added back to encapsulate the web browser functionality,
allow the nav drawer items to be launched and enable other fixes.
2013-09-05 23:43:44 +00:00
409d823dec propagate from branch 'i2p.android.base' (head 673745663d325fbda1918746084110decd77634e)
to branch 'i2p.android.base.fragments' (head 9a651bea924de2d108bd743e4cb20958d281a4ff)
2013-09-05 23:02:46 +00:00
0208e58a3b Fixed previous commit
Refreshing is now disabled in PeersFragment and WebFragment, but both of them
will eventually be removed.
2013-09-05 12:25:32 +00:00
6d18e50a3a Removed start/stop and reload buttons from main menu 2013-09-05 11:48:08 +00:00
c748610280 Added PeersActivity; moved peers link to nav drawer for now 2013-09-05 11:43:41 +00:00
7768c624f9 New I2PFragmentBase so Fragments can access RouterContext, migration changes
All page logic is in the Fragments. Activities don't need the convenience
methods.
2013-09-05 06:07:34 +00:00
72ed6bd170 Migrated nav drawer code into I2PActivityBase 2013-09-05 03:54:09 +00:00
3d5b9938fd Migrated I2PFragmentBase back to I2PActivityBase
zzz and sponge pointed out that the router needs to be managed by whatever
Activity happens to be active (in case an automatic start is required). This
commit reverses the initial migration of I2PActivityBase to a Fragment (code is
broken now).
2013-09-05 03:39:15 +00:00
03b5927447 Updated refresh icon, removed old icons 2013-08-28 06:47:01 +00:00
b7a6b4acd5 Manifest change missing from previous commit 2013-08-28 06:02:51 +00:00
e27e1e55bd Implemented an Addressbook picker for Destination in tunnel wizard 2013-08-28 05:26:24 +00:00
0b0511dbce Added verification of Destination in tunnel wizard 2013-08-28 03:14:30 +00:00
02c370a04a Added input validation support to SingleTextFieldPage 2013-08-28 02:48:05 +00:00
4810c9e990 Implemented starting and stopping tunnels 2013-08-28 00:42:29 +00:00
cc801de79d More indent changes 2013-08-27 23:58:58 +00:00
93fd4f7e0c Fixed indent 2013-08-27 23:56:45 +00:00
abd9908a21 Moved tunnel list help handler to correct class, removed unused imports 2013-08-27 23:54:34 +00:00
52d278134c Added help link to tunnel list overflow menu 2013-08-27 23:51:57 +00:00
c60e4f6b3e Set up action buttons for starting and stopping tunnels 2013-08-27 23:47:18 +00:00
5b7452ff90 Fixed two-pane tunnel deletion 2013-08-27 11:12:47 +00:00
014fc9b79b Added edit and delete actions to tunnel detail fragment, implemented deletion 2013-08-27 10:11:01 +00:00
9ca0ce3192 Moved TunnelWizardModel parameter descriptions into resources 2013-08-27 04:01:20 +00:00
99d720c685 Implemented tunnel creation backend
The methods in TunnelConfig and TunnelUtil are taken almost verbatim from
IndexBean (modified to be static in TunnelUtil). The tunnel creation wizard
works now, and the new tunnel will start if auto start is enabled.
2013-08-27 03:53:07 +00:00
c46ba4f24b Moved tunnel wizard model key strings into resource, dismiss submit dialog 2013-08-27 03:36:27 +00:00
522178598b Pass tunnel wizard data back to TunnelListFragment 2013-08-26 11:50:12 +00:00
5b6658531e Readability, documentation of TunnelWizardModel 2013-08-26 08:59:36 +00:00
333455b738 Bugfixes 2013-08-26 08:21:05 +00:00
5ebdeedb2b Another required parameter 2013-08-26 06:44:13 +00:00
0af8d2145f Set more tunnel parameters as required 2013-08-26 04:26:55 +00:00
5ac6d51289 Added support to SingleTextFieldPage for setting a default string 2013-08-26 04:18:02 +00:00
238ab91092 Implement full tunnel wizard model 2013-08-26 02:32:44 +00:00
0af8ed90f7 Added NotEqual and EqualAny, removed show-on-null assumption 2013-08-26 02:31:08 +00:00
c761287a8a Added support for complex branching with Conditionals 2013-08-26 01:23:00 +00:00
a77674603a Restore checked status 2013-08-26 01:07:21 +00:00
9a2382d886 PagerAdapter -> MyPagerAdapter 2013-08-26 01:04:03 +00:00
0d58d81bce Added OnClickListener to tunnel wizard dialog, does nothing yet 2013-08-25 13:15:28 +00:00
1e4300cb83 Stretch or shrink the StepPagerStrip to fit the width by default
This is better for smaller devices. Larger devices will be customized later.
2013-08-25 13:14:20 +00:00
28b0950990 Added SimpleTextFieldPages for the main tunnel parameters needed 2013-08-25 13:13:10 +00:00
536102658a TextField* -> SingleTextField* for accuracy 2013-08-25 12:49:46 +00:00
6754f6b5b1 Tweaks to text field page, added a single boolean page for auto start option 2013-08-25 06:26:12 +00:00
06d1903184 Dummy tunnel creation wizard - most structure in place, does nothing 2013-08-25 01:39:37 +00:00
4d13e8adfd Added a TextFieldPage to WizardPager 2013-08-25 01:12:59 +00:00
145b249394 Added WizardPager code from https://github.com/romannurik/android-wizardpager 2013-08-25 01:06:06 +00:00
a00c08bb49 Moved I2PTunnel code into separate package 2013-08-24 06:26:51 +00:00
449627be3d Started expansion of I2PTunnel detail Fragment
Most of the getters in TunnelEntry are almost verbatim from
net.i2p.i2ptunnel.web.IndexBean and net.i2p.i2ptunnel.web.EditBean
2013-08-24 04:30:55 +00:00
27be4aacb2 Adjusted weighting of two-pane layout, set AddressbookActivity to use it 2013-08-22 22:12:41 +00:00
f4f849182d Added detail page for tunnels and a two-pane layout for large screens
There are a lot of changes here:
- The main_content FrameLayout is now main_fragment (more logical name).
- TunnelEntry now stores a Context instead of a TunnelEntryLoader (so
  it can be instantiated inside the detail Fragment).
- The activity_navdrawer layout is now an alias to a one-pane or two-pane
  layout depending on screen size.
- Subclasses of I2PActivityBase can now override canUseTwoPanes() to enable
  and use the two-pane layout (for devices that support it).
2013-08-22 14:52:00 +00:00
32d8a7112c Added missing I2PTunnel status stars 2013-08-22 14:37:45 +00:00
4dbfff292b Missing AndroidManifest update, prep code for help content 2013-08-22 01:48:50 +00:00
228d27d82b Moved licenses and release notes into menu of new HelpActivity 2013-08-22 01:46:42 +00:00
9d0858ad17 Override method for when nav drawer opens/closes to hide/show action bar items 2013-08-22 01:05:55 +00:00
480dacb7f2 Fixed warnings in SeekBarPreferences 2013-08-21 11:39:42 +00:00
84edc743f5 Fixed SeekBarPreferences to check resource strings 2013-08-21 11:34:31 +00:00
b7dfc45b1e Prep for I2PTunnel details fragment 2013-08-21 11:03:39 +00:00
bd0ebc8852 Removed Addressbook from menu (it is in the nav drawer) 2013-08-21 10:14:35 +00:00
8c0e2228a5 Communicate between Fragments via the container Activity, not directly 2013-08-21 09:57:14 +00:00
4dafc3e5af Import VersionDialog, not just the listener 2013-08-21 09:54:08 +00:00
291294435a Removed unused imports 2013-08-21 09:53:13 +00:00
99588c3cb1 Filled tunnel row layout with tunnel data 2013-08-19 00:15:00 +00:00
f7904e0c7e Added TunnelEntry to format TunnelController data, expanded tunnel row layout 2013-08-18 14:27:17 +00:00
ae2fa4dce7 Fill I2PTunnel list with a Loader
Until changes to the list of TunnelControllers can be monitored, the Loader
refreshes the view every 10 seconds.
2013-08-18 12:46:13 +00:00
bdbc777a52 Added TunnelControllerAdapter, filled tunnel lists with names
Router must be started and client tunnels built before loading the I2PTunnel
Activity, or it hangs when switching tabs.
2013-08-18 00:13:05 +00:00
320e8d5153 Added client and server tabs 2013-08-17 11:53:12 +00:00
c53b98d2b9 Changed LicenseFragment to a ListFragment 2013-08-17 11:21:54 +00:00
e1236d2824 Replaced list header with Toast in Addressbook 2013-08-17 09:37:29 +00:00
d7ac916eeb Changed AddressbookFragment to a ListFragment
Previous commit was not broken, a clean build fixed the problem.
2013-08-17 05:41:42 +00:00
5b9203f77d File framework for I2PTunnel interface
Broken: cannot find net.i2p.i2ptunnel.I2PTunnel
(but it can when launching the router)
2013-08-16 21:19:08 +00:00
9757d6e396 Added missing search icon for action bar 2013-08-16 21:17:21 +00:00
c2ff90af91 Fixed activity parents 2013-08-14 05:12:31 +00:00
c1e8719d0e Fixed bug in manifests 2013-08-14 04:46:04 +00:00
56198bf771 Moved logs and error logs into nav drawer 2013-08-14 04:40:19 +00:00
73286f43f6 Moved licenses button into nav drawer
Temporary; will eventually be in an about menu in settings
2013-08-14 04:22:58 +00:00
cd3157038c Fragmented LicenseActivity, turned TextResourceFragment into a DialogFragment 2013-08-14 04:11:37 +00:00
9359c7a726 Implemented Addressbook filtering via SearchView in action bar 2013-08-14 01:47:10 +00:00
058f41ec73 Set up SearchView in Addressbook action bar in preparation for searching
The navigation drawer has been (mostly) migrated to link to Activities instead
of Fragments. Only Activities can be searched via the inbuild Android search
function, which uses Intents.
2013-08-13 13:54:39 +00:00
e4c9095626 merge of '73d2724826ecdabe3e124af9e485c44fe7188117'
and '977f74485a75e34e7488c13e06849f6dfb5d2d2a'
2013-08-12 01:44:37 +00:00
dd90ea9874 Put full strings in android:dialogMessage for SeekBarPreference
The SeekBarPreference class needs fixing to follow resource references.
2013-08-12 01:44:31 +00:00
zzz
53c7770e4e - Handle 4-digit core version
- Set API in version string to min version
2013-08-11 14:50:01 +00:00
21274f0335 Added es translation 2013-08-11 13:58:21 +00:00
4ccf3e713d tr-rTR -> tr to support other regions as well 2013-08-11 13:58:05 +00:00
2ef4d71cdb Renamed navigation drawer layout 2013-08-10 10:20:31 +00:00
c2bc999847 Turned navigation drawer code into base activity to subclass 2013-08-10 10:17:41 +00:00
d3f37a21a5 Show navigation drawer on first run 2013-08-10 09:16:19 +00:00
658d2a68e2 Removed unused imports 2013-08-10 05:43:41 +00:00
490148cb5b Migrated old Dialog to DialogFragment 2013-08-10 05:38:28 +00:00
430d56b681 Set choice mode for navigation drawer
This should have enabled the current navigation drawer entry to be highlighted
by the call to setItemChecked() in selectItem(), but it still doesn't work.
2013-08-10 03:43:34 +00:00
405bb3317e Show some menu items in action bar 2013-08-10 03:40:13 +00:00
bbb41c9c54 Use dp instead of px, added content description for logo 2013-08-10 03:29:58 +00:00
5c9c438e28 Moved Addressbook button to navigation drawer 2013-08-10 01:40:22 +00:00
27239cf09d Renamed menu1.xml 2013-08-10 01:26:12 +00:00
b853c3af39 Only call onBackPressed for I2PFragmentBase subclasses 2013-08-10 01:20:59 +00:00
48f84f1a1b Added tr_TR translations 2013-08-10 01:19:45 +00:00
eb4ae2c66d Set minimum percentage, add language code mapping for tr_TR 2013-08-10 01:06:37 +00:00
17be8fb3f7 Load WebFragment properly from AddressbookFragment 2013-08-10 00:50:10 +00:00
bf5accb121 Converted AddressbookActivity to Fragment 2013-08-10 00:44:55 +00:00
4749e470b5 Fixed static reference 2013-08-09 23:35:32 +00:00
0553815777 Removed unused imports 2013-08-09 23:30:58 +00:00
57d81fb14d Migrated home buttons to use Fragment transactions 2013-08-09 23:30:37 +00:00
ee97af6e4f Fix labels in navigation drawer 2013-08-09 12:31:45 +00:00
6397a93cac Enable app icon for navigation drawer opening 2013-08-09 11:59:16 +00:00
03465185f9 Moved Fragments to net.i2p.android.router.fragment
Side-effect: some constant strings are now public
2013-08-09 11:52:33 +00:00
ddd9a195e6 Removed "I2P Home" from action bar (linked in navigation drawer) 2013-08-09 11:14:11 +00:00
664985461a Initial migration to navigation drawer and Fragment
- Migrated I2PActivityBase and subclasses to Fragment
- Added new MainActivity with navigation drawer to handle Fragments
- Added MainFragment to navigation drawer

Code compiles, installs and runs. Known bugs created:
- Some buttons now fail (can't use an Intent with a Fragment)
  -> Migrate usage of Intents to Fragment transactions
- New install/upgrade dialogs are commented out
  -> Migrate old Dialogs to DialogFragments
2013-08-09 11:11:37 +00:00
6d340dc056 Added Transifex config 2013-08-09 06:22:47 +00:00
f312b7c6f1 Extracted more strings 2013-08-09 03:24:15 +00:00
a42bd73de3 Comment out add button in AddressbookActivity 2013-08-08 14:24:59 +00:00
4424392bdc Comment out add button until it does something 2013-08-08 14:17:11 +00:00
bfe71213f8 Extracted more strings 2013-08-08 14:07:34 +00:00
cd2a12c8ed Use dp instead of px, removed invalid property (for LinearLayout) 2013-08-08 13:45:50 +00:00
4ca2ed756f Updated README.txt 2013-08-08 13:30:54 +00:00
a4abfd8fb8 Updated support library path to match README.txt 2013-08-08 13:30:41 +00:00
9d754c29ae Moved ic_content_new.png to proper folder 2013-08-08 13:05:17 +00:00
0101e63bce Updated .mtn-ignore 2013-08-08 03:33:40 +00:00
75fe8bfbe0 Removed another old import 2013-08-08 03:23:16 +00:00
806f6edbf1 Removed old import 2013-08-08 03:07:16 +00:00
767ff4f3d2 Merged methods 2013-08-08 02:55:52 +00:00
07fafb03b6 Added ActionBar to Addressbook, placeholder add action 2013-08-08 02:52:02 +00:00
e98f86b29a Updated .mtn-ignore 2013-08-08 02:33:07 +00:00
18bc4f141d Setup for ActionBar using appcompat support library
The path in project.properties will require local overriding. I tried directly
referencing the SDK with ${sdk.dir} but the build fails with an absolute path
to a library.
2013-08-07 13:07:49 +00:00
a3792bad7a Set target SDK to 18 2013-08-07 12:37:34 +00:00
745bd3fa94 Set target SDK to 18 2013-08-07 12:00:15 +00:00
97692a4635 Use color style instead of explicit color 2013-08-07 03:35:06 +00:00
3fe7575dab Removed FrameLayout 2013-08-06 05:41:23 +00:00
a7fc5090f3 Simplified settings layout, pulled strings into resource file 2013-08-05 14:41:08 +00:00
6154f64120 Set text resource color to stop color-change on touch 2013-08-05 12:52:13 +00:00
0e5ca23732 Fixed bug in main.xml 2013-08-04 04:34:17 +00:00
c47e7dab31 Added Eclipse project files
To satisfy dependencies, import the following other projects from i2p.i2p into
the same Eclipse workspace as i2p.android.base:
i2p_sdk       - core/java/
i2p_router    - router/java/
i2ptunnel     - apps/i2ptunnel/java/
BOB           - apps/BOB/
addressbook   - apps/addressbook/
jetty         - apps/jetty/
ministreaming - apps/ministreaming/java/
2013-08-04 04:33:56 +00:00
zzz
472fa6d49e - Adjust default configs, esp. ones on the settings page
- Update release notes
- Lower log levels
- Spelling fixes on settings page
2013-07-30 19:52:25 +00:00
60ece9d4d2 fix honeycomb notification annoyance 2012-12-14 02:07:22 +00:00
afd656c6b4 Fixes to peers webviewer 2012-10-04 16:46:03 +00:00
78e250a207 Small stats cleanup 2012-09-20 02:15:32 +00:00
134db2ecd3 Allow _fast_ quit v.s. graceful when user hits stop and then back button. 2012-09-11 13:10:11 +00:00
53caad9f2a Fix state recognition on restart. 2012-09-11 12:44:00 +00:00
742df967e2 Clean up poorly formed code (lint), fix close on rotate. 2012-09-11 09:14:46 +00:00
5d0c5c30eb Fix stale notification icon + refactoring 2012-09-11 06:32:53 +00:00
cb9924a0bf (Security fix) Fully kill the app and remove it from memory if not running. 2012-09-11 02:32:44 +00:00
3ceed9a6b3 Remove checks for properties, as-per zzz 2012-09-10 21:14:47 +00:00
c3d95a608d fix numaric typo 2012-09-06 13:00:31 +00:00
1b004a628e Fix bad router config for ports. This really belongs in the core... 2012-09-05 06:09:03 +00:00
b080bd387a If no participating tunnles, blank that status line out. 2012-09-04 12:19:24 +00:00
7a429674a7 Add missing colon 2012-09-04 06:52:12 +00:00
45a1511cab Add 10pixel border, adjust scrollbars 2012-09-04 06:46:28 +00:00
6c7be97ed5 FatCowIcons license was not copied from i2p.i2p, so I added it to custom_rules.xml
(for copying on build) and changed LicenseActivity to show it.
2012-09-03 22:58:10 +00:00
3244509cab Added icons to the UI. Used fatcow icons since the license is allready in place.
Screenshots could be found at: http://meeh.i2p/android/ui/2/
2012-09-03 22:19:08 +00:00
43a20d18c5 last adjustment to i2ptunnel config 2012-08-31 13:57:26 +00:00
e2332543ec Fix kytv's irc server settings, oops 2012-08-31 04:26:05 +00:00
4d68da45b4 Seperate out kytv's irc server 2012-08-31 04:17:24 +00:00
084ed85467 no more bouncy castle, wrapper.log fix 2012-08-28 13:17:46 +00:00
1d060fd419 Revert UPnP now that it was fixed. 2012-08-18 00:00:03 +00:00
a95ca82a3e Make service foreground, so droid does not stop us 2012-08-17 22:42:00 +00:00
c13101d535 More sensable defaults, especially dangerous 1 hop tunnels. 2012-08-13 00:07:15 +00:00
7dc7697c14 fix mysterious file name, force routerjars 2012-08-12 22:50:39 +00:00
91fb0a2248 Adding res/menu/activity_addressbook_settings.xml 2012-08-12 19:40:32 +00:00
2663cc7d57 Forgot a resource file. 2012-08-12 18:48:52 +00:00
f9fce317d3 Added support for ndk building in osx. (Hope i did't breake it.. worked on osx 10.8 / ubuntu 12.04)
Also did some changes in AddressbookSettingsActivity; changed the way subscriptions.txt is readed and removed tabs. also changed some handlings in save function.
2012-08-12 16:29:25 +00:00
f87a3eb03c Cleaned up a bug I made making it unavailable on ubntu and most surely other linux distros.
I've think I have fixed it, but it would be perfect if someone with good shell skills could check.
2012-08-12 14:41:20 +00:00
zzz
36a0f2c678 - Enable SSL reseed
- Update README.txt and release notes
- Add irc.killyourtv.i2p to IRC list
- Use new buildI2PTunnelJar target
- LogWriter cleanup
2012-08-12 11:25:06 +00:00
f8fe3f082a Added support for building jni in osx. Also forgot to add new source files from last commit. 2012-08-12 04:02:24 +00:00
6e130185de Added AddressbookSettingsActivity, and a link via settings. It's now possible to update subscriptions.txt on android. 2012-08-12 03:55:13 +00:00
006fc1dc51 Moving i2plogo to top and fixed a typo. 2012-08-11 21:05:21 +00:00
87836ddab6 Some UI changes to the main activity.
* Rearanged views
* Bigger buttons
* Removed wallpaper
* Added topic labels
2012-08-11 20:49:12 +00:00
ff7154b525 oops, forgot to add arrays.xml 2012-08-11 15:59:11 +00:00
7a829236b9 Add data usage stat 2012-08-08 03:31:41 +00:00
d3edd31155 test commit 2012-08-04 12:57:08 +00:00
455726f05a merge of '28e40eada54b4ffaffbdedb720514e9c75bde890'
and 'ed5a9580c190b1f53ebc6c46fe936b6c80114779'
2012-08-03 03:55:49 +00:00
5dc9d729f4 Fix buildnumber js, add more settings 2012-08-03 03:53:20 +00:00
6d42b93de4 merge of 'a6013429f41dd5ea107ee5e56da100592f7ede0c'
and 'eddaa1f2aaa94d303db9952dc8a04e7f10a19bf3'
2012-08-03 02:38:24 +00:00
39b54c41ab Remove duplicate Debug, move wrapper.log delete to a better place. 2012-08-03 02:37:40 +00:00
f8920298ee merge of 'b8271f21729bb5732b5383ee78febb68bde639af'
and 'c300165977b04a83f75252de61018f9122d0b2fc'
2012-08-03 01:08:33 +00:00
cc3b37c4c0 change install location to auto 2012-08-03 01:08:21 +00:00
0cdd5a5d88 merge of '382962c8f01043a3d3b75c95bf3d469b5aabc799'
and 'bc7602f413292ff3e11f3c9dbeb513075f10af14'
2012-08-03 00:58:00 +00:00
b61bc8f5ef move manifest files, change install location to auto, additional ant file tweaks 2012-08-03 00:57:44 +00:00
2a6a2ef7a7 merge of '96f925faf1d190d7b7d71c043d3b73853cc7a9f7'
and 'a081d5b6c58932415d009872ca843b36587fc455'
2012-08-01 14:59:49 +00:00
245f69f2d3 Fix build problems for the routerjars libs stuff... Should build fine now. 2012-08-01 14:59:29 +00:00
4c43b6f5d5 merge of 'cd63013f274d56bce70efcc4b1f0004411f9013a'
and 'eea8516ab4cd7b29f403d17fff0272a38d3cba7c'
2012-08-01 13:37:50 +00:00
28230c914d finish sync 2012-08-01 13:36:30 +00:00
f7e1acdb68 merge of '6a29ded18e13ec9d52d9af1abc2cbc21d2cc80d0'
and '8b6ea99d1c37c57f25c94df8231ae4a6e765db8c'
2012-08-01 13:32:13 +00:00
995cd7f327 javascript all the buildnumber stuff, new target incrementBuild, use when i2p.i2p source has not changed, but android source has changed. 2012-08-01 13:29:14 +00:00
zzz
1e024c22da fixup after merge 2012-07-31 23:11:22 +00:00
zzz
4e853a753f merge of '099d95534fe893da4acef3a0b5ab0ea8d74b2d79'
and 'aec2af21d2c3fe9b04ec51cb63fa8ef1188a3eb6'
2012-07-31 23:07:18 +00:00
01547e9a20 Add missing file 2012-07-31 20:01:59 +00:00
zzz
09b2af14fd merge of '9bda005612c09e3581b62178a01594526384c36b'
and 'f5cf8336fa20e64d9ff7dc28776621fb88ccef5c'
2012-07-31 19:52:23 +00:00
f5d06470e4 incrementBuild target, be sure to execute it manually from ant to increment build number 2012-07-31 19:42:49 +00:00
zzz
abe20c95d0 - Enable NTP based on SDK version
- Disable SSL reseed (temp until merge)
- Update release notes
- Restrict addressbook to only hosts.txt file
2012-07-30 21:59:15 +00:00
c9abfa80f0 Make SeekBar away from edges and away from value view 2012-07-29 21:36:16 +00:00
f34ef46dbf Make SeekBar width expand in a way that actually makes sense for the value range 2012-07-29 21:18:16 +00:00
0c30296888 Huge refactor, fixes, settings, put jbigi.so back in too. 2012-07-28 00:34:05 +00:00
3fd373ad8c less transparent icons, they were too dark, and difficult to see 2012-07-25 14:03:15 +00:00
41091dce25 BOB 2012-07-24 19:21:17 +00:00
0fbaeb0ea4 Don't ask for signing passphrase on the lib build 2012-07-24 05:59:45 +00:00
19791a5965 builds fine now 2012-07-24 05:25:49 +00:00
9d4c0aa839 Reorganize router to own sub-project to avoid build errors 2012-07-24 05:16:21 +00:00
0b12a952cb update README.txt 2012-07-23 23:47:16 +00:00
a95aa6e89b Janitorial work, imports and some warnings 2012-07-23 09:33:42 +00:00
f13c772509 install certificates 2012-07-22 02:17:04 +00:00
0f28c4d807 archive certificates 2012-07-21 19:54:08 +00:00
a649d434c7 Finish fixing ant issues, needs work yet. 2012-07-15 08:42:47 +00:00
23c5710d42 Move to newer ASDK and ant, does not compile 2012-06-30 16:31:56 +00:00
zzz
52a60b37e2 handle core versions without the 3rd digit 2012-06-29 12:43:09 +00:00
zzz
adb5c56f26 disable upnp again 2011-07-10 13:45:25 +00:00
zzz
177ac2e3a1 - Addressbook message tweak
- Tweak log levels
2011-07-05 13:07:03 +00:00
zzz
1219725e6a - Notification icon rotations
- Clean up debug text on main screen
- Move most logging from System.err.println to Util
- Stub out HTTP auth handler
- Don't restart Peers page on orientation change
- Add inbound/outbound arrows, not loaded yet
- Tweak log levels
2011-07-04 16:15:45 +00:00
zzz
db1932a908 android-0.8.7-4_b1-API8 2011-07-03 18:44:22 +00:00
zzz
9ff31a1872 fix spacing 2011-07-03 18:40:06 +00:00
zzz
0326783442 fix 2011-07-03 18:27:48 +00:00
zzz
e1b07f45fa - Delete dup license files
- More build cleanups
- Don't start router by default at first install
- Initial news cleanups
2011-07-03 18:25:16 +00:00
zzz
4d4eb2c48b - Build, versioning, and release note cleanups in preparation for release 2011-07-03 16:36:32 +00:00
zzz
6c48f042f9 - Hook up start and stop router menu items
- More updates to release notes
2011-07-03 14:28:00 +00:00
zzz
9869d08295 fix dumb NPE 2011-06-30 23:25:08 +00:00
zzz
0a5e6007da - Proxy error pages and CSS. Needs a little help still. 2011-06-30 23:10:08 +00:00
zzz
dbc6c22156 more progress dialog fixups 2011-06-30 19:36:56 +00:00
zzz
e62ce19a49 dialog cleanup 2011-06-30 18:35:45 +00:00
zzz
6c803935c7 - Top-level uri fixup part 3: Set base uri when loading from cache
- More debugging in WVC
2011-06-30 17:51:58 +00:00
zzz
a88edb8ea8 - Top-level uri fixup part 2: Remember base uri in CacheProvider;
do the rectification in CacheProvider too
2011-06-30 16:59:44 +00:00
zzz
57f3c95d72 - Doc updates
- Force hosts.txt naming service
2011-06-30 13:39:55 +00:00
zzz
3021c0bc91 top-level uri fixup part 1 2011-06-30 02:36:26 +00:00
zzz
293e51c175 - Reverse content URI back to I2P URI in WVC so we can load it
there instead of via the provider
- Several reload fixes
2011-06-30 01:38:17 +00:00
zzz
448d74e172 - Load clicked i2p sites via EepGetFetcher output stream and resource cache
- Toast on cache load
- Don't lose current page on orientation or keyboard hidden events
- Implement reload
- Quit is the new stop
2011-06-29 23:39:00 +00:00
zzz
92d47564dd - Handle resource URIs in the WV Client
- Switch from URI to Uri in the WV Client
- Canonicalize resource URIs if necessary
- Switch from HashMap to SharedPrefs in CacheProvider
- Use cache when going forward too
- CacheProvider remove old entries in onCreate()
- CacheProvider cleanup
- gc on router stop
- Add reload menu item
- Don't return to welcome page on activity restart
- Notification on client tunnels up/down
2011-06-29 20:05:57 +00:00
zzz
d51126cab4 - Add OutputStream variant of EepGetFetcher
- EepGet from the CacheProvider
2011-06-28 02:28:35 +00:00
zzz
752ac44930 - Use new eepget features to pass error page through 2011-06-28 00:05:03 +00:00
zzz
8833020455 - Use Uri for cache key instead of String
- Cache inserts and deletes to provider
- Still need to untangle the AppCache and CacheProvider
- Fix clean of class files before build
- Wrap main page in a ScrollView
2011-06-27 20:37:06 +00:00
zzz
e489c8d937 stub out a cache ContentProvider 2011-06-26 00:27:38 +00:00
zzz
9c4e661e53 - Implement LRU file cache with max size and file count
- Use cache for going back in webview...
  Sadly you can't go forward after going back
- Start brand new notification when starting or stopping router
- Add uncaught exception handler to remove notification but not sure if it works
2011-06-25 21:56:12 +00:00
zzz
a4215cf76e add intent filter 2011-06-24 21:44:35 +00:00
zzz
15afd309b3 license tweaks 2011-06-24 19:06:54 +00:00
zzz
a3aa64654f - Add Peers activity
- Save service state
- Start router after stopped by system
2011-06-24 17:39:26 +00:00
zzz
87cd67f498 - Add more IRC tunnels and more hosts
- LogActivity tweaks
- Welcome and release note tweaks
2011-06-24 13:23:33 +00:00
zzz
b5b2692cee log update handler 2011-06-24 04:21:19 +00:00
zzz
cadb6e8c1e - Set android log tag to "I2P"
- Log to console buffer too
- New log activity
- Debug status output when router not running
- More logging utility methods
2011-06-24 03:23:19 +00:00
zzz
1aa08d8341 show memory usage 2011-06-23 21:46:11 +00:00
zzz
628bae2497 fix version 2011-06-23 21:24:07 +00:00
zzz
4b5420f51a - Toast if no network
- Update status faster
- Update release notes
2011-06-23 21:05:33 +00:00
zzz
e86e69f437 - Move network waiter from a thread to the service handler
- Allow quitting while waiting
- Move connected detection to utility class
- Use connected info for displaying buttons
2011-06-23 19:39:01 +00:00
zzz
29b9ca6359 libjbigi.so for GMP 4.3.2 compiled with NDK r5b,
SDK Tools Version 11, SDK Platform-tools Version 5, API 8.
LGPLv3.
2011-06-23 18:43:29 +00:00
zzz
b337f0f651 convert license page to a ListActivity 2011-06-23 17:29:59 +00:00
zzz
8b41459c5d fix context dirs if started before the router 2011-06-23 17:12:19 +00:00
zzz
d4769c7c5a - Move new version detection from the service to the activity,
and from a system property to shared preferences
- Strip libjbigi.so
2011-06-23 16:58:56 +00:00
zzz
a04a224b4a - Add addressbook to menu
- Addressbook header not selectable
2011-06-22 21:48:21 +00:00
zzz
f1ea9dde51 - SusiDNS in 20 lines of code
- Show the toast
- First web page can be i2p
2011-06-22 21:04:51 +00:00
zzz
95fd006143 - Add background img
- Add missing resources
- More work on start/stop buttons and binding
2011-06-22 18:03:21 +00:00
zzz
eb04fb3335 add addressbook client 2011-06-22 14:47:19 +00:00
zzz
f045191c82 - Change to startActivity()
- Hide start/stop in menu as appropriate
- Prep for actually stopping and releasing service
- Stop service when stopping router
- Switch from singleTask to SingleTop
- Use SharedPrefs to remember whether to start router
2011-06-22 01:03:16 +00:00
zzz
097883c1ee - Delete old temp files on startup
- Catch loadUrl() exception
- Stub out settings and menus
- Enable double-tap to zoom in webview on Droid
2011-06-21 20:48:20 +00:00
zzz
d71ead3f53 Bump to API 8 for setBlockNetworkLoads()
More welcome file updates
2011-06-21 01:56:01 +00:00
zzz
77180cea17 - Fix crash on screen rotation
- Handle cancels better
- Start clients faster
2011-06-21 00:59:25 +00:00
zzz
0aa325ada8 - Add toast for some errors
- Fix eepsite loads by adding xml header
- Use loadDataWithBaseURL() but block network loads, requires API 8
- Turn zoom controls on for local pages too
2011-06-20 22:08:14 +00:00
zzz
ae8cadde95 - Support eepsites in web viewer
- Async task for web/eep loads
- Progress dialog for web/eep loads
- Cancel loads with back button
2011-06-20 20:23:46 +00:00
zzz
14464772f9 - Add browser activity
- Add welcome page
- Add EepGetFetcher app
- Add warnings
2011-06-20 14:16:29 +00:00
zzz
5305b39ee4 - More release notes
- Add the rest of the licenses
2011-06-19 20:25:13 +00:00
zzz
8e2ec53e94 - Tunnels 1+1 hops for now
- Split out WebViewClient to own class
- Clean up status a little
- Check for new install or new version at startup
- Popup dialog on new install or version
- Only merge config files on new version
- Add release notes and licenses screens
2011-06-19 17:37:24 +00:00
zzz
e80dcee65a back to shared clients 2011-06-18 19:40:26 +00:00
zzz
a2ae1ccab2 - Build script fixups for setting i2p source location
- Don't require GMP source to build
- Hook new router final shutdown hook, tweak state machine
  to not declare router done until final shutdown
2011-06-18 17:05:18 +00:00
zzz
05cdb11c55 - Add status to main page in the Handler
- Convert service status bar updater from a thread to a Handler
- Clean up status bar
- Null out router context on shutdown
- Switch back to shared clients
2011-06-17 22:05:20 +00:00
zzz
3a7f4331f0 - Enable UPnP
- Increase max NTCP connections
- Delete old wrapper.log at startup
- Spoof network status on emulator
- Increase client start delay
- Disable shared clients
- Stop LogWriter from starting a new App context at shutdown
- LogWriter tweaks
- Logging tweaks
2011-06-17 20:15:26 +00:00
zzz
2ee5d5f02f - Really change to SDK 7
- Start and stop buttons
- Handler for screen updates
- Make service not sticky
- Log tweaks
- Fix version script
2011-06-12 21:49:36 +00:00
zzz
cf5454d43e rcvr tweaks 2011-06-12 18:40:29 +00:00
zzz
e94c332ed6 - Stop router if network lost
- Only bind to service briefly from receiver to
  prevent shutdown hangs
2011-06-12 18:29:27 +00:00
zzz
735da1408b - Hook in news fetcher
- Move temp dir setting from config to code
- Stub out methods to stop the router
2011-06-12 16:53:32 +00:00
zzz
0e6cecce7b news fetcher app, not hooked in yet 2011-06-12 03:30:04 +00:00
zzz
0d97d92c64 - Beginnings of a local Binder
- Change min API to 7 (2.1), to make things a little easier.
  This covers 95% of active devices and older ones are likely
  too crappy to run I2P anyway.
2011-06-12 03:02:51 +00:00
zzz
3f62eded02 simple wait for network thread. still need to hook up the binder 2011-06-11 21:02:39 +00:00
zzz
a9a3fbd5da - Start clients directly (hard coded) instead of using clients.config
and LoadClientAppsJob, due to ClassLoader issues and the need to
  register shutdown hooks anyway.
- Status bar tweaks
- Fix NPE when stopping
- Instantiate broadcast receiver
- apk config has preference over installed config for now
2011-06-11 20:08:53 +00:00
zzz
6597847682 - i2ptunnel link fix
- Set class loader, although that causes other problems
- Fix temp dir for now, but needs to be set in app not in config file
2011-06-10 21:57:46 +00:00
zzz
8fb166b61b - Add news button, news page, initialNews.xml
- Add clients.config, i2ptunnel.config, hosts.txt, i2ptunnel.jar,
  streaiming.jar, ministreaming.jar
  Clients won't load yet, have to fight the class loader.
- More BroadcastReceiver work (still not hooked in)
- enums
2011-06-10 18:12:24 +00:00
zzz
7cc1e37cc2 - Switch to GMP 5.0.2
- Beginnings of a BroadcastReceiver
- ant target for signing key
- Status thread
- Status in status bar for now
2011-06-10 03:09:35 +00:00
zzz
84419904ad update paths in scripts and readme 2011-06-07 14:45:02 +00:00
zzz
ac30407eb2 Start an android-only branch without any code from i2p.i2p.
Next step: Update the scripts and docs to point to
../i2p.i2p/ for everything.
2011-06-07 14:00:36 +00:00
zzz
95189c8f53 Android:
- Move the classes around
  - Split into Activity and Service
  - Add status bar notification
  - More config changes
2011-06-06 13:47:47 +00:00
zzz
7e84451ac3 Android:
- Import the main_rules file and remove the copied rules
  - Set the version code and name in the apk badging
  - Build target is 8 to allow SD install, MIN-SDK is still 3
  - Fix NPE on new install
  - Remove some debug code from NBigI
2011-06-05 22:38:35 +00:00
15b9615a1c Debian: update path of installed javadocs 2011-06-05 20:02:48 +00:00
4dc9cfb457 Debian: re-work patch to compensate for recent runplain.sh & wrapper.config changes 2011-06-05 20:02:13 +00:00
1250617d6c Make runplain.sh even more shell agnostic 2011-06-05 19:54:21 +00:00
ca5f35aea9 merge of '7f219c63dd48ba4ae26ad87603df4cb41ada2c59'
and 'afa8f9152e731dd11cd6a3649d45caaeb65b1b82'
2011-06-05 15:03:05 +00:00
3dfa982b39 Missing swedish translation and fix of html tags by digitalmannen 2011-06-05 15:02:20 +00:00
zzz
b2a5a94ce0 -18 2011-06-05 14:01:12 +00:00
zzz
d834c8063c merge of '90dce8fafc543f94a2aefe704bf4b3e63b24eab9'
and '9d726cbaf7d1591c47b4dd7e6aed864d2c09e25d'
2011-06-05 13:58:14 +00:00
zzz
d28f4bd24b * JBigI:
- Replace old non-PIC 62-bit linux libs (GMP 4.1.4 built in 2005)
        with PIC libs built with GMP 5.0.2. License is LGPLv3.
        Built by sponge with GCC 4.4.4, downloaded from
        http://sponge.i2p/files/jbigi/gmp-5.0.2/
        For 64-bit processors, both performance testing and
        the GMP changelog led us to use 5.0.2 for both the 32- and 64-bit versions,
        even though the files are twice as big.
        See http://zzz.i2p/topics/306 for discussion and test results.
        libjbigi-linux-athlon64.so was a 64 bit file; by the new naming standard
        supported by NativeBigInteger, it is now a 32-bit file and the
        64-bit one is libjbigi-linux-athlon64_64.so.
        All new 64-bit libs will have _64 appended.
      - Update build docs
2011-06-05 13:52:43 +00:00
zzz
48f4c7286d - Remove libjbigi-windows-athlon64.dll which was a duplicate of libjbigi-windows-athlon.dll;
NBI now tries athlon as a fallback for all 64-bit processors.
2011-06-05 13:31:26 +00:00
zzz
d9f80e9de6 GMP is not in core lib 2011-06-05 12:50:04 +00:00
zzz
d1e42233a8 * DSAEngine: Add code for alternate implementation using Java libs;
disabled by default. Add test code to verify identical results
                 and compare speed.
2011-06-05 12:40:59 +00:00
6110957921 Fix html tags in swedish translation 2011-06-05 11:59:38 +00:00
zzz
d308d7da97 remove unnecessary zeroing code, javadoc 2011-06-05 11:19:32 +00:00
zzz
4d34078678 * Data: Remove duplicate signature verification code
in RouterInfo and LeaseSet
2011-06-05 11:18:35 +00:00
zzz
8d42ebc2f0 * Console: Tag stat descriptions at declaration rather than in Strings.java 2011-06-05 11:16:57 +00:00
zzz
87cad7eaee * JBigI: Replace old non-PIC 32-bit linux libs (GMP 4.1.3 built in 2004)
with PIC libs built with GMP 4.3.2. License is LGPLv3.
             Built by sponge with GCC 4.4.4, downloaded from
             http://sponge.i2p/files/jbigi/gmp-4.3.2/
             The 4.3.2 files are half the size of those built with GMP 5.0.2, and there was
             little or no performance difference between the two versions for 32 bit processors.
             See http://zzz.i2p/topics/306 for discussion and test results.
2011-06-05 11:06:56 +00:00
b1f1c28c5c Swedish translations (thanks 123hund123, hottuna and digitalmannen) 2011-06-05 10:15:05 +00:00
b612e925df merge of 'b87fbef6393383ccfe6d24286dbbf9ffc79fdd29'
and 'c0bbd3c3725889c45887d4cdce900908d8918df8'
2011-06-05 08:51:48 +00:00
af629d2442 minor change to i2psnark l10n es 'n pt 2011-06-05 08:48:58 +00:00
zzz
e232a641a3 android: fix gmp configure args 2011-06-05 02:09:12 +00:00
zzz
35495e4d5a Android:
- Add a version update script
  - Disable NTP
  - Disable external I2CP
2011-06-04 19:31:45 +00:00
zzz
5974160805 * Router:
- Add a lock for reading/writing the router.info file
      - Check our RouterInfo validity after reading and before saving,
        to catch fatal errors sooner
2011-06-04 12:05:48 +00:00
zzz
4e16ef35a2 * KeyGenerator: Restore old return type to not break ABI (thx kytv) 2011-06-04 12:04:18 +00:00
zzz
885d549e84 * NBigI: Recognize Android 2011-06-04 12:03:35 +00:00
zzz
173343e049 Android:
- More efficient build of i2p.jar and crypto.jar
  - More build fixes
  - Merge package configuration resource with configuration file on device if it exists
  - Add launcher icon, resized from installer/resources/eepsite.help/help/lib/itoopie.png
  - Start of a libjbigi build script
  - Increase min API to 3 so we can use JNI
2011-06-04 00:29:02 +00:00
zzz
c3bcb8d020 fix misspelled file causing build dependency problems 2011-06-03 13:20:50 +00:00
zzz
d7de8ae630 Android:
- Fix up build.xml to work with tools version 11
  - Get rid of dot at front of project name
  - README.txt updates
  - logger_config additions
2011-06-03 12:14:54 +00:00
d5f529819f merge of '6ad44c8ad61fa5a65207491cab744ddfa8f0f3ca'
and 'db7c4479731f94687d64bea76eafeb4c62e14f1a'
2011-06-03 01:31:31 +00:00
d2093444a6 update i2psnark pt 2011-06-02 21:34:50 +00:00
3f15c4324b update i2psnark one string in es and de 2011-06-02 20:32:49 +00:00
zzz
219d7fd8c3 fix ElGamalTest compile; fix jbigi.jar path to speed up the test 2011-06-02 20:29:15 +00:00
c5c6a9fa17 update routerconsole Deutsch 2011-06-02 20:23:36 +00:00
78779fe92f update Castillian 2011-06-02 19:36:53 +00:00
b37a64905b fix/merge 2011-06-02 19:07:38 +00:00
675ac79443 merge of '65af54c284a3e8def1740b26114d3ed42ccae172'
and 'd805aad2dab23264b9c386c8ffabea464fece871'
2011-06-02 19:02:29 +00:00
14ea9c2928 fix/merge 2011-06-02 19:02:12 +00:00
ec6084cd37 merge of '468d5271753b5b44fff6890ecd33d03b684d8e18'
and 'cd4b79fe5aae3f17a3def305c7a3494a8db5dc74'
2011-06-02 18:57:06 +00:00
b65cbb0f78 Remove txt file in BOB.jar as per zzz's request. 2011-06-02 18:53:45 +00:00
zzz
fe15db51d8 - Logging tweaks inspired by Android
- Disable reusing Deflater on Android
2011-06-02 18:29:06 +00:00
zzz
761ad38bcc * HMAC:
- Javadocs and cleanups
      - Use SimpleByteCache
      - Comments and speculation
2011-06-02 13:37:35 +00:00
zzz
2a5ed938bb update generateKeyPair() return type to make it easier 2011-06-02 13:34:26 +00:00
zzz
c5c4e3c7ce * ElGamalAESEngine: Fixups required after SessionKey enforcement
* SessionKey: Enforce data size and prevent reuse like the other SimpleDataStructures
2011-06-02 13:33:03 +00:00
zzz
94af6550fa HMAC256 is used by Syndie 2011-06-02 13:30:33 +00:00
zzz
c767644c8f typo 2011-06-02 13:29:27 +00:00
zzz
a3ee593d0b give up on a reseed host after 90% errors 2011-06-02 13:27:03 +00:00
zzz
733d6db56e one more illegal character 2011-06-02 13:25:23 +00:00
zzz
6d938a12f6 android build fixes 2011-06-02 13:24:47 +00:00
8a56531c90 Don't prefer IPv4 but add the option commented out to wrapper.config. Make the option configurable in runplain.sh 2011-06-01 14:42:18 +00:00
zzz
43332bb6d0 * Crypto:
- Use java.security.MessageDigest instead of bundled GNU SHA-256 code
        if available, which it should always be.
        5 to 20% faster on Oracle JVM; 40 to 60% on Harmony;
        5 to 15% on JamVM; 20x (!) on GIJ.
      - Use java.security.MessageDigest instead of bundled Bitzi SHA-1 code
        if available on non-Oracle JVMs, which it should always be.
        Not faster on Oracle JVM; 30 to 60% faster on Harmony;
        15 to 20% on JamVM; 10-15x (!) on GIJ.
2011-06-01 11:44:10 +00:00
5990dd5879 add description for debian-clean target 2011-06-01 10:24:07 +00:00
030a95cdd1 reference debianhowto 2011-06-01 09:54:32 +00:00
18d3536ffe ConfigClients stopClient stubbed out. 2011-06-01 03:59:12 +00:00
3b80f53b8e There is more than one way to peel a pineapple... 2011-06-01 02:49:14 +00:00
5912c60692 Remove the one little html file that ends up in BOB.jar. The file is NOT a javadoc file, it is a package file. Still, it is zapped. 2011-06-01 02:32:00 +00:00
f8dc8a298e Debian: refactor patch 2011-06-01 00:11:03 +00:00
a3dd538afb typo fix 2011-06-01 00:09:53 +00:00
a90b8aa03a Prefer IPv4 connections
In some distributions (such as Debian, for example) net.ipv6.bindv6only=1 is
set by default. In some configurations, networking in java applications will be
broken. Someone recently came into #i2p experiencing this very problem.

This change closes #464.
2011-06-01 00:04:23 +00:00
313ee79bae hide syndie from "all" target and disable syndie target 2011-05-31 23:32:27 +00:00
97f97448d5 Clean up debian options in build.xml 2011-05-31 23:29:06 +00:00
zzz
3677cadcca * jbigi: Add support for solaris 2011-05-31 20:21:51 +00:00
455b5529b4 jbigi: Add support for SunOS/Nexenta/Solaris to the build*.sh scripts 2011-05-31 19:37:29 +00:00
60204fef24 Debian: initscript: Don't spew warnings when chown'ing files that don't yet exist 2011-05-31 18:50:54 +00:00
45064ec37e libjcpuid for Solaris x86
Compiled using
gcc (GCC) 4.2.3 (Ubuntu 4.2.3-2nexenta7) on Nexenta 3.0.1
2011-05-31 18:20:32 +00:00
zzz
4ecacc7607 * HTTP Proxy: Don't send redirect for POST (thx kytv) 2011-05-31 15:57:39 +00:00
43ba27126c Debian: Refactor jcpuid & jbigi patches to deal with SunOS support 2011-05-31 11:32:07 +00:00
527c9ba5dd Add support to jbigi/jcpuid for Solaris/SunOS 2011-05-31 11:30:10 +00:00
zzz
d4bf2523a6 * I2CP:
- Append I2CP Version information to the Get/Set Date Messages,
        so that both the router and client are aware of the other side's version,
        and future protocol changes will be easier to implement.
        Previously, router version information was not available to the client,
        so when router and client were in different JVMs,
        old clients would work with new routers
        but new clients would not work with old routers.
        After this change, we can design future changes so that new clients
        will work with old routers.
        This is an enhancement to the old protocol version byte sent by the client,
        which we have never changed and probably never will.
      - Prevent a client from setting the router's clock
      - Javadocs
2011-05-30 16:31:09 +00:00
zzz
acb4bac5e6 * netDb: Don't refetch expiring router infos if we have enough 2011-05-30 16:29:33 +00:00
zzz
cbef38ac11 * i2psnark: Restrict swarm size for small torrents 2011-05-30 16:25:24 +00:00
f9ffab62f4 Debian: Refactor jcpuid patch
Changes made to patch b/c of  kFreeBSD changes to build.sh I recently checked
in.
2011-05-29 15:12:46 +00:00
656292e1b1 Debian: Since jetty-i2psnark.xml has been disabled, there are no xml files dumped to pkg-temp. 2011-05-28 21:36:17 +00:00
ed8a065da9 Debian: Rework patch to work with the updated runplain.sh 2011-05-28 20:21:45 +00:00
9834a36787 merge of '5b0e335af7a9ce35cb7e40cd550b7e65af923218'
and 'd25f86bdd190afae59745e22e4fd0c2d8911a8ac'
2011-05-28 20:17:09 +00:00
33b9a5c2ce Make runplain shell agnostic
Braces were put around variable names so that router will run in kFreeBSD.
runplain.sh should now be shell agnostic (it runs in dash. it even runs in
*posh*, a ridiculously picky shell).
2011-05-28 20:14:36 +00:00
zzz
1eb58a84df * i2psnark: Fix bug preventing Robert from connecting to snark (thx sponge) 2011-05-28 20:11:52 +00:00
c9c35a3e5a jcpuid: minor edits so that compilation will work with Debian kFreeBSD 2011-05-28 17:26:24 +00:00
e0dd52a4dc build.xml: Don't copy jetty-i2psnark.xml to pkg-temp 2011-05-28 12:52:23 +00:00
zzz
393d813d05 Don't re-append the query string to the redirect URL,
which caused eepget to repeatedly retry the new redirect
of an i2paddresshelper query by the HTTP proxy.

This was clearly non-compliant (the Location: header requires
an absolute URI including any query string).

This was part of the original redirect handling added by
jrandom to eepget back when it was in syndie;
appending that changelog just in case this hackery was
required by Freenet USKs, which I doubt.

Also, reset the redirect counter when retrying.

==============

	Revision: 62a8cac8565958d111d0a47a443c964918d2e3ef
	Parent:   277fe109ea4416f7d8a6dba6e09cd4f605a8ce1a
	Author:   jrandom@i2p.net
	Date:     10/22/2006 15:06:30
	Branch:   i2p.syndie

	Changelog: 
	    ...
	    - add support for HTTP 301 redirects to EepGet (so freenet USKs work as
	      intended)
2011-05-27 21:41:49 +00:00
0000e4f28d Debian: Ship custom router.config to disable updates via the I2P router. Updates, to keep with Debian policy, must be done via the package manager. 2011-05-27 17:43:05 +00:00
zzz
e3a3a99317 add cpuid 2011-05-27 16:18:38 +00:00
zzz
6a9f73bd61 quick jbigi test script 2011-05-27 16:12:10 +00:00
zzz
2c3be29016 * JBigI:
- Refactor to handle 64 bit libs and a list of fallback libs
      - Logging tweaks
      - Only check for one file name in library path
2011-05-27 15:04:40 +00:00
zzz
8eb10872b8 * CPUID:
- Recognize amd64 as x86
      - Only check for one file name in library path
      - Log tweaks
2011-05-27 15:02:03 +00:00
zzz
d5fd682985 * Console: Fix router.updateThroughProxy being set to false after saving
change on /configupdate when install dir is read-only.
               (ticket #466)
2011-05-27 14:58:57 +00:00
zzz
8f861f7ba2 javadoc 2011-05-27 14:57:36 +00:00
efe53c831d Debian: Since browser launch is disabled within the I2P codebase for the i2psvc user, removing patch to disable it 2011-05-27 13:35:36 +00:00
0dba0a1d6f typo fix 2011-05-27 09:45:42 +00:00
89c01696cc Debian: Remove cruft that remained in debian/rules from the times in which cpuid couldn't be build for i386. 2011-05-27 09:35:17 +00:00
164f060a40 Debian: Creating a new fourth package by splitting the i2p package in two
This commit splits the i2p package into a second package, i2p-router.
   * The new 'i2p-router' package does not depend on the java-wrapper nor jbigi.
     Jbigi is recommended. This package can be installed on the ports or 
     distributions that the java-wrapper is not available for.
   * The new 'i2p' package depends on i2p-router, libjbigi-jni, and the java-wrapper. 
     This package will add the i2psvc system user and the initscript. Existing
     users of the i2p package will have the i2p-router package pulled in
     automatically and for them there will be no usability changes.

 Executive summary: No functionality changes will take place for either those
		    that installed the i2p package in the past or those that
		    install the newly split i2p package. For them, "The Song
                    Remains the Same."
2011-05-27 09:33:20 +00:00
e347ee5880 Debian: debian/README.Debian updates to reflect packaging changes 2011-05-26 21:56:42 +00:00
a4ea70b33b Debian: Move scripts/ to doc/i2p/examples 2011-05-26 21:40:31 +00:00
4433a3db06 Debian: Install runplain.sh as /usr/bin/i2prouter-nowrapper 2011-05-26 21:38:50 +00:00
e019d3b8d7 Debian: create symlinks in doc/licenses that point to existing licenses in /usr/share/common-licenses 2011-05-26 21:33:05 +00:00
1f497e171a Debian: Add certificates directory to $I2P 2011-05-26 19:12:32 +00:00
cd8c954513 Debian: Drop junit from Build-Depends-Indep 2011-05-26 18:53:22 +00:00
d08d5ffd64 Debian: add debian/copyright to ant clean target 2011-05-26 18:51:36 +00:00
8744eab46d Debian: drop dynamically created copyright file 2011-05-26 18:46:41 +00:00
5d7e936aed Remove legacy standalone i2psnark from package 2011-05-26 15:49:43 +00:00
e786da2605 Remove information from debian/README.Debian that is no longer applicable 2011-05-26 14:45:10 +00:00
b6fab829cc Debian packaging fixes 2011-05-25 23:09:58 +00:00
zzz
150cb30339 minor NBI tweaks and comments 2011-05-25 22:13:18 +00:00
zzz
724d8de9ae call the 64 bit cpuid, even if we dont use it yet 2011-05-25 21:35:21 +00:00
zzz
ddcd8cbb10 prep for new 32 bit cpus 2011-05-25 21:23:40 +00:00
zzz
f5f4f14b7e Drop libjbigi-linux-k63.so and libjbigi-freebsd-k63.so that were identical
to k62 versions; add mapping in NativeBigInteger.
2011-05-25 21:14:16 +00:00
zzz
6616ccd3b4 cleanup in prep for more changes 2011-05-25 21:05:20 +00:00
075f89f43c Update jetty version number--we use version 5.1.15. 2011-05-25 18:11:15 +00:00
9a836ed072 merge of '0ab9435836f60e748b89344771eea555219e6262'
and '13180c845a0d2cce619be3b9b139295f2ff49ece'
2011-05-25 17:09:29 +00:00
zzz
552608744d * CPUID: If the 64 bit extract worked but the load failed, try 32 bit 2011-05-25 16:54:25 +00:00
2accbdcf05 Operation close #354 part one of ??: Make the router console's help pages valid html. We *LOVE* valid HTML. 2011-05-25 16:52:52 +00:00
ab17bd3150 Built using gcc (Debian 4.4.5-8) 4.4.5 in Debian Squeeze within clean chroot jails.
-fPIC and stripped.
2011-05-25 16:00:11 +00:00
zzz
d201a29d03 * HTTP Proxy: Address helper refactoring, address book add form 2011-05-25 13:52:18 +00:00
zzz
c4bbcc4617 * CPUID: Load 64-bit libcpuid if available 2011-05-25 13:48:45 +00:00
zzz
82a0ac16f1 increase min floodfills again 2011-05-25 13:36:17 +00:00
zzz
27b48034c5 b32 cleanups 2011-05-25 13:34:32 +00:00
641e71c141 close tags in eepsite help files 2011-05-24 23:16:15 +00:00
4fd8da8041 Fix errors that tests/scripts/checkxml.sh found 2011-05-24 22:33:28 +00:00
zzz
68dccdfe2f try to fix RrdGraph GIF exception 2011-05-23 23:24:54 +00:00
zzz
592361b1a4 * Console:
- Disable zh translation in graphs on windows due to font issues
      - Fix NPE at startup
      - Graph tweaks
2011-05-23 19:22:33 +00:00
zzz
6e4df8830a - Force news refetch after URL change 2011-05-23 19:19:07 +00:00
zzz
7ab95d0144 javadoc 2011-05-23 19:16:33 +00:00
4ea5622842 mbuild.sh fixups : add new jcpuid/mbuild.sh, edit jbigi/mbuild-all.sh -- pedantic naming 2011-05-23 04:52:29 +00:00
zzz
606300a042 * GeoIP: Read countries.txt in UTF-8 2011-05-22 18:36:08 +00:00
zzz
96cf598691 javadoc 2011-05-22 18:34:41 +00:00
zzz
6b923c7251 Fix build error that omitted local jetty patches from org.mortbay.jetty.jar;
affected 0.8.4 and 0.8.6 installers. Include jar in the updater for the next release.
        Thx KYTV.
2011-05-22 18:33:51 +00:00
zzz
18e57d19db doc update 2011-05-22 14:31:56 +00:00
45f3020924 mbuild.sh document and fixes, mbuild-all.sh add cpu types 2011-05-21 18:26:10 +00:00
zzz
d8a3cb0d58 change build script to GMP 4.3.2 2011-05-21 17:09:30 +00:00
b5dc9b6f5a Update geoip database and country list 2011-05-21 01:07:03 +00:00
zzz
38a6e6b212 restore old cpuid assembly for x64 2011-05-20 16:26:40 +00:00
zzz
627519e69c disable debug 2011-05-20 16:25:46 +00:00
zzz
2f2e0e539a history for props, -1 2011-05-20 14:23:31 +00:00
zzz
e42b78e177 propagate from branch 'i2p.i2p.zzz.naming' (head 9626e0df682c8d5f706d2c814158ba451f3ebeb5)
to branch 'i2p.i2p' (head a3969e6c9c4fd5bfd69cd716ce0df191ad2af634)
2011-05-20 14:12:07 +00:00
zzz
4b19801cdb try to prevent out-of-order logging at shutdown 2011-05-20 14:09:36 +00:00
zzz
3d76354cbb fixup after prop 2011-05-20 13:55:13 +00:00
zzz
e2c98ac134 propagate from branch 'i2p.i2p.zzz.jrobin159' (head 08df645290d8e156d88930ddaf71b3f3d8af419d)
to branch 'i2p.i2p' (head 69c9e6bd0c6894c335f7d9892aa28ac7d6389907)
2011-05-20 13:52:35 +00:00
zzz
d4fe76afee hide graph link in summary bar when disabled 2011-05-20 13:47:09 +00:00
zzz
3352c45517 - Rewrite cpuid.c so it builds with PIC (source only, binary not updated yet) 2011-05-20 13:25:19 +00:00
zzz
0e719b8eb0 fixup after prop 2011-05-20 13:17:04 +00:00
zzz
ff520b74dc propagate from branch 'i2p.i2p.libgmp' (head 41a57954f7e78e57f8eb5e30e8ebde7fd75b15dc)
to branch 'i2p.i2p' (head d174e772ebd4f3e3eac5c9b5abd7f736c2527eb2)
2011-05-20 13:13:26 +00:00
zzz
48bf618ae5 final 2011-05-20 12:49:29 +00:00
zzz
d6c1202e4b summary bar tweak 2011-05-20 12:48:58 +00:00
zzz
20452c9387 * Certificate: Fix creation bug; improve router cert generation 2011-05-20 12:46:50 +00:00
zzz
64a753116b * i2ptunnel: Fix server-side stripping of X-Accept-encoding 2011-05-20 12:43:50 +00:00
5ce439ffc4 merge of '97f5690455a3a74e68056739ea7145c8059454c6'
and 'e01e159c9825a36e8e640bb3cf8d0f1200b1be2f'
2011-05-19 05:47:02 +00:00
00f2721640 upd 2011-05-19 05:44:13 +00:00
454a310bbe make translation more castillian 2011-05-18 21:40:11 +00:00
18952f5109 upd routerconsole messages_fr.po 2011-05-18 11:37:39 +00:00
zzz
7377086aae 0.8.6 2011-05-16 19:58:19 +00:00
zzz
9f7cc9d887 add update host 2011-05-13 21:04:58 +00:00
zzz
ffa9ea9cd2 Increase min floodfills; decrease min routerinfo expiration 2011-05-13 20:13:56 +00:00
zzz
f9654661bb * Use partitions of fast tier for various hops of client tunnels; minor cleanups 2011-05-11 14:40:55 +00:00
zzz
5ce06d02b4 the rest of -2 2011-05-06 12:35:19 +00:00
zzz
c356792d02 * Tunnels and profiles:
- Increase max fast and high-cap tier sizes
      - Slow profile eval cycle after sufficient uptime
      - Fix bug which started a new build after a successful build
      - Misc. cleanups
2011-05-06 01:10:28 +00:00
90642a8ab5 warning 2011-05-05 01:59:20 +00:00
zzz
6199e7b74c oops fix path to newly tagged files 2011-05-03 13:15:13 +00:00
1e9ac05b63 merge of '83e7567c0dbdabe57c21a0bfdc9d70acbbc71463'
and 'f783d7f664254691074c1542a6d8937731e2b503'
2011-05-02 16:24:54 +00:00
ed338d9cfa minor tweak to es 2011-05-02 16:24:48 +00:00
a84e6f7854 typos 2011-05-02 11:23:01 +00:00
zzz
fe21748b2d -1 2011-04-28 18:46:09 +00:00
zzz
8b184f8c03 one more zero-length torrent check 2011-04-28 18:05:03 +00:00
zzz
5ed22d5c16 cleanups 2011-04-28 18:04:31 +00:00
zzz
525e0b4518 tag peers.jsp UPnP text 2011-04-28 18:03:18 +00:00
zzz
e8d94982e4 * Console: Try to prevent cascaded IllegalStateExceptions in .jsp code;
add logging for original error
2011-04-28 18:01:48 +00:00
zzz
38db0b0ff3 * UPnP: Strip trailing nulls from incoming XML to prevent
"content not allowed in trailing section" exceptions
      from stupid routers
2011-04-28 17:57:30 +00:00
e4a8b9621d site (plugin) 2011-04-25 06:29:20 +00:00
66ea1c060a merge of 'aee566a8e2250d2461203b83c7a3434b29f771f9'
and 'f6410ea071e6b154e0c14deea8ef6eaa35cb7faa'
2011-04-24 07:38:51 +00:00
50dabfec8c typo typo 2011-04-24 07:37:20 +00:00
a8722e033c tweaks es 2011-04-20 00:28:02 +00:00
1cec98d180 tweaks es 2011-04-20 00:24:37 +00:00
zzz
97bb2d81b7 0.8.5 2011-04-18 03:12:51 +00:00
9c4d107b5d update de 2011-04-16 01:22:55 +00:00
eaccd029c8 merge of '9f3e70c07e90831996f4a09177d29015e02d03a1'
and 'bfdfec0ecf3dfe56d93ab5835b3c6887743e50ac'
2011-04-16 01:22:12 +00:00
b2c90b0633 update es 2011-04-16 01:20:58 +00:00
1152e117b3 routerconsole: update russian translation 2011-04-13 17:34:36 +00:00
9f3cdeb29e typo 2011-04-11 13:49:55 +00:00
699bfb3987 typo 2011-04-11 13:23:11 +00:00
0695753084 typo 2011-04-11 13:19:21 +00:00
ef0e9ca36c typo 2011-04-11 13:05:40 +00:00
3e9e56ed28 typo 2011-04-11 12:27:22 +00:00
b16cfb9df6 typos 2011-04-11 11:24:42 +00:00
18c3430656 typos 2011-04-11 10:53:02 +00:00
94298c3678 missinfo 2011-04-11 09:19:23 +00:00
a3d22e829b encore une 2011-04-11 08:55:15 +00:00
63ecc10c5e typos 2011-04-11 08:46:32 +00:00
937ef0ea4e typo 2011-04-11 08:15:45 +00:00
zzz
428db02274 * Console: Hide iframe on mobile browsers
* DataHelper: Speed up eq() (Ticket #437)
    * HTTPServer: Strip inbound X-Accept-Encoding header
    * netdb.jsp: HTML fixes
    * Plugins: Log error when console server not found
    * Reseed: Log tweak
2011-04-10 18:22:43 +00:00
960f12d66c final tweaks 2011-04-09 01:09:16 +00:00
aea618061f final tweaks 2011-04-09 00:47:57 +00:00
3995d2b123 merge of '3ef57a4333ea11a79d106a471afe2014124dc520'
and '41944e5ee9caea1445633a41c9e0f3474aefea7e'
2011-04-09 00:20:18 +00:00
891f9b2e87 final tweaks 2011-04-09 00:16:04 +00:00
47efafa722 changes to es 2011-04-08 21:55:34 +00:00
b19006690c tweaks es 2011-04-08 19:12:05 +00:00
6acef90087 final tweak 2011-04-07 21:26:17 +00:00
5b7896d16e final tweaks after tests 2011-04-07 19:04:43 +00:00
8a74eceac3 final tweaks after tests 2011-04-07 15:04:56 +00:00
a5f576d912 final tweaks after tests 2011-04-07 14:45:25 +00:00
e0c0f2a350 final tweaks after tests 2011-04-07 14:32:14 +00:00
1ca63be423 final tweaks after tests 2011-04-07 14:31:41 +00:00
eaee55e3a9 fix the damned apostrophe and some better translations for other strings 2011-04-07 11:45:30 +00:00
1fbaf24d59 fix the damned apostrophe 2011-04-07 10:32:34 +00:00
1ada55f012 add how_fr.png 2011-04-07 10:25:06 +00:00
bcbd5bbda6 fix the damned apostrophe and some typos 2011-04-07 10:19:53 +00:00
2a982a4c47 fix the damned apostrophe 2011-04-07 09:12:17 +00:00
2061640cb6 fix the damned apostrophe and other typos 2011-04-07 09:00:15 +00:00
a4ff83c0d4 fix the damned apostrophe 2011-04-06 19:43:49 +00:00
e766202a2e fix in panel: congestion->tasks list 2011-04-06 17:34:15 +00:00
0da9c606f2 remake duck's change 2011-04-06 15:33:06 +00:00
398984009b remake duck's change 2011-04-06 15:21:36 +00:00
3e00866bdf remake duck's change 2011-04-06 15:21:15 +00:00
ac3c2bd872 remake duck's change 2011-04-06 15:02:50 +00:00
281c2f5b51 tweak 2011-04-04 20:44:18 +00:00
2e9e2e20ef tweak 2011-04-04 20:37:47 +00:00
ed131f47de tweak 2011-04-04 20:27:28 +00:00
853e5ac607 tweak 2011-04-04 20:21:21 +00:00
1cffcdb670 ttweak 2011-04-04 20:13:19 +00:00
a9b1603f9f ttweak 2011-04-04 20:08:50 +00:00
aee08287eb tweak 2011-04-04 12:31:40 +00:00
131e8f6d68 translation es update 2011-04-02 22:00:39 +00:00
c8544d016d merge of '51802b6d77791cf157cb9ef16097495772c68d12'
and '7a7f3283a6a2a69e8ed4df36c0e5a9850c8bb248'
2011-04-02 20:43:42 +00:00
8198e61acc tweaks transl8ion desktopgui 2011-04-02 20:38:25 +00:00
b41ed69b0f Adding Arabic to Transifex 2011-04-02 12:18:45 +00:00
5b2cf8b676 German translation for DesktopGUI, thanks blabla 2011-04-01 21:41:13 +00:00
5d9116965b Spanish translations, thanks punkibastardo 2011-04-01 21:29:53 +00:00
07e61d499a Fix French quoting, add to Transifex 2011-04-01 21:22:33 +00:00
9f010d80fb checked against console 2011-03-30 22:52:54 +00:00
660ba64ce1 little fixes 2011-03-30 22:45:25 +00:00
29c731d660 little fixes 2011-03-30 21:08:08 +00:00
df4714e628 little fixes 2011-03-30 20:57:34 +00:00
a7d6048748 mini tweaks 2011-03-30 20:35:27 +00:00
1a40178e8c fix 2011-03-30 20:20:14 +00:00
49ac0278f0 redo 2011-03-30 20:17:44 +00:00
4c74315411 redo 2011-03-30 20:12:09 +00:00
f992a07df9 redo 2011-03-30 20:09:42 +00:00
zzz
e62d9dfa48 more cleanups, clickable logo 2011-03-30 00:56:15 +00:00
zzz
6dd7431ccd message cleanup 2011-03-30 00:42:08 +00:00
zzz
7020bfd521 display cleanups 2011-03-30 00:19:28 +00:00
zzz
0fcf13ef73 * susidns:
- IDN toASCII improvements (old bean)
- Add 'other' filter
- Fix jsp 500s
2011-03-29 23:17:14 +00:00
zzz
9e37a5a4af * susidns:
- Enforce basic rules on host name additions
- Split up form
- IDN toASCII improvements
- Log message improvements
2011-03-29 22:46:59 +00:00
9e4e9c197b typo 2011-03-29 15:17:09 +00:00
zzz
172541a368 implement delete on details page 2011-03-29 03:29:23 +00:00
zzz
9f475c03cb fix details for published book 2011-03-29 03:02:17 +00:00
zzz
fbfffa9987 - SusiDNS cleanups
- Logging cleanups
2011-03-29 02:16:42 +00:00
8ea721696f readme_fr.html 2011-03-29 00:33:45 +00:00
3e5713e479 readme_fr.html 2011-03-29 00:05:29 +00:00
b7072d48b6 messages_fr.po & readme_fr.html 2011-03-28 22:54:26 +00:00
7feefc049c readme_fr.html 2011-03-28 22:53:58 +00:00
zzz
8ae398d786 - Isolate span read failures to that span
- Don't keep separate count of spans and levels, use BSL HashMap sizes
- Fix SkipList counts when read in
2011-03-28 20:33:57 +00:00
zzz
a818e84dcf - Cleanups, logging, checks and javadocs 2011-03-28 17:15:46 +00:00
zzz
33780ef359 - Fix FLB full check
- Cache FLB
- FLB logging, cleanups, checks
2011-03-28 14:27:19 +00:00
516216730b readme_fr.html 2011-03-28 14:25:47 +00:00
7a69024fb5 messages_fr.po & readme_fr.html 2011-03-28 13:59:46 +00:00
zzz
9fcb20a7bd - Free unused span continuation pages (big space savings)
- Less data copying during on-disk searches
2011-03-28 04:57:16 +00:00
zzz
991acd3917 fix level count init 2011-03-27 22:42:36 +00:00
zzz
f4905d2742 - Use new UTF8StringBytes
- Track number of SkipLevels in a SkipList
- More double-checks
- Caching cleanups
- Cleanups, logging, generics
2011-03-27 22:36:45 +00:00
zzz
b7b7283ff9 - Use new UTF8StringBytes
- Track number of SkipLevels in a SkipList
- More double-checks
- Cleanups, logging, generics
2011-03-27 22:19:50 +00:00
zzz
22d50dd150 require router.activePeers stat (ticket #450) 2011-03-27 19:19:41 +00:00
zzz
bc231b51b5 - Fix several bugs in removal of first or second span
- Fix bugs in flushes
- Add magic numbers for free pages and free list
- More bounds checking
- Lots of checks for double-kill / double-free
- Make some freelist errors non-fatal
- Cleanups, logging, javadocs, test code
2011-03-27 18:55:51 +00:00
4d17643064 messages_fr.po 2011-03-27 18:37:09 +00:00
0b510cdc21 fignolage help_fr & console messages_fr.po 2011-03-27 10:03:04 +00:00
a188275608 revert trac #450: need enable all stats to enable active & fast peers statsgrphs, text added in help, comments removed 2011-03-27 09:01:43 +00:00
0617ee99cd Fix: Wrong working dir when running as a Windows service 2011-03-27 01:30:30 +00:00
4fbde3a0bc better 2011-03-26 20:55:47 +00:00
9911d22ac3 transl 2011-03-26 20:54:17 +00:00
b14c17c884 add news_fr.xml .... feel free to use for tests or mtn delete 2011-03-26 17:50:54 +00:00
3fe232a535 typo 2011-03-26 16:49:29 +00:00
52a0ab5482 same for highCap 2011-03-26 15:24:23 +00:00
b3dec96e1e see trac #450 2011-03-26 15:03:26 +00:00
b639482c4a tweak 2011-03-26 10:47:16 +00:00
d68e59fb04 tweak 2011-03-26 10:03:39 +00:00
d97f991230 fix 2011-03-26 08:59:39 +00:00
cc780c23f8 merge of 'c8e4037205cbf60c898d6f6e7acaf03eec0a04ab'
and 'e596e8b965b583853015d99b62798865654e4806'
2011-03-26 07:40:17 +00:00
zzz
a7fceb644f javadoc 2011-03-26 05:50:13 +00:00
zzz
312534b635 - Change disk format to add magic number to all pages
- Change blockfile magic number to reflect new format
- Cleanups and javadocs
2011-03-26 05:27:34 +00:00
zzz
8f9f102baf - Fix several bugs with BSkipLevels persistence
- Logging and debug code
- New serializers
- Cleanups and javadocs
2011-03-26 02:40:17 +00:00
26cc6a26b8 add 2011-03-26 02:38:34 +00:00
bcf9d59c82 fix 2011-03-26 01:49:09 +00:00
cf7e922dcd merge of '71dfdcd2d4d32f1ab1d0f8aa795af4e2520362dc'
and '98c75b36461d2528cd3135f43f759440d3183acc'
2011-03-26 00:33:21 +00:00
ba67bb9412 fix 2011-03-26 00:29:00 +00:00
1271e03192 fix 2011-03-25 23:15:40 +00:00
cdd986c56b update translation de 2011-03-25 22:55:37 +00:00
ea86b6880f fix 2011-03-25 22:19:29 +00:00
d47de894ab fix 2011-03-25 19:54:59 +00:00
109bd978de fix 2011-03-25 19:41:25 +00:00
25d2ce65e2 add 2011-03-25 17:20:18 +00:00
07b3ebefc1 '->\' 2011-03-25 14:53:18 +00:00
e255de6f72 '->\' 2011-03-25 14:20:33 +00:00
76bbc604ae ? 2011-03-25 11:09:59 +00:00
103bde8a32 ? 2011-03-25 11:09:12 +00:00
57140d2655 add 2011-03-25 10:14:50 +00:00
f61108bbae add 2011-03-25 09:14:26 +00:00
05a3738fdb refilled 2011-03-25 08:56:53 +00:00
ceb631719b purged 2011-03-25 08:35:43 +00:00
zzz
078056f163 implement last-modified 2011-03-24 22:07:19 +00:00
zzz
1adb3d19c7 - Better serializer error handling and logging
- Automatic corruption repair in blockfile
- Automatic removal of bad entries in BFNS
- Use unsigned shorts to extend max lengths to 65535
- Check max length
- Throw IOE on negative ints
- Tweak fromProperties() exceptions
- Fix DataHelper encoding issues (ticket #436)
- CSS tweaks
2011-03-24 21:51:20 +00:00
b5cfe00ba5 new 2011-03-24 21:22:46 +00:00
46b2fd2749 new 2011-03-24 21:14:12 +00:00
f1d1a80f4e new 2011-03-24 21:03:08 +00:00
f3a30276f3 new 2011-03-24 20:55:15 +00:00
a9579cdd87 new 2011-03-24 20:45:52 +00:00
2d4c3453b7 new 2011-03-24 20:33:18 +00:00
1f58125eed new 2011-03-24 20:25:54 +00:00
fb36da7669 new 2011-03-24 20:19:26 +00:00
fa1820786a new 2011-03-24 20:11:18 +00:00
655d0ad77e new 2011-03-24 20:10:53 +00:00
0098816866 new 2011-03-24 18:39:32 +00:00
6e08fd614a after antpoupdate 2011-03-24 16:53:10 +00:00
0680725582 upd 2011-03-24 15:37:38 +00:00
0cb10f9bb1 upd 2011-03-24 15:08:14 +00:00
zzz
7751661f3d basic IDN support 2011-03-24 05:30:33 +00:00
zzz
ca5484a984 - Add details page in susidns
- Add source in Daemon
- Honor list property in BFNS.lookup()
2011-03-24 03:00:47 +00:00
f7beb5d68e initial trsl 2011-03-24 01:47:41 +00:00
zzz
d6999a3327 * DataHelper:
- Undeprecate fromProperties() and toProperties()
      - Undeprecate BOOLEAN_FALSE and BOOLEAN_TRUE
      - Fix fromProperties() and toProperties() to correctly throw DataFormatExceptions
      - Add sort option
      - Efficiency improvements in writeProperties(), toProperties(), storeProps(), and toString()
2011-03-23 21:44:38 +00:00
541ff01fd1 merge of '6467dc867b03e6be51ac21be14d7f8cbdadc2bd2'
and 'b30b38d7e36009a6ffcdbc0c6405a97703d29128'
2011-03-23 20:26:25 +00:00
zzz
c85931cbc5 log tweaks 2011-03-23 02:22:19 +00:00
zzz
7e0d0e2b01 - Implement getNames()
- Use getNames() for merging to hosts.txt naming services to avoid O(n**2)
- Fix naming service selection
- Don't merge from master book unless publishing
- Add naming service and direct config options
2011-03-22 22:10:15 +00:00
f289be908c added UNanted susidns messages_fr.po. Please jdk guru initialize, aka antize it so I can translate. I just changed one header line 2011-03-22 22:06:12 +00:00
42e9fd9431 upd snark_fr.po 2011-03-22 21:59:14 +00:00
zzz
5dc9214296 - Iterate through eepgetted subscription file instead of loading the whole thing into memory 2011-03-22 18:20:44 +00:00
086bad4b47 upd messages-fr.po 2011-03-22 16:31:20 +00:00
22d66131f3 upd messages-fr.po 2011-03-22 16:23:59 +00:00
zzz
311bb7a4b6 propagate from branch 'i2p.i2p' (head 6467dc867b03e6be51ac21be14d7f8cbdadc2bd2)
to branch 'i2p.i2p.zzz.naming' (head ed37752523387104764b68a1deaaedb5e707e827)
2011-03-22 14:28:16 +00:00
8b10720b23 upd messages-fr.po 2011-03-22 11:06:18 +00:00
zzz
6f296a6f76 -8 2011-03-22 02:12:03 +00:00
zzz
61590d39e0 merge of '60c5cb17c0406b6e6e547489f9ea8ef3c290e262'
and 'ea425725295fb82fd45d0a93ba521f8695fa88a5'
2011-03-22 02:11:30 +00:00
zzz
c7a574fe01 final 2011-03-22 02:08:03 +00:00
zzz
1b2519cfb8 - Improved error handling
- Disable graphs on JVMs that crash
2011-03-22 01:59:52 +00:00
zzz
9c02aab4fb oops remove newline 2011-03-21 18:37:26 +00:00
c89f752ccc Update Dutch translation for routerconsole 2011-03-21 18:34:49 +00:00
zzz
40fd4ccd15 Stats:
- Refactor handling of required stats
    - Shorten description of required stats
    - Improve save messages on configstats.jsp
    - Change bw.sendBps and bw.receiveBps stats to bytes, not Kbytes
    - Expires directive for graphs
2011-03-21 18:14:58 +00:00
4c0a4a2296 Update english routerconsole tags 2011-03-21 18:06:58 +00:00
zzz
ddddc686fe propagate from branch 'i2p.i2p' (head 60c5cb17c0406b6e6e547489f9ea8ef3c290e262)
to branch 'i2p.i2p.zzz.jrobin159' (head 330a4f9652fe5f67e6e9998f5c0a87c7ef163764)
2011-03-21 14:29:03 +00:00
zzz
642376b0b6 HTML fixes 2011-03-21 14:27:46 +00:00
zzz
3ba9f872ed fix manifest error 2011-03-20 18:28:29 +00:00
zzz
bfb4560dc2 maxMemory() fixes for silly GNU returning Long.MAX_VALUE 2011-03-20 18:14:30 +00:00
zzz
fa8f2290af set firstHeardAbout; tweak dump order 2011-03-20 13:34:14 +00:00
zzz
c0422134f9 * i2psnark: Fix peers stuck at uninteresting after magnet fetch 2011-03-19 18:46:18 +00:00
zzz
b11516f758 remove cache directives 2011-03-19 18:34:39 +00:00
zzz
14986fbfa1 * Profiles:
- Nicer profile dump
      - More efficient profile lookup for display
      - Fix dumpprofile NPE
      - Change file suffix from .dat to .txt.gz
2011-03-19 17:19:54 +00:00
zzz
34d951aa6b recognize links as a text browser 2011-03-19 16:40:10 +00:00
zzz
f96342d33a backport equals() fix 2011-03-19 16:39:22 +00:00
zzz
5eb6bf1b1d change i2ptunnel clients to 3 hops for new installs 2011-03-19 16:39:04 +00:00
zzz
295e1daa22 test scripts update 2011-03-19 16:37:53 +00:00
zzz
cf0d2197b8 - Persistent option on GUI
- Fix HTML errors
- Refresh improvements
- Fix Rate.equals() bug
- More cleanups
2011-03-18 15:49:58 +00:00
zzz
79358f4271 notes and tweaks 2011-03-18 00:47:14 +00:00
zzz
12f3634f96 more rows when persistent 2011-03-17 23:25:38 +00:00
zzz
033dee0216 - Persistent RRD
- Restart line in graphs
- Restore zh fonts in graphs
2011-03-17 21:13:52 +00:00
zzz
1324eaf056 cleanups and javadoc 2011-03-17 17:16:28 +00:00
zzz
2e5e3b9d40 better error messages, fix NPE, comment out template handling 2011-03-17 16:16:50 +00:00
zzz
ef26accde0 jrobin 1.5.9.1
sha1sum 7d76f5cdec625fd1ce21acc0e46d286fbd6d307f
Released 2008-09-05
Downloaded from http://sourceforge.net/projects/jrobin/files/jrobin/1.5.9/
License: LGPL 2.1

It appears that the only difference from 1.5.9 is it was compiled with Java 5
instead of Java 6. The 1.5.9 jars out there also contain the large font .ttf files,
which are not in 1.5.9.1.

The only announcement I could find about 1.5.9.1 is here:
http://opennms.530661.n2.nabble.com/Am-I-missing-something-td841945.html

The following directories are dropped from the jar during the build process:
org/jrobin/cmd/
org/jrobin/convertor/
org/jrobin/inspector/
2011-03-17 16:03:27 +00:00
zzz
8461beba1c 1st cut 2011-03-17 02:07:08 +00:00
zzz
b93e3dfb55 cleanups and permissions 2011-03-16 18:33:56 +00:00
zzz
5ef1dd87a5 javadoc fix 2011-03-16 18:14:51 +00:00
zzz
07860d018c add b32 links to susidns; add source property for additions via susidns 2011-03-16 17:28:10 +00:00
zzz
ce5ce12e3b * Naming services:
- Refactor caching
    - Logging, caching, shutdown cleanup and fixes
2011-03-16 16:11:54 +00:00
zzz
02c4bbfc58 fix filtering 2011-03-16 03:01:32 +00:00
zzz
bf613448d7 susidns/hoststxtNS compatibility fixes 2011-03-16 01:50:22 +00:00
zzz
5095e8a1d6 naming service shutdown stuff 2011-03-16 00:37:54 +00:00
zzz
0352ca3ef6 * Naming service, addressbook, susidns:
- Replace img hack for susidns requesting addressbook update
      with registration and request through the NamingService
2011-03-15 23:16:44 +00:00
zzz
12c5b9c21c * Naming services, addressbook, susidns:
- Fix search capability
    - Fix result count and view within results
    - Fix published address book
    - Fix ngettext
    - Cache size
    - Fix 0-9 filter
    - Addressbook updates via API, except for published
2011-03-15 21:52:48 +00:00
be4be9716d readme tweaks 2011-03-13 12:39:52 +00:00
ac5785c796 update susimail de translation 2011-03-13 11:32:43 +00:00
e6b24277b6 readme tweaks 2011-03-13 11:06:33 +00:00
dca9f32d3f Make the actual installation the last step before the "Done" screen 2011-03-12 22:19:05 +00:00
21a3657da5 Add NT service as an installer option on Windows 2011-03-12 21:53:55 +00:00
zzz
3f141e72b8 ngettext fixes thx duck 2011-03-12 21:32:29 +00:00
e3a81f6091 Susimail: use ngettext, fix typo (thanks m1xxy) 2011-03-12 21:00:04 +00:00
zzz
3ecc38cc9c -6 2011-03-12 18:03:32 +00:00
zzz
b23f278c3f ngettext cleanups 2011-03-12 18:00:58 +00:00
zzz
e47afffd09 * Console: Fix HTML errors in
configpeer.jsp, configtunnels.jsp, configupdate.jsp
2011-03-12 17:32:15 +00:00
zzz
0f91899aa9 * Console: Fix HTML errors in form message box,
logs.jsp, netdb.jsp, profiles.jsp, stats.jsp
2011-03-12 16:11:10 +00:00
zzz
8e672ea548 * LogWriter: Prevent NPE after permissions fail 2011-03-12 16:09:57 +00:00
zzz
cfc17d59b4 * BuildHandler: Loop double-check 2011-03-12 16:08:52 +00:00
zzz
46e8add16a * Blocklist: Add bogons since they won't change any more 2011-03-12 16:08:11 +00:00
7f616f20ae Susimail fix typo 2011-03-12 02:37:18 +00:00
133017d2db Susimail translation de 2011-03-12 02:29:13 +00:00
ee6a058602 merge of '2800e8520ddd9ac3f56053467ccfb76cde381974'
and '5c35adb4725a7a6f8145b1f5ee552729a691706d'
2011-03-12 02:26:14 +00:00
6bbdb4fc03 merge of 'ca5b19055e887994435b0eb35978484f2489bb6e'
and 'f2d5735e0701a2b5b380f0967281811b26e26de4'
2011-03-12 02:20:39 +00:00
5def26ab93 Add Susimail to Transifex config 2011-03-11 22:23:25 +00:00
1657f151f6 Update history 2011-03-11 21:53:18 +00:00
a5b55728ba I18N for susimail, including dutch translation. 2011-03-11 21:47:00 +00:00
zzz
8b737b4adb static 2011-03-11 02:31:10 +00:00
zzz
f4e92572eb more generics 2011-03-11 02:18:15 +00:00
zzz
b048b016ad generics 2011-03-11 02:01:20 +00:00
zzz
41fc9cf4ca reverseLookup improvements 2011-03-11 01:11:18 +00:00
zzz
7edbd3ad0a * HostsTxtNamingService:
- Add getEntries() and size() support
2011-03-11 00:29:34 +00:00
zzz
de815e271c * Blockfile:
- More query options
    - More exception logging
    - Fix lookup infinite loop
    - Fix lookup NPE
  * SusiDNS:
    - Refactoring for new NamingService API
    - Initial conversion to new NamingService API
      (still needs work)
    - Fix lots of HTML warnings
    - Some Java 5 cleanup
2011-03-10 23:06:13 +00:00
zzz
ad24f1438f propagate from branch 'i2p.i2p' (head ca5b19055e887994435b0eb35978484f2489bb6e)
to branch 'i2p.i2p.zzz.naming' (head e71d7dc813c07bb2b6798ab74099efdfc1754f47)
2011-03-10 17:59:35 +00:00
zzz
b6a0426477 * logs.jsp: Fix NPE (ticket #430) 2011-03-10 14:04:16 +00:00
zzz
f71dfe50f9 * eepget: Don't set X-Accept-Encoding header (ticket #422) 2011-03-09 17:57:48 +00:00
zzz
6b6aaab881 * configui.jsp: Fix lang setting broken by previous nonce change
* Console: Consolidate nonce handling
2011-03-09 17:16:28 +00:00
zzz
8bbcb0b337 split up form, fix HTML warnings 2011-03-09 15:56:23 +00:00
zzz
a1032abc92 align tables 2011-03-09 15:55:52 +00:00
zzz
380c1e5053 efficiently use entropy in padding 2011-03-09 15:55:00 +00:00
zzz
21dbee03f1 history for prop 2011-03-08 13:34:31 +00:00
zzz
f4ca3976d5 propagate from branch 'i2p.i2p.zzz.test4' (head 7b50b6c3d48da68078a86a53e55e2c18f55685e8)
to branch 'i2p.i2p' (head ebce577e19b70c281daacc5277f98e9bb2bb9630)
2011-03-08 13:31:57 +00:00
zzz
b02fe536bc * Console:
- Parameterize download button tags (ticket #425)
      - Clean up summary bar HTML warnings
      - Just display a summary bar link for text browsers
      - Move welcome div from the readme files to index.jsp
      - Require a nonce to change language
2011-03-08 03:07:02 +00:00
zzz
f9b2c0bc63 * i2psnark:
- More efficient metainfo handling, reduce instantiations
      - Improved handling of storage errors
      - Improved handling of duplicate file names
      - More metainfo sanity checks
      - Metadata transfer error handling improvements
      - Code cleanup, remove dead and duplicated code
2011-03-08 03:01:02 +00:00
6e607e6bfe s/bit/bytes 2011-03-04 18:52:50 +00:00
0e854623c1 Last update of Arabic translation 2011-03-04 17:51:03 +00:00
21c65475f9 Update Arabic translation 2011-03-03 21:14:24 +00:00
97c36cc54e Update Arabic translation of router console 2011-03-02 22:39:14 +00:00
zzz
b30e1f5ba9 two more simple test scripts 2011-03-02 19:31:18 +00:00
zzz
b2d4a799d5 fix reversions after merge 2011-03-02 18:31:48 +00:00
zzz
9030b64dc8 merge of 'ae690eef1560c4b0cbabfd7f75a663bac6b6ee99'
and 'd88d323de60e5ba66e1c96e2d11f91de9029b27d'
2011-03-02 18:24:18 +00:00
zzz
cb707785cc * OutNetMessage: Remove dead code
* Tunnel cleanups, final, javadoc
2011-03-02 17:27:02 +00:00
zzz
f938cc7b0c * BuildHandler:
- Limit request queue size
      - Concurrent request queue
      - Remove dead code for queued rely handling
2011-03-02 17:18:37 +00:00
zzz
28bd1802b4 0.8.4 2011-03-02 15:41:34 +00:00
zzz
35a0be6d1c cleanup/fix console build dependencies 2011-03-01 19:32:42 +00:00
zzz
7b29481124 updates after review 2011-03-01 13:37:40 +00:00
cacd0f898d merge of '2e344d5a40af5ff5f653e5bb911a2a693430d887'
and '7d56ae866ee2ea98e7bd34a9877f002821b4c407'
2011-02-27 20:02:29 +00:00
f8fffb5d20 merge of '1128186f23d4c02c548fa9253638806164f51256'
and '4abd29865b0fb8d04e5374f13c7d659c3d6939d4'
2011-02-27 20:02:27 +00:00
9cd0e53d0f update Arabic translation 2011-02-27 20:02:11 +00:00
b0daab601a merge of '3e32ba6e66f58b4ac347c39ab58f626c9b917f38'
and 'c68baba7320228bca1a46b463158f09ed6535aea'
2011-02-27 19:55:58 +00:00
291b70036a explicit merge of 'e6c9327ff1ba8469394ea059c363542418c60e8f'
and '3e32ba6e66f58b4ac347c39ab58f626c9b917f38'
2011-02-27 18:17:27 +00:00
bfad5889ad update de translation, small change to pt snark by user 2011-02-27 18:06:51 +00:00
zzz
bb8736f2cd drop obsolete docs 2011-02-27 16:24:11 +00:00
zzz
a3fb49adcb add missing files; new API in blockfile NS 2011-02-27 14:49:04 +00:00
zzz
21f14ac22e * Console:
- Fix numerous readme HTML errors
      - Fix flag locations in readmes
      - desktopgui.enable now defaults to false; run systray if false
      - Start icon app before console
      - Restore systray form in configservice.jsp
      - Only save lang when clicking on flags if desktopgui is running
      - Only allow two-letter lang code from cgi parameter
2011-02-27 13:53:39 +00:00
zzz
30373bf6df * Reseed: Disable HTTPS until we have enough working hosts again 2011-02-27 13:46:55 +00:00
e990d98dab rollback the readme I commited accidentally to hamada's version.
fix flagbox
2011-02-27 04:03:37 +00:00
5beb739913 fix message 2011-02-26 08:49:07 +00:00
6e84ee8361 Add full Arabic translation of susidns 2011-02-25 18:50:20 +00:00
dedb139fb0 merge of '426f3701e6aff730cff1ccf9bf0812c6b66dc07a'
and 'c11fe68b816f89dba74a19921645984ecb370946'
2011-02-25 18:47:36 +00:00
d7f5f2c3d8 multi-lang support for building is optional 2011-02-25 16:01:30 +00:00
zzz
bb7d0287d9 * i2psnark:
- Fix delete and remove buttons for Opera and w3m (thx xiake)
      - Stop torrent if no valid trackers
      - Fix war build dependencies
2011-02-24 15:45:18 +00:00
f8e647796b Add Arabic translation of i2psnark 2011-02-24 14:53:33 +00:00
fde783b156 Fixed router console flag problem 2011-02-24 00:29:29 +00:00
zzz
f03064ac71 * BuildHandler: Cleanups and loop checks 2011-02-23 19:36:29 +00:00
zzz
7bf8b46049 fix html error 2011-02-23 19:34:52 +00:00
zzz
6789df50f3 lower the max limit 2011-02-23 15:58:46 +00:00
f0eb74eeb0 merge of '0cc0ed981fc84e39ef190f1540ab82ca067e4c3e'
and '2581256cd4f76cdfe7499610c52b41f6450d88a4'
2011-02-23 14:34:58 +00:00
da41096115 Added susidns arabic and removed french entry from Arabic translation file 2011-02-23 14:33:42 +00:00
61f6ecd725 merge of '8defd07dc628523d87035c507798143df23f7c39'
and 'dbd17e12f35cee94207abc66c7b10c9741fadb9b'
2011-02-23 05:23:44 +00:00
102d9183d8 desktopgui: update russian translation 2011-02-23 05:23:36 +00:00
zzz
c269546c08 stub out new API, needs testing 2011-02-22 23:39:51 +00:00
zzz
79c68c5636 * BuildHandler: Prelmiinary participating tunnel throttler 2011-02-22 23:34:02 +00:00
zzz
4967f8de3c - Add spellcheck=false to textareas 2011-02-22 23:32:37 +00:00
zzz
99f3969b54 - Fix HTML error in server-side 503 error page 2011-02-22 23:31:44 +00:00
d131c4bfec merge of '77b7b8bdb82c499d69c7c8fae6d87b6824bc97d1'
and 'b39e8584ce620f381c8b887e7644ff1f08f0510c'
2011-02-22 17:12:48 +00:00
e93a3ed908 Used Arabic language flag as requested and fixed language name 2011-02-22 16:38:44 +00:00
bfb74f7181 reveal the secret protable target 2011-02-22 16:08:16 +00:00
9b77f5e81f Fixed translation bug and updated routerconsole Arabic translation 2011-02-22 12:39:27 +00:00
36cbae2d7f merge of '13ca0f2216adf3e66f114ceb036d6b9c296a1619'
and '659ccd1cc2f49106cdea175ce29c0542e5fd94e7'
2011-02-22 12:29:54 +00:00
632f34e114 Fixed my translation bug in proxy files 2011-02-22 01:24:04 +00:00
bb31be231d Add Arabic flag and fixed display problem of the language list in router console 2011-02-22 00:06:37 +00:00
zzz
258c260601 fix SkipIterator 2011-02-21 21:35:01 +00:00
0c1bbb349d Cancel and OK should work every time now (before, they only worked if the mouse did not move while clicking). 2011-02-21 17:03:27 +00:00
2dca305c3f revert the half finished translation that's accidentally commited.
(pls rename before commit next time)
2011-02-21 15:39:48 +00:00
8af15e01aa translation update
fix readme <div>
2011-02-21 14:58:06 +00:00
93be3cbdd4 Update Dutch translation 2011-02-20 12:28:44 +00:00
ce103d58a8 Update english labels 2011-02-20 12:24:36 +00:00
b406c6c51e Fixed tests for i2ptunnel. 2011-02-20 11:03:40 +00:00
50e22b614f merge of 'af76c48b3494f94a988fd96021bc5855e50d7e84'
and 'cdbfd85082605354db8dc98dee56d49ad42994ba'
2011-02-20 07:16:54 +00:00
zzz
7c3af2cdd6 * Plugins: Fix signature verification if router.config specifies
trustedUpdateKeys (ticket #416)
2011-02-19 19:14:05 +00:00
fbe3a488e4 routerconsole: update russian translation 2011-02-19 18:49:00 +00:00
zzz
fde7b21ca4 * I2PTunnel: Fix standalone server tunnels
http://forum.i2p/viewtopic.php?t=5376
2011-02-19 17:36:37 +00:00
dev
72692840a7 merge of '37c901026218772a834490f3a1f7b4f3f97f8540'
and 'e0bd7f50374a8accafb4dfa872318cff7fc59d12'
2011-02-19 17:14:30 +00:00
dev
edb976bce5 minor 2011-02-19 17:13:50 +00:00
zzz
3d30e142c1 fix LogSettingsTest hang on fail 2011-02-18 15:37:56 +00:00
aaf2fe9942 -14 2011-02-18 07:10:42 +00:00
d4fce3b98e merge of '2695182df34f8500e1b5d93d7337a46b8a4656f4'
and '2ef560b013d5341eefa6cee116c1f6d06161e9b1'
2011-02-18 07:08:49 +00:00
zzz
bd28397f83 fix LogSettingsTest 2011-02-17 23:22:44 +00:00
zzz
0c7b9a137d merge of '0a27a0cd7dd97fb82efc3aca6f06794769a50365'
and '0b536ca980b0338b2088c0586e9009d64ca138c9'
2011-02-17 23:21:49 +00:00
zzz
f9b2c77161 fix RateTest; includeAntRuntime=true for router tests 2011-02-17 21:23:38 +00:00
6885f96741 Arabic translation of error messages 2011-02-17 21:09:31 +00:00
ef50c122fc Added the option to disable desktopgui. 2011-02-17 17:19:39 +00:00
dev
6c7e913d5e fixed formatting 2011-02-17 16:35:30 +00:00
zzz
b208295cdb fix ant test thx welt 2011-02-17 13:50:43 +00:00
zzz
5027b6ce33 * i2ptunnel: outproxy2 -> outproxyng (Ticket #394 take 2) 2011-02-17 12:55:28 +00:00
zzz
d59e3f9200 - Add Arabic
- A flag of for the Arabic language, including the four Pan-Arab colors. Note: This is the 1917 Arab revolt / Hashemite dynasty flag.

   Source:
	http://commons.wikimedia.org/wiki/File:Arabic-Language-Flag.svg

   License:
	I, the copyright holder of this work, release this work into the public domain. This applies worldwide.
	In some countries this may not be legally possible; if so:
	I grant anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.

   Converted to 16x11 png by zzz / gimp

- revert ch flag old change
2011-02-17 12:52:57 +00:00
zzz
fd91927c11 * Build:
- Add includeAntRuntime=false to all javac targets
      - Add build date, mtn rev, and changed file list to all manifests
      - Add unless=uptodate to all jar and war targets
        (bob and dtg still todo)
2011-02-17 12:47:35 +00:00
zzz
a3d466eeaa merge of '3455cef3331839269d5b10fa09f5ce185042060b'
and 'e69eca8c91b11f3dce6b6bbaa98db4d7f657045c'
2011-02-17 12:33:43 +00:00
dev
bec1b4a8e1 merge of '2640744244f35bbe1cfa2738209238b69696c3aa'
and 'a9276b7c162ada9a117bde0a54aa4da8fdc05773'
2011-02-17 10:45:49 +00:00
dev
84990d9d43 minor changes 2011-02-17 10:45:35 +00:00
e1b40d4925 Add Arabic version of readme and initialNews 2011-02-16 20:02:21 +00:00
8a71ab4447 Added Arabic l10n for router console 2011-02-16 19:11:48 +00:00
ecadbba98e Add russian desktopgui to Transifex config 2011-02-15 20:36:38 +00:00
d468a3a8e6 i2psnark: update russian translation 2011-02-15 17:28:51 +00:00
e227464748 merge of '2f361aff8dd74139e94c6f92e575638347b28b0a'
and 'c095a7e88a112095206c8abb3db82789c620a5e4'
2011-02-15 17:23:02 +00:00
6c61b39f60 desktopgui: add russian translation 2011-02-15 17:20:14 +00:00
ce634d4f44 i2psnark: update russian translation 2011-02-15 17:18:44 +00:00
3d1312d169 i2ptunnel: update russian translation 2011-02-15 17:18:20 +00:00
e75d0b7654 routerconsole: update russian translation 2011-02-15 17:17:59 +00:00
zzz
4d59570df2 * Timers: Log cleanup 2011-02-15 15:25:16 +00:00
zzz
8fa49968ed * i2psnark: Details link shuffle, mostly restore 0.8.3 behavior 2011-02-15 15:22:57 +00:00
zzz
eb7e1d24cd * Profiles: Punish rejections more, in an attempt to spread the
load more through the network
2011-02-15 15:21:32 +00:00
zzz
c1d7182b08 swap constructor param order 2011-02-15 15:19:54 +00:00
dev
81411601d5 merge of '36411afd84e961f271fd1d09a2d7f227f633af4c'
and 'a441ad8880324b5e5e9deb63487986976daf06a8'
2011-02-15 06:26:01 +00:00
dev
b2433d0e50 properly deprecate stuff 2011-02-15 06:22:54 +00:00
dev
2c6984ab99 even more tests 2011-02-14 20:45:36 +00:00
dev
c91d2bf278 minor adjustments to RouterAddress testcase 2011-02-14 18:14:03 +00:00
dev
4c1f3a3143 exclude test classes from coverage 2011-02-14 18:08:45 +00:00
a6686cbed4 Fix headless issue without reboot. 2011-02-14 17:12:12 +00:00
dev
581cd72032 merge of '0d9093cdc66fad9b4827931caa079ad00f2a76f7'
and '8aecdabbd225a6ea26a3c20725aeabfedf2dbe1d'
2011-02-14 16:38:22 +00:00
dev
271f330cdd add another totally useful test 2011-02-14 16:37:23 +00:00
dev
33701195b1 minor changes to some tests 2011-02-14 16:16:20 +00:00
zzz
289c7d6c34 merge of 'b5d2a1759a243f1d66cec0bc09016324eb6e0286'
and 'dae0a00fe84fa6972a8c42237b2b57ec8e4d689d'
2011-02-13 21:23:16 +00:00
d15f682b17 #348 i2psnark french typo 2011-02-13 20:41:26 +00:00
zzz
854998832d * NetDB: Prevent ExpireLeaseJob NPE (thanks sponge) 2011-02-13 20:36:43 +00:00
zzz
38bfca1d65 * GeoIP: Prevent startup NPE (ticket #413, thanks RN) 2011-02-13 20:29:59 +00:00
zzz
1f702f1eb1 * JobQueue: Prevet NPE at shutdown (thanks liberty) 2011-02-13 20:28:46 +00:00
zzz
41d8177340 * Connect Client: Minor NPE fix cleanup 2011-02-13 20:26:56 +00:00
2e84134938 Update Dutch translations 2011-02-13 17:53:41 +00:00
a75b2ccf15 Don't create an english bundle. Add missing desktopgui dependency. 2011-02-13 17:11:53 +00:00
0fef251efb Transifex translation configuration
Project URL: http://www.transifex.net/projects/p/I2P/
This is an evaluation of using this open translation platform.
2011-02-13 14:31:38 +00:00
5e96b86281 Add source language (English) 2011-02-13 13:42:44 +00:00
3c7aa6fcab Add missing plural forms for Dutch and French I2PSnark translation files.
Use the real apostrophe (single quote) character U+2019 to resolve msgfmt -c
errors.
2011-02-13 13:00:05 +00:00
6aaa6cd959 just spoted something that went really wrong 2011-02-12 16:54:48 +00:00
50cb4074d1 changed to utf8 2011-02-12 16:52:17 +00:00
8781f89820 update translation 2011-02-12 12:12:04 +00:00
93010923f0 minor wording 2011-02-12 11:58:31 +00:00
bf6b81f85a translation fix 2011-02-12 11:36:38 +00:00
1d1472c1e4 merge of '47f3a51a7017f1141b9ba7ea01faa1e621324955'
and 'fab379ac654f8f643b8b29203a50cb68c76c181b'
2011-02-12 11:31:41 +00:00
93045c2a8d make windoz msg bundling suck less 2011-02-12 11:30:21 +00:00
2d260a80fa fix msgbundle under windows 2011-02-12 10:50:58 +00:00
zzz
f11a543233 * Clock: Cleanups and javadocs
* EepGet: Cleanups and javadocs
    * Reseed: Use the reseeder as a clock source
2011-02-11 23:59:10 +00:00
f97402b141 merge of 'a6e9aa4eede6931f8bd627a7b6feb3902c8b5113'
and 'd8b436ffeb6b54ba576de5b3caea5f713efdedee'
2011-02-11 19:13:47 +00:00
4471567344 Fixed headless issue, added -8. 2011-02-11 19:12:19 +00:00
dd2c5067aa I2PTunnel: fix my own stupid bug in I2PTunnelConnectClient 2011-02-11 11:12:19 +00:00
8ec3e58e27 I2PTunnel: fix NPE in I2PTunnelConnectClient 2011-02-11 11:07:33 +00:00
1ad005ec6f Minor spelling corrections in comments, no new code. 2011-02-10 20:47:17 +00:00
8d15bb4a38 I2CP: fix NPE in QueuedClientConnectionRunner 2011-02-10 19:47:30 +00:00
d8cff6c3e2 merge of '710537602a9f16aa4235ee5d50f9062658827469'
and 'ebeebe3477f791c404683923ccfaf075de781391'
2011-02-10 18:09:05 +00:00
b43facebad merge of '484cb64d4b1b58d9f8ecb38e7502a128e18c030b'
and '9f73ccf73ff6b692ea790e91358cbd23bf8ac992'
2011-02-10 17:17:14 +00:00
zzz
ae9c160734 * i2psnark:
- Improved magnet link parsing, use tr parameter if present
2011-02-10 17:12:15 +00:00
zzz
03bc4fc133 change shared client default to false for newly created clients 2011-02-10 17:09:29 +00:00
29028342b4 Extra test to check if headers with the same key are maintained. 2011-02-10 17:09:18 +00:00
zzz
e68fbc0243 remove debug nulling, was causing NPE at session close 2011-02-10 17:08:10 +00:00
zzz
fc38d54bcb * I2CP: Correctly close internal connections on the router side
when closed by the client, was causing massive memory leak
            for internal clients using lots of sessions (thanks sponge)
2011-02-10 15:21:23 +00:00
zzz
5eb511b0bf * Streaming: Don't use iter.remove() on a COWAS 2011-02-10 15:20:05 +00:00
zzz
59a16cb689 tweak 2011-02-10 15:17:36 +00:00
2db136b420 * minor revise on some wording.
* updated translation.
2011-02-10 09:46:25 +00:00
c8866bebc4 Added tests to fix HTTPTunnelServer header fix. 2011-02-10 07:20:40 +00:00
99ebad3032 BOB config fix, I2CP fix some leaks, see history.txt for details 2011-02-09 16:15:36 +00:00
467de344b9 * fix typo in bat script
* fix build script poupdate target on windows
* change messages_nl.po's encoding to UTF-8 (desktopUI)
* add message_zh.po for desktopUI
- POs not translated yet, just updated
2011-02-09 15:54:27 +00:00
c2871e151b Use multimap instead of map, to allow multiple headers with the same key. 2011-02-09 06:03:29 +00:00
zzz
ad3342aefb exception cleanup 2011-02-08 14:26:46 +00:00
zzz
54fdfd823b - Drop deprecated NamingServices
- Add caching and b32 support to DummyNamingService
    - BlockfileNamingService Cleanups
2011-02-08 03:29:18 +00:00
zzz
ba9c7015fe blockfile naming service 2011-02-08 00:46:47 +00:00
zzz
208db9a673 initial blockfile mods 2011-02-08 00:45:23 +00:00
zzz
7f10a67804 BlockFile as downloaded 2011-02-08 00:41:33 +00:00
zzz
3f3385fdde message tweak 2011-02-07 19:32:26 +00:00
zzz
6c1f5dd5a9 * i2psnark:
- Check for dup magnet torrent when adding torrent file
      - Add exotrack.i2p (ticket #403)
      - Disable spellcheck in textarea
2011-02-07 19:27:55 +00:00
zzz
86e663b2b4 * i2ptunnel: Generate error message when i2ptunnel.config save fails (ticket #404) 2011-02-07 19:08:56 +00:00
zzz
33c5e14f90 fix SessionEncryptionTest 2011-02-07 19:07:40 +00:00
dev
7c0e82fa4d merge of '5bf3578b311b1d7c5fb2c2dec8dd60e414a7c983'
and '8b3e48e1cca08c942ee3ab576b77af9e2f1a585a'
2011-02-07 18:15:20 +00:00
dev
005fe48e12 merge of '1826c4597d79220a8ad045a63055ac6e75b8a545'
and '6d9e17c19dd9ab91772e21a74fdfe371037b7717'
2011-02-07 18:14:23 +00:00
dev
dcacfb281a increase maxmemory when running junit tests, directly write reports to reports directory instead of moving them later 2011-02-07 18:14:10 +00:00
dev
6c8cacfaa2 updated some core tests to cope with the recent datastructure changes 2011-02-06 17:09:52 +00:00
dev
9bf90c54e1 removed broken duplicated test 2011-02-06 15:21:55 +00:00
zzz
f9d43a8a5f * i2psnark: Fix maggot links, and magnet links with trailing parameters (thx user) 2011-02-06 14:22:32 +00:00
zzz
c38d72d178 * i2ptunnel:
- IRCClient: Use tunnel log instance
      - Server: Full queue log tweak
2011-02-05 23:21:56 +00:00
zzz
b08efb6700 propagate from branch 'i2p.i2p.zzz.dhtsnark' (head 2e0aa840a2872848da7e91b53396aa8584cdf122)
to branch 'i2p.i2p' (head 00bac2c43b65761ddcdf22effe769c8e25da4929)
2011-02-05 22:42:26 +00:00
zzz
6a54aa7e4e cleanups 2011-02-05 22:42:07 +00:00
zzz
e398c036a8 outproxy2 2011-02-05 18:59:06 +00:00
zzz
6b852afe15 new ignore file; drop build dir 2011-02-05 18:56:06 +00:00
121c817268 Fix for headless. 2011-02-04 17:09:13 +00:00
zzz
c979d65ee6 - Add UTF-8 test script
- Fix non-UTF-8 comment in Jetty source File
2011-02-03 19:27:49 +00:00
dev
b502fd0e9d merge of '3bd1963d77675d6b8db1e811e37bf7671f602040'
and 'baffe70898c078da88fedac8e7d10e5301d8b25e'
2011-02-03 17:47:54 +00:00
zzz
b8ab14b7d3 * Build:
- Remove dup flag files (ticket #316)
      - Remove BOB dependency on i2ptunnel
2011-02-03 17:36:22 +00:00
zzz
041e194471 * Reseed: Limit time spent downloading from a single source 2011-02-03 15:47:47 +00:00
zzz
ee6730fdaa * RandomSource: Fix seeding from /dev/urandom 2011-02-03 15:46:24 +00:00
zzz
db93421599 * I2PTunnel: Fix NPE 2011-02-03 15:45:26 +00:00
zzz
9257cbb0e7 * Console: Add DTG to classpath for old installs 2011-02-03 15:44:56 +00:00
dev
daac11d2d1 simplify code(and deduplicate) 2011-02-03 13:53:58 +00:00
dev
85d5a8542e replaced clover with opensource alternative 2011-02-03 06:57:35 +00:00
fa6e60da84 merge of '54d4dff4f475a95dfa8e7c7878c5e6321036b988'
and 'c8ddd603cd6b832a3d5320ada590613a7b2e5c34'
2011-02-02 22:56:00 +00:00
004d7874c4 Core tests build fix. 2011-02-02 22:52:41 +00:00
051fdb2f2a history.txt 2011-02-02 17:08:25 +00:00
ddc8953589 Revise lookup code 2011-02-02 17:06:34 +00:00
4dc686736b Removed http reseed destination b.netdb.i2p2.de and replaced it with forum.i2p2.de/netdb/ 2011-02-01 00:30:34 +00:00
0ccbe818ce Added https://forum.i2p2.de/netdb/ to the list of ssl reseeder urls 2011-01-31 20:06:43 +00:00
be92253330 Added public ssl cert for forum.i2p2.de so we can use it as a secure netdb resource (http://forum.i2p2.de/netdb/) 2011-01-31 20:01:17 +00:00
zzz
97f93c64e6 Fix context properties initialization; history for test4 prop, -1 2011-01-31 15:44:00 +00:00
zzz
e721ddd3a4 propagate from branch 'i2p.i2p.zzz.test4' (head 592b7d2b980e8cba19167fa064f25251296ed8bb)
to branch 'i2p.i2p' (head 0ba672eaca7076092389d2277dba231fdd34423b)
2011-01-31 13:42:36 +00:00
zzz
07b2e3e092 merge of '5f4e1d5a5191ff6bd9063e019fc2b2be471e5e39'
and '86fb452a9d8592dad08f34af6d6517f6e18e3af8'
2011-01-31 13:39:32 +00:00
zzz
71dcbec10e disapproval of revisions 'a74d2ef75dd2d96cca222c96b5f51154a536ac25'..'dbe319d674d6a6a53491762262978f53caaaa58a' 2011-01-31 13:38:11 +00:00
37fc44867f propagate from branch 'i2p.i2p' (head dbe319d674d6a6a53491762262978f53caaaa58a)
to branch 'i2p.i2p.mathiasdm.desktopgui' (head fced1e04334ef1c18bc6ae8a31984e627310b14c)
2011-01-26 06:48:45 +00:00
a440358e60 merge of '48e0ea7fd7688afa736e2ea34205af6f8b4449c0'
and '7d28abec87645e7ef5c5bbbc1120f1ab862842ae'
2011-01-26 06:47:22 +00:00
z3d
89e0e6638d I2PTunnel: Update h2ik proxy details. 2011-01-25 17:05:14 +00:00
232ba5612a Whitespace cleanup, while we're not yet merged into trunk yet. 2011-01-25 07:08:54 +00:00
z3d
fa15710455 Console: light theme: restore truant dropshadow to h1 class. 2011-01-25 02:51:36 +00:00
z3d
fbac928313 Console: revert light theme regressions. 2011-01-24 20:24:40 +00:00
zzz
656670919d 0.8.3 2011-01-24 14:55:34 +00:00
zzz
bf99b04e0a cleanups after review, ticket 390 2011-01-24 13:20:06 +00:00
cf1cf9e738 New trayicon image (thanks, dr|z3d). 2011-01-22 14:28:53 +00:00
4191eb98b0 Dutch translation updated (thanks KwukDuck) 2011-01-22 12:12:14 +00:00
z3d
1eec4484fd Light consistency tweak. 2011-01-22 08:10:01 +00:00
z3d
dc0c97c0ae Multifarious light tweaks. 2011-01-22 07:16:42 +00:00
z3d
a71372c679 TUnnel Manager: light button consistency fix. 2011-01-22 03:14:46 +00:00
z3d
cb2ce5ea29 Classic adjustment. 2011-01-22 03:03:42 +00:00
z3d
b3f8025393 TUnnel Manager light festooneries. 2011-01-22 02:22:36 +00:00
z3d
809bb59c9d Tunnel Manager light tweaks. 2011-01-22 01:51:53 +00:00
zzz
f046eb79bd javadoc 2011-01-21 16:04:45 +00:00
zzz
6981db4fa3 comment out main() 2011-01-21 15:53:37 +00:00
zzz
e924052fd8 final 2011-01-21 15:52:58 +00:00
zzz
9ee8e045b4 small optimization in TunnelID 2011-01-21 15:52:12 +00:00
zzz
b80c0546a2 standard socket cleanups 2011-01-21 15:48:05 +00:00
zzz
d2adbfdf24 dont spec thread pool name, to prevent sharing 2011-01-21 15:36:23 +00:00
z3d
61456ba57e merge of '02fcc2f7749bae7a3ec47e06df2e87b744f859d9'
and '2a04fb3507bc56975b251f740976304cb2801283'
2011-01-21 14:13:49 +00:00
z3d
d05b02de13 Light Chinese finessing. 2011-01-21 12:52:42 +00:00
z3d
a4d270fa63 Light consistency tweaks. 2011-01-21 12:05:23 +00:00
z3d
a946af721e Light tabulatory tweaks. 2011-01-21 04:29:06 +00:00
568f242998 i2ptunnel: remove dup in russian translation 2011-01-21 03:47:03 +00:00
9338196c30 Update Dutch translations 2011-01-20 21:23:00 +00:00
587dd3041a - Added version check needed before starting desktopgui.
- Added correct 'stop I2P' functionality in desktopgui.
2011-01-20 17:10:30 +00:00
zzz
90fc3b0e57 fix XML comment-in-comment thx KillYourTV 2011-01-20 15:14:56 +00:00
zzz
4c84930245 adjust eepsite thread limits 2011-01-20 14:35:38 +00:00
z3d
08de93e7ef Light relief. 2011-01-20 10:29:10 +00:00
z3d
96593c7287 Light spice. 2011-01-20 10:08:07 +00:00
z3d
471ddaa209 Light chinese bite. 2011-01-20 09:57:20 +00:00
z3d
17946fbfab Light tweak, consistency fix. 2011-01-20 09:48:05 +00:00
z3d
22108f2c58 Light tweak. 2011-01-19 22:56:09 +00:00
z3d
2a7bb5b550 Midnight and light cleanups/tweaks. 2011-01-19 22:49:43 +00:00
zzz
da2f4cb915 * Console: Put all socket handlers in same thread pool,
set min/max threads and idle timeout
2011-01-19 20:16:18 +00:00
zzz
653abbcc7e transport cleanups: final, init, pkg private 2011-01-19 17:18:39 +00:00
84d86834b9 Added desktopgui to installation, updater and startup. 2011-01-19 16:51:42 +00:00
zzz
8da1e90226 * RouterContext: Clean up clock overrides
* PeerManager: Make calculators static, take out of router context
2011-01-19 16:40:48 +00:00
zzz
0d52399b15 tweak 2011-01-19 15:33:58 +00:00
zzz
96de505b5b OCMOSJ: dont send an already-expired msg 2011-01-19 15:23:44 +00:00
zzz
7b9f98721d cleanups - final, init, pkg private 2011-01-19 15:05:28 +00:00
zzz
7538766c88 DBF/DHS cleanups and speedups 2011-01-19 14:42:14 +00:00
zzz
7a7889b59a clean up OCMOSJ init 2011-01-19 14:40:29 +00:00
zzz
08d24b059a remove nativeDoubleValue(), update jbigi README 2011-01-18 14:05:26 +00:00
ae00ec5dd6 routerconsole: update russian translation 2011-01-17 20:38:27 +00:00
f9384d627c readme_ru.html: fix link to anchor 2011-01-17 20:37:13 +00:00
bbb731af6c i2ptunnel: update russian translation 2011-01-17 19:37:12 +00:00
2ea05f01eb Fix typo 2011-01-17 19:26:41 +00:00
99405b7dff readme_ru.html: sync with english version 2011-01-17 18:52:24 +00:00
zzz
5a1027c5ed * UPnP:
- Change all log errors to warns (tickets #76, #95, #120)
      - Double socket soTimeout to 2 seconds
2011-01-16 15:31:45 +00:00
zzz
0ed88c5686 * UDP: Prevent rare startup NPE 2011-01-16 15:30:41 +00:00
zzz
32b817f9b1 allow editing of console args 2011-01-16 15:30:04 +00:00
zzz
04d04d0169 add some HTTP headers in the view servlets 2011-01-15 22:23:57 +00:00
z3d
d4a717e6b6 Console themes: Fix for http://trac.i2p2.i2p/ticket/359 2011-01-15 14:49:15 +00:00
zzz
394dd3cd57 propagate from branch 'i2p.i2p' (head dc55b0e10a8da0fb3b9571a30bee6d96d2b1b271)
to branch 'i2p.i2p.zzz.test4' (head b246a3f2df80018875eafca6be6d5d2096c804fd)
2011-01-15 14:39:28 +00:00
z3d
f7df15fd5d Light tweaks. 2011-01-15 05:48:45 +00:00
z3d
29dfa77bce Tunnelmanager light finesse. 2011-01-15 05:39:03 +00:00
z3d
02fbd7f9d6 Light touch. 2011-01-15 05:05:06 +00:00
z3d
c453dd0e34 Console/tunnelmanager: light theme adulteration. 2011-01-15 04:09:53 +00:00
zzz
f679ef250b stub out flags support in I2CP SMES 2011-01-14 17:12:44 +00:00
z3d
8b8a3a4a60 Light tweaks. 2011-01-14 12:55:26 +00:00
z3d
8b664fe2a1 merge of '0c3129e1443b3c155a4e5e06e008fa40a89776a3'
and 'fe23acdcae4f7bace1f6ceb4823a13271fe37207'
2011-01-14 12:28:32 +00:00
z3d
50a6a81706 Light tweaks. 2011-01-14 12:12:19 +00:00
z3d
9944dc0696 Console: light theme, borderline tweak. 2011-01-14 06:16:04 +00:00
z3d
65387def16 Light relief. 2011-01-14 05:51:02 +00:00
z3d
19f1f7c380 Console: Enhanced support for webkit/opera in light theme. 2011-01-14 04:45:59 +00:00
z3d
c36aaa62ba Readme (eng): decombobulation. 2011-01-13 22:34:10 +00:00
z3d
dc120847e1 Readme (en): Clarify "rejecting tunnels". 2011-01-13 22:16:43 +00:00
z3d
1aea5b3dec Additional light tweaks. 2011-01-13 21:39:04 +00:00
z3d
9ea41b6e67 More light tweaks. 2011-01-13 21:27:10 +00:00
z3d
4a85f30bf4 Light tweaks. 2011-01-13 20:58:12 +00:00
zzz
c1c4e50b5b - Finish PEX send/rcv
- Disable KRPC
- Shorten tracker string
2011-01-13 19:54:56 +00:00
zzz
461e3b65f1 propagate from branch 'i2p.i2p.zzz.test4' (head 7c43589775312e84d2fed75f07f03e11b1608bc4)
to branch 'i2p.i2p.zzz.dhtsnark' (head 92f01c300d8392f0bb53715b44db8d0d7fb114a4)
2011-01-13 19:52:27 +00:00
zzz
c92a8851b2 whoops 2 un-singletons 2011-01-13 19:52:11 +00:00
zzz
b55bfd034e propagate from branch 'i2p.i2p.zzz.test4' (head 1b67209a056b1c17df560e857ee8b114a59254a3)
to branch 'i2p.i2p.zzz.dhtsnark' (head 463d86d9ccc9ed8c2faa79f2cf959effa8f92089)
2011-01-13 16:32:26 +00:00
zzz
65c6186479 Cleanups: Collections.singleton(), COWAS - includes ticket #388 2011-01-13 14:21:48 +00:00
z3d
c4445143f9 merge of '6100fa1118decc83a309c2ccf8d128db2e9c2ef8'
and 'd804fb6b50abf7968a0198674912906c60ec9ff0'
2011-01-13 04:38:38 +00:00
z3d
9e2c063465 Console: tunnelmanager a:link color consistency fix. 2011-01-13 04:35:30 +00:00
dev
4dd78ed31b merge of '9d97a97ab57669b6ed2c246c966df9d4afcda899'
and 'bc18ab31728be1d004b18d113343c50f25f0a678'
2011-01-12 20:06:29 +00:00
dev
330f1f341e Fixes to Atom identification. 2011-01-12 20:06:22 +00:00
zzz
b4e0fe121c dont update globals until end of storage check 2011-01-12 13:54:41 +00:00
zzz
79bd5f1c11 fix log init problem 2011-01-12 13:28:32 +00:00
zzz
1ad1883d56 fix hashCode 2011-01-12 13:27:55 +00:00
zzz
4c1050b93a * Router:
- Add new RandomIterator, use in UDP, peer selector,
        profile organizer
      - Add a stat to monitor peer selector run time
2011-01-12 13:19:20 +00:00
z3d
4b85c56903 Console themes: fix news headings. 2011-01-12 12:48:16 +00:00
zzz
dfcb81c32f use context random() 2011-01-11 22:20:05 +00:00
dev
7289c89171 merge of '52a34b607bb02c92ab1dac1ef16a3ce64462e39e'
and 'e6920b673f432050c4d56a74a2ff2074a2959e6a'
2011-01-11 17:51:46 +00:00
dev
c6a2e99a0d Added Intel Atom as (pentium3) as prescribed by the libgmp configure scripts. 2011-01-11 17:51:29 +00:00
dev
1757a2cc08 merge of '4e478ff8494e308808d6df2c47e368ac3aeb61aa'
and '51ae655150adb03f61e4ead408e1e7d827661dc7'
2011-01-11 16:40:37 +00:00
zzz
1811989089 unbundle jbigi.jar, create at build time 2011-01-11 00:44:36 +00:00
zzz
1ae6c28592 Don't expire outgoing piece messages, since we no longer prefetch the data 2011-01-10 17:49:00 +00:00
zzz
6670209cb3 i2psnark:
- Update session options when max bandwidth changes
  - BufferedStream cleanup and comments
  - torrent name display tweak
  - findbugs
2011-01-10 17:14:34 +00:00
5371481007 - Shutdown change in desktopgui.
- Brainstorming about the best way to make desktopgui autostart in I2P.
2011-01-10 17:09:55 +00:00
zzz
c29d0917e9 findbugs tunnel 2011-01-10 16:15:31 +00:00
zzz
e4bb053a61 findbugs netdb 2011-01-10 16:11:33 +00:00
zzz
f15ad23482 findbugs, use context random() 2011-01-10 15:51:02 +00:00
zzz
0c5d88d230 findbugs router, router/client 2011-01-10 15:46:13 +00:00
zzz
f68c095222 findbugs util (includes ticket #370) 2011-01-10 15:45:20 +00:00
zzz
2a85263259 findbugs udp 2011-01-10 15:43:04 +00:00
b963e2a855 propagate from branch 'i2p.i2p' (head 1b82a3bfd792b71321bcbd8f3b8344664db2dc45)
to branch 'i2p.i2p.mathiasdm.desktopgui' (head 4e485a19a83a3e30425e1b1a03836f35fa4ebb50)
2011-01-10 06:41:39 +00:00
zzz
a51ae64e41 build tweak 2011-01-09 01:06:05 +00:00
zzz
fd4e4fbc64 * Data Structures: More caching improvements, don't cache where we shouldn't 2011-01-09 01:04:06 +00:00
zzz
9a63be8f69 * NetDB: Don't rescan netDb directory unless changed,
to reduce Hash cache thrash (backport from test4)
2011-01-09 01:03:05 +00:00
zzz
212c87ffd8 * DataHelper: Speed up and annotate sortStructures()
* RouterInfo:
      - Don't cache byteified data by default, to save ~1.5 MB
      - Don't create empty peers Set, to save ~100KB
2011-01-09 01:02:17 +00:00
dev
16509e5921 Better comments 2011-01-08 20:00:36 +00:00
dev
4c172760cc Corrected some identification code. 2011-01-08 19:58:04 +00:00
dev
7330e5fef8 Added support for new Intel family/model names.
Added proper support for using Core2 machines as P4.
Added support for identifying SSE 3/4.1/4.2/4A support on CPU.
2011-01-08 18:24:16 +00:00
7710b22cfd Moved I2PProperties callback to the RouterContext. 2011-01-07 17:09:27 +00:00
zzz
6cfb2baad3 -9 2011-01-07 00:42:00 +00:00
zzz
158063658c propagate from branch 'i2p.i2p.zzz.test4' (head 8dcdde2b4d8eec6e6832866f70995392b52aa23d)
to branch 'i2p.i2p.zzz.dhtsnark' (head fb155ffe63e76eaa33cd79c9604a555b11a27989)
2011-01-07 00:39:32 +00:00
zzz
0e1d978774 propagate from branch 'i2p.i2p' (head 687bab4d9de8e6686e2734069dfb72f6f2134124)
to branch 'i2p.i2p.zzz.test4' (head 9580436bb581971920ea96e58861142c546c861b)
2011-01-07 00:37:51 +00:00
zzz
3870924fbd * i2psnark: Improve request tracking to reduce memory usage 2011-01-07 00:23:25 +00:00
zzz
087c7b86de findbugs core,client,crypto,data,stat,i2np 2011-01-07 00:15:35 +00:00
zzz
0129051063 * Reseed, peermanager, transport, ntcp, udp, tunnel, tunnel pool
- Findbugs
      - Replace "ghetto" mark/reset
      - Remove dead code in TrivialPreprocessor
      - More efficient UDP peer sort
      - finals
2011-01-06 22:49:16 +00:00
zzz
a087c82db9 cleanups 2011-01-06 18:14:48 +00:00
zzz
a692ab42fa add missing hashCode() 2011-01-06 15:54:54 +00:00
zzz
05a290cdd5 more caching 2011-01-06 15:54:39 +00:00
zzz
3867e6144a simple cleanups and final 2011-01-06 15:45:17 +00:00
zzz
f8a2befbc0 add getProperties() 2011-01-06 15:43:59 +00:00
zzz
9bbcdadd0e propagate from branch 'i2p.i2p' (head 915df7d6afddd7473a7db7fd1f499d350611db62)
to branch 'i2p.i2p.zzz.dhtsnark' (head 4c10a9396745b20a517c9822cf1454aca752ea94)
2011-01-05 21:49:13 +00:00
zzz
ea29c961ed log tweak 2011-01-05 21:01:03 +00:00
zzz
4005bd6804 reseed form button tweak 2011-01-05 20:34:56 +00:00
zzz
e826ce723a * i2psnark: Refactor request tracking to prevent possible deadlocks 2011-01-05 20:21:29 +00:00
zzz
226cb7fdb9 * Streaming:
- Add new real sockets for easier porting of apps.
        See http://zzz.i2p/topics/792 for info.
        Untested.
      - de-SpongeCase
      - Javadoc
2011-01-05 16:41:41 +00:00
zzz
6822bf7978 findbugs high-rank issues 2011-01-05 14:49:51 +00:00
zzz
e2c3ea3ffc log tweak thx ech 2011-01-05 14:47:48 +00:00
zzz
2e51577f39 fix up findbugs target 2011-01-04 22:35:34 +00:00
zzz
976544bd1d stub out PEX 2011-01-04 00:36:24 +00:00
9b0c42ca6f - Added support for on-the-fly routerconsole.lang changes to desktopgui and routerconsole (routerconsole now commits changes to the I2PAppContext).
- Added desktopgui support for detecting if it's running in the same JVM as I2P (without commandline arguments).
2011-01-03 18:40:18 +00:00
2a6c763c31 Added support for callbacks when changes in I2PAppContext properties occur. 2011-01-03 18:37:29 +00:00
zzz
3305f1790c details page for single-file torrents 2011-01-03 18:02:26 +00:00
zzz
8d59fd1cbe some more defines 2011-01-03 16:21:51 +00:00
zzz
532c9d3fc5 * I2CP:
- Add experimental bandwidth limiter
      - Add I2PSession API method to update tunnel and bandwidth
        configuration on an existing session
      - Filter more system properties before passing them to the router
2011-01-03 15:56:02 +00:00
zzz
1a3b0d3812 * I2PAppContext: New getProperties() method
* i2ptunnel:
      - Use context properties as defaults
2011-01-03 14:26:22 +00:00
b92ba5edbb concretization in lang=es 2011-01-03 00:14:45 +00:00
aeb1d40658 minor tweaks and accomodation in lang=es 2011-01-03 00:07:05 +00:00
zzz
bb39d8c6fd disable spell check in textareas 2011-01-02 18:58:06 +00:00
zzz
bb74bc33d1 fix bw limits handling in standard session 2011-01-02 18:56:45 +00:00
zzz
af90121b47 cache tweak 2011-01-02 18:56:04 +00:00
zzz
f015ce1f0b log tweak 2011-01-02 18:55:26 +00:00
zzz
378490886f * NetDB, DatabaseeStoreMessage:
- Convert everything from DataStructure to the
        new DatabaseEntry superclass
      - Optimizations made possible by DatabaseEntry
      - Don't rescan netDb directory unless changed
2011-01-02 14:23:26 +00:00
785d184676 corerection on eespite de 2011-01-02 06:32:42 +00:00
ca5ed9d1b7 merge of '36bd43007b45f4b59b1dc14a2cb02b06c9e7fa84'
and '82c6b46d2891bdaf3043f85ea25fd9f3bf5ab3e5'
2011-01-02 04:39:18 +00:00
8fdc4bc9b0 routerconsole de add ; 2011-01-02 04:36:00 +00:00
7d2bbaad94 actualizar -> actualización 2011-01-02 04:35:07 +00:00
zzz
0eebfbacd7 generics 2011-01-01 20:07:34 +00:00
zzz
4d4bfa00b3 add dht stub 2011-01-01 14:59:41 +00:00
zzz
ffcff54c9f propagate from branch 'i2p.i2p' (head 36bd43007b45f4b59b1dc14a2cb02b06c9e7fa84)
to branch 'i2p.i2p.zzz.dhtsnark' (head 2960be09b366cb629d254d72f0654ff9ecc0133b)
2010-12-31 16:28:53 +00:00
zzz
ed8197f6d2 * Data Structures: More caching and cleanups 2010-12-31 13:21:05 +00:00
zzz
e0f77731c5 generics 2010-12-31 13:19:26 +00:00
zzz
3b51f420c4 better logging 2010-12-31 13:18:36 +00:00
zzz
cd1ed63908 javadoc 2010-12-31 13:18:17 +00:00
zzz
a64d0a54b1 * Datagram Dissector: Fix RuntimeException caused by reuse,
preventing iMule from connecting on UDP
                          (thanks devzero)
2010-12-31 13:16:46 +00:00
zzz
1b74b49e0f remove missing img 2010-12-31 13:16:14 +00:00
zzz
95cf306526 * i2psnark: Send cache directive for in-war icons 2010-12-31 13:14:57 +00:00
zzz
a18197dbdd - Add console request logging, enable with routerconsole.log=filename 2010-12-31 13:14:15 +00:00
zzz
dcb9d38114 - Make theme files and history.txt return 403 on error,
not 500, to avoid the new error page
2010-12-31 13:13:26 +00:00
zzz
544563672c - Link to full history.txt on help page 2010-12-31 13:12:40 +00:00
zzz
0de6c932f5 * OCMOSJ: Refactor cache keys for efficiency 2010-12-31 13:11:25 +00:00
z3d
ba8c8aa90d merge of '21a58b4579e454d8f04032726ab182a3176653da'
and 'a1a6a2d409864f97efb7af374431e7214c5a7976'
2010-12-31 07:16:08 +00:00
f9cc72e892 tweaks 2010-12-31 06:31:18 +00:00
751134f5df merge of '6ac923b4b6f858e909094ff3d0fbfbbfba7ff9d4'
and '8b279c27b4d263a1c9cc02ab7fe2e448e652f469'
2010-12-31 01:52:45 +00:00
4025a57529 grammar fix 2010-12-31 01:51:01 +00:00
bad27e648a fix typo 2010-12-31 01:49:03 +00:00
zzz
5a4af0eeb8 fixup after prop 2010-12-30 15:33:36 +00:00
zzz
5ee08c4b9a propagate from branch 'i2p.i2p' (head 8b279c27b4d263a1c9cc02ab7fe2e448e652f469)
to branch 'i2p.i2p.zzz.dhtsnark' (head 0ce68fac84f881ae27f66c7552bd21d24afaba6f)
2010-12-30 15:22:43 +00:00
zzz
8ab1892560 history for prop, -5 2010-12-30 15:06:54 +00:00
zzz
6ec1772c82 propagate from branch 'i2p.i2p.zzz.test4' (head 544002db2f75a06bbd19571f24692055c41b3290)
to branch 'i2p.i2p' (head 18c56774615023acadd46474b890350cd02a08c9)
2010-12-30 15:01:53 +00:00
zzz
08a3165c44 * Data Structures:
- New SDSCache for SimpleDataStructures
      - New SimpleByteCache for byte[]
      - Cache Hash, PublicKey, and SigningPublicKey
      - Remove global lock in ByteCache
2010-12-30 15:01:39 +00:00
zzz
5d6edad9d4 * I2CP:
- Include the Hash in the DestReplyMessage on a failed lookup
        so the client may correlate replies
        (file omitted from previous checkin)
2010-12-30 13:18:22 +00:00
zzz
01f9be4622 propagate from branch 'i2p.i2p.zzz.test4' (head 764616dd0b3539990a05edb329ece0afd35261cb)
to branch 'i2p.i2p' (head 871752bfdd3d262d0fde193cf787e2705418936a)
2010-12-30 01:35:53 +00:00
zzz
5615b13027 Fix buttons on Firefox 4.0b 2010-12-30 01:35:13 +00:00
zzz
cc4158a7e1 * i2ptunnel:
- Use dropdown box to select interface for clients
      - Warn on index page if required fields not set
2010-12-30 00:36:41 +00:00
80ee0a3b54 merge of '4db34be5448beb1eab5ca54e2e417437a591d8e4'
and '6f964a29ceb436cab5b25b2a74cc225a8e53e88b'
2010-12-29 15:48:01 +00:00
f21b079e25 mods to pt 2010-12-29 15:42:39 +00:00
8a4745a465 merge of 'af0d307e46e94ee1a32100b7ba28e243e8f82e74'
and 'e23be5b3f87b826c3e0d02aa479df283ad906489'
2010-12-29 14:19:47 +00:00
7bd978e569 Fix typo 2010-12-29 14:15:33 +00:00
zzz
563e1f97e8 * DSAEngine: Restore variants of methods using a Hash argument,
required by Syndie, removed in 0.8.1
2010-12-29 14:07:13 +00:00
zzz
fc589db9b2 fix validation errors 2010-12-29 13:31:40 +00:00
zzz
3309b53401 fix validation errors 2010-12-29 13:12:35 +00:00
zzz
a61183303f add configreseed page 2010-12-29 12:56:48 +00:00
zzz
cd58dfdf99 add 500 error page 2010-12-29 12:36:03 +00:00
zzz
45f3a35fac - Add StartCom CA cert required for www.i2pbote.net 2010-12-29 12:35:24 +00:00
9919a41436 fix a typo spotted by user 2010-12-28 19:25:41 +00:00
zzz
01b67acfa0 - Catch OOM when creating torrent (tickets #364 and #366)
- Fix changing 'use open trackers' config setting (old bug)
- More TrackerClient fixes for no primary announce
- More BEValue.toString() improvements for debugging
2010-12-28 15:46:45 +00:00
42ea77df7f minor translation updates 2010-12-28 00:04:47 +00:00
zzz
2ae91a9801 listing info tweaks 2010-12-27 18:08:43 +00:00
zzz
71043c41f1 - Hide I2CP settings when in router context
- Better BEValue.toString()

(most of the following got missed in the last checkin)
- Fix about 9 NPEs
- Fix numwant in magnet mode
- Send metadata size in extension handshake
- Open trackers are primary if we don't have primary trackers
- Add missing break in port message handling
- Increase max msg size to account for metadata msg
- Remember magnets across restarts
- Drop peers w/o extensions if we need metainfo
- Fix DATA messages
- Fix tracker transition to non-magnet
- Fix infohash for non-magnet
- Fix up peer transition to non-magnet
- More logging
2010-12-27 17:13:24 +00:00
zzz
ab4a5d15a1 history for prop, -2 2010-12-27 16:36:33 +00:00
zzz
f225c1cca0 propagate from branch 'i2p.i2p.zzz.test4' (head 56ba5c9f8d0779f91259df05b7be0826fe08cd84)
to branch 'i2p.i2p' (head 0ba2cc80363f5c7086bce7a43f43a9b095ed2d9e)
2010-12-27 16:21:09 +00:00
zzz
6ee162002a fix console jetty temp file names when in ssl-only mode 2010-12-27 15:56:19 +00:00
zzz
fefcb6c2cb prevent leak after exception 2010-12-26 23:35:27 +00:00
zzz
cdcbc80248 Addresses cleanup 2010-12-26 22:57:13 +00:00
965b2611b3 Evolve, document how the URI path fix works. Fix 302 redirects so they URL encode properly. bump to -1 2010-12-26 20:45:29 +00:00
zzz
bebd6b2022 propagate from branch 'i2p.i2p.zzz.test4' (head cd6f8d7166795ee12ac0b24b7e0e26fb2e404151)
to branch 'i2p.i2p.zzz.dhtsnark' (head 1dfd7ad10e6b9ec23db5722a5a024a96659c57a3)
2010-12-26 20:37:02 +00:00
zzz
443abce647 * I2CP:
- Move BWLimits and DestLookup message support from
        I2PSimpleSession to I2PSessionImpl
      - Include the Hash in the DestReplyMessage on a failed lookup
        so the client may correlate replies
      - Add support for parallel lookups and BWLimits requests
      - Add support for specifying the timeout for DestLookups
        (can only be smaller than the router timeout for now)
      - Extend dest lookup router timeout from 10s to 15s
2010-12-26 20:36:44 +00:00
923c3d8b4c Fix 302 redirect so that it encodes the URI path properly. 2010-12-26 18:45:13 +00:00
925f9d0a28 Add virgin ResourceHandler.java file 2010-12-26 18:13:14 +00:00
zzz
49b11bb49e refactor Addresses 2010-12-26 15:07:59 +00:00
zzz
5d494ba89a Move Addresses class from router to core so we can use it in i2ptunnel 2010-12-26 13:48:45 +00:00
zzz
7e229ccea0 propagate from branch 'i2p.i2p.zzz.test4' (head bf9ef6aabb549475a41e936e7074ef625ab194e0)
to branch 'i2p.i2p.zzz.dhtsnark' (head 0a6fe29cd1c9fc357ad2c973be4f1a2a752b52b7)
2010-12-26 13:17:33 +00:00
zzz
cd0d062fca Fix last piece length calculation for torrents > 2GB (ticket #361) 2010-12-26 13:17:12 +00:00
zzz
b3d1a76146 Prep for caching by making SimpleDataStructures immutable after data has been set. 2010-12-26 13:04:52 +00:00
zzz
824d5a0d36 javadocs 2010-12-26 12:42:44 +00:00
zzz
34973371ac * Update:
- Change the UpdateHandler to try all sources in a loop, rather than one,
        so the user need not retry manually
      - For each source, fetch the first 56 bytes and check the version
        before downloading the whole thing, so we need not wait for every
        host to have the latest before updating the news.
2010-12-26 12:37:51 +00:00
zzz
7ee7cbf660 * Stats: Change stat.full default.to false (saves ~ 1MB) 2010-12-26 12:35:54 +00:00
zzz
66f3484508 * i2psnark: Backport TrackerClient NPE fix 2010-12-26 12:32:17 +00:00
zzz
c54b40288b * Addresses: Add listing capability for internal interfaces 2010-12-26 12:31:01 +00:00
zzz
ff0c168d65 * Certificate: Fix fatal null cert error 2010-12-26 12:29:55 +00:00
zzz
12fae66948 - Fix about 9 NPEs
- Fix numwant in magnet mode
- Send metadata size in extension handshake
- Open trackers are primary if we don't have primary trackers
- Add missing break in port message handling
- Increase max msg size to account for metadata msg
- Remember magnets across restarts
- Drop peers w/o extensions if we need metainfo
- Fix DATA messages
- Fix tracker transition to non-magnet
- Fix infohash for non-magnet
- Fix up peer transition to non-magnet
- More logging
2010-12-26 12:27:40 +00:00
zzz
82e344055b * Certificate: Use a single static null cert in place of
tens of thousands of them
2010-12-24 17:39:31 +00:00
zzz
63c6613261 * configclients.jsp:
- Add form for I2CP options
      - Fix HTML errors
2010-12-24 16:52:23 +00:00
15a8d39ef5 router's index ru: multiple fixes
- translation fixes
- typo fixes
- grammar and spelling fixes
2010-12-23 20:05:33 +00:00
85629aca86 routerconsole: fix typo in russian translation 2010-12-23 20:02:10 +00:00
5069bebe99 merge of '28858996311a6bf5c6a1e8f6558502527f1ea9e9'
and 'f251674b3b5b8f06caee32cc5abca12103115022'
2010-12-23 18:50:32 +00:00
b81ff32434 routerconsole: small update of russian translation 2010-12-23 18:50:21 +00:00
5d2f5c7a1f merge of '04a2d141a4d20a86027b0345820c081a8460a671'
and '0c71002f6fde035669ce69ce9f263e9c231917f2'
2010-12-23 18:41:48 +00:00
b862d14ecb Sync russian translation of router's index page with english version 2010-12-23 18:37:58 +00:00
zzz
b97ad6c5f0 generics 2010-12-22 22:23:34 +00:00
zzz
97f0c13c15 - Protection against modifying metainfos
- Announce peers to local tracker
- Ping node on port reception
- More info on directory pages
- Cleanups
2010-12-22 22:22:38 +00:00
zzz
973407498b Magnet icon from http://findicons.com/icon/178214/magnet
Courtesy led24.de
Freeware
2010-12-22 21:45:09 +00:00
z3d
4e3effa7e5 merge of '878149500938c6886eb9e0274ba0901e8fe3a3bb'
and 'deab42b1e2bfe970ba51a868ab2b8c47181fdd15'
2010-12-22 00:03:56 +00:00
z3d
a825132961 Readme (eng): typo fixes. 2010-12-21 23:56:40 +00:00
zzz
690aea255b - Rework traffic counters
- Record the metadata bandwidth
- More null announce handling
- Callbacks for got MetaInfo event
- Cleanups
2010-12-21 23:43:13 +00:00
zzz
f02a0d96dd fix initialNews files in wrong place in installer 2010-12-21 22:05:33 +00:00
zzz
eefa732815 fix reseed fallback to http 2010-12-21 22:05:08 +00:00
zzz
299c1bd67b 0.8.2 2010-12-21 21:22:00 +00:00
zzz
1f22ae6a0c tweaks after review 2010-12-21 21:16:13 +00:00
zzz
f15b329874 - Move some torrent file creation code from the servlet to the manager,
to allow locking and prevent interference by the DirMonitor
- More checks for whether torrent is already running
- Consistent filename filtering in all cases
- Allow null announce string
- Move snarks map to a CHM
- Remember last tracker selection
- Add callback for reception of metainfo
2010-12-21 16:36:08 +00:00
z3d
bb637eb757 merge of 'be5741c3c94c1e0719f55180856bbdeecca4d5e2'
and 'cf23c2bccd1b205a714663148e4591cc09e9617c'
2010-12-21 10:21:37 +00:00
z3d
94f8b81bd3 TunnelManager css tweaks (light/dark/classic). 2010-12-21 10:20:27 +00:00
zzz
8e40b35210 metadata handling - untested, still some stubs 2010-12-21 03:04:10 +00:00
867286b47b - Replaced RouterContext with I2PAppContext.
- Detect I2P location using I2PAppContext.
2010-12-20 21:31:17 +00:00
zzz
8451610737 Several connect-to-self checks 2010-12-20 19:37:38 +00:00
zzz
ad00c16f85 fix NPE 2010-12-20 19:36:49 +00:00
zzz
ebe7f3b127 UI adjustments when no metainfo yet 2010-12-20 18:55:10 +00:00
zzz
7602999274 more prep and stubs for no metainfo 2010-12-20 00:05:03 +00:00
zzz
4899a6d306 Refactor fields to private and replace with getters,
and lots of prep for lack of metainfo and storage.
2010-12-19 22:14:02 +00:00
1d89e136bd translation: routerconsole es stub fixup 2010-12-19 21:59:07 +00:00
e247e959f3 propagate from branch 'i2p.i2p' (head f41d2dbeb0c32c0adc31c610f50c8f6d9feaf65d)
to branch 'i2p.i2p.mathiasdm.desktopgui' (head f5a63128d67798eb6910fb9b12599589adb1711c)
2010-12-19 20:25:09 +00:00
zzz
a3644ccaa9 pluck of 43243e8d732573e9609515178f9a30080395334c 2010-12-19 15:48:29 +00:00
zzz
5e7bad2af0 explicit merge of 'e340ab5e817eb0ed7bb8058e3677aaea268d180a'
and '2c3eb1b692122c7c96b2c547532274f1068fc7f5'
2010-12-19 15:44:40 +00:00
zzz
de112fd63c explicit merge of 'daa35ac8b482063c4db4b6205ca5dacc045080a4'
and 'cde8ce662bee407206b7fea94beaa230f052f501'
2010-12-19 15:43:33 +00:00
zzz
afe57512ab PORT msg support; port and extension listener stubs 2010-12-19 15:37:11 +00:00
zzz
91f1ece753 adjust runner count based on max mem 2010-12-19 15:13:54 +00:00
6725ce096c routerconsole es stub 2010-12-19 12:02:43 +00:00
a568ad2bbc i2psnark es tweaks 2010-12-19 11:59:28 +00:00
z3d
8e72445273 merge of '2c3eb1b692122c7c96b2c547532274f1068fc7f5'
and 'ed99c2a20da18fdc068fa77418f54a1857152a16'
2010-12-19 09:10:49 +00:00
c3f43bc63b add leading space &nbsp; before &hellip; k 2010-12-19 03:55:57 +00:00
f1fe29e4ba add Portuguese translation of i2psnark 2010-12-19 03:52:06 +00:00
086004879d translation update i2psnark es 2010-12-19 03:51:23 +00:00
8ded0392bf translation changes de 2010-12-19 03:40:42 +00:00
58cacd88e4 proxy error translation changes de 2010-12-19 03:33:54 +00:00
3c4994c0e1 Fix script so the proper encodeing is used in the JVM. 2010-12-19 00:40:01 +00:00
0802b9a8dc version bump, history.txt 2010-12-19 00:24:59 +00:00
ed5c61725a merge of 'daa35ac8b482063c4db4b6205ca5dacc045080a4'
and 'e19c106344aa97ad1765e79df75f96182f89d102'
2010-12-19 00:23:10 +00:00
4622080e07 Fix FileResource.java 2010-12-19 00:20:14 +00:00
8d6a12552c Fix URI.java, add FileResource.java 2010-12-19 00:19:26 +00:00
zzz
360d96d085 de-thinsp until we can check UA for opera 2010-12-19 00:04:55 +00:00
f8ed3c561e Add original URI.java source 2010-12-18 19:58:29 +00:00
da8661526f Fix missing </A> 2010-12-18 19:57:56 +00:00
z3d
0d20d95ccd merge of '8ea404af31d0c1c0c9355425f6c880df4e763cea'
and '8edfe96d16e0a77f05f6370cc3e6436c6745303f'
2010-12-18 13:55:30 +00:00
z3d
5781880707 Classic & Midnight proxy error tweaks; favicon_light.ico (awaiting logic!). 2010-12-18 13:24:54 +00:00
zzz
59e5ec7426 fix 1 sec tag causing po error 2010-12-18 13:22:47 +00:00
zzz
7944065e3f cleanups and URL fixes 2010-12-18 13:22:07 +00:00
z3d
d3498138ac Classic filagree. 2010-12-18 07:35:31 +00:00
z3d
2302545a03 Classic futzage. 2010-12-18 07:24:08 +00:00
z3d
5531b4be51 Midnight & Dark mumblings. 2010-12-18 07:13:18 +00:00
z3d
3b4007f8fe Dark disturbance. 2010-12-18 07:02:49 +00:00
z3d
5a567705ca Midnight mod. 2010-12-18 06:51:23 +00:00
z3d
0a5818e1c3 Midnight tweak. 2010-12-18 06:28:21 +00:00
z3d
6c6609c937 Midnight manouevres. 2010-12-18 06:21:46 +00:00
z3d
7e3c347ac3 merge of '094945b98d69169e985ac8068256fec4ee5515f0'
and 'abb387ef4b4418e0e202272f5535a9f076f9da1d'
2010-12-18 05:20:48 +00:00
z3d
c09664c57a Dark 404 fixup. 2010-12-18 04:00:03 +00:00
z3d
73f5eed45c Light tweaks. 2010-12-18 02:30:25 +00:00
z3d
112f3736fb Readme (eng) space insertion. 2010-12-17 23:38:14 +00:00
z3d
c55778ea1a Dark polish. 2010-12-17 22:57:29 +00:00
zzz
7c8e5c6d66 retrofit SimpleDataStructure over SHA1Hash 2010-12-17 22:04:57 +00:00
zzz
d699eaaec9 change map class 2010-12-17 21:50:14 +00:00
zzz
60e57ec29e add some types 2010-12-17 21:49:34 +00:00
zzz
03f58d1886 shorten thread name 2010-12-17 21:48:04 +00:00
z3d
8a1fab0c2f merge of 'a5db72a1d84bd8d00d11acfbd2cd21ad6281e8ef'
and 'cd559af7f771ba5ff6933d3b1315f2836b3fe411'
2010-12-17 21:43:20 +00:00
z3d
65c623a9cc Mods to light, dark & midnight console themes (mostly news tweaks). 2010-12-17 21:43:08 +00:00
4e4165e30d Update Dutch translations 2010-12-17 16:12:13 +00:00
ef340e6b3e merge of '83219c8a9d6734e695b300d9eefc8786b82671a1'
and 'c5b24b88c7bba734c5412f4dd03d8dce069c5ba9'
2010-12-16 15:58:32 +00:00
cab63efacf routerconsole: update russian translation 2010-12-16 15:56:30 +00:00
6bab0e7251 Added https support for r31453.ovh.net 2010-12-16 07:19:07 +00:00
zzz
0bd75f0e56 comment out mains 2010-12-15 23:35:50 +00:00
zzz
df3fc6e05d Random cleanup 2010-12-15 23:19:34 +00:00
zzz
fe575a38aa fix up DH like YK 2010-12-15 22:59:35 +00:00
cb7e6cfb38 i2ptunnel: update russian translation 2010-12-15 19:42:28 +00:00
aca0ae2103 i2psnark: update russian translation 2010-12-15 19:42:10 +00:00
ed9b0bbdd5 routerconsole help_ru.jsp: small fix 2010-12-15 18:46:58 +00:00
97bb51c67b dnf-header_ru.ht: fix typo 2010-12-15 17:20:43 +00:00
zzz
4c9558c586 adjust limits to reduce chance of running out; adjust limits based on max mem 2010-12-15 17:08:11 +00:00
a85f931c1c Fixed r31453.ovh.net reseed url (small change).
SSL still needs to be added for this url.
2010-12-15 16:54:36 +00:00
zzz
2deee2b1b7 AES cleanups and javadoc 2010-12-15 16:10:03 +00:00
zzz
8e709eec2e fixup after prop 2010-12-15 15:19:09 +00:00
zzz
c7c7731f91 propagate from branch 'i2p.i2p' (head 3d405c867f6903bf1d69b04c1daebf3146882525)
to branch 'i2p.i2p.zzz.test4' (head bfd85b10fdd1542526a4b9c53e5d4a733087f317)
2010-12-15 15:09:48 +00:00
zzz
77f910ee36 add max conns to form 2010-12-15 13:41:11 +00:00
zzz
d000d2047d clean up jump host verification 2010-12-15 01:21:58 +00:00
zzz
9d41e86866 add jump list to form 2010-12-15 01:06:08 +00:00
zzz
c15c97f69c put blacklist mode on form 2010-12-14 22:14:29 +00:00
zzz
5ed8be2466 add conn limits to form 2010-12-14 21:39:29 +00:00
zzz
6826c1eb69 disable I2CP auth in-JVM 2010-12-14 20:30:00 +00:00
zzz
46b8befda5 drop non-country flags 2010-12-14 15:33:27 +00:00
zzz
2082feeaa9 one more log error to a warn (ticket #356) 2010-12-14 15:14:36 +00:00
zzz
f9c2624b24 disable log priority override for now 2010-12-14 14:51:23 +00:00
zzz
8bcfdc3c6e i2ptunnel ui fixes 2010-12-14 14:50:52 +00:00
zzz
e772107c58 trivial cleanup 2010-12-14 14:34:50 +00:00
zzz
c44c222557 minor 2010-12-14 14:34:27 +00:00
zzz
8efefeeb5b * I2CP over SSL, enable with i2cp.SSL=true 2010-12-14 14:27:35 +00:00
ceb9bfcc07 Refactoring and splitting logic from interface. 2010-12-14 07:19:37 +00:00
z3d
1a41334e34 Dark & Classic tweaks. 2010-12-14 07:10:58 +00:00
z3d
311f295f22 I2PTunnelManager "Midnight" polish. 2010-12-14 06:31:00 +00:00
z3d
194abc7916 Readme (eng): no leading space before %hellip; 2010-12-13 19:39:06 +00:00
z3d
30145ff298 License typo fix. 2010-12-13 19:19:59 +00:00
z3d
f8bf32e05c Update license. 2010-12-13 19:19:04 +00:00
z3d
35feab3dad Classic tweaks. 2010-12-13 19:15:47 +00:00
z3d
7f3650650d Classic tweakery. 2010-12-13 17:48:07 +00:00
z3d
57edfbbc15 Classic massage. 2010-12-13 16:48:11 +00:00
z3d
7e1a5d5cb5 Light touch. 2010-12-13 15:42:51 +00:00
zzz
59af763dcd do it the easy way 2010-12-13 15:28:06 +00:00
zzz
2880d61c1b * Pack200: Find and use either Oracle or Apache library at runtime;
neither required at compile time.
2010-12-13 14:01:46 +00:00
af8751a3a4 new translation update for de and es 2010-12-13 00:26:26 +00:00
zzz
f194f78953 use base 64 for temp dir name 2010-12-12 22:09:04 +00:00
zzz
a5354f64a5 more classes pkg private 2010-12-12 22:07:26 +00:00
zzz
6d41aadc24 * I2CP:
- New option i2cp.disableInterface to turn off external I2CP port
        (7654) and allow internal clients only
      - Disallow internal connect when shut down
2010-12-12 22:06:30 +00:00
zzz
9a993c00e4 * graphs.jsp:
- Show selected refresh delay
      - Translate refresh delays
      - Fix setting delay to 'Never'
2010-12-12 22:04:06 +00:00
zzz
114c398056 shorten TrackerClient thread name 2010-12-12 21:45:32 +00:00
zzz
384f1bd174 update jetty.xml SSL comments 2010-12-12 21:32:00 +00:00
zzz
653a68b8a5 Disable I2CP host/port options when in router context 2010-12-12 21:30:29 +00:00
zzz
7c63866c51 * i2psnark:
- Fix end-game deadlock
      - Fix last-modified check for multifile torrents, causing
        apparent loss of data after abnormal exit
      - UI Tweaks
2010-12-12 14:49:30 +00:00
z3d
d4b0bfda7e merge of '4be12c91831cc6b24ef6fcf16af9cbb9fa32069d'
and 'c578a1847c62244cfc8308021014c94afef01606'
2010-12-11 18:06:01 +00:00
z3d
c3597cfd99 Readme (eng) typo fix. 2010-12-11 16:43:06 +00:00
z3d
5f91be1b47 -36rc. 2010-12-11 14:49:28 +00:00
z3d
50caf108cc Midnight twickery. 2010-12-11 14:36:16 +00:00
z3d
dea69fee76 Midnight tweaks. 2010-12-11 14:35:27 +00:00
zzz
0be2ca8beb * I2CP: Change a log error to a warning (ticket #353) 2010-12-11 14:24:27 +00:00
z3d
eec96ff670 Midnight logo tweaks. 2010-12-11 14:12:28 +00:00
z3d
8c4298167b Midnight header logo refresh. 2010-12-11 14:06:07 +00:00
zzz
2ca8fc6e62 * i2psnark:
- Restore text (ticket #273)
      - Fix several HTML errors (ticket #273)
      - Fix HTML error causing info links to be unclickable in dillo (tiicket #273)
      - Fix alt text duplicated or looking bad in text browsers (ticket #273)
      - Fix Opera button errors (ticket #332)
      - Fix POST resubmission errors (ticket #334)
      - Catch FetchAndAdd copy error (ticket #352)
      - Set permissions on downloaded torrent files
      - Hide some columns when not running
      - Lots of spacing cleanups
      - Rename images so users don't end up with unused files
      - Remove ~15 unused images
      - Clean up theme selection speed-coding exercise
      - Indent fixes
2010-12-11 13:57:14 +00:00
zzz
89b3e3bcb4 * TunnelPoolManager: Fix rare startup NPE (http://forum.i2p/viewtopic.php?t=5192) 2010-12-11 13:31:23 +00:00
zzz
b55b552e06 * Plugins: Better handling of signing keys (Ticket #351) 2010-12-11 13:30:34 +00:00
zzz
3098d6ef8e * News: XML fixes (ticket #350) 2010-12-11 13:28:16 +00:00
z3d
036e36f611 Light tweak. 2010-12-11 13:28:13 +00:00
z3d
11de315834 Dark tweak. 2010-12-11 13:27:51 +00:00
zzz
638e04beb8 * Log: Don't double-timestamp CRITS in wrapper.log 2010-12-11 13:25:58 +00:00
zzz
10f674a782 * Build: Fix 'ant distclean poupdate' again 2010-12-11 13:24:26 +00:00
zzz
8d54dbac9a merge of 'ba7a210d3d3729205c9f020868e4830f34d74e19'
and 'baae7f79d6af8cd227c59257a3a5ec11c4179c3d'
2010-12-11 13:12:07 +00:00
z3d
198280eea5 Midnight under the moon. 2010-12-11 13:09:12 +00:00
z3d
6644bb0f53 Midnight perspectives. 2010-12-11 13:08:41 +00:00
z3d
99ebcb5e17 Classic doublebyte glyph polish. 2010-12-11 06:12:56 +00:00
z3d
624aff645d Classic changes, sotto voce. 2010-12-11 05:58:41 +00:00
z3d
b0ac5d3bdd Classic smoothness. 2010-12-11 05:21:21 +00:00
z3d
3887b0c4e4 Readme (eng): more clarifications. 2010-12-11 04:42:30 +00:00
z3d
1abf447f85 Dark twiddle. 2010-12-11 03:38:55 +00:00
z3d
587b7861cd Light touch. 2010-12-11 03:38:28 +00:00
z3d
4833b68fc0 Midnight top 'n tail. 2010-12-11 03:34:38 +00:00
z3d
a292770415 Classic enhancements. 2010-12-11 03:21:46 +00:00
z3d
b77bcd4692 Readme (eng) finessing. 2010-12-11 03:21:04 +00:00
z3d
ec9238c99c Readme (eng): make or <br> time (removals division). 2010-12-11 02:49:56 +00:00
z3d
a9f1f1bc1f Readme (eng) detailing. 2010-12-10 20:56:45 +00:00
z3d
ceb45dd17b Classic polish. 2010-12-10 20:49:30 +00:00
z3d
b0564a8aeb Classic ie shimming. 2010-12-10 20:48:09 +00:00
z3d
b7d89a9796 Classic load balancing. 2010-12-10 20:34:38 +00:00
z3d
49a03bdde9 More classic finessing. 2010-12-10 20:31:44 +00:00
z3d
173e03a050 Classic ieshim tweaks. 2010-12-10 20:24:12 +00:00
z3d
651e258de0 Classic <code> tweaks. 2010-12-10 20:17:39 +00:00
z3d
4e7b013ce6 Classic css tweakery. 2010-12-10 20:09:46 +00:00
z3d
60b60f20c9 Classic polish. 2010-12-10 20:09:15 +00:00
z3d
f196ec8854 Classic gloss. 2010-12-10 18:19:07 +00:00
z3d
507dc44b1d Classic ieshimmery. 2010-12-10 18:18:37 +00:00
z3d
36305db762 Readme (eng): minor futzage. 2010-12-10 14:57:35 +00:00
z3d
ea3f886597 Readme (eng): typo fixes and clarfications. 2010-12-10 11:13:27 +00:00
6983380668 Fixed up security fix, so it filters correctly for clients and servers. 2010-12-10 06:04:23 +00:00
36d555523d Added translation support + first language (nl). 2010-12-09 17:22:08 +00:00
z3d
59343b5899 Readme (eng): s/severs/servers 2010-12-09 16:40:37 +00:00
z3d
6df27b273d Vanilla/Ubergine tweaks. 2010-12-08 06:46:42 +00:00
z3d
1a3076a162 Dark updates. 2010-12-08 06:24:26 +00:00
z3d
e46d5c6658 Dark news reversion to radar. 2010-12-08 06:23:19 +00:00
z3d
0fdb10940e -35rc. 2010-12-08 06:00:04 +00:00
z3d
29b8788fc2 Readme (eng): typo fixes. 2010-12-08 05:47:01 +00:00
z3d
6996c60a41 I2PSnark: vanilla/ubergine status line tweaks. 2010-12-08 05:34:22 +00:00
z3d
7d5cfecb64 I2PSnark: Status spacing tweaks. 2010-12-08 05:29:04 +00:00
z3d
6fe4477ccb I2PSnark: Don't forget our priority tooltip! 2010-12-08 04:43:55 +00:00
z3d
e349e13efe I2PSnark: Status updates! 2010-12-08 03:47:36 +00:00
z3d
020da9d0be I2PSnark: Priority tweaks. 2010-12-08 03:24:25 +00:00
z3d
022e77d58d merge of '271d5fa6e5479cee64f70863f31de61f79fa2e03'
and '79a880c604fbbd9dfc56596d8d9c9009b233ca9d'
2010-12-08 03:09:28 +00:00
z3d
7280110c7b I2PSnark: Long awaited changes to file and size header icons. 2010-12-08 03:00:23 +00:00
03ff26acc7 Hide HTTP server name (replace by I2PServer) to avoid server detection
(flaw successfully tested by Adrian Crenshaw -- thanks!).
2010-12-07 21:38:13 +00:00
z3d
26356ce35f -34rc. 2010-12-07 18:53:12 +00:00
z3d
1ddf19c7f9 I2PSnark: follow through with vanilla header images. 2010-12-07 18:51:29 +00:00
z3d
f9e05f5e56 I2PSnark: Add bittorrent logos to head_torrent.png. 2010-12-07 18:24:35 +00:00
z3d
001e5a0816 I2PSnark: Footer icon spacing adjustment. 2010-12-07 18:07:42 +00:00
z3d
7e00d830a9 I2PSnark: header graphic tweaks. 2010-12-07 17:51:14 +00:00
z3d
c1f992f21c I2PSnark: Lose the motorcycles! 2010-12-07 17:06:47 +00:00
z3d
510b4e295b Light tweaks. 2010-12-07 14:03:39 +00:00
z3d
eeb7669c2e Light tweaks. 2010-12-07 00:23:57 +00:00
z3d
2486ebbbd1 Ubergine screenlog tweaks. 2010-12-07 00:04:27 +00:00
z3d
a1698b8eab Light, ubergine & snark changes. 2010-12-06 17:51:10 +00:00
z3d
274272111f Light finessing. 2010-12-06 15:40:57 +00:00
z3d
a723bce18a Light blue adjustment. 2010-12-06 15:20:25 +00:00
z3d
5a0fcc7791 -33rc. 2010-12-06 14:03:03 +00:00
z3d
b4d2eda02c Ubergine lovefest. 2010-12-06 13:54:06 +00:00
z3d
6360fba8f8 Vanilla refinement. 2010-12-06 13:45:14 +00:00
z3d
e7426f727e Vanilla essence. 2010-12-06 13:27:02 +00:00
z3d
51ba6c16fc I2PSnark resolutions. 2010-12-06 13:15:43 +00:00
6749931450 de translation update for 0.8.2 2010-12-06 10:43:05 +00:00
z3d
43e09b00b6 I2PSnark: More overflow fixes. 2010-12-06 04:06:20 +00:00
z3d
bd11011d01 I2PSnark: downloading subsisnark arrows. 2010-12-06 02:34:48 +00:00
z3d
a31e3a2a1f Ubergine tweaks. 2010-12-06 02:01:38 +00:00
z3d
6ae3d8ed01 Snark tweak. 2010-12-06 00:40:58 +00:00
z3d
e6c4d23402 Snark refinements. 2010-12-06 00:35:03 +00:00
z3d
f054663b17 -32rc 2010-12-05 23:50:12 +00:00
z3d
78b990880c I2PSnark: Wrap fixes. 2010-12-05 23:36:25 +00:00
z3d
6a11c472ed I2PSnark: seeding.png tweak. 2010-12-05 21:11:36 +00:00
z3d
c8d9dee46e Dark enhancer. 2010-12-05 20:17:07 +00:00
z3d
e4417c3582 ScarfAce tweak. 2010-12-05 20:05:18 +00:00
z3d
55d1bf353d Tweaks. 2010-12-05 19:44:03 +00:00
zzz
4a9f7b740c * Console:
- Add SSL support - To enable, change clients.config. Examples:
            ## Change to SSL only - just add a '-s'
            clientApp.0.args=-s 7657 ::1,127.0.0.1 ./webapps/
            ## Use both non-SSL and SSL - add '-s port interface'
            clientApp.0.args=7657 ::1,127.0.0.1 -s 7667 ::1,127.0.0.1 ./webapps/
            ## ...and change URLLauncher args further down for the browser to open https:// at startup if you like.
2010-12-05 19:04:33 +00:00
z3d
3d0394e63b Readme tweaks. 2010-12-05 16:25:41 +00:00
z3d
a00845ce4a ScarfAce refreshes. 2010-12-05 14:35:30 +00:00
z3d
57963c9c10 Readme (eng): more futzage! 2010-12-05 13:14:43 +00:00
z3d
c13d2c2dfc Readme: add missing futz (absence spotted by Mathiasdm). 2010-12-05 12:55:10 +00:00
z3d
26fda3944b Readme (eng): futzinger (noun). an zealous partaker of futzing. 2010-12-05 12:24:29 +00:00
z3d
bbad4dd5fa Readme tweaks. 2010-12-05 05:57:15 +00:00
z3d
b411de7bf8 Light tweaks. 2010-12-05 05:51:25 +00:00
z3d
9664ac2a8b Classic&Midnight link.png refresh. 2010-12-05 05:09:44 +00:00
z3d
0bab0ae217 merge of '354d421d8e1f234007967cec4461aedb532ae89e'
and '56635df32be529c80a40a3d84e01ef858c7346ec'
2010-12-05 04:32:28 +00:00
z3d
b5be73a15f Dark tweaks. 2010-12-05 04:31:33 +00:00
z3d
1531fde198 Muffing about with dark iconography. 2010-12-05 04:07:20 +00:00
zzz
c94fa6ef17 tweaks 2010-12-05 04:05:20 +00:00
zzz
3872cad2fb * DataHelper: Have readLong() and readString() throw an
EOFException instead of a DataFormatException on EOF,
      which should lower the log severity in I2CP and I2NP
      when a client or peer disconnects.
2010-12-05 04:05:10 +00:00
z3d
9c9d91c5d3 ScarfAce vectorizations. 2010-12-05 04:03:59 +00:00
z3d
44d5dd65ba Light tweaks. 2010-12-05 03:18:03 +00:00
z3d
e577379519 Mostly theme graphics cruft removal. 2010-12-05 02:43:37 +00:00
z3d
5b0a9fd287 Readme (eng): more clarficatory amendments. 2010-12-05 02:35:03 +00:00
z3d
aa7e1cf72f Dark rumblings. 2010-12-05 02:05:26 +00:00
z3d
bf9ce6e82e Readme (eng): adjustment. 2010-12-05 01:20:27 +00:00
z3d
2403d82a7b ScarfAce muscles in on the dark news. 2010-12-05 01:02:43 +00:00
z3d
225cd17cf5 Readme (eng): more finessing. 2010-12-05 00:42:29 +00:00
z3d
6efec491c6 Readme (eng): more elucidcation. 2010-12-05 00:28:58 +00:00
z3d
589f4ba29d Readme (eng): clarifications, qualifications & enhancements. 2010-12-04 23:53:20 +00:00
z3d
11f0259b36 Readme (eng): more finessing and clarificationary tweaks. 2010-12-04 23:43:10 +00:00
zzz
86de251691 fix QueuedI2CPMessageReader not stopping; javadocs 2010-12-04 22:27:24 +00:00
zzz
0b2bc726df fix SimpleSession NPE 2010-12-04 21:18:37 +00:00
zzz
b42967848e javadoc 2010-12-04 20:39:51 +00:00
zzz
04af255045 SimpleSession doesnt need a notifier thread 2010-12-04 20:39:40 +00:00
zzz
3d759d76cf javadoc, start notifier only after success 2010-12-04 20:39:22 +00:00
zzz
7c583fb1e6 convert mark router liveliness thread to SimpleScheduler 2010-12-04 20:34:57 +00:00
zzz
9aaf95ca98 * Threads:
- Reduce thread pool sizes based on memory and/or bandwidth limits
      - Tweak some thread names for clarity
2010-12-04 18:54:06 +00:00
zzz
6dfd9bca69 log tweaks 2010-12-04 18:48:01 +00:00
zzz
eadf472dd0 * I2PTunnel:
- For clients, use a common thread pool that expires idle threads
        rather than keeping 5 accept() threads for each client.
        This also removes the configurable (30s default) max wait time
        for a socket, this may have to be restored.
      - Use pool for HTTP decompression also.
2010-12-04 18:47:22 +00:00
zzz
04ea1fb9ca javadoc 2010-12-04 18:43:30 +00:00
zzz
947010ad01 I2PThread -> I2PAppThread 2010-12-04 18:42:40 +00:00
zzz
3a05abe556 add a stat to see if getBids() is taking too long 2010-12-04 18:41:12 +00:00
zzz
a1c69082e2 LBQ -> SynchronousQueue so it will expand the pool 2010-12-04 18:38:11 +00:00
z3d
3d5a42658f Readme (eng): clarification(s). 2010-12-04 17:24:20 +00:00
z3d
8f104223df Dark news. 2010-12-04 17:09:26 +00:00
z3d
c713ff6ac0 ScarfAce goes underground. 2010-12-04 16:59:21 +00:00
z3d
2b11267b45 Light webskit/shopera fixes. 2010-12-04 16:46:42 +00:00
z3d
9fbeca08e1 -30 2010-12-04 16:40:12 +00:00
z3d
b23abfb8fc Light enhance. 2010-12-04 16:37:41 +00:00
z3d
e88a1d2a4d Scarface bling. 2010-12-04 16:30:40 +00:00
z3d
62be1bf1ce Readme (eng): Troubleshoot kickbacks. 2010-12-04 15:39:43 +00:00
z3d
ab29e1e560 Readme troubleshooting massage. 2010-12-04 14:50:22 +00:00
z3d
176f54023a Readme (eng) edits. 2010-12-04 14:40:08 +00:00
z3d
c36d2409a7 Dark tweaks. 2010-12-04 14:13:53 +00:00
z3d
333e015a53 merge of '0053ae5e6e0a984e8e8876549da6851de16970d5'
and '23394c79d24fe3cfcdf8b59caf2a707175a60e4f'
2010-12-04 14:10:22 +00:00
z3d
d0ac53fa5e ScarfAce downsizing. 2010-12-04 14:08:59 +00:00
z3d
d2a1a6d113 ScarfAce puts his stash away. 2010-12-04 13:53:56 +00:00
d236a3c72c readme typos and order 2010-12-04 13:04:21 +00:00
z3d
5474646fb2 Readme (eng): enhance troubleshooting section. 2010-12-04 04:50:00 +00:00
z3d
8b75b3c773 Dark stirrings. 2010-12-04 03:35:43 +00:00
z3d
36a7fa1b64 Dark nuance. 2010-12-04 03:28:19 +00:00
z3d
46dcba12ed Dark polish. 2010-12-04 03:16:40 +00:00
z3d
6d3b09a7a2 -29. (ScarfAce Special Edition). 2010-12-04 02:59:02 +00:00
z3d
e9aca5dacb Dark undertones. 2010-12-04 02:55:51 +00:00
zzz
467b082e82 * I2PTunnel:
- Limit server blockingHandle threads
      - Run standard server blockingHandles inline
2010-12-04 02:03:08 +00:00
z3d
6b8f420ad0 -28 2010-12-04 01:54:37 +00:00
z3d
42753be69b Light embellishments. 2010-12-04 01:41:54 +00:00
z3d
1054080cf2 merge of '2dfae8b7197d2abdca4c46244533b97fede046c0'
and '3742a97ed79b29cb38f0ef3919dcf036c126efe2'
2010-12-04 00:49:17 +00:00
z3d
a6946803e4 Light adjustment, please remain seated. Refreshments will be served shortly. 2010-12-04 00:48:02 +00:00
z3d
3f3c44d432 More Light meddling. 2010-12-03 23:09:19 +00:00
z3d
f23b1880f5 Light shift. 2010-12-03 22:43:27 +00:00
z3d
1330930867 Dark rumblings. 2010-12-03 22:24:45 +00:00
z3d
5c3e5cf1e6 Dark dealings. 2010-12-03 22:16:53 +00:00
z3d
d60da1bf63 Light&Dark Opera/Webkit enhancements. 2010-12-03 22:03:41 +00:00
26d423ff6b readme_es s/P/p 2010-12-03 21:33:54 +00:00
zzz
5ab813179d dont update stats after failure 2010-12-03 21:30:32 +00:00
z3d
92254f4295 Light psychoacoustic adjustments. 2010-12-03 21:17:08 +00:00
z3d
e59797e660 Light spatial reordering. 2010-12-03 21:08:02 +00:00
z3d
c7f6e72807 Light frolics in the snow (reported by postman). 2010-12-03 20:52:54 +00:00
zzz
8976746867 mindless history.txt servlet 2010-12-03 20:40:34 +00:00
z3d
f4ceb163bd host.txt: add planet.i2p; more light tweakage. 2010-12-03 19:24:59 +00:00
z3d
e3f2673919 Light touches. 2010-12-03 19:17:22 +00:00
z3d
4a1235a03f proxy error tweaks. 2010-12-03 18:04:29 +00:00
z3d
33dde2b44e -27 2010-12-03 17:28:44 +00:00
z3d
3f63633b45 Light spruce. 2010-12-03 17:27:39 +00:00
zzz
fabbda659b I2CP internal mode tweaks 2010-12-03 17:23:36 +00:00
z3d
2b87eb86ef Light embellishment. 2010-12-03 17:12:54 +00:00
zzz
e9e1890b14 * I2PTunnel:
- Extend header timeouts for HTTP and IRC server tunnels
2010-12-03 17:01:51 +00:00
z3d
61f6ac56e0 -26 2010-12-03 16:54:47 +00:00
zzz
5c73a60551 * I2PTunnel:
- Better logging of server errors
      - Return 503 to client before closing i2p socket if server is not there
2010-12-03 16:51:04 +00:00
z3d
cfc69c22b5 Light hors d'oeuvres, served on a bed of caramelized pig liver (snaffled by postman). 2010-12-03 16:42:39 +00:00
z3d
a20ed8aa18 Light logo, salad on the side (spotted by postman). 2010-12-03 16:24:05 +00:00
z3d
b4fce55aee Readme (eng): typo police. 2010-12-03 15:29:25 +00:00
z3d
19fb2877d3 -25 2010-12-03 15:24:38 +00:00
z3d
9906fc4bdf Light console_big.css finesse. In memory of Bruce Lee. 2010-12-03 15:22:35 +00:00
zzz
ae6a6a1d9c * I2PTunnel: Get Log from the logManager instead of instantiating,
so we may adjust the levels on the fly
2010-12-03 15:20:00 +00:00
z3d
94620d6acb Light logo phasers set to stun. 2010-12-03 15:11:59 +00:00
z3d
1442fd68f3 light/console_big.css added to the workspace manifest. 2010-12-03 15:06:41 +00:00
z3d
90e87046aa Light logo adulteration. 2010-12-03 14:47:31 +00:00
z3d
f088302b05 More light spiff, extra yoghurt (spotted by postman). 2010-12-03 14:15:54 +00:00
z3d
24839d9b04 -24 ftw! 2010-12-03 13:58:37 +00:00
z3d
ef028005bf Light spiff. 2010-12-03 13:56:22 +00:00
z3d
240642803a Light finesse. 2010-12-03 13:24:27 +00:00
z3d
efd11d1950 Light sleight. 2010-12-03 12:22:39 +00:00
z3d
2f49575adb Light table magic. 2010-12-03 11:53:57 +00:00
z3d
e7dc90907d light magic table tweakery. 2010-12-03 07:17:27 +00:00
z3d
56fbb54580 trip the light fantastic. 2010-12-03 07:15:06 +00:00
z3d
cf236deec0 Light adjustment. 2010-12-03 07:03:32 +00:00
z3d
594765dd4e Light futz. 2010-12-03 06:54:30 +00:00
z3d
17526f435c -23 2010-12-03 06:50:56 +00:00
z3d
b649d8424a Light magic touch. 2010-12-03 06:09:11 +00:00
z3d
faf3d08164 proxy error logo refresh. 2010-12-03 05:42:47 +00:00
z3d
e4281cfbab classic ieshim tweaks. 2010-12-03 02:56:15 +00:00
z3d
1b36b3efe1 Light manoeuvring. 2010-12-03 02:35:24 +00:00
z3d
336f576499 merge of 'c824ff0c12a4b616407365fc175b161e7c3736df'
and 'dede80d3699065f495e330c8bb8e9e579882757c'
2010-12-02 18:44:35 +00:00
z3d
3e0da23b4d Readme (eng) futz. 2010-12-02 18:43:25 +00:00
zzz
acf09bb3d0 merge of '1cf0e4a5d377da8d3a8a8bd80a184c589fab1238'
and 'd95ca1deac504336bf9a646b4a6753b35ca6b40b'
2010-12-02 18:31:09 +00:00
zzz
5ba101063a * I2NP: Allow message to be written more than once,
instead of throwing an IllegalStateException
2010-12-02 18:12:38 +00:00
zzz
8f8fb0e5cb log tweak 2010-12-02 18:11:30 +00:00
z3d
c1e56cd05c hosts.txt: add i2plugins.i2p & i2pbote.i2p 2010-12-02 18:01:03 +00:00
zzz
2126b5156e format refresh time 2010-12-02 16:18:09 +00:00
zzz
3d6a5bd9e7 fix extension messages 2010-12-02 16:17:28 +00:00
zzz
2c8421d8ad * Transport: Hamachi address block 5/8 assigned by IANA 2010-12-02 13:01:25 +00:00
zzz
d226d6047f javadoc 2010-12-02 12:58:53 +00:00
zzz
9a6a66d70f * Streaming: Restore I2PSocketManagerFull as public
(broke jwebcahe ticket #345)
2010-12-02 12:58:40 +00:00
z3d
3c51725916 Readme (eng): Attribute Complication as I2Phex maintainer, noting that I2Phex is looking for new devs. 2010-12-02 01:15:05 +00:00
z3d
6eee69835d Light tweak. 2010-12-01 21:32:14 +00:00
zzz
19c6760ea7 * I2CP: Change from the internal pseudo-socket that was
implemented in 0.7.9 to an internal Queue that directly
      passes I2CPMessage objects. For in-JVM clients,
      this eliminates two writer threads per client and
      avoids the serialization/deserialization of I2CP messages.
2010-12-01 18:57:05 +00:00
e3bb912d08 translation tweaks de & es 2010-12-01 18:17:26 +00:00
z3d
28ee1d1f1f I2PSnark: trackererror.png update. 2010-12-01 17:56:58 +00:00
z3d
5fa17238e0 Console: Midnight i2plogo refresh. 2010-12-01 16:33:35 +00:00
z3d
2f044f1345 Dark updates. 2010-12-01 15:58:46 +00:00
z3d
17afef63f2 I2PSnark: Ubergine subisnark love. 2010-12-01 15:40:53 +00:00
z3d
8d62632945 -19 2010-12-01 15:11:44 +00:00
z3d
35a72e8a97 merge of 'c4649554b77db6d5f9d4e4c7aaa8e6830c9f4937'
and 'ca22cd7740376a68a2a9b094458abb2b5dc897d5'
2010-12-01 15:09:17 +00:00
z3d
9f3bcc20f9 I2PSnark: Update subisnark images. Console: Midnight theme tweakage. 2010-12-01 15:01:22 +00:00
z3d
a2a406fb7c Console themes: rework ieshim.css for classic/ie; Classic & Light tweaks; I2PSnark vanilla/ubergine edits. 2010-12-01 13:10:24 +00:00
zzz
293eea9e38 try to fix log flush error at file rotation 2010-11-30 19:04:03 +00:00
6de6fb1b56 es tweaks by user 2010-11-30 18:26:04 +00:00
ac74befd83 propagate from branch 'i2p.i2p' (head 13a52cb132e9cd1eb7e7a0813081a95e3c73153e)
to branch 'i2p.i2p.mathiasdm.desktopgui' (head 2562b1a0e40c669587761eebf9c9430396f23bda)
2010-11-30 17:09:21 +00:00
620128a767 Cleaned up RouterManager, should now be crossplatform. 2010-11-30 17:08:22 +00:00
zzz
e04252f2e7 merge of '758ffc5607f3a32a8aeaa7dd5a1d1b839629d33d'
and 'c366ec63b4c58df5f6fd47dcf1bddd1eb48f43c8'
2010-11-30 15:56:39 +00:00
zzz
578d656f9d change port change message from error to info 2010-11-30 15:22:17 +00:00
zzz
c97e72d050 formatSize tweak 2010-11-30 15:15:39 +00:00
zzz
ad54822383 * i2psnark: Move PeerCheckerTask from Timer to SimpleTimer2 to save some threads 2010-11-30 15:12:18 +00:00
zzz
243bd412e1 * I2CP: Try to hide Pipe closed messages (several tickets) 2010-11-30 15:08:51 +00:00
zzz
45b8d8b6b5 * Logging:
- Limit buffer size; block and wakeup writer when full
      - Limit errors written to system log
      - Add method to force a log below the current level
2010-11-30 15:07:45 +00:00
f7ed341263 requested changes to de 2010-11-30 15:05:14 +00:00
zzz
9147fddb8e * Streaming: Change some log errors to warnings (tickets 76, 341 and others) 2010-11-30 15:04:18 +00:00
db23534e36 merge of '0e94b0f3b3818b53b029fcce7e9ca64680dd4391'
and '5d73bb2f881c3ef24f74af899f7451da1e5f42d4'
2010-11-30 11:17:54 +00:00
4efeecdaba minor de tweaks 2010-11-30 11:16:04 +00:00
z3d
59b53eb6f5 Console translation (de): s/Router-Einstellungen/Einstellungen (sidepanel). 2010-11-29 20:08:27 +00:00
z3d
2980794645 Console translation (fr): s/I2P Configuration Interne/Configuration (sidebar). 2010-11-29 19:55:18 +00:00
z3d
f12556714a -16 2010-11-29 18:18:38 +00:00
z3d
0f288ed720 Console: "light" theme refresh. 2010-11-29 18:16:49 +00:00
e06ce250ab * Switch to I2P logging.
* Add javadoc where necessary.
* Add javadoc build target.
* Some code cleanup.
2010-11-29 17:17:59 +00:00
z3d
e243f90b35 Readme tweaks; Dark manoeuvres. 2010-11-29 17:00:26 +00:00
zzz
601abdce6d Lock down streaming classes not in the API. Holler if this breaks any external apps. 2010-11-29 15:39:55 +00:00
zzz
b5f652ef04 tweak 2010-11-29 15:36:05 +00:00
zzz
671f48e77e -14 2010-11-29 13:51:39 +00:00
zzz
174c222662 * UDP:
- Fix bug causing PacketPusher to loop quickly instead of sleeping
      - Fix udp.sendCycleTime and sendCycleTimeSlow stats
      - Fix speed values on peers.jsp
      - Try to fix rare NPE (ticket 298)
2010-11-29 13:15:11 +00:00
zzz
d31113255e * Logging:
- Use System locale and time zone for default date/time format,
        so it matches the wrapper log time (we can't set the wrapper log time zone).
        (existing installs must remove logger.dateFormat line
         in logger.config to get system default format)
      - Force RuntimeExceptions to CRIT level
      - Don't have log() count buffer size
2010-11-29 13:13:02 +00:00
zzz
a86fef2a21 * i2psnark: Don't timeout queued piece messages 2010-11-29 13:08:03 +00:00
z3d
2138599567 I2PSnark: Vanilla edits. 2010-11-29 05:36:54 +00:00
z3d
8d2ea460c8 I2PSnark: Vanilla finessing. 2010-11-29 04:51:27 +00:00
z3d
054eae8718 Readme tweak; dark tweaks. 2010-11-28 23:29:02 +00:00
z3d
c23116bca8 Readme: add planet.i2p to our list of I2P resources. 2010-11-28 23:23:46 +00:00
z3d
47ce7b24fa Console: Add console_big.css to "dark" theme to accomodate doublebyte glyphs better. 2010-11-28 22:58:07 +00:00
z3d
4a94d48ef7 More readme tweakage. 2010-11-28 20:41:26 +00:00
z3d
d2afaa4586 Readme tweaks 'n fiddles. 2010-11-28 20:36:05 +00:00
z3d
140d893364 Readme futzes. 2010-11-28 20:16:09 +00:00
z3d
693945a471 I2PSnark: s/Ignore/Skip 2010-11-28 17:53:43 +00:00
z3d
f3fc28ff74 Readme tweaks. 2010-11-28 13:29:28 +00:00
3480f8e827 tiny reformulation in fr (user) 2010-11-28 13:03:48 +00:00
de85a8d3f9 merge of 'ac50d73893f7b61e4c91b21080551261aaf0858d'
and 'cb91ed6dab8fa6b20f179c822df7402805e853a6'
2010-11-28 12:59:49 +00:00
77221de703 tiny reformulation in es/pt (user) 2010-11-28 12:59:30 +00:00
26d5390e85 merge of '8f40f2b7ad2272ecedca14c17598ecaf409340e8'
and 'da96c40b16f6e3f2e4e044f0f48cb53f1e9f2264'
2010-11-28 12:36:17 +00:00
1ddea5c134 fix initial news pt 2010-11-28 12:36:11 +00:00
z3d
48adefca22 merge of '5f806c16d9ddce033dc0527c22c5559e00f692e5'
and '893000f2731ec12111a70dbb912005b82642fcaa'
2010-11-28 12:05:14 +00:00
z3d
609a17f438 Light tweak. 2010-11-28 12:03:45 +00:00
z3d
e37f831ce6 Dark&Vanilla tweaks. 2010-11-28 11:40:07 +00:00
zzz
b9413d540a -13 2010-11-28 04:02:05 +00:00
zzz
a52fb65c64 * i2psnark:
- Fix NPE and other partials bugs
      - More extension message stubbing
      - Log tweaks
2010-11-28 04:01:20 +00:00
zzz
9ba86e86aa * I2PTunnel: Deprecate destFromName() 2010-11-28 04:00:02 +00:00
zzz
612d06bd53 * Build: Move all dependencies to top-level build.xml,
so each sub-build.xml is only executed once (true DAG)
2010-11-28 03:56:56 +00:00
z3d
a59e52bff5 Dark tweak. 2010-11-28 02:25:48 +00:00
z3d
5b5459f6e8 Readme edits. 2010-11-28 02:20:51 +00:00
z3d
86bbb8578d Classic tweak. 2010-11-28 02:01:24 +00:00
z3d
0e19f45862 More readme edits. 2010-11-28 01:56:11 +00:00
z3d
8f3d4e8e6b Readme edits. 2010-11-28 01:09:55 +00:00
z3d
bcf1999347 merge of '72b051da2fb0f5215c2c90ba63559876f8909937'
and 'd34a77db6375e8df16bb5fdf76aaa43ab630c704'
2010-11-28 00:58:16 +00:00
z3d
ab80fafa67 Readme tweaks and edits. 2010-11-28 00:54:33 +00:00
0d3f85a2c4 more br->pt conversions 2010-11-27 18:18:23 +00:00
z3d
6a9ea5a131 Snark control button tweak. 2010-11-27 17:58:38 +00:00
z3d
48419588c3 Vanilla tweaks. 2010-11-27 17:56:49 +00:00
z3d
8aaa2ebb3c History.txt typo fix. 2010-11-27 17:53:36 +00:00
z3d
0ea55cbcb8 History.txt 2010-11-27 17:13:24 +00:00
z3d
9158ce9ae2 merge of '0f2ea1b227d59edae92a0450663f0ac1418bd153'
and '846a3cf81acf27ff8da92e611833e5651af94496'
2010-11-27 17:11:36 +00:00
zzz
fdf2b5f7d2 -12 2010-11-27 16:36:46 +00:00
z3d
ce332a407e I2PSnark: tiles for vanilla theme. 2010-11-27 16:35:14 +00:00
zzz
8e98f58f6d merge of '2b0329ad66b84d90d1b7e6e1a6247c6d826321f9'
and '77a4e2e18ab0e48d6f102388838e1367c1d56ebd'
2010-11-27 16:34:15 +00:00
z3d
fdb19bb671 I2PSnark: Vanilla theme - theme specific control buttons. 2010-11-27 16:31:32 +00:00
z3d
b61f564d3b merge of '6c704c4130747ce7d75627bcdf68f1b5195fb0bb'
and '73917249645c8c29f9d46f7ed097290016161e15'
2010-11-27 15:00:08 +00:00
z3d
b805bc7a56 New snark theme: "vanilla". 2010-11-27 14:55:45 +00:00
zzz
3c45b038c6 * i2psnark:
- Drop queued outbound requests when choked
      - Redo some data structures and locking to hopefully prevent deadlock
      - Memory reduction part 3: Return partial pieces to PeerCoordinator when choked
2010-11-27 14:34:08 +00:00
8c5fd29233 Plugin: ticket 336 fix NPE 2010-11-27 13:52:57 +00:00
zzz
ff828e6417 * Build:
- Add man pages to package
      - New updaterWithJavadoc target
    * Console:
      - Add link to javadocs if installed
2010-11-27 13:50:33 +00:00
zzz
28b4239d08 linkify message 2010-11-27 13:48:53 +00:00
zzz
5b951b5b4b javadoc 2010-11-27 13:48:01 +00:00
zzz
df4f40f6f4 log cleanup 2010-11-27 13:46:33 +00:00
zzz
595b562461 prep for another config option 2010-11-27 13:45:09 +00:00
zzz
daa4ff6308 fix race NPE at stream close 2010-11-27 13:44:42 +00:00
zzz
2d0e8b6ec8 fix configstats NPE 2010-11-27 13:43:48 +00:00
z3d
f7c85a4746 merge of '83099cd337dd977a73da45025dd3e2fbff708cee'
and 'a69c4ee8775f64e852719b159c9fc5091405d8cf'
2010-11-27 11:59:02 +00:00
z3d
bcf27dbe12 I2PSnark: Echo themename in screenlog when changed (thanks to sponge); readme tweaks. 2010-11-27 11:53:06 +00:00
8eef3808a4 Slackware: bump i2p-base version, so that it can be upgraded with the new
base code fixes.
2010-11-27 11:17:19 +00:00
z3d
49a946d0f1 Readme (eng) futzing. 2010-11-27 04:54:47 +00:00
z3d
64999e7f01 Readme (eng): more futzing. 2010-11-27 04:23:20 +00:00
z3d
be7609baed Readme: s/anonymity network/invisible internet. 2010-11-27 04:14:10 +00:00
z3d
d57988fbbc Readme: s/darknet/anonymity network. 2010-11-27 04:07:27 +00:00
z3d
a034a8c4f5 Readme (eng) finessing. 2010-11-27 03:42:01 +00:00
z3d
cb99f4191f Readme: clarification. 2010-11-27 03:40:10 +00:00
z3d
56cf29c626 Readme type fix (spotted by user). 2010-11-27 03:29:40 +00:00
z3d
f6ad9be8e4 Dark tweak. 2010-11-27 03:23:22 +00:00
z3d
f56992e8e8 More readme tweaks. 2010-11-27 03:09:08 +00:00
z3d
6aa4baa2b4 Readme (eng) typo fix. 2010-11-27 02:39:35 +00:00
z3d
f0f6aeaea1 Dark tweaks. 2010-11-27 02:37:55 +00:00
z3d
31f3159991 merge of '55a577eea2afce7c3027ebe2eb4ad0032b40f9df'
and 'b48269d2804fffb770351d55a37643c0dcc508ec'
2010-11-27 02:14:26 +00:00
z3d
bf0af85714 Readme (eng) finessing. 2010-11-27 02:13:26 +00:00
c4424b4235 merge of '80ee287e0046c4751abaf3d29d9cd9e8ae26aefe'
and 'bc909db8c63cb08ea501f98b8d389496859c09b8'
2010-11-27 01:19:05 +00:00
17f0627262 - fixed wrong mail selection 2010-11-27 01:05:04 +00:00
z3d
eac4613cec Light tweak. 2010-11-27 00:44:33 +00:00
z3d
c16ea7b05b yet more readme fiddles. 2010-11-27 00:33:17 +00:00
z3d
4690ce4533 Yet more readme tweaks; update "dark" sidepanel logo. 2010-11-27 00:13:03 +00:00
z3d
14bb8bf37d Readme tweaks. 2010-11-27 00:03:04 +00:00
z3d
537ef93eb1 Readme (eng) finessing. 2010-11-26 23:42:41 +00:00
z3d
2160608a21 Readme tweaks; SnarkManager.java fix (thanks to sponge for new snark themer!) 2010-11-26 23:15:09 +00:00
z3d
ccecd72dc0 Readme (eng) typo fix. 2010-11-26 22:57:27 +00:00
z3d
25b9ce1076 merge of '0800868fb9e71ed7990ac34d125b266d4bfbe2fc'
and '3f4014962c62bb98789453c6bd7ad84da007de14'
2010-11-26 22:52:44 +00:00
z3d
0e7385a77a Readme (eng) finessing. 2010-11-26 22:51:54 +00:00
c79f0caa67 i2psnark: Don't save theme parameter if it has not changed. 2010-11-26 22:46:23 +00:00
bbfb8583c7 i2psnark: Add theme change and theme selection storage abilities. 2010-11-26 22:31:59 +00:00
z3d
b54598e9ba Readme (eng) finessing. 2010-11-26 20:02:48 +00:00
zzz
08372be34f -9 2010-11-26 15:59:45 +00:00
zzz
df55494c58 merge of 'b002d4a942128fdd4994a2cfba1c554ba9cb81d8'
and 'e6547920e2da9f540c79fcafc7ca7c82d25eae23'
2010-11-26 15:57:05 +00:00
zzz
b902656dd4 explicit merge of '1788f8361f67967c724d35db872b088e28c985d5'
and '31616535107305cf8195a51302e2b52b165f061c'
2010-11-26 15:56:27 +00:00
zzz
a0a3622f16 remove unneeded initializers 2010-11-26 15:04:58 +00:00
zzz
78a588af0e reduce UDP clock bias by rounding clock and adjusting for RTT 2010-11-26 14:57:16 +00:00
z3d
558d0284e9 Readme (eng) typo fixes. 2010-11-26 14:19:46 +00:00
zzz
e1e6db2b3c Round NTCP timestamps to reduce clock bias 2010-11-26 14:04:49 +00:00
z3d
f66fbfd0fd More readme & theme tweaks. 2010-11-26 13:45:42 +00:00
d7128b4db2 more changes by user 2010-11-26 11:13:17 +00:00
z3d
15382478fa Readme tweaks. 2010-11-26 10:24:14 +00:00
z3d
b21f7f7a89 Readme (eng) finesse; Dark tweaks. 2010-11-26 10:11:11 +00:00
z3d
b9567f1e54 Readme (eng): encore finesse. 2010-11-26 09:48:01 +00:00
z3d
3c256bbd30 Readme (eng): More finessing. 2010-11-26 09:26:49 +00:00
z3d
a82c50fa59 Readme (eng) finessing; Dark tweaks. 2010-11-26 09:04:54 +00:00
z3d
505d2cd469 Dark finesse. 2010-11-26 08:46:42 +00:00
z3d
8b3c072c3c Readme (eng): more textual finessing. 2010-11-26 08:26:45 +00:00
z3d
66e0a6d79d Readme (eng): more finessing. 2010-11-26 08:12:56 +00:00
z3d
bf21c28ecd Readme: jiggle service ordering. 2010-11-26 07:25:37 +00:00
z3d
5642529cc4 -8 2010-11-26 07:12:55 +00:00
z3d
06400a56ae Readme (eng): finessing. 2010-11-26 07:05:12 +00:00
z3d
d49c4f4658 Readme (eng): Tidy up layout, update text. Theme tweaks. 2010-11-26 07:00:44 +00:00
zzz
7f1ace4dbe * i2psnark: Clean up and enhance the PeerCoordinator's partial piece handling,
in preparation for more improvements
2010-11-26 00:44:00 +00:00
zzz
d37944e081 javadoc 2010-11-26 00:41:20 +00:00
zzz
358846ab04 * LogManager: When not in router context, delay creating log file until required 2010-11-26 00:37:20 +00:00
zzz
c3a2982154 * Router: Prevent NCDFE after unzipping update file 2010-11-26 00:36:07 +00:00
zzz
1197a5c8c9 reduce RouterInfo expiration again 2010-11-26 00:33:40 +00:00
zzz
9e250bc07d fix hashcode and javadocs 2010-11-26 00:32:44 +00:00
zzz
ec51ea6513 * Console: Split initialNews.xml into a file for each language;
don't copy to config dir at install.
2010-11-26 00:32:00 +00:00
02c3abfc4c Added desktopgui documentation. 2010-11-25 18:22:28 +00:00
z3d
ab57b55e64 Classic tweaks. 2010-11-25 18:12:39 +00:00
b885046c64 - Added README
- Added configuration
- Added option to start I2P from desktopgui
- Cleanup
2010-11-25 18:12:32 +00:00
z3d
949f933f04 More classic tweaks. 2010-11-25 17:45:29 +00:00
z3d
8e996cd09a Console theme tweaks. 2010-11-25 17:24:56 +00:00
z3d
bab97bfbe4 Dark tweak. 2010-11-25 16:31:54 +00:00
z3d
35db17fa50 Light tweak. 2010-11-25 15:50:13 +00:00
z3d
c66b787006 Classic tweaks. 2010-11-25 14:54:46 +00:00
z3d
00aa884a72 -7 2010-11-25 13:52:24 +00:00
z3d
fc7b1ea150 merge of '60987f4b854cedf353de8adef7747f79ca24b941'
and '8760d93a324f2eb837d218bc3b7450c80bb83b70'
2010-11-25 13:43:58 +00:00
z3d
0a5ffe6651 merge of '30bd40aa8c1637256a775b418e15d0e636cc96c6'
and 'abd4faae60790075a5dd79142e3c7f8cfb15ea40'
2010-11-25 13:43:57 +00:00
z3d
e7272fce53 Console themes: Overhaul of classic and dark; fix langbox glitch on homepage. 2010-11-25 13:40:54 +00:00
b9c36e436d some changes to portuguese readme 2010-11-25 11:37:19 +00:00
a8a608c5c5 br and es readme tweaks 2010-11-24 22:34:56 +00:00
ef92123e00 0.8.1-6 2010-11-24 17:46:23 +00:00
58da5d7942 * Don't use bash explicitly
* Don't put the signer's name into the SignWith field, use the email address instead to avoid problems with spaces
2010-11-24 17:45:13 +00:00
zzz
838da762f8 -6 2010-11-24 16:47:50 +00:00
zzz
9c96c07f3e merge of 'bbaea7567520aced60f19b571f63c11cbb3b1d76'
and 'e7bbb1ca66df6fb49b2f1fcb554e8077dd488fb2'
2010-11-24 16:45:43 +00:00
zzz
9053a86eb0 br->pt 2010-11-24 16:45:28 +00:00
zzz
d5b079faa8 Message cleanup 2010-11-24 16:41:19 +00:00
zzz
8228365d4b * Router:
- Remove global lock on accessing config
      - Add global lock on reading/writing config file
2010-11-24 16:40:13 +00:00
zzz
a8b602bc54 * SimpleDataStructure: Fix problem in fromBase64() that
manifested itself as a configtunnels.jsp bug
2010-11-24 15:06:49 +00:00
zzz
0b59af6551 * i2psnark:
- Prevent dup requests during end game
        (ticket 331 - thanks sponge and Oct!)
2010-11-24 15:04:52 +00:00
zzz
90490cb65d cleanup; limit concurrent renderings to conserve memory 2010-11-24 15:01:14 +00:00
zzz
af519732c4 save some info we might need later 2010-11-24 14:59:27 +00:00
zzz
868f5b1c38 remove dup log 2010-11-24 14:58:40 +00:00
zzz
55db8bf3f6 save p param across posts 2010-11-24 14:56:58 +00:00
zzz
18a90516b3 javadoc 2010-11-24 14:56:07 +00:00
5f3834d398 Slackware, fix rc.i2p, bad logic. 2010-11-24 14:55:53 +00:00
zzz
4dfac0846b add pt, move readme_br to _pt 2010-11-24 14:55:16 +00:00
zzz
ffee32535e add more info about trac 2010-11-24 14:53:41 +00:00
zzz
1b59135b4a javadoc, and comment out a test method 2010-11-24 14:53:24 +00:00
8b5c0a2db1 Plugin: ticket 104 Fix webapp isRunning to check ALL webapps.
The only defecency is that if one is running, that it considers the
      entire pliugin to be running. I'm not sure if that is a good thing
      or a bad thing, but the other code checks threads that way.
2010-11-24 14:31:54 +00:00
z3d
dec1a9d77d Readme.html: Remove links to tino/perv's eepsite status sites (requested by zzz); more tuneups. 2010-11-23 21:30:08 +00:00
z3d
b39d1c7322 Readme.html: finessing. 2010-11-23 20:40:12 +00:00
z3d
19696e1ec1 Readme.html: Add perv and tino eepsite lists; add i2plugins; add target="_blank" to all external links. 2010-11-23 20:08:01 +00:00
z3d
d6a6836d90 merge of '3b6c4d6af6fae83cc9b7d42e8515804ae48ec675'
and '799a00a4929a59478c534a56cce350cdb9a042e0'
2010-11-23 13:54:18 +00:00
53efb4e046 changes to spanish snark by user 2010-11-23 06:30:04 +00:00
fa4379aef1 Portuguese, thx to user 2010-11-22 22:30:11 +00:00
591e531ab6 Kleinschreibung 2010-11-22 22:24:09 +00:00
c41a0c49b3 merge of '09a1ef8a35181c9ebdca5244237767f3eedc3ac0'
and 'ff29f16d54e144a5bdc987ddb29a1b9063742e40'
2010-11-22 17:07:28 +00:00
7c37590800 2010-11-22 17:06:57 +00:00
zzz
e4e0697ea8 -4 2010-11-22 01:17:26 +00:00
zzz
ee831106b7 merge of 'c6ad7f9d5bc5afefd248c4fc8fa5266642e18143'
and 'cbd2b39bbf04f7e25bcea99f213cbad1c323e445'
2010-11-22 01:16:25 +00:00
zzz
502f247d08 update trac message 2010-11-22 01:12:00 +00:00
zzz
ad96c8498d more conversion to POST 2010-11-22 01:03:35 +00:00
705598d66a quote=user: holding back further work until dr|z3d complies with his promise 2010-11-21 23:12:11 +00:00
zzz
3e52d6959b require POST where we can 2010-11-21 23:05:14 +00:00
76bc6f5aee two missing spaces in i2psnark 2010-11-21 22:29:53 +00:00
zzz
6c19e7e399 * i2psnark:
- Defer piece loading until required
      - Stub out Extension message support
2010-11-21 21:19:12 +00:00
zzz
b5ae626425 sort tweak 2010-11-21 20:49:45 +00:00
zzz
d710da5c11 add note 2010-11-21 20:48:17 +00:00
zzz
883fb2cb4a log tweak 2010-11-21 20:47:59 +00:00
zzz
2a34ea8356 * Console:
- Convert GraphHelper to a FormHandler
      - Require POST for all forms
      - Change the way we store the Writer to prevent problems
      - Fix bonus setting on configpeer.jsp
      - More ".jsp" removal
2010-11-21 20:46:48 +00:00
zzz
9e8af7367e * Addressbook: Fix rename error on Windows (tkt 323 - thanks RN!) 2010-11-21 20:40:42 +00:00
zzz
106af9967a * SSLEepGet, Reseeder:
- Implement additional CA loading
      - Provide facility to reuse SSL state for speed
      - Provide facility to store previously untrusted certificates
      - Add SSL reseed hosts, prefer them by default
      - Reseed message cleanup
    * build.xml:
      - Add www.cacert.org cert to the installer and updater so
        SSL on a.netdb.i2p2.de and c.netdb.i2p2.de will work
      - Cleanup, fix distclean error in older ants.
2010-11-21 20:37:49 +00:00
c8cad6ab79 fixed a few typos 2010-11-21 18:40:30 +00:00
d8139cb19e further changes to eepsite, e.g. s/link drücken/link klicken 2010-11-21 12:39:37 +00:00
7a469b048e merge of '1ab0d0ba04d993e3f1101e599cecbcdc3950a26d'
and '26e69d318672e267117c74a736c1ab3d38215c20'
2010-11-20 16:48:40 +00:00
b23d6c9dbe insert a missing space 2010-11-20 16:47:18 +00:00
zzz
d23fdd6b4c -3 2010-11-19 22:47:45 +00:00
zzz
49325d491d merge of '50335c064a9992f4ba8707d62d35bbbbe752d231'
and 'b93c1c7b2b01fc43af5bc07470d9997f3edba6da'
2010-11-19 22:46:27 +00:00
zzz
635b53c329 fix ant distclean javadoc 2010-11-19 22:30:41 +00:00
zzz
72d2137e9b javadoc fix 2010-11-19 22:07:29 +00:00
zzz
c06198491e always have as many recent as active 2010-11-19 21:13:35 +00:00
zzz
9b69dad06b * Addressbook
- Store last-fetched time so we don't always fetch subscriptions after restart
      - Randomize first fetch time
      - Make most classes package private
2010-11-19 21:12:45 +00:00
1a8406e0f7 merge of 'cdf6b7afd6c4244142f0a24fda0a9603ea117767'
and 'f5d8fb56c10dc0007901ed64a84a5cba32a3ca92'
2010-11-19 19:26:47 +00:00
509befc912 removed some strange-looking strings in French router console translation that stroke my eye, have not read through all of it tho; change some capitalizations in de and de eepsite 2010-11-19 19:17:07 +00:00
z3d
e73439d876 Console: New favicon.ico 2010-11-19 19:02:05 +00:00
zzz
729aedee5f * News:
- Store news last-fetched time so we don't always fetch news after restart
      - Don't include news in the updater
2010-11-19 18:34:00 +00:00
765d4b8563 update languages 2010-11-19 17:58:30 +00:00
zzz
6b0c931200 change buttons from GET to POST 2010-11-19 16:42:23 +00:00
zzz
dd39f3f244 i2ptunnel jsp cleanup 2010-11-19 16:14:14 +00:00
zzz
af4a285e5b fix small confignav problem 2010-11-19 15:32:31 +00:00
zzz
166f378f2f clean up more urls and POST self-references 2010-11-19 15:23:25 +00:00
z3d
9d037911d0 Eepsite Help: Add some new flags, tweak layout, finesse German. 2010-11-19 15:01:26 +00:00
z3d
73baec8539 merge of '7665dfe8f38eaf14d608493cb893b2dffaba49aa'
and 'edc923fb03834a90710c72b8a3fb206cfb904e86'
2010-11-19 14:45:49 +00:00
z3d
118872ab69 merge of '75fac120e4d13f521c4a863604f331b845a2d7e4'
and 'f0fab315b6a44d956c29a25bb527e7974ea62088'
2010-11-19 14:45:47 +00:00
zzz
f0ac96cab1 Increase i2ptunnel nonce queue size again 2010-11-19 14:42:10 +00:00
zzz
4545a98968 More work on error propagation and improving log messages in i2ptunnel and I2CP client 2010-11-19 14:41:26 +00:00
z3d
0ba6299655 Readme: Insert missing </div> to fix positional issues with langbar. 2010-11-19 14:41:08 +00:00
e32e316146 convert period to exclamation mark 2010-11-19 07:16:04 +00:00
zzz
e940f51599 * SecureFile: New class, catch places that were missed,
add i2p.insecureFiles option to disable (default false)
2010-11-19 00:40:33 +00:00
zzz
50d9080e26 add note 2010-11-19 00:36:24 +00:00
6836b548af Comments 2010-11-18 23:52:43 +00:00
457e1d293a update 2010-11-18 22:55:45 +00:00
11807df8b3 merge of '09e7a6657a746f06face3afe1374efc8179d9739'
and '21d86fc1f8deb605adc6f6a7022e644e1f4c8b00'
2010-11-18 22:49:28 +00:00
96ff36c159 fix a line break and too long seconds 2010-11-18 22:47:34 +00:00
da782c07a4 Add debian/source/format (lintian: missing-debian-source-format) 2010-11-18 20:58:37 +00:00
b32399ac60 0.8.1 2010-11-18 20:58:04 +00:00
f1e36f7fd0 Create Debian packages in debian/packages/ instead of ../ 2010-11-18 20:56:42 +00:00
b434a475a3 Thrown away additional libraries and code, started something simpler to build on. 2010-11-18 20:38:21 +00:00
zzz
1cad02c461 remove jrandom signing key as it may no longer be secure 2010-11-18 19:27:37 +00:00
b56563deee new router console strings, leaving 'rolling avg' for next round 2010-11-18 19:17:02 +00:00
zzz
81d885c5a4 postman b32 take 2; recognize oga and ogv 2010-11-18 15:02:29 +00:00
ad3039390d more proxy translation 2010-11-18 11:53:08 +00:00
365e0f093d 2010-11-18 09:18:15 +00:00
zzz
138be42aa5 bye .jsp part 2 2010-11-17 22:26:31 +00:00
zzz
8a385ffc32 recognize postman b32 2010-11-17 22:19:13 +00:00
zzz
995c736a71 peers.jsp fixups 2010-11-17 22:15:45 +00:00
zzz
a9801766e5 * PrivateKeyFile: Speedups and better messages 2010-11-17 22:14:55 +00:00
zzz
6544e135b2 add red clock 2010-11-17 16:23:40 +00:00
zzz
a71b379ff8 comment out distclean deb files again 2010-11-17 16:13:59 +00:00
zzz
2f880f7b5b propagate from branch 'i2p.i2p.zzz.test4' (head 3569f7d0608498cadafc88e87a0ad2b18c44dfb6)
to branch 'i2p.i2p' (head ddc9be27c47878e472d5b6c281cccb6094c42c9a)
2010-11-17 16:09:19 +00:00
zzz
f698ef93e8 * I2PTunnel SOCKS and SOCKS IRC clients:
- Add SOCKS 5 outproxy support, with username/password authorization
    * I2PTunnel
      - Index page outproxy display cleanup
2010-11-17 15:47:00 +00:00
zzz
bf0275ddcb * I2PTunnel: Improve messages when starting and stopping tunnels, add some tags 2010-11-17 14:27:32 +00:00
zzz
e68a3fb856 * Streaming: Fix bug causing read() to incorrectly return EOF 2010-11-17 14:26:24 +00:00
b9a6dfbcda a missing comma in i2psnark, prolly others still missing 2010-11-17 00:03:38 +00:00
28f790bbe7 further tiny de tweaks 2010-11-16 18:52:03 +00:00
1becd42695 changes to spanish by user 2010-11-16 18:32:42 +00:00
d6f80a7b77 tweaks to French i2psnark translation by albat and user 2010-11-16 18:25:58 +00:00
zzz
bdbbe30c2c bump to -1 after merge of stuff that missed the release 2010-11-15 13:27:24 +00:00
zzz
b0ae907a86 merge of '1d65e621dc6cf1d3558c33ec81ac8dc5820c210e'
and '9572100b83b95246d97f9879011be63898ac1e52'
2010-11-15 13:26:04 +00:00
zzz
4078c70caa news header fix 2010-11-15 13:01:06 +00:00
fb6560db40 merge of '2eb6f45d531fc66bce57696bd27ae4d2ea9cd2a0'
and '84303e0952347926ec08fcea629bb0b27f9b95dd'
2010-11-15 00:49:36 +00:00
zzz
10aed35b08 0.8.1 2010-11-15 00:23:00 +00:00
cbf0239c23 Fix lintian error: no-standards-version-field 2010-11-15 00:18:31 +00:00
a7c50fcfd9 Make maintainer in debian/changelog the same as in debian/control (lintian: changelog-should-mention-nmu) 2010-11-15 00:13:11 +00:00
a598d9019c strip binaries in debian package (lintian: unstripped-binary-or-object) 2010-11-15 00:07:40 +00:00
a91d9bc68f proxy Err pages translation de 2010-11-14 23:59:01 +00:00
zzz
355ca7b2f7 tweaks after review 2010-11-14 23:58:13 +00:00
e963c3d3a2 Add binary-arch and binary-indep targets (lintian: debian-rules-missing-required-target) 2010-11-14 23:57:36 +00:00
3b4371ad4b Replace libc6 dependency with shlibs:Depends (lintian: package-depends-on-hardcoded-libc) 2010-11-14 23:55:03 +00:00
2121b04f31 merge of '1e02b9123df580c44b0fa30918003bc8cf8030a4'
and 'c65ae88fa8b668ccd972d6a0bafe7843ea487285'
2010-11-14 19:25:06 +00:00
2420373389 language names consistency fix 2010-11-14 19:14:31 +00:00
235f6e0383 merge of '582904768901629443730b9763abb65e8ac8dd74'
and '8e94fe72b25ee4167620078c94890ca496fba9ad'
2010-11-14 18:40:58 +00:00
3f7d432f91 routerconsole: update russian translation
- Change translation of some terms:
  + тред -> поток
  + журнал -> лог
  + аптайм -> время работы
- use lowercase for second word where needed
- Reorder words where needed

These things was discussed on irc #ru
2010-11-14 18:38:23 +00:00
894e649be9 routerconsole: russian translation fixes 2010-11-14 17:35:52 +00:00
388767258a i2psnark: update russian translation 2010-11-14 16:27:27 +00:00
zzz
f3307d6508 * Addressbook:
- Try to save files safely
      - Catch bad B64 lengths
2010-11-14 15:05:24 +00:00
zzz
c29a275969 summary bar spacing cleanup 2010-11-14 15:03:50 +00:00
zzz
c890f61d0b javadoc 2010-11-14 15:01:52 +00:00
zzz
1e0e24826e concurrent 2010-11-14 15:01:23 +00:00
d6ea9cb0a4 i2ptunnel: update russian translation 2010-11-14 14:57:47 +00:00
zzz
dc6fc0185c final 2010-11-14 14:56:54 +00:00
zzz
1d627371ce todo comment 2010-11-14 14:55:58 +00:00
zzz
d3b05f44d5 cleanups 2010-11-14 14:54:18 +00:00
zzz
581b915748 Call session.propogateError() on reception of SessionStatusMessage with bad status or DisconnectMessage 2010-11-14 14:53:30 +00:00
zzz
e293b25bb7 I2CP username/pw auth (client side) 2010-11-14 14:50:45 +00:00
zzz
23005a82b1 I2CP username/pw auth (router side) 2010-11-14 14:49:26 +00:00
zzz
d47dcddb9b send I2CP DisconnectMessage at router shutdown 2010-11-14 14:47:43 +00:00
zzz
cd621f2b4b * I2PTunnel SOCKS and SOCKS IRC clients:
- Add local proxy username/password authorization
2010-11-14 14:22:45 +00:00
zzz
7cbf74d3f2 * I2PTunnel HTTP and Connect clients:
- Shim in a new abstract superclass I2PTunnelHTTPClientBase for common code
      - Add local proxy username/password authorization
      - Add outproxy username/password authorization
      - Filter hop-by-hop Proxy headers appropriately
2010-11-14 14:18:43 +00:00
zzz
7967653dd1 * DataStructures:
- Shim in 3 new abstract classes
        SimpleDataStructure, KeysAndCert, and DatabaseEntry

===========

Right now, everything in net.i2p.data extends DataStructureImpl.


There are several goals for adding some intermediate abstract classes,
between DataStructureImpl and the concrete classes:


1) Merge common code
2) Make the simple cases (a single byte array) more efficient
   by adding a common base class.
   I'm calling this one SimpleDataStructure.
3) Make a common base class for Destination and RouterIdentity
   since they are almost exactly the same thing.
   Consolidate the getters/setters and hash functions here.
   I'm calling this one KeysAndCert.
4) Make a common base class for LeaseSet and RouterInfo so
   so netDb and I2NP can handle them easier, without doing
   "instanceof" all over the place.
   Consolidate the hash, signature, and routing key functions here.
   I'm calling this one DatabaseEntry.
5) Make it easier to add more object caching.


The additional classes are retrofit
above many of the data types:


DataStructureImpl (unchanged)
-------------------
	ByteArray
	Certificate
	Lease
	Payload
	RouterAddress
	TunnelId


	SimpleDataStructure (new)
	-------------------------
		Hash
		PrivateKey
		PublicKey
		SessionKey
		SessionTag (was ByteArray)
		Signature
		SigningPrivateKey
		SigningPublicKey


	KeysAndCert (new)
	-----------------
		Destination
		RouterIdentity


	DatabaseEntry (new)
	-------------------
		LeaseSet
		RouterInfo
2010-11-14 14:09:58 +00:00
zzz
ad060c5d5d remove unused TunnelId methods 2010-11-14 14:00:39 +00:00
9af33974eb merge of '9e5fa2ede2d44dd05b58b29796cb86a510628fa2'
and 'd0a4b4ea6faa776eb1e35049ffdc0fb0beee9135'
2010-11-13 23:00:10 +00:00
fdbfa00d96 fix missing </a> 2010-11-13 22:43:20 +00:00
e844cf25c2 routerconsole: update russian translation 2010-11-13 22:20:30 +00:00
4df05f69b1 merge of '3aff7e5f43f96e1909cffca3b9c608bb6b02af53'
and '9dc9aae56898fbe4bb03c860f00dac9b8a5552b5'
2010-11-13 21:54:48 +00:00
c52693d2ac little translation tweaks in i2psnark 2010-11-13 20:02:04 +00:00
8d2a75bc01 Add man pages for eepget and i2prouter 2010-11-13 17:58:05 +00:00
5fe654e7e8 Abort if any command in the script exits with an error (lintian: maintainer-script-ignores-errors) 2010-11-13 17:55:34 +00:00
cd741439d9 merge of '83f0017029b25b67b4d90694eba5ceefb9f006f9'
and 'ae9bcaf1a7c197b462162c4513161894de6c658a'
2010-11-13 17:25:25 +00:00
bdff919d3f only updating a flag on readme 2010-11-13 16:23:31 +00:00
zzz
f4b49f7425 change low mem error to warn 2010-11-13 12:06:16 +00:00
zzz
db7e4a273b static 2010-11-13 12:05:49 +00:00
42f6b9e24b merge of 'b6f941cc4c3eb51d9106dfdf35abdd7f3d1199af'
and 'ed834a4da30a6a913ab0145cd76519e5eaa969d2'
2010-11-13 10:53:30 +00:00
ad3ae84083 French translation Nachtrag 2010-11-13 10:53:14 +00:00
a4c9397db0 French translation of i2psnark done by Redzara. Thx, redzara\! 2010-11-13 09:56:43 +00:00
z3d
5380879aba I2PSnark: Update stopped.png 2010-11-13 08:50:46 +00:00
eda1f8d640 merge of '89b2dc0430e50fd1ce78ab07cd3545aded81fee9'
and 'dcba57e8260ad530685ca665724566533964a7b4'
2010-11-13 04:14:13 +00:00
88e98f0f67 Don't call the init script directly, use invoke-rc.d (lintian: maintainer-script-calls-init-script-directly) 2010-11-13 04:08:56 +00:00
2faa60ee59 update eepsite help 2010-11-13 02:43:35 +00:00
b614d14037 merge of '4fff03e3acecbfb131a884b6c151967978058c49'
and '7ec0520d4bb67df2b9c378aab53bffbf8dcb222b'
2010-11-13 01:36:25 +00:00
d9bf826baf initialNews.xml fix; i2psnark translation tuning 2010-11-13 01:30:02 +00:00
2152c5f6c9 Use a variable for /tmp to make lintian happy (possibly-insecure-handling-of-tmp-files-in-maintainer-script) 2010-11-13 00:39:55 +00:00
0d23e37124 Add shebang to script 2010-11-13 00:30:11 +00:00
fddf32a6ca * Stop service at runlevels 0 and 6 (lintian: init.d-script-possible-missing-stop)
* Add force-reload option, same as restart (lintian: init.d-script-does-not-implement-required-option)
2010-11-13 00:28:30 +00:00
a07339e1ff Remove rc.d files in postrm, not in prerm (fixes lintian errors prerm-calls-updaterc.d and postrm-does-not-call-updaterc.d-for-init.d-script) 2010-11-13 00:03:13 +00:00
c5a6c5d412 merge of '963a4636469adb55ac3981048b32011865bb4faa'
and 'cdac59d49a839e82c626130a576b12a1297f981e'
2010-11-13 00:02:02 +00:00
7e17ac989b adding stub 2010-11-12 23:53:33 +00:00
7b5e331038 Put a name and email in the Maintainer field 2010-11-12 23:28:25 +00:00
ae101f6cad Reorganize the Debian directory structure to conform to their packaging policy. This brings the number of Lintian errors+warning
s down from 383 to 16.
2010-11-12 22:57:59 +00:00
z3d
98f559c9c0 I2PSnark: More width futzing. Please report any layout breakage (wrapping lines in main torrent table). 2010-11-12 19:08:47 +00:00
z3d
d368bb8ae0 I2PSnark: More width futzage. 2010-11-12 13:20:42 +00:00
z3d
33932eb373 I2PSnark: TorrentName width tuneup. 2010-11-12 12:58:17 +00:00
z3d
7d6e237183 merge of 'bc9f7e74001104c203687a91535b414228b5184b'
and 'f0ebb51ab350759843e67cdc74a8ec8158fe5ac6'
2010-11-12 12:28:52 +00:00
z3d
056fb5ea88 I2PSnark: Indentation cleanups. 2010-11-12 12:27:10 +00:00
92d013752a merge of 'c51af7655557d0a98ec7561a4f434c63d5f26f41'
and 'e42b35ff366e0c56916caaeec4a14f17ac95a0eb'
2010-11-12 09:03:51 +00:00
a9daf8fc8f bump bote to router console start page 2010-11-12 09:03:16 +00:00
c3aa84f961 Run includedeb and include on each file individually, reprepro can't do multiple files 2010-11-12 05:09:06 +00:00
b4524c67d5 Make separate i386 and amd64 packages, this fixes the arch-independent-package-contains-binary-or-object lintian error 2010-11-12 04:04:27 +00:00
11b69ee121 disapproval of revision '7c7c3832c57db0fee96000f6cf612d1443b0fc85' 2010-11-12 01:25:49 +00:00
be3330d84f bump bote to readme.hmtl 2010-11-12 00:49:05 +00:00
9439477799 merge of '3643017f592675aa1170acb97e64ad78fbe9405c'
and 'ca29fd016d218f636d2cc844d46d6a25ca9ff5c6'
2010-11-11 22:40:14 +00:00
826efdf767 translation of dr|z3d's newly added stuff and more consitency fixes 2010-11-11 10:01:07 +00:00
z3d
7ef35e0284 I2PSnark: Do our level best to prevent stuff from wrapping and breaking the table layout; bump to -18rc. 2010-11-11 07:02:42 +00:00
z3d
0324bc4eec Bump to -17rc. 2010-11-11 06:50:15 +00:00
z3d
f157471ac1 I2PSnark: Increase min-width for status column to prevent column header from wrapping. 2010-11-11 06:49:14 +00:00
z3d
416e7825a8 I2PSnark: Remove thinspaces for download column. 2010-11-11 06:40:18 +00:00
z3d
6b12d26388 I2PSnark: Css tweak. 2010-11-11 06:32:16 +00:00
z3d
0adac224fb I2PSnark: Parent dir icon (up.png) tweak. 2010-11-11 06:28:41 +00:00
z3d
6935d7361a Bump to -16rc. 2010-11-11 06:15:53 +00:00
z3d
05409bae6e I2PSnark: Revert the regression, hopefully cunningly sidestepping conflicts. 2010-11-11 06:12:25 +00:00
z3d
283e915514 merge of '9ef5f8dbdf741e0d3f6f88061efff16e14d9182a'
and 'b44b28fa2d4279996e0adbc143968ec132faed8d'
2010-11-11 05:20:18 +00:00
z3d
676d84a081 I2PSnark: CSS whitespace/tab cleanups. 2010-11-11 03:58:20 +00:00
z3d
9f6e6cd54d I2PSnark: Add details_nolink.png icon for trackers that don't work with infohash extraction.
Mousever should provide minimal info, eg: tracker id.
2010-11-11 02:43:07 +00:00
z3d
dc51d694db Bump to -15rc. 2010-11-11 01:34:29 +00:00
z3d
0f63158f50 I2PSnark: Main torrent table tidyups and tweaks. 2010-11-11 01:33:56 +00:00
z3d
903d27ec0d Bump to -14rc. 2010-11-11 01:01:45 +00:00
z3d
5d9ed45cbd I2PSnark: Tweak details.png 2010-11-11 00:59:23 +00:00
z3d
7c0ef0ab80 I2PSnark: Tidyups. 2010-11-10 22:15:13 +00:00
bda00e18fe * Fix build dependencies for Debian
* Add dependency on libc6 which fixes the lintian warning missing-dependency-on-libc
2010-11-10 21:01:52 +00:00
z3d
49fb6c59d1 Bump to -13rc. 2010-11-10 21:00:49 +00:00
z3d
224aa5fd9c I2PSnark: File manager cleanups. 2010-11-10 20:56:37 +00:00
z3d
25e21ffb1e I2PSnark: Screenlog padding fix. 2010-11-10 18:15:15 +00:00
z3d
0165c6068a Bump to -12rc. 2010-11-10 17:59:27 +00:00
z3d
585339e0d4 I2PSnark: All the goodness from the disapproved branch + visual fixes. 2010-11-10 17:56:33 +00:00
z3d
83ae568d38 I2PSnark: Fix Rate tag. Spotted by mixxy. 2010-11-10 14:53:15 +00:00
z3d
b323408cee merge of '285a9a021659672b12861eea3c150d47b5025275'
and 'a90a0715f156a732cf039bd2df9bbc3d90e82693'
2010-11-10 14:37:57 +00:00
z3d
71707bf0c0 disapproval of revision 'ffe706fb236d2cd14241d22dc6e6203964f8bc31' 2010-11-10 14:37:39 +00:00
7db5340159 merge of '96b28bcad599dea550230cc8cba4d7bce7f5fa68'
and 'a396094617a5124882fc16e11466375fcc4f3047'
2010-11-10 14:11:45 +00:00
dee2f2431c cinsistency fix 2010-11-10 14:09:26 +00:00
0b0fa04210 merge of '3dfa2ea9f44e204ca76d700e01ae09cda54c6b6a'
and 'a90a0715f156a732cf039bd2df9bbc3d90e82693'
2010-11-10 13:41:59 +00:00
18374fe426 German translation cleanups 2010-11-10 13:29:33 +00:00
ab432e14ee Fail if repository cannot be created 2010-11-09 22:19:32 +00:00
5d9a7b9452 Add changelog to .deb 2010-11-09 21:34:44 +00:00
e9af7406c6 Update changelog 2010-11-09 21:30:32 +00:00
zzz
20e2e20212 * I2CP: Fix NPE caused by null session options (seen in i2pbote) 2010-11-08 16:13:43 +00:00
7897df5544 Improve the Debian copyright file, see http://lists.debian.org/debian-legal/2003/12/msg00194.html 2010-11-08 03:23:30 +00:00
0e9f0a741e Print destination in b64 2010-11-08 03:23:19 +00:00
zzz
31ff9b2747 update javadoc links and titles 2010-11-07 20:25:29 +00:00
zzz
dcd915457b minor javadoc fix 2010-11-07 20:23:45 +00:00
zzz
454a5c5286 explicit merge of '14597ede957582a9ca29df867f1565479c64888b'
and '6c0d71283dd65aea1fe1baad14ca57855808dad8'
2010-11-07 20:22:44 +00:00
168a4ca6f9 minor translation corrections #3 2010-11-07 00:48:22 +00:00
z3d
6e48ecb9ce I2PSnark: Fix syntax errors; tweak css. 2010-11-06 14:21:22 +00:00
zzz
959e57e755 RIP crstrack 2010-11-06 13:26:57 +00:00
zzz
0e53445e91 * logs.jsp: Format multiline messages better 2010-11-06 12:34:53 +00:00
zzz
3ee85fed30 * Stats: Improve Frequency, enable coalescing; cleanup and javadocs
* stats.jsp: Cleanup, more tagging, hide obscure stuff unless ?f=1
2010-11-06 12:33:53 +00:00
zzz
010a1fde3f * Console: Display durations with new formatDuration2() 2010-11-06 12:28:38 +00:00
c2349662e7 Minor things 2010-11-06 05:40:24 +00:00
43c7cc0893 Auto download jetty in the debian and debian-source targets 2010-11-06 05:38:00 +00:00
d64a2b0306 * Add debianrepo target
* Change the debian target to build binary and source, add a debian-binary target
2010-11-06 04:51:11 +00:00
zzz
1bc563832e propagate from branch 'i2p.i2p' (head 7f26a3df7f04d3c069c63b4633871bd7676f6167)
to branch 'i2p.i2p.zzz.test4' (head 91572937612227b99f41e7e170ae38574a001e7b)
2010-11-05 12:46:59 +00:00
zzz
1f48c6c03d deprecate unused toDate(Date) 2010-11-05 12:46:41 +00:00
50aca88438 corrections of translation, mainly capitalization, ß and white spaces, some grammar fixes 2010-11-05 10:30:22 +00:00
be5bd43194 Debian package: Fix purge with no prior remove (rev. 9a8fca24502aa8933793f2bad48e327596a2c0d4 only fixed remove, then purge) 2010-11-05 07:03:45 +00:00
8894aa7d38 minor translation corrections #2 2010-11-04 23:29:45 +00:00
092d29fe56 minor translation corrections 2010-11-04 08:55:25 +00:00
8593931171 If the working directory contains only a plugins/ subdir, initialize it like it is empty 2010-11-04 06:49:12 +00:00
77e0cb94d3 merge of '01966a37ff4e50e48ab6eeb9d215baa8b75fc46d'
and '85cbdd70a9896ae9b2257bfe8f25f045b1cd0b2d'
2010-11-04 04:24:23 +00:00
zzz
2b2c3cf118 snark tweaks 2010-11-03 22:21:10 +00:00
zzz
be308a0444 merge of '398a24f487b61ef778a2e849660e953ef7e43b39'
and '598d00efae4c9b675b64fd626bc2eab2b921e0c5'
2010-11-03 16:04:14 +00:00
z3d
9b39f02ce5 I2PSnark: Relocate errant "." 2010-11-02 14:07:25 +00:00
z3d
7109061ee0 merge of '4dfe5728ed4951d32f89e2fddbdcdfc3b4755cad'
and '62005c74e58b5fdbaf4659ffb65392ecfbd8bc0a'
2010-11-02 13:49:03 +00:00
z3d
f71dd25b3c I2PSnark: Relocate a pesky \n. 2010-11-02 13:48:11 +00:00
z3d
012fbe3a45 I2PSnark: Relocate </code> to its rightful place. 2010-11-02 13:22:48 +00:00
853f941d88 merge of '598d00efae4c9b675b64fd626bc2eab2b921e0c5'
and 'd38686d88680521e54d7bcb8be24e21d252eb946'
2010-11-02 04:00:43 +00:00
c03abb50d3 merge of '8c4c57f191c33a31bc69564888c9851f9042438c'
and '9c5d0b4cdfa76234e6ac9fbfd0ce753748104f47'
2010-11-02 03:51:00 +00:00
94bc3c3503 merge of '1da5a6b3f2f42d9ddbe6b0a64e3c27313d61d86a'
and '5784df5facdf6e194dc3c052b2527a8c63c96c0f'
2010-11-02 03:49:06 +00:00
252473d7cf merge of '5784df5facdf6e194dc3c052b2527a8c63c96c0f'
and '9c5d0b4cdfa76234e6ac9fbfd0ce753748104f47'
2010-11-01 22:09:52 +00:00
z3d
6eb8cbfacc I2PSnark: CSS refinements. 2010-11-01 22:08:05 +00:00
zzz
ddc86b54c7 fix snark rates 3x too low 2010-11-01 22:04:10 +00:00
zzz
3678aa157e * i2psnark:
- Limit number of parallel requests of a single piece when in the end game
      - Shorten and weight the speed tracker so the display is more
        reflective of current speed
2010-11-01 14:35:01 +00:00
z3d
4d7a77d318 I2PSnark: Bug fix. 2010-11-01 14:33:10 +00:00
zzz
8d13bcbac0 discourage b32 2010-11-01 14:30:57 +00:00
zzz
2f54ec61bd logging tweak 2010-11-01 14:30:24 +00:00
af541662f3 Add get-orig-source rule as required by Ubuntu, see https://wiki.ubuntu.com/UbuntuDevelopment/CodeReviews#NewPackage 2010-10-31 21:13:53 +00:00
3e2c530281 Fix error message with dpkg --purge 2010-10-31 19:54:49 +00:00
ff5b7950f1 Debian package:
* Make eepget, i2prouter, and i2psvc world-executable
 * Auto-start I2P after installation
2010-10-31 19:52:28 +00:00
148ce25af7 Print an error if /etc/init.d/i2p is run as non-root so Ubuntu users aren't asked for a non-existing root password 2010-10-31 19:48:41 +00:00
56ef384595 Make /usr/bin/eepget and /usr/bin/i2prouter symlinks 2010-10-31 19:44:33 +00:00
ea24f3ba6d Fix dependencies for Ubuntu 2010-10-31 19:41:55 +00:00
zzz
ba4f6608e4 update nbsp comment 2010-10-31 14:52:21 +00:00
zzz
07aa07981d * logs.jsp: Add message if wrapper log not found
(ticket #103)
2010-10-31 14:52:09 +00:00
zzz
0afabbd609 Add synch to fix race causing AIOOBE
http://forum.i2p/viewtopic.php?t=5061
2010-10-31 14:36:56 +00:00
zzz
2ea3f9b9bb parse log limit with current locale (ticket 118) 2010-10-31 14:33:31 +00:00
z3d
35a8c703a7 I2PSnark: Unitalicize remaining download amount. 2010-10-30 20:24:24 +00:00
z3d
d0855ee892 I2PSnark: Status icon updates. 2010-10-30 19:32:46 +00:00
z3d
e95b41511a I2PSnark: Add status icons, refine css. 2010-10-30 16:34:04 +00:00
zzz
30a5c4907b -6; history for this head 2010-10-30 15:50:03 +00:00
zzz
f170baab3f - Delay during StopAll so we don't close the tunnel before the
stopped announces go out and reopen it
- Logging tweaks
2010-10-30 15:30:14 +00:00
zzz
643687472a - Only add wanted pieces to wanted list at startup
- Make sure lastRequest is null when it should be
- Logging tweaks
2010-10-30 15:28:29 +00:00
zzz
c76058efc3 send &compact=1 to keep opentracker happy 2010-10-30 14:17:09 +00:00
zzz
502cf72653 fix nbsp screwing up POST 2010-10-30 00:38:08 +00:00
zzz
9baa6e7bc8 update requests after changing priorities 2010-10-29 20:31:07 +00:00
zzz
7efb0fa7ed * i2psnark:
- Priority mapping bugfix
      - Close files as we go when creating/checking
        so we don't run out of file descriptors
2010-10-29 17:32:05 +00:00
zzz
571ad83e03 use nbsp in formatSize2() 2010-10-27 14:22:53 +00:00
zzz
983e7683fd * i2psnark:
- Don't stay interested if we run out of pieces
        to request (thanks sponge)
      - Enhance debug mode to show requests
2010-10-27 13:29:27 +00:00
zzz
b9af4a8cf0 avoid rare transport NPE at startup 2010-10-27 13:25:13 +00:00
f239d4f350 * Tiny readability fix: separate value and unit with a space. 2010-10-26 23:38:01 +00:00
z3d
4d77f62e38 I2PSnark: Fix alignment issue in file viewer filesize column. 2010-10-25 14:35:51 +00:00
zzz
ac3e6e27dc add note 2010-10-24 16:57:38 +00:00
zzz
4f9c442d55 fix disconnect race NPE 2010-10-24 16:56:43 +00:00
zzz
adab0cc3d3 * NTCP: Catch a race after stop() 2010-10-24 16:55:29 +00:00
zzz
b1f1725506 * Router: Set permissions on wrapper.log when not called by RouterLaunch 2010-10-24 16:52:41 +00:00
zzz
4bb902a8b9 * FileUtil: Make it easier to compile without Pack200, or with
Apache Harmony's Pack200, add unzip to main()
2010-10-24 16:49:20 +00:00
zzz
ed399a07d8 systray short doc and main() 2010-10-24 16:16:46 +00:00
z3d
4db38b9ba5 I2PSnark: Fix some showstopping whitespace issues. 2010-10-22 21:18:09 +00:00
z3d
22934545eb I2PSnark: Nuke the old copy of our snark theme in /themes/console/snark 2010-10-22 17:18:38 +00:00
z3d
7fe6b35359 I2PSnark: Tabs into spaces exercise. Release the kraken! 2010-10-22 16:49:07 +00:00
z3d
cfd2ad9a1c LICENSE.txt: Attribute I2PSnark's "Man with hat over face" graphic. 2010-10-22 16:33:30 +00:00
z3d
74a30aeee4 I2PSnark: Render unto Caesar what is due unto Caesar, namely some fixed tags. Enjoy! 2010-10-22 16:08:58 +00:00
z3d
1bff62e3c7 I2PSnark: Relocate theme to /themes/snark/ubergine/; update build.xml 2010-10-22 09:43:16 +00:00
z3d
31032cd794 merge of '42f7898ab54db310e16aa6fbedb1b078afe0ae18'
and '9d4166108eac930384ccb9c5859eede93f4d63ed'
2010-10-22 09:11:09 +00:00
z3d
8ccad29353 I2PSnark: Fix minor tag issue; add missing navbar bg graphic. 2010-10-22 09:01:29 +00:00
z3d
7ff873bbc9 merge of '6cf2d1b2af6daa4fffc59fede3407d3e10c09095'
and '9afc46edd20c72064eb24b5c1f6a4a8540e35799'
2010-10-22 08:25:44 +00:00
z3d
a55a464694 I2Psnark: Ensure our css uses the new path to our theme resources. 2010-10-22 08:17:49 +00:00
z3d
c14760c294 I2PSnark: Unbutcher tags; relocate our snark theme to /themes/snark; more css updates. 2010-10-22 08:14:51 +00:00
e6bf1af982 Sanity and some fixs for slackware package 2010-10-22 02:43:17 +00:00
3998ce311f Fix rc.i2p for slackware package 2010-10-22 02:26:13 +00:00
e6c45ae5f8 Added package files for router. 2010-10-20 16:01:18 +00:00
e8abe14395 Fixed susimail javadoc errors. 2010-10-20 15:55:28 +00:00
zzz
466128c179 * replaceAll() -> replace() when not using regex
* ampersand escaping (lots more to do)
2010-10-19 14:39:29 +00:00
zzz
8c7a39f00a * JobImpl: Deprecate getAddedBy() and addedToQueue()
to reduce LogManager records
2010-10-19 14:33:11 +00:00
1400c4d4d0 added plurals to fr, de and nl po file 2010-10-18 08:28:15 +00:00
zzz
24dd78394b priority persistence 2010-10-15 17:25:45 +00:00
zzz
9afff4f80a * i2psnark: Add file priority feature;
Use context random for shuffle; other cleanups
2010-10-15 13:48:36 +00:00
zzz
1aba324481 * I2PSocketEepGet: Set connect delay to save a RTT, will
speed announces in i2psnark
2010-10-15 13:41:56 +00:00
3daa6b964d -Added package-file for time.
-Modified susi javadoc to remove more warnings (and non-javadoc '@see' to base class).
2010-10-14 16:05:06 +00:00
8cda5104e3 - Added package doc for crypto and net.i2p
- Got rid of some susimail javadoc warnings
2010-10-14 06:19:19 +00:00
z3d
8db45ffaa1 merge of '01c6aeb6ee46c7795e83553f40e16b5bdae08aac'
and '56ee4b01df5de86f0fdc98cdc4ed1197104584b5'
2010-10-13 16:07:35 +00:00
z3d
b41e714a1b merge of '0738aeef8a1d4e9ca82dc5ba0077d83a57c47f81'
and '9625ea3e96d57df74bc62018bf64230a22c49ce0'
2010-10-13 16:07:33 +00:00
z3d
6cd645b34b I2PSnark: Tighten up navbar, color tweaks. 2010-10-13 16:03:41 +00:00
zzz
772c1d4fb8 explicit merge of '33c6e246dc934cddc886b50df2570c0caf122701'
and '4ef1d99f924ee431587d6f85241540e031fecbc1'
        to branch 'i2p.i2p'


Explicit merge from test4.
1.6 JDK now required to build.
1.5 JRE still OK to run I2P.

    * configlogging.jsp:
      - Add easy way to add an override
      - Make file size specifier more flexible
    * Console:
      - Sort RouterAddress options on netdb.jsp and peers.jsp
      - Remove unused web-*.xml file from war
    * Crypto:
      - Convert all ArrayList caching to LBQs in YKGenerator,
        HMACGenerator, and AESKeyCache.
      - Change DSAEngine params from Hash to new SHA1Hash, since
        these were really 20 byte hashes, not 32 byte Hashes.
      - Add stats to track YKGenerator caching success
      - Fix YKGenerator precalculation to be much more useful by
        increasing the cache size and dramatically shortening the delay
      - Option cleanups
      - YKGenerator cleanups
      - Mark HMAC256Generator unused
    * EepGet: Reset length variable on redirect
    * Files: Change permissions to 600/700 for all written files/directories.
      Now requires Java 1.6 to build, but only 1.5+ to run.
      (requires 1.6 to set permissiomns)
    * GeoIP: Fix locking bug causing lookups to stop
    * Hash: Throw IAE if data length is not 32 bytes,
      now that DSAEngine abuse is gone
    * HTTPResponseOutputStream:
      - More caching
      - Stats cleanup
      - Max header length check
      - Catch OOM
      - Initializer cleanup
      - Javadoc
    * I2CP:
      - Add new option i2cp.messageReliability=none, which prevents the
        router from sending MessageStatusMessages back in reply to an
        outbound SendMessageMessage. Since the streaming lib always ignored
        the MSMs anyway, make it the default for streaming.
        This will reduce the I2CP traffic significantly.
        MSM handling now avoided, but it is still fairly broken, see
        comments in I2PSessionImpl2.
      - Cleanups to replace method calls with fields
      - More cleanups, javadoc, rate reduction
    * i2psnark:
      - Compact response format
      - Add link to finished torrent in message box
      - Don't let one bad torrent prevent others from
        starting or stopping
      - Sort peers by completion %
      - Add some missing mime types to web.xml
      - shouldLog() cleanup
    * i2ptunnel:
      - Now that streaming flush() is fixed, use it in IRCClient, and
        for initial data in I2PTunnel runner, to avoid the 250 ms
        passive flush delay
      - Add hostname DSA signature field, to be used for addkey forms.
        Experimental, may be commented out later.
      - More header blocking (thanks telecomix!)
      - Remove unused web-*.xml file from war
    * Installer: Add startup hint for non-x86
    * Javadoc updates all over the place
    * LogConsoleBuffer: Java 5
    * Naming:
      - Increase cache size and expiration time
      - Add clearCache() method
      - Don't use EepGet or Exec for b32
      - Javadoc updates
    * NetDB:
      - Expire unreachable routers quickly, even if they don't have introducers,
        so we don't have old data on routers that ran out of introducers.
      - Fix rare NPEs at shutdown
    * NTCP:
      - Workaround for a rare 100% CPU bug in EventPumper
      - Cleanups
    * Streaming:
      - Make flush() block less, by waiting only for "accept" into the
        streaming queue rather than "completion" (i.e. ACK from the far end).
        This prevents complete stalls when flushing, and should help performance
        of apps that use flush(), like i2psnark (and SAM?).
        close() still does a flush that waits for completion, as i2ptunnel
        doesn't like a fast return from close().
      - cleanups
    * SusiDNS:
      - Remove unused web-*.xml file from war
    * TransportManager: Convert _transports from a List to a CHM
      to prevent a rare concurrent exception
    * Tunnels:
      - Don't use peers < 0.7.9 for tunnels due to the old
        message corruption bugs
      - Javadoc
      - Cleanups
    * UDP:
      - Beginnings of destroy message support
      - Try to avoid running out of introducers by relaxing selection criteria
        and increasing minimum number of potential introducers
      - Avoid rare AIOOBE
      - PacketBuilder refactor
      - Make most classes package private
      - Comments
      - Logging cleanup
      - Comment out a main()
2010-10-12 20:26:42 +00:00
5a782cca4d Add HungryHobo as a signer 2010-10-12 19:30:46 +00:00
zzz
647b8f7fa1 default tweak 2010-10-11 15:18:17 +00:00
zzz
798bdf32c1 * Streaming:
- Make flush() block less, by waiting only for "accept" into the
        streaming queue rather than "completion" (i.e. ACK from the far end).
        This prevents complete window stalls when flushing, and should help performance
        of apps that use flush(), like i2psnark (and SAM?).
        close() still does a flush that waits for completion, as i2ptunnel
        doesn't like a fast return from close().
      - flush/close javadocs and comments
    * i2ptunnel:
      - Now that streaming flush() is fixed, use it in IRCClient, and
        for initial data in I2PTunnelRunner, to avoid the 250 ms
        passive flush delay
2010-10-11 15:17:35 +00:00
zzz
fbc20da606 more header blocking 2010-10-11 15:14:55 +00:00
0820b2c13f Bump version, add history 2010-10-10 14:36:11 +00:00
5f2361fe7c merge of '4ef1d99f924ee431587d6f85241540e031fecbc1'
and '56c6ae6a06651a05025a2e4f76ba35985a8ff372'
2010-10-10 14:32:35 +00:00
6e6142a91f Fulfill Request for name lookup feature. 2010-10-10 14:31:56 +00:00
zzz
500f6cf896 use context field 2010-10-07 18:42:30 +00:00
zzz
a23ea5e5f1 * configlogging.jsp:
- Add easy way to add an override
      - Make file size specifier more flexible
2010-10-07 18:39:03 +00:00
zzz
86a7d68f08 one more mime type 2010-10-07 15:14:07 +00:00
zzz
373fce2988 change perms on append too 2010-10-07 15:13:54 +00:00
zzz
8ac5d5d5fc add some missing mime types 2010-10-06 15:03:33 +00:00
zzz
3841e92d53 remove unused web-*.xml files from wars 2010-10-06 14:25:27 +00:00
e5f53ed5e9 revise and fix 2010-10-06 13:07:34 +00:00
zzz
5ef9d46d0b dont sort in debug mode 2010-10-06 02:18:52 +00:00
zzz
5389ee056a sort snark peers by completion % 2010-10-06 02:05:26 +00:00
zzz
e2b7f93d11 fixup 2010-10-06 01:27:15 +00:00
zzz
09d1eb17d4 reset eepget length variable after a redirect 2010-10-06 01:11:21 +00:00
zzz
895c9a33a9 pluck build.xml javadoc changes from main branch 2010-10-05 14:52:44 +00:00
zzz
ab91d35331 comment 2010-10-05 13:15:39 +00:00
zzz
2d601099f3 propagate from branch 'i2p.i2p.zzz.test' (head 128a31611abc6a88e58133f3bf6a577fe6dd5b1c)
to branch 'i2p.i2p.zzz.test4' (head fa9a871892517271eb2531b433fe80a2a713be9c)
2010-10-05 13:06:16 +00:00
zzz
48ccf85e97 try again to fix the i2ptunnel nonce problem 2010-10-05 00:08:59 +00:00
zzz
6cf7bc7985 * i2ptunnel:
- Add hostname DSA signature field, to be used for addkey forms.
        Experimental, may be commented out later.
2010-10-02 17:20:39 +00:00
zzz
3d9b6061ce * NetDB:
- Expire unreachable routers quickly, even if they don't have introducers,
        so we don't have old data on routers that ran out of introducers.
      - Fix rare NPEs at shutdown
2010-10-02 17:07:37 +00:00
zzz
042cde2952 * UDP:
- Try to avoid running out of introducers by relaxing selection criteria
        and increasing minimum number of potential introducers
2010-10-02 17:04:52 +00:00
zzz
3b2aa946af * I2CP:
- Add new option i2cp.messageReliability=none, which prevents the
        router from sending MessageStatusMessages back in reply to an
        outbound SendMessageMessage. Since the streaming lib always ignored
        the MSMs anyway, make it the default for streaming.
        This will reduce the I2CP traffic significantly.
        MSM handling now avoided, but it is still fairly broken, see
        comments in I2PSessionImpl2.
      - Cleanups, javadoc, rate reduction
2010-10-02 16:56:02 +00:00
zzz
a687180d98 * TransportManager: Convert _transports from a List to a CHM
to prevent a rare concurrent exception
2010-10-02 16:30:07 +00:00
zzz
b1fd835f56 update irc description 2010-10-02 15:55:46 +00:00
zzz
53847dc3ad Sort RouterAddress options on peers.jsp and netdb.jsp 2010-10-02 15:51:48 +00:00
zzz
ec0c678cc9 * i2psnark:
- Add link to finished torrent in message box
      - Don't let one bad torrent prevent others from
        starting or stopping
2010-10-02 15:43:56 +00:00
zzz
b83184e895 initializer cleanup 2010-10-02 15:16:07 +00:00
zzz
f0f1a6f529 initializer cleanups, reduce rates, javadoc 2010-10-02 15:15:03 +00:00
zzz
333f80680e * UDP:
- Avoid rare AIOOBE
      - Comments
      - Logging cleanup
      - Comment out a main()
2010-10-02 15:11:41 +00:00
zzz
3489512a54 client cleanups 2010-10-02 15:07:35 +00:00
zzz
6100c799b7 LogConsoleBuffer cleanup 2010-10-02 15:03:20 +00:00
zzz
4a96e88118 * Hash: Throw IAE if data length is not 32 bytes,
now that DSAEngine abuse is gone
2010-10-02 15:00:30 +00:00
zzz
ed4c09b456 * Tunnels:
- Don't use peers < 0.7.9 for tunnels due to the old
        message corruption bugs
      - Javadoc
      - Cleanups
2010-10-02 14:56:45 +00:00
zzz
939dcee537 * GeoIP: Fix locking bug causing lookups to stop 2010-10-02 14:48:50 +00:00
zzz
7424fdd623 javadoc 2010-10-02 14:45:13 +00:00
zzz
4456048e79 * HTTPResponseOutputStream
- More caching
      - Stats cleanup
      - Max header length check
      - Catch OOM
      - Initializer cleanup
      - Javadoc
2010-10-02 14:43:40 +00:00
zzz
4c31c70298 Startup hint in installer for non-x86 2010-10-02 14:28:27 +00:00
zzz
c10a4f51ba I2CP: cleanups to replace method calls with fields 2010-10-02 14:27:01 +00:00
zzz
53dd0c7655 * Crypto:
- Convert all ArrayList caching to LBQs in YKGenerator,
        HMACGenerator, and AESKeyCache.
      - Change DSAEngine params from Hash to new SHA1Hash, since
        these were really 20 byte hashes, not 32 byte Hashes.
      - Add stats to track YKGenerator caching success
      - Fix YKGenerator precalculation to be much more useful by
        increasing the cache size and dramatically shortening the delay
      - Option cleanups
      - YKGenerator cleanups
      - Mark HMAC256Generator unused
2010-10-02 14:23:56 +00:00
zzz
6f449aa4f6 Naming:
- Increase cache size and expiration time
  - Add clearCache() method
  - Don't use EepGet or Exec for b32
  - Javadoc updates
2010-10-02 14:07:46 +00:00
zzz
171e3abe34 cleanups 2010-10-02 14:02:41 +00:00
zzz
2bffeea7eb comment out main 2010-10-02 14:01:38 +00:00
z3d
90288202e5 I2PSnark: Include missing add.png, spotted by xyz123. Bump to -3. 2010-10-02 00:36:31 +00:00
z3d
a4d24c61ba I2PSnark: Tweak the size of our writeable fields in add/create sections for better visual coherence. 2010-09-29 02:09:05 +00:00
z3d
3075593767 I2PSnark: Activity icons refresh. 2010-09-27 06:34:54 +00:00
z3d
8ab134ffe5 I2PSnark: Positional CSS tweaks 'n fiddles. 2010-09-27 06:05:02 +00:00
z3d
4800e73a4a I2PSnark: Add buttons for start/stop/delete torrents. 2010-09-27 05:04:05 +00:00
z3d
3bd97646a9 I2PSnark: Add favicon to file browser page; version bump to 0.8-02. 2010-09-23 04:56:43 +00:00
z3d
059e4176a1 I2PSnark: Rationalize file browser layout. 2010-09-23 02:43:05 +00:00
z3d
57b627fb71 I2PSnark: Add some icons to our file manager columns. 2010-09-22 21:18:57 +00:00
z3d
5281862932 I2PSnark: Kludge to fix extraneous space under message log on config page. 2010-09-20 21:07:27 +00:00
z3d
0fe2313754 I2PSnark: Configuration section tweaks. 2010-09-20 18:41:49 +00:00
z3d
f62dfb0abf I2PSnark: Invert show/hide peer icon functionality, tooltip change to "toggle peers"; fix alignment of "No torrents loaded" message with new css class; Replace brackets on Totals with &raquo;. 2010-09-20 11:26:28 +00:00
z3d
7507282886 I2PSnark: css tidyup. 2010-09-20 10:21:38 +00:00
z3d
9db5dd36b9 I2PSnark: alt tags, display filelength tweak. 2010-09-19 20:23:46 +00:00
z3d
9ce54d803f I2PSnark: show/hide peer icons. 2010-09-19 17:05:11 +00:00
z3d
7e7d36f0d6 I2PSnark: Table column header positional tweakery. 2010-09-19 15:43:57 +00:00
z3d
82323cd806 I2PSnark: Add icons for status and torrent columns. 2010-09-19 14:48:44 +00:00
z3d
511182f148 I2PSnark: status display tweakage. 2010-09-19 04:40:48 +00:00
z3d
e9b1db7ac7 I2PSnark: Update image references to point to our new snark theme directory. 2010-09-19 03:51:40 +00:00
z3d
9795334f12 build.xml: ensure we copy snark's directory, and remove the file copy for snark.css 2010-09-19 03:36:41 +00:00
z3d
321d88e795 I2PSnark: Add icons to relevant parts of the UI; rejigging of UI to minimise space wastage; create new snark directory in console/themes/ .. snark dir will need to be ignored when router scans directory for theme dirs. 2010-09-19 03:20:43 +00:00
z3d
99d2e2d0d0 I2PSnark: Fix alignment issue with snark_add.png 2010-09-18 16:36:29 +00:00
z3d
3fb1fbe1b3 I2PSnark: space savings! 2010-09-18 16:19:51 +00:00
z3d
d4f3304397 I2PSnark: Tweaks 'n fiddles. 2010-09-18 08:55:52 +00:00
z3d
4865373b4f I2PSnark: UI/theme tweaks. 2010-09-18 07:10:43 +00:00
z3d
5378b0ad56 I2PSnark: Transition from gray to puce. 2010-09-18 06:28:42 +00:00
z3d
7de357df98 Version bump. 2010-09-17 23:03:19 +00:00
z3d
27808012d0 I2PSnark: Reduced label lengths in preparation for icon substitution and tooltip; more colorification; Opera kludges. 2010-09-17 22:59:22 +00:00
z3d
dc22949b47 I2PSnark: more css polish; now with more color! 2010-09-17 16:02:15 +00:00
z3d
3d7ad215d9 I2PSnark: CSS Spit 'n polish. 2010-09-17 13:55:47 +00:00
z3d
67994d7e99 I2PSnark: snark.css fontsize tweaks. 2010-09-17 08:27:02 +00:00
z3d
deab6b40e0 I2PSnark: Fix text alignment issues. 2010-09-17 08:00:09 +00:00
z3d
0205fa6385 I2PSnark: snark.css finessing. 2010-09-17 07:27:21 +00:00
z3d
69b3343f45 Can't remember what. css stuff. 2010-09-16 23:33:24 +00:00
z3d
9c5b8419a5 I2PSnark: Add favicon. 2010-09-16 17:38:01 +00:00
z3d
fedf6d7537 I2PSnark css edits: log text visibility. 2010-09-16 16:49:27 +00:00
z3d
21306dbf5d merge of '1e79fc27bda464359d20795eaa33ed2ad61c9741'
and '7c6c62e901e75230e3a39e578f8fcbcf4cd2dd00'
2010-09-16 02:34:08 +00:00
z3d
9b69f2266a I2PSnark "faze to gray" theme: graphics and css futzing. 2010-09-16 02:32:07 +00:00
zzz
161f86b6bb improve and sort javadoc titles, put classes in the right places, add susi* 2010-09-15 15:25:32 +00:00
z3d
7f24dc5f03 Cross-browser tweaks to snark.css 2010-09-15 04:03:48 +00:00
z3d
6423c92b84 merge of '5e59656352811b3ccce9a2817417de1065ee9641'
and '8110890364bb45accd3016e90611f626e305b10e'
2010-09-15 01:50:30 +00:00
z3d
f7ea958961 Update history.txt to reflect Snark theme change. 2010-09-15 01:45:17 +00:00
z3d
8262048edc New default I2PSnark theme: faze to gray. 2010-09-15 01:39:38 +00:00
73d956462f Fixed: recoded to UTF-8, cyrillic and chinese labels repaired. 2010-09-07 03:25:48 +00:00
db0bc1a618 Fixed: missing links to the new Swedish help page. 2010-09-07 03:24:28 +00:00
zzz
91bcf947df * Javadocs
* Base64: comment out some unused methods
* Remove huge whitespace in CryptoConstants
* ElGamalAESEngine:
  - Reduce rates
  - Check number of tags earlier
2010-08-30 17:51:49 +00:00
z3d
c035ef6eb7 merge of '87f2562a0893b175a9b369e97b8413726f61935a'
and 'b1416986cd60fc129af81122324997fe0584472d'
2010-08-22 23:00:52 +00:00
z3d
4f31691c8a Add Swedish translation for eepsite help and update other help pages accordingly. Thanks to olleolleolle. 2010-08-20 22:51:58 +00:00
zzz
2244142bd8 javadoc, comment out some main()s 2010-08-14 18:22:46 +00:00
zzz
4323036992 javadocs 2010-08-10 16:17:09 +00:00
8eeabe4409 merge of '85a542c53d910dffbf34cdcefb8a2faeee96adc4'
and 'c92f2bcd662936f16d539ea5e98b0d4496556384'
2010-08-08 10:01:51 +00:00
6add722a25 Javadoc fix - thanks, duck! 2010-08-08 10:01:35 +00:00
87abc1d6b4 CryptoConstants update from draft to RFC. 2010-07-31 12:49:38 +00:00
6ddac9a478 Fix typo (trac #32) 2010-07-30 08:54:21 +00:00
38169b6d70 small fixes to _de 2010-07-26 12:08:17 +00:00
zzz
8cc561775b 0.8 2010-07-12 14:25:21 +00:00
zzz
0634154b28 final compact response format 2010-07-11 14:45:12 +00:00
c08f79f71e Unfuzzy susidns translation, typo fixes for eepsite help. (thx _4get) 2010-07-10 11:49:40 +00:00
7532276a00 Dutch eepsite help page 2010-07-10 11:04:30 +00:00
ee29074a30 Dutch proxy translations, we missed a couple. 2010-07-10 09:06:26 +00:00
zzz
870ace55e2 version bump just to add -rc 2010-07-09 17:46:38 +00:00
zzz
05ac2594b6 more shouldLog() 2010-07-09 17:40:59 +00:00
zzz
8353b623da SSU PacketBuilder: Refactor header generation, add destroy msg support 2010-07-09 16:34:54 +00:00
zzz
c19af4dbcf i2psnark:
- Rework PeerID class so it depends only on peer desthash, since
    peer ID is not available with compact format. Implement deferred
    lookup of destination.
  - Implement compact tracker requests and response handling
    (may not be the final format)
  - Fix Peer hashCode()
  - Java 5
2010-07-09 16:32:31 +00:00
ad7447f8ae merge of '6471243b39d38669b029124571adc47ad6417db4'
and 'a24bf3a898b6310d05bf2ee9ce99b3a52f067205'
2010-07-09 14:04:25 +00:00
4f827a5b1d Dutch help page 2010-07-09 14:02:55 +00:00
zzz
be75455b84 More i2ptunnel error propagation fixes - key file - thx echelon 2010-07-08 18:45:30 +00:00
96d3f67436 Dutch translation for RouterConsole sidebar labels 2010-07-08 14:41:56 +00:00
906bce637a new strings, corrections in german translation 2010-07-08 08:25:17 +00:00
3c0d0dfeee Russian translation updated (help & faq link, local identity link) 2010-07-07 20:30:05 +00:00
2ca5802e4d Include logo in updater now that it is themeable. (thanks RN!) 2010-07-07 19:49:07 +00:00
f4b06e586e RouterConsole: Add Help & FAQ link, minor label improvements. 2010-07-07 19:04:30 +00:00
zzz
525806d776 merge of '798de678af324027c003163c81c1b6169a487992'
and 'a75a75901ecc2b8caa1b97cd0693f491063826ba'
2010-07-07 13:36:52 +00:00
zzz
01ef6baa53 beginnings of SSU destroy msg handling 2010-07-07 13:30:04 +00:00
zzz
ed04747517 snark css fix for Opera 10.60 thx i2pn00b http://forum.i2p/viewtopic.php?t=4712 2010-07-07 13:28:27 +00:00
e13d336f2f Dutch translation of proxy error pages 2010-07-07 13:21:50 +00:00
zzz
5accdd24fc RIP p2i.mine.nu 2010-07-06 23:05:24 +00:00
5c61c28772 Dutch news 2010-07-06 20:09:26 +00:00
zzz
3a767d84df concurrentify with LBQ 2010-07-06 17:14:57 +00:00
zzz
d04ce7a2b7 launch browser sooner 2010-07-06 17:14:41 +00:00
zzz
a1524241cb Set permissions on directories and files when they are created 2010-07-06 15:22:48 +00:00
b312fdeac1 susidns: Dutch translation (thanks do monkeybrains) 2010-07-05 23:07:19 +00:00
30c8cf7b96 merge of 'c6af0acc022d4fc8e24488a86ab869d7cb561f57'
and 'fafee42899e7efa42942bc451a888bf77be69ac9'
2010-07-05 16:39:47 +00:00
zzz
50bda941ad make most classes package local; stub out a session destroy message; javadoc 2010-07-05 16:03:13 +00:00
zzz
fc6306575d new classes, requires Java 1.6 to build 2010-07-05 16:01:50 +00:00
c43ca7de87 - removed one useless line of code 2010-07-05 15:34:39 +00:00
826951536b - anged user agent for outproxy from Wget/1.11.4 to Firefox 3.6.6 on WinXP to avoid getting blocked as a crawler 2010-07-05 14:35:22 +00:00
zzz
5f52edf831 * I2PTunnelIRCClient: Filter PART messages like we do for QUIT 2010-07-05 14:21:38 +00:00
zzz
29bc53d618 * i2psnark: Fix transition to end game 2010-07-05 14:20:34 +00:00
zzz
378c855902 cleanup 2010-07-05 14:20:02 +00:00
546a588aa5 I2PTunnel & I2PSnark: Dutch translation (thanks to monkeybrains) 2010-07-05 13:37:36 +00:00
6e517c4a19 RouterConsole: Fix typos in Dutch translation 2010-07-04 23:03:02 +00:00
30d3f52f30 RouterConsole: Dutch translation (thanks to monkeybrains) 2010-07-04 13:13:45 +00:00
zzz
5dee6cb3d5 * I2PTunnel: More error propagation fixes 2010-07-03 13:59:46 +00:00
zzz
2a96c9a145 static 2010-07-03 13:58:59 +00:00
zzz
6435514e0d * I2PTunnelHTTPClient: Don't use BufferedReader 2010-07-03 13:41:24 +00:00
zzz
cd7a41924d cleanup 2010-07-03 13:40:27 +00:00
zzz
b9452546c5 fix ant distclean poupdate 2010-07-03 13:39:25 +00:00
zzz
4fa89d5e86 javadoc 2010-07-03 13:38:13 +00:00
zzz
63ece7e1aa cleanup 2010-07-03 13:37:52 +00:00
4808055054 merge of '02b40376f4c34b45e4f77deb70bd24bdef34f867'
and '2365aee6776961ebaa1ca862ffa21e0457ece0a6'
2010-07-02 05:45:46 +00:00
zzz
115016e75e add trac.i2p2.i2p (linked from logs.jsp) 2010-07-01 12:36:09 +00:00
ee09bfac66 translation fix 2010-07-01 11:09:15 +00:00
zzz
530a3fcd10 * I2PTunnel: Don't start a tunnel if no valid destinations;
cleanups, logging, and error propagation fixes
2010-06-30 23:37:25 +00:00
zzz
0010229363 unused icon 2010-06-30 23:30:50 +00:00
zzz
d241afcbd8 * EventDispatcher: Minor cleanups and comments 2010-06-30 23:29:31 +00:00
zzz
615257831c * Transport: Fix NTCP address generation when host is specified but port is auto 2010-06-30 23:28:44 +00:00
zzz
b9b737f4ce propagate from branch 'i2p.i2p' (head 08b1e0356e38567d4632bdc0269506b5d89f7a7c)
to branch 'i2p.i2p.zzz.test' (head 181daec1a6229c188282645875162287879cbbc6)
2010-06-30 22:29:33 +00:00
36a032d249 25%-50% cpu savings in BOB. The remainder of the fix is in streaming lib,
which aparently keeps running and does not sleep according to profiling.
2010-06-29 19:06:39 +00:00
zzz
726079e0bb CapacityCalculator cleanup and comments - no changes to formula 2010-06-29 13:40:26 +00:00
zzz
66421858e7 formatSize cleanups 2010-06-29 02:32:08 +00:00
zzz
df7b3dd861 * Scale prng.buffers based on max memory, reduce default from 16 to 9 2010-06-29 02:30:40 +00:00
zzz
22ea79a4ff * Jetty: Disable TRACE and OPTIONS in console and eepsite 2010-06-29 02:29:42 +00:00
zzz
2025fe7c20 * SOCKS: Better HTTP error message 2010-06-29 02:27:10 +00:00
zzz
a11c529557 * I2PTunnel: Add default HTTPS outproxy 2010-06-29 02:25:29 +00:00
zzz
edaa2fba16 * RouterInfo: Add main() to dump RI files 2010-06-29 02:23:57 +00:00
110f01a55b I2P logo in routerconsole sidebar is now themed. 2010-06-27 17:04:51 +00:00
ada39a970e Russian translation updated (i2psnark startup delay option) 2010-06-26 21:20:04 +00:00
zzz
8c2641703c - Move connection profile and delay connect to advanced config section
- Add persistent client key support to SOCKS IRC
2010-06-26 04:11:02 +00:00
zzz
9fcb07250d explicitly set shared client for POP (defaults true anyway) 2010-06-26 04:06:32 +00:00
zzz
47f39d0766 stripHTML on form params 2010-06-26 04:05:30 +00:00
zzz
bcba5af8a9 static 2010-06-26 04:04:01 +00:00
zzz
aec1b3aeef * jbigi, jcpuid: Suppress log messages when not in router context 2010-06-26 04:03:33 +00:00
zzz
a979ed770d * logs.jsp: Add more JVM version info so we can distinguish OpenJDK from Sun 2010-06-26 04:01:58 +00:00
zzz
5485568764 * jetty.xml: Add info on how to configure for following symlinks 2010-06-26 04:01:13 +00:00
zzz
6f3597cc83 fix display of interactive setting 2010-06-26 04:00:18 +00:00
zzz
1202d09966 * FileUtil: Try to handle lack of unpack200 support more gracefully
* Update: Select old update URL if no unpack200 available
2010-06-16 13:29:41 +00:00
zzz
266eb8307c sort countries using collator for locale for current language 2010-06-16 13:23:21 +00:00
zzz
8843cc2948 cleanups 2010-06-16 13:22:35 +00:00
2c4acce0f3 finally i2ptunnel messages_de 2010-06-15 12:13:49 +00:00
87beb2ea1a updated susidns messages_de, fix kbit/kbyte in i2psnark messages_de 2010-06-15 09:27:59 +00:00
9c5b7760ba mentioned path of jetty to be put in 2010-06-14 17:29:23 +00:00
6964786552 plural fixes. hope thats all 2010-06-14 10:06:28 +00:00
d755756ee5 routerconsole messages_de.po updated 2010-06-14 09:52:27 +00:00
fbc970e4a7 updates i2psnark messages_de 2010-06-14 07:38:58 +00:00
zzz
364b905790 UDP fix and comments 2010-06-13 16:42:24 +00:00
zzz
34a1085604 use a different user agent for outproxy traffic 2010-06-13 16:04:28 +00:00
zzz
c460ac8ade * Console: Add some divs for languages to news and readmes 2010-06-13 16:02:33 +00:00
zzz
49a09f61a2 * i2psnark:
- Move config to separate page
      - Icon tweaks
2010-06-13 16:01:11 +00:00
zzz
08b4563f49 zh fix 2010-06-13 15:54:01 +00:00
026f62f183 i2ptunnel .de 2010-06-13 12:44:17 +00:00
2307ac5a22 SusiDNS .de and i2psnark .de translations 2010-06-13 12:41:15 +00:00
2b186421a7 change more 2010-06-13 11:51:22 +00:00
1dc471e07e router console messages_de.po 100 percent done 2010-06-13 11:48:59 +00:00
dev
db1fb7ccf7 minor style change 2010-06-12 11:06:24 +00:00
dev
e5071a3b7c update history 2010-06-12 11:03:56 +00:00
dev
e6bfe0c10b fixed possible race-condition and improved code style 2010-06-12 11:02:39 +00:00
dev
919a97d4c8 really fixed #49 now.. use Context->routerHash instead of calculating it everyt time 2010-06-09 12:43:48 +00:00
dev
61216b638d fixed #49: missing calculateHash() 2010-06-09 12:37:11 +00:00
dev
e065d2b01e merge of '8c5085970b330a592129aa2da5a473d318426bbb'
and 'f11c600b339d0742fb91a87df7322ec4b84eee4d'
2010-06-08 15:37:25 +00:00
zzz
746bad3c30 remove jetty fixes from release target 2010-06-07 12:57:10 +00:00
zzz
5bbd61b75c 0.7.14 2010-06-07 12:18:43 +00:00
zzz
27eb7e46d0 tweak 2 2010-06-06 20:38:19 +00:00
zzz
c20bef3731 tweaks after review 2010-06-06 20:36:54 +00:00
dev
d5aaff7f06 merge of '9ec612b8794a44b9337b7743afef8ccbb2fc904e'
and 'ec741e25082ea0a9d1fd530f613b2282edefc1d9'
2010-06-06 15:51:25 +00:00
dev
fc60768a66 prevent an NPE in case the connection is gone already(but that should not happen?) 2010-06-06 15:49:29 +00:00
zzz
8ef1dac95b propagate from branch 'i2p.i2p' (head 45d9fab2e437a2acf99febfab1c50b28c342c694)
to branch 'i2p.i2p.zzz.test' (head 946c3527d4481d3dcf0b8ab163d1e248673c1733)
2010-06-05 10:32:27 +00:00
zzz
2024fb1b65 * Netdb:
- Use new receivedAsReply flag in LeaseSet to mark
        those received as response to a query
      - Mark which methods in FloodfillPeerSelector may return
        our own hash
      - Redefine selectNearest() so it may return our own hash,
        so it can be used for closeness measurement
      - Redefine findNearestRouters() to return Hashes
        instead of RouterInfos
      - Fix LeaseSet response decisions for floodfills, based
        on partial keyspace and closeness measurements
      - List only count of published leasesets in netdb
2010-06-05 01:10:56 +00:00
zzz
617ca79b8f conn throttler fix when only total configured 2010-06-05 01:07:29 +00:00
5081755d0b - integration of dynamicly configurable startup delay of i2psnark
- i2psnark webfrontent configuration of startup delay
- default startup delay 3 minutes
- new config variable in i2psnark.config: i2psnark.startupDelay
2010-06-04 23:50:13 +00:00
zzz
7bfb5b1bf4 readme cleanup 2010-06-04 12:18:57 +00:00
8d73529fa4 po revise 2010-06-04 03:46:52 +00:00
dev
a19d04d3ba merge of '4002ce96746459cd6ab6f91f16795bdbe3165644'
and 'db4aaff4718328041f29e6166333139f845406cd'
2010-06-03 23:13:35 +00:00
dev
a9c7748a52 minor code style updates to ntcp EventPumper 2010-06-03 23:13:13 +00:00
zzz
41e4e952b7 * Update: Fix multiple updates after manually
starting update - caused by refreshing summary bar
      (thx 'backup'!)
2010-06-03 16:53:55 +00:00
zzz
c0b0b5e4c5 Add min delay after startup before fetching news 2010-06-03 16:51:37 +00:00
e424479e7e peers.jsp:
Show definitions panel if any transport is enabled (was: only for UDP). 
  Use div.wideload for the whole page (was: only for transports and broken if only one of them enabled).
2010-06-03 08:35:14 +00:00
a8804f3093 merge of 'bdef8183da2c97dd55e2c2fad915537640e0f404'
and 'f908793c77bb4bd3d5fa3dd71bed704f32404fd0'
2010-06-03 07:21:52 +00:00
6479a24bb7 merge of '0bd9edccbe59dc0c8dddee2b45cde1af0f8551f2'
and '779311c9e2df158049abc2e0f56e4e9fcb071142'
2010-06-03 06:27:12 +00:00
8b372ad306 Fixed build.sh
jbigi's build.sh had a number of failed assumptions as per where I2P and JAVA_HOME were which needed to be removed and a warning put in their place. A better solution would be to have some way to search for JAVA_HOME and I2P in common locations, but at least this solution works if you do it manually:

I2P=~i2p JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.20 sh build.sh dynamic

thank zzz for prodding me to do this
2010-06-03 03:35:46 +00:00
86791a2f1b Russian translation updated (descriptions for the stats that are graphed by default) 2010-06-03 03:22:35 +00:00
zzz
7cf0aad388 * UDP: Fix a bug from a blank i2np.udp.host config
causing frequent RouterInfo updates and incorrect
      addition of introducers, caused by config.jsp handling
2010-06-02 18:20:13 +00:00
zzz
c5ea51beec * graphs.jsp: Tag some more 2010-06-02 18:16:43 +00:00
zzz
7cc8e51d73 * Update: Change default update URLs to .su2 for pack200 2010-06-02 18:13:45 +00:00
zzz
75ba58d68c * Translation: Set xgettext add-comments option 2010-06-02 18:12:46 +00:00
zzz
cd35b219db * i2psnark:
- More listing fixes (more thanks to 'backup')
      - Start end game a little sooner
2010-06-01 22:19:10 +00:00
zzz
4a863f8ce7 comment 2010-06-01 14:02:21 +00:00
zzz
24264548a6 * Installer: Disable pack200 in updater again, doesn't work
on Java 1.5
    * Remove jetty from updater - it's been in for a few
      releases, and i2psnark now has its own listHTML method
2010-06-01 14:01:21 +00:00
zzz
f9e4b1a56b snark css tweak 2010-06-01 13:57:39 +00:00
zzz
13b54b864e * i2psnark:
- More listing fixes
      - Revert choker change
      thx 'backup' !
2010-06-01 13:56:53 +00:00
05d45fe945 po update 2010-05-29 07:18:56 +00:00
2781f6035a Russian translation updated for ngettext (plural forms) strings 2010-05-27 17:59:57 +00:00
zzz
dc3378d084 * Translate: Add GNU ngettext (plurals) support 2010-05-27 00:38:32 +00:00
zzz
9132e94143 * i2psnark: Listing fixes and cleanups; icons on front page; tweak bw choker again 2010-05-26 14:28:46 +00:00
b61e2aa73c Russian translation updated 2010-05-26 04:37:28 +00:00
7fdbae3b0f Tagged "bytes remaining" 2010-05-26 04:37:03 +00:00
dev
4dc6fc3b5d merge of '20f5a25a77de641ddf49c4d47d4ede923b59bfa3'
and '7dfc6bc466e7b6ee3212af949a08c51d4e3dd3db'
2010-05-25 19:08:31 +00:00
dev
618275b1f9 merge of '13c351b9c26b147632b40df8c0e8d9ca7d2d4485'
and 'b281a23e2f1719a388abed362ec3653f63e6769b'
2010-05-25 19:07:13 +00:00
dev
7a1111d845 updated history 2010-05-25 19:06:15 +00:00
zzz
3af356840e -11 2010-05-25 18:31:09 +00:00
zzz
911a278926 snark listing icons and cleanups 2010-05-25 13:08:34 +00:00
dev
014063700f merge of '82b66240733c560b038d4874d1630bf59f5fbe1a'
and 'd6f8e674646687b5efb03d09b6cdca57c6bd8f50'
2010-05-23 19:52:49 +00:00
dev
f7c0db0454 -10 2010-05-23 19:52:06 +00:00
zzz
a534d25d82 -10 2010-05-23 19:18:50 +00:00
zzz
bcf3e4a2d3 merge of '200dbdfc1dba31eb7abc6bb3403ac77cc9072c94'
and '56425d32b819bb74fe3abb999e7e3763814533ac'
2010-05-23 19:17:50 +00:00
dev
0cdfbd9803 merge of '01deefdd2f5a2b8f21fd3e97d1a6bd0dd66fecab'
and '1a75d8e703883bde472616a9def0b27bb64b7815'
2010-05-23 18:08:26 +00:00
dev
a3e5654d86 merge of '03e8a3d066ce112bb4ddaa98c0387dfefde94a0e'
and '751ff97c62634ee13a8f8baf3d7947e373d5368a'
2010-05-23 17:05:15 +00:00
dev
2f9364db2b fixed a major bug in the datagram dissector, improved performance a little bit and added a utility method to get the already calculated hash of the payload 2010-05-23 17:04:37 +00:00
zzz
5d7c9ebf82 * i2psnark:
- Choke slower when at bandwidth limit
      - Fix completion % for small files
      - Use Random from context
2010-05-23 16:18:10 +00:00
zzz
48da98d0e4 * NewsFetcher:
- Add backup URL
      - Change to 0 retries (was 2)
2010-05-23 16:15:37 +00:00
dev
55e994ac3c merge of '751ff97c62634ee13a8f8baf3d7947e373d5368a'
and 'ddc06f282f1b88e164c208509d818e3ed701143e'
2010-05-23 16:06:20 +00:00
dev
6d46a21f9f implemented WEBIRC support in the I2PTunnel IRC server 2010-05-23 16:04:22 +00:00
fdc83484fd NTCP bind interface
Adding support for binding to a specific IP in the NTCP configuration. Uses new config option i2np.ntcp.bindAddress.
2010-05-22 16:50:39 +00:00
zzz
6786817fff -9 2010-05-21 17:34:30 +00:00
zzz
b77cd0db15 show completion status in listing 2010-05-21 15:07:34 +00:00
zzz
20bef76878 * i2psnark:
- Spiff up dir listings
      - Urlify some messages
      - Only go into end game at the end
      - Bye Bart Bye
2010-05-21 04:38:49 +00:00
zzz
7a30490482 more validation 2010-05-19 18:55:53 +00:00
zzz
3bc2e469cc remove unnecessaary initializers from constructors 2010-05-16 18:08:24 +00:00
zzz
d770d3c6da border-radius thx dr. 2010-05-16 17:11:40 +00:00
zzz
339a001592 never used 2010-05-16 13:16:05 +00:00
zzz
ace57a96a9 translate log priorities 2010-05-15 15:42:20 +00:00
zzz
2c26b8d422 * Hash: Move caching XOR methods only used by KBucket into netdb 2010-05-15 14:21:31 +00:00
zzz
e1eafa2394 * Eepsite: Set no-cache in redirecting page 2010-05-15 14:19:41 +00:00
zzz
39cb51c9eb snark css tweaks 2010-05-15 14:18:54 +00:00
zzz
fa5016ab04 javadoc fix 2010-05-15 14:17:54 +00:00
zzz
b134ef1a74 * Console:
- Tag text in graphs
      - Move SummaryRenderer to its own file
2010-05-15 14:17:17 +00:00
zzz
234dff888d Try to prevent ZipErrors after plugin update 2010-05-13 17:04:16 +00:00
zzz
a08c15a3ee leaseset debug tweak 2010-05-13 17:02:32 +00:00
zzz
cfa894e7b6 peer id tweak 2010-05-13 17:01:30 +00:00
zzz
d6c8e64575 throttle fix 2010-05-10 16:21:20 +00:00
zzz
dc91580e30 fixes from DataHelper.eq() deprecation 2010-05-10 15:58:53 +00:00
zzz
7ec1dd7a98 netdb.jsp leaseset debug 2010-05-10 15:22:10 +00:00
zzz
82f3f7506c * NetDB:
- Handle old and duplicate stores more efficiently
      - Have DataStore put() return success
2010-05-10 15:00:13 +00:00
zzz
e26df1c26b * LeaseSet: Add receivedAsReply() methods in preparation for
some netdb changes
2010-05-10 14:52:53 +00:00
zzz
aea77cf225 * NetDB: Move getDistance() to its own class 2010-05-10 14:50:55 +00:00
zzz
a1e3ef9c5c cleanup fail output on peers.jsp 2010-05-10 14:26:19 +00:00
zzz
7aece71342 cleanup 2010-05-10 14:24:47 +00:00
zzz
bdbde54f04 * Router: Add router.forceBandwidthClass advanced config for testing 2010-05-10 14:23:25 +00:00
zzz
157e035710 summary bar tweaks 2010-05-10 14:22:37 +00:00
zzz
97d9a3a4e5 show monthly bw estimate 2010-05-10 14:21:48 +00:00
zzz
cb7f111ade * UDP: To help limit connections, don't offer to introduce
when floodfill
2010-05-10 14:20:27 +00:00
zzz
35f670706a * TunnelPoolManager: Concurrent 2010-05-10 14:18:15 +00:00
zzz
3fac888fe5 * DataHelper: Deprecate inefficient eq() methods 2010-05-10 14:17:05 +00:00
zzz
d843646b4f * Streaming: Add support for connection throttling 2010-05-10 14:15:31 +00:00
zzz
c2b73d9fb5 * i2psnark:
- Add tunnel config dropdowns
      - Comment out old proxy stuff
2010-05-10 14:13:55 +00:00
9da95b8165 PluginStarter: If there is some delay, there may be a really good reason for it.
Loading a class would be one of them!
    So we do a quick check first, If it bombs out, we delay and try again.
    If it bombs after that, then we throw the ClassNotFoundException.
2010-05-10 07:27:34 +00:00
zzz
5bcd8efe14 2 transport test classes out 2010-05-06 13:21:30 +00:00
027a1d748d merge of '19b2cad8459bddf9473031504b0f30aa3aad97e3'
and '5fc11615066ab7c27262a8670b7713405d25424c'
2010-05-06 04:15:34 +00:00
6d6e012c19 adapt to the change in build.xml 2010-05-06 03:59:23 +00:00
zzz
a8db6b007f * Plugins:
- Set classpath for specific client only, not for the whole JVM
      - Use ConfigDir() not AppDir()
2010-05-05 19:34:03 +00:00
zzz
f3576e54c6 throw IllegalStateException rather than NPE if no context 2010-05-05 18:44:12 +00:00
zzz
0325f6c4d2 more isEmpty and a static 2010-05-05 18:43:33 +00:00
zzz
8225ce063a * Console: Print stack trace if exception on startup 2010-05-05 17:50:28 +00:00
zzz
c2c379c994 * i2psnark: Skip 'the' when sorting snarks 2010-05-05 17:45:52 +00:00
zzz
7344c2af47 * I2PTunnelHTTPClient: Reject 192.168.* 2010-05-05 17:34:24 +00:00
zzz
f484ea8c64 * EepGet: Limit max times to fail completely even if numRetries is higher 2010-05-05 17:27:20 +00:00
zzz
ac790492eb * build.xml: Create packed sud in release 2010-05-05 16:55:00 +00:00
zzz
9ac5fb4890 * RouterInfo: Clean up use of sortStructures() 2010-05-05 16:54:28 +00:00
zzz
2baee7413c * Replace size() <= 0 with isEmpty() everywhere, ditto > 0 -> !isEmpty() 2010-05-05 16:51:54 +00:00
16bec08f09 merge of '03068a89c26b0986a8bf2b6f36cb478f565664eb'
and 'c3c31953c884c3aafb142e05c2dbef2809516d9c'
2010-05-03 16:44:06 +00:00
afb3c76922 - rewrite portable targets
pkg-portable-clean
	preppkg-portable-win32-jbigi
	preppkg-portable-linux-jbigi
	preppkg-portable-basic
	preppkg-portable-win32
	pkg-portable-win32
- add windoz support to target pack200
2010-05-03 16:42:45 +00:00
z3d
2f526b35e8 merge of '77299d7d613df0c3d1308d1056facc243ef693bb'
and 'a088711b406a5c062940ebbdd1709aa891283d74'
2010-05-02 16:43:46 +00:00
2dc32aa310 fix name "preppkg-linux-only" 2010-05-02 13:04:40 +00:00
zzz
10e669165a Fix plugin version check bug 2010-05-02 12:19:17 +00:00
zzz
b6cb90d731 * ByteCache:
- Add a per-cache stat
      - Limit each cache based on max memory
      - Disable in UDP MessageReceiver
      - Add clearAll() method to be called when under
        severe memory pressure; call from Router
2010-05-02 12:14:14 +00:00
zzz
949a8901fb comment out mains 2010-05-02 12:11:20 +00:00
d608f450af return what is taken a way ;) 2010-05-02 11:30:31 +00:00
z3d
e0a1341901 Adjust dimensions of installer splash graphic: was 171x275, now 171x270. 2010-04-30 10:26:54 +00:00
z3d
2cfb03f17d New installer splash graphic. 2010-04-30 09:30:01 +00:00
z3d
4dd0f51da4 merge of '6b54027d89ac66a5b395118365de13f5ab61bcaf'
and 'b915692e91863a7122937dbd0bad366bf38a7dfc'
2010-04-30 09:26:43 +00:00
dev
d65a3e54a2 update checklist 2010-04-28 17:53:18 +00:00
c212eacf19 - add new target: pkg-portable-win32 (must run buildSmall first)
- add configs/win batchfiles to installer/resources/portable

* currently only pkg-portable-win32 on win32 available
need linuxers to write target preppkg-portable-nix/pkg-portable-linux
and enable pkg-portable-win32 on linux (i doubt anyone need it ?)
shell scripts should goto installer/resources/portable/configs/linux/
2010-04-27 15:01:03 +00:00
zzz
46f341d782 peers.jsp: cleanup and tag 2010-04-27 12:55:37 +00:00
zzz
ab4ff5548d fix reseed tips links 2010-04-27 12:54:07 +00:00
zzz
d4713e1e6c every body needs some <body> 2010-04-27 12:53:16 +00:00
zzz
8a3a1466c9 * i2psnark: Serve downloaded files from the servlet rather
than with a file: link
2010-04-27 12:52:17 +00:00
zzz
a5af9dc973 * Jetty: Backport directory listing bugfix from jetty 6 2010-04-27 12:51:14 +00:00
zzz
049a083e42 0.7.13 2010-04-27 01:43:35 +00:00
zzz
9683a110d6 plugin cleanups 2010-04-23 16:28:14 +00:00
zzz
c44698f61a comments 2010-04-23 16:27:56 +00:00
zzz
106bccda0e log compress errors 2010-04-21 17:41:14 +00:00
zzz
b1aafa5aaf increase buf size for extraction 2010-04-21 17:06:54 +00:00
zzz
e2e43cd534 * EepGet: Don't convert a MalformedURLException into
an IOE so we recognize it when it's throuwn
2010-04-21 17:05:39 +00:00
zzz
43b4fe8300 * ReusableGZIPStreams:
- Concurrent
      - Workaround for Apache Harmony 5.0M13 Deflater bug
2010-04-21 17:04:53 +00:00
zzz
7c3e4fd947 reduce floodfill max conns slightly; fix clients start button 2010-04-18 23:06:04 +00:00
zzz
9916ef4d3d IRC links on readmes and initialNews 2010-04-18 19:57:42 +00:00
zzz
ad4da54bc4 I2PTunnelServer: Log incoming connections with net.i2p.i2ptunnel.I2PTunnelServer=INFO 2010-04-18 15:22:33 +00:00
2415c5a38b * BOB early session destroy to speed up tunnel tare-down. 2010-04-16 19:38:40 +00:00
ecbc0a2a2d Show the start button when a plugin is not running, and the stop button when a plugin is running. 2010-04-16 03:58:48 +00:00
zzz
10d37a9be5 log tweaks 2010-04-15 18:16:00 +00:00
zzz
590d2e4639 Floodfills: Increase max to 100 (was 60) and min to 60 (was 45) 2010-04-15 18:14:21 +00:00
zzz
806a07acc5 Limit max length in readline() 2010-04-15 18:13:51 +00:00
zzz
8258cdd6cf Limit max header lines 2010-04-15 18:13:30 +00:00
2fcee6e87a I2PTunnelHTTPClient: Test for "http://:/" and output error page.
This avoids an ArrayIndexOutOfBoundsException, which can eventually
cause the eepproxy to stop functioning.
2010-04-15 06:38:35 +00:00
zzz
04efbc8819 propagate from branch 'i2p.i2p' (head 2c845f47f9323817088f27c61390558ad723b84a)
to branch 'i2p.i2p.zzz.test' (head 97a16a11a0fa27c0fa44df062573a51af938e068)
2010-04-14 14:05:39 +00:00
zzz
1fc288917a back to updater 2010-04-14 14:05:25 +00:00
zzz
27587e83c8 add test 2010-04-12 22:26:54 +00:00
zzz
a0d6741ff5 fix wrong prefix for startOnLoad in plugin webapps.config 2010-04-12 21:11:22 +00:00
zzz
63562ddd48 * i2ptunnel: Implement access lists for TCP servers.
Enter b32 or b64 hash or dest into list box, and
      check enable for whitelist. Uncheck enable and enter
      i2cp.enableBlackList=true in advanced i2cp options for
      blacklist. Todo: make black/whitelists radio buttons.
2010-04-12 19:18:21 +00:00
zzz
aac96b15b0 * configstats.jsp: Fix full stats checkbox default 2010-04-12 19:12:04 +00:00
zzz
0f502b4229 * LogManager: Concurrent 2010-04-12 19:10:11 +00:00
zzz
a916f970b1 * i2psnark: - Concurrent, limit, display, log tweaks 2010-04-12 19:07:53 +00:00
zzz
7f2d0acc3b merge of 'b12b7f42f59f400abd7032f3f2bffba289f3ec7a'
and 'b5a86744c2877d9d738a2fdd2b99970a0160e062'
2010-04-10 16:06:14 +00:00
zzz
8b6751f419 Streaming:
Fix the window size increment logic so it does it much more often.
The code increased the window size by MSS * MSS / N, like
in RFC 2581, but it did it only once every N,
so that was like MSS * MSS / N**2.
Now do it all the time, except for isolated packets like keepalives
that aren't using more than one message of the window.
Seems to speed up outbound significantly, without any
noticable increase in stream.sendsBeforeAck.
2010-04-10 15:42:08 +00:00
zzz
70e9cf5838 add comments about the null privkey bug 2010-04-10 15:41:42 +00:00
zzz
24020302fd cleanup 2010-04-10 15:29:16 +00:00
zzz
d7e2f39d25 * Startup:
- Don't die horribly if there is a router.info file
        but no router.keys file
        http://forum.i2p/viewtopic.php?t=4424
      - Log tweaks
2010-04-10 15:28:31 +00:00
zzz
89d0d7b266 Disconnect seeds that connect to a seed 2010-04-10 15:26:23 +00:00
zzz
e3c222b5c1 Lower per-torrent conn limits for large pieces 2010-04-10 15:25:57 +00:00
a199015bc9 Russian translation updated (trac.i2p2.i2p link) 2010-04-08 09:57:32 +00:00
zzz
23617f7b30 dont set stats off, defaults to off anyway 2010-04-07 23:22:48 +00:00
zzz
f5f02236df toString() for logging 2010-04-07 23:21:45 +00:00
zzz
ad76bc378c * OCMOSJ:
- Increase min timeout
      - Logging tweaks
2010-04-07 23:20:42 +00:00
zzz
570d8d15af * Key Manager: Hopefully avoid some races at startup
http://forum.i2p/viewtopic.php?t=4424
2010-04-07 23:19:24 +00:00
zzz
e254c5f31a * Streaming:
- Detect and drop dup SYNs rather than create
        a duplicate connection - will hopefully fix
        "Received a syn with the wrong IDs"
      - Send reset for a SYN ACK with the wrong IDs
      - Don't send a reset to a null dest
      - Logging tweaks
      - Cleanups
2010-04-07 23:18:58 +00:00
zzz
2a92be5946 * Console:
- More HTML transitional fixes
      - Standardize on 'save' to the right of 'cancel'
2010-04-05 13:34:45 +00:00
zzz
caab860351 - Add tooltip support for plugin links
- Make target=_blank for plugin links
2010-04-05 13:22:16 +00:00
z3d
32861b7ce9 merge of '44418e8f7048de3ac06833176b607d55afc94bdd'
and '6cd2f8bb60720e3aeeb500d67b3f162f2831c3fa'
2010-04-05 12:26:28 +00:00
z3d
a08802c4b6 Fix the errant horizontal rule in the console news section (classic/midnight). 2010-04-04 11:32:28 +00:00
z3d
6b51be6fae Fix the errant horizontal rule issue in the console news section (classic/midnight). 2010-04-04 05:46:07 +00:00
zzz
5b5c975884 turned the knob the wrong way before 2010-04-02 13:10:08 +00:00
zzz
605dfec5e7 dont call exit 2010-03-31 18:33:40 +00:00
zzz
71aa0cfba7 * FloodfillPeerSelector: Adjust rankings to try to
improve LeaseSet lookups
2010-03-31 18:33:08 +00:00
zzz
55e45c4274 * HostsTxtNamingService: Don't load the whole hosts.txt
into memory for every lookup
2010-03-31 18:32:16 +00:00
zzz
8c880b2518 prep for a windows-only pkg 2010-03-29 21:21:56 +00:00
zzz
c43b16cfbb * configclients.jsp:
- Always show start button for webapps and plugins
    * configclients.jsp, configupdate.jsp:
      - Fix submission when entering CR in a text box
    * Plugins:
      - Stop all plugins at shutdown
      - Log tweaks
    * WebApps:
      - Remove the WAC after stopping it
      - Stop a WAC before starting it to prevent dups
2010-03-29 21:20:48 +00:00
zzz
394903a8f0 - Implement destroy() in i2psnark to prevent dups 2010-03-29 21:14:35 +00:00
zzz
e31c0636ab - Implement destroy() in addressbook to prevent dups 2010-03-29 21:13:45 +00:00
zzz
e9fe80f8e5 * HTTPResponseOutputStream: More static 2010-03-29 21:12:51 +00:00
zzz
7671550a9f * EepGet: Don't retry after a MalformedURLException 2010-03-29 21:12:04 +00:00
zzz
83d24fa90d -2 2010-03-25 20:26:28 +00:00
zzz
3e2956da3f * netdb.jsp: Tag transport properties 2010-03-25 20:25:03 +00:00
zzz
cf3fd01012 * Plugins: Remove final check and install console
messages after a while
2010-03-25 20:23:32 +00:00
zzz
319071c73b Add new reseed host
thx merd@mail.i2p
2010-03-25 19:09:30 +00:00
zzz
ab8d9bb79b * PrivateKeyFile: Add b32 output 2010-03-25 19:07:35 +00:00
zzz
25eaf8cad7 fix dup anchor 2010-03-25 19:06:47 +00:00
zzz
c8f97d9c73 * i2psnark:
- Send numwant=0 if we don't need peers
      - Report returned complete and incomplete counts
        if higher than peer count
      - Allow missing peer list
      - Log tweaks
2010-03-25 19:05:45 +00:00
zzz
d3f1fe1c30 * Console: Sort plugin links in summary bar 2010-03-25 19:04:45 +00:00
zzz
5fb01a01af history for prop, -1 2010-03-18 15:55:42 +00:00
zzz
617d1cd648 propagate from branch 'i2p.i2p.zzz.test' (head c295ab421dd719cfe0e273268b5b4e48505e4f61)
to branch 'i2p.i2p' (head 995914d8e049d9bb695fd25e4cf5be860cd4e487)
2010-03-18 15:49:03 +00:00
zzz
f672193fcf enable VTBM 2010-03-18 15:48:40 +00:00
zzz
d3c490e9d7 bold the rest of the update msg 2010-03-18 12:32:28 +00:00
zzz
2e8fd23f2b concurrent 2010-03-18 12:32:01 +00:00
zzz
3eef403b04 concurrent 2010-03-18 12:31:44 +00:00
zzz
f3b78fc82f post-release cost cleanup 2010-03-17 22:05:45 +00:00
zzz
80654b2732 Discard at IBGW based on router clock not system clock 2010-03-17 17:00:35 +00:00
zzz
05597ae914 disable i2ptunnel nonce checking if console password is set 2010-03-17 16:23:20 +00:00
zzz
0f1eb464e8 add reseed host thx mathiasdm 2010-03-17 16:22:11 +00:00
zzz
8745ffd42f * config.jsp: Set burst to +10% for 20s by default,
to fix bug where the burst stays high when limits
      are reduced.
2010-03-17 16:18:25 +00:00
zzz
db99e98658 display transport cost 2010-03-17 16:15:52 +00:00
zzz
9f1a663f63 typo fix thx duck 2010-03-16 13:52:57 +00:00
zzz
db0b3da446 snark up bw tracking tweak 2010-03-16 13:32:34 +00:00
zzz
5d22d41201 pack200 for installer (-3.3MB) 2010-03-16 12:38:07 +00:00
zzz
b397de1d54 link to trac 2010-03-16 12:37:32 +00:00
dev
4bda79b263 merge of '7e9ec9156e65514e00e0d9f82be002cf9aadac5f'
and '9df57c2abc8e859828f9edf80e9d104fd6bf6729'
2010-03-15 19:01:28 +00:00
dev
697a9dbd06 merge of '59ab6afe6ba2e217124fe55e8d854d0e04b965c4'
and '6cf70779bcd05bcf782d6d7bb8d131ce8d71426f'
2010-03-15 19:01:07 +00:00
dev
accaabcfde added c.netdb.i2p2.de to the reseed sites 2010-03-15 19:01:03 +00:00
zzz
5026cbdc8d 0.7.12 2010-03-15 18:03:46 +00:00
zzz
16a14d4ebd * Clients:
- Negative delay means run immediately and inline
      - Add methods to test class and run inline,
        to propagate errors to the console
      - Add javadoc for clients.config format
      - Use new methods for plugins
2010-03-15 16:19:19 +00:00
zzz
c151352910 cleanup 2010-03-15 16:15:23 +00:00
zzz
52e2aaa20d javadoc cleanup after review 2010-03-15 14:34:25 +00:00
zzz
9df87ba167 partial fix for i2ptunnel nonce troubles 2010-03-13 20:33:48 +00:00
zzz
b80f70fc54 dont yell so loud 2010-03-13 16:04:32 +00:00
zzz
939cdb019b log tweak 2010-03-13 15:00:47 +00:00
zzz
fde36fe238 flip backwards arraycopy args 2010-03-13 14:59:54 +00:00
116be93160 Russian translation updated (snark file open error message, reseed messages, SOCKS IRC proxy) 2010-03-13 09:57:55 +00:00
zzz
40e820cabb * UDP:
- Big refactor of several classes for concurrent,
        elimination of several locks
      - Reduce max number of resent acks in a packet to
        lower overhead
      - Take incoming messages from the head of the queue,
        not sure why taking them from the tail "reduces latency"
      - Java 5 cleanup
2010-03-09 20:44:46 +00:00
zzz
d79387bd92 * TunnelGatewayPumper: Refactor for concurrent 2010-03-09 20:43:30 +00:00
zzz
05f2a62cbb * Job Queue:
- Replace some locks with concurrent
      - Change job ID to a long so it won't wrap
      - Remove some unused stats
      - Java 5 and debug cleanup
2010-03-09 17:32:29 +00:00
zzz
78a965dc90 * FIFOBandwidthRefiller:
- Replace global counters with atomics
      - Use lockless shortcut methods to grant
        requests if we can satisfy immediately
2010-03-09 17:10:18 +00:00
zzz
5b603d6627 cleanups and comments 2010-03-08 22:17:46 +00:00
zzz
e93d2046d3 Remove some unused stats 2010-03-08 22:15:42 +00:00
zzz
995871db8a more java 5 cleanups 2010-03-08 22:13:43 +00:00
zzz
501535f196 Java 5 cleanups 2010-03-08 22:07:52 +00:00
zzz
91e854e99c * Peer Manager:
- Replace some locks with concurrent
      - Switch back to fast version of getPeersByCapability()
      - Java 5 cleanup
2010-03-08 22:02:42 +00:00
zzz
9b05d8e774 * ByteCache:
- Remove some locks with concurrent
2010-03-08 21:32:14 +00:00
zzz
e70793c3bc propagate from branch 'i2p.i2p' (head b7a8a00272124eec0d149224af58bd144358c009)
to branch 'i2p.i2p.zzz.test' (head a4d67a357c36f4e94718bf237a7af96b8617a4a7)
2010-03-08 20:04:55 +00:00
zzz
abb2603bea one more unused class 2010-03-08 20:04:35 +00:00
c91218be27 Add i2pbote.net to the list of reseed hosts 2010-03-08 05:14:26 +00:00
zzz
9eab44128a * Random: Remove and deprecate some old classses 2010-03-08 00:48:56 +00:00
zzz
f98101afa6 * i2psnark: Better track outgoing bandwidth by incrementing
counter before the blocking write
2010-03-08 00:45:08 +00:00
zzz
4fae7a8cb6 * Floodfills: Increase max to 60 (was 28) and min to 45 (was 20) 2010-03-08 00:44:40 +00:00
zzz
26cf1922db * Reseeder: Reduce max response size to 1MB (was 8MB) 2010-03-08 00:44:15 +00:00
c087b0695f An update of the network configuration page in the messages_fr.po file. 2010-03-06 13:22:49 +00:00
zzz
16930d2004 merge of '18a87911d2a41f5a1fa0f5019d9bcd7249731338'
and '1d260b764d0fde4b8df67bdb23320b85e6944721'
2010-03-05 15:56:57 +00:00
zzz
33939e7cfb translate country names on flag popups 2010-03-05 15:56:17 +00:00
zzz
e759ef5865 tag console reseed messages 2010-03-05 15:36:24 +00:00
zzz
2be1b1ece4 couple of tags 2010-03-05 15:27:32 +00:00
1820a29aed translation update 2010-03-05 15:14:43 +00:00
zzz
ee9f85d53c rename getString() since it was getting tagged 2010-03-05 14:44:50 +00:00
zzz
afbb1dbe86 compile fix 2010-03-05 14:44:18 +00:00
zzz
9244bd6b0f * I2PSOCKSIRCTunnel:
- New, for filtering IRC client traffic when using SOCKS
    * I2PTunnelIRCClient:
      - Make filter classes static and public for use by SOCKS
      - Eliminate redundant case conversion
      - Pass ISON message through (jIRCii uses it for pings)
      - Switch back to StringBuffer since it's used by 2 threads
      - Set daemon on filter threads
    * SOCKS5Server:
      - Fix handling of multiple authentication methods
2010-03-05 14:04:32 +00:00
zzz
6bb4403207 updates after trying SDK 2.1 2010-03-05 13:48:26 +00:00
24ebd503d4 susidns translation 2010-03-05 13:39:37 +00:00
285a5eed35 Russian translation updated (job queue link, address helper conflict message) 2010-03-04 13:04:01 +00:00
zzz
26aebe6a0f * Console:
- Add link to jobs.jsp on configservice.jsp
      - Add plugin disableStop support
2010-03-02 22:54:32 +00:00
zzz
ca9f174171 * Context: Add boolean getProperty methods 2010-03-02 22:52:26 +00:00
zzz
ffbced22b3 * LoadClientAppsJob:
- Fix unquoted arg after quoted arg
      - Logging cleanup
2010-03-02 22:51:53 +00:00
zzz
45ca459ceb * HTTP Proxy:
- Fix address helper conflicts caused by last checkin
      - Use B32 instead of random hostname for conflict link
2010-03-02 22:50:46 +00:00
5a539f0619 merge of '98497fef229d3e37922d4c09cb52e043b01647ee'
and 'de5aa1476c5d447deb031032dbfbc921114dfbd6'
2010-02-27 18:03:05 +00:00
c6cef72cb7 Fix: webapps keep asking for the router console password even after the user entered it 2010-02-27 18:02:56 +00:00
zzz
8081d053cc Prevent UDP startup NPE http://zzz.i2p/topics/571 2010-02-27 14:38:52 +00:00
zzz
efdc8e5df0 * HTTP Proxy:
- Put B32 instead of B64 in Host: header, saves 450 bytes
      - Eliminate some redundant lookups
      - Fix http://i2p/b64/ and /eepproxy/site/ requests
      - Disallow a port specified for an i2p address
      - Cleanup and comments
2010-02-27 01:16:39 +00:00
zzz
b4911a2b2f support plugin themes 2010-02-26 16:58:01 +00:00
zzz
7b70210c9a * UDP Transport:
- Replace the unused-since-2006 TimedWeightedPriorityMessageQueue
        with DummyThrottle
      - Don't instantiate and start TWPMQ Cleaner and OutboundRefiller
        threads, part of priority queues unused since 0.6.1.11
      - Don't instantiate and start UDPFlooder, it is for testing only
2010-02-26 16:54:41 +00:00
zzz
e3353df8bb * NTCP Transport:
- Replace lists with concurrent queues in EventPumper
        and NTCPConnection to remove global locks
      - Java 5 cleanup
2010-02-26 16:52:09 +00:00
zzz
25285fc059 remove jobs link from summary bar 2010-02-26 16:47:41 +00:00
zzz
7720f71e44 * eepsite: Add some help to index.html 2010-02-26 16:46:12 +00:00
zzz
1657ac5357 * netdb: Fix NPE after OOM http://trac.i2p2.i2p/ticket/38 2010-02-26 16:45:34 +00:00
zzz
299214aa1d * i2psnark:
- Fix NPE after create file failure
      - Sanitize more characters in file names
2010-02-26 16:44:49 +00:00
5fd4488e08 Russian translation updated (delete confirmation, non-i2p trackers warning) 2010-02-23 08:49:37 +00:00
zzz
87fcaf2651 * Unzip: Any files in the zip with a .jar.pack or .war.pack extension
will be transparently unpacked with unpack200. Savings is about 60%.
      Someday we will do this for suds, but we can do it for xpi2ps now.
    * build: Add updater200 target
2010-02-23 02:44:47 +00:00
zzz
f6b9cf6f21 * configclients.jsp:
- Add js delete confirm
      - Remove delete button for webapps
    * i2psnark:
      - Ignore a non-i2p tracker in a torrent rather than deleting
        the torrent, thus "converting" a torrent to in-netowrk use
        via the open trackers
      - Add js delete confirm
2010-02-22 18:17:11 +00:00
zzz
eae18e61b7 unhide plugins, fix d/l status display 2010-02-19 14:42:43 +00:00
zzz
96735f2543 make file box bigger 2010-02-19 14:40:57 +00:00
54459d3b5c Russian translation updated (plugin support) 2010-02-18 21:16:15 +00:00
zzz
82444f9e7b move getConsoleServer() method 2010-02-18 16:33:47 +00:00
zzz
3d8365a473 * HTTP Proxy: Fix blank page instead of error page for eepsite unreachable 2010-02-18 16:32:44 +00:00
zzz
e2dc9715d2 * Transport:
- Fix recognition of IP change when not firewalled
      - Require consecutive identical results from two peers before changing IP
2010-02-18 16:31:57 +00:00
zzz
d4f1230b37 better error message when finding HTML instead of metainfo 2010-02-17 19:56:54 +00:00
zzz
7701693d37 * Plugins:
- Fix plugin start button
      - Change signer prop to match docs
      - Tweaks
2010-02-17 18:12:46 +00:00
zzz
b6704fce4e javadoc fix 2010-02-17 18:11:16 +00:00
zzz
39a68d4a2b slew tweak 2010-02-17 18:10:45 +00:00
zzz
94633899d7 CLI exit 1 on error for ease of use in scripts 2010-02-17 18:10:20 +00:00
zzz
c45bc1554f move to i2p.scripts 2010-02-17 18:08:54 +00:00
789c8edc45 Russian translation updated (plugin support) 2010-02-15 20:53:49 +00:00
zzz
e0b44f43e3 history for 3 props, -1 2010-02-15 16:37:22 +00:00
zzz
b45069e377 propagate from branch 'i2p.i2p.zzz.VTBM' (head fb6ef5bc51e18536bc1611a483e9be804084e37b)
to branch 'i2p.i2p' (head c9f5d7378a6028393fe560739ec02f5f87f50f80)
2010-02-15 16:22:20 +00:00
zzz
c3a156ce4b propagate from branch 'i2p.i2p.zzz.plugin' (head fafcd8c8c41873b4d106a9e06504dd7b48109ad8)
to branch 'i2p.i2p' (head 7eafbe18b0a1e26f09b9488d374f5fed4c278a78)
2010-02-15 16:21:15 +00:00
zzz
ee5cc099ed propagate from branch 'i2p.i2p.zzz.test' (head 0914f799641c6ec04dbe40f325f8368403167885)
to branch 'i2p.i2p' (head f3d096929c21753a2117f93d7550b751b021c2a7)
2010-02-15 16:17:40 +00:00
zzz
f189587153 log tweak 2010-02-15 16:16:03 +00:00
zzz
a1fb5ef6ed verify that signing key name matches 2010-02-15 16:12:49 +00:00
zzz
8c2550c39a * Streaming: MessageOutputStream logging tweaks 2010-02-15 16:10:41 +00:00
zzz
1d3f0fe96c * Transport:
- Update addressses before publishing
      - Increment address cost if near capacity
      - Synchronize notifyReplaceAddress()
2010-02-15 04:08:02 +00:00
zzz
49a6cdbda6 - Clear the geoip negative cache periodically 2010-02-14 01:17:19 +00:00
zzz
2700028da7 * Transport: Adjust bids based on address cost
- More finals
2010-02-13 15:16:12 +00:00
zzz
4f70a7d0fe * Clock:
- getFramedAveragePeerClockSkew() now returns a long (ms);
        was a Long (s)
      - Implement NTP-style clock slewing so the clock is adjusted
        gradually
      - Implement clock strata so we prefer better clocks
      - Implement a timestamper in the transport so we will periodically
        update the clock even if NTP is not working
        This allows the router to converge the clock instead of simply
        hoping the first connected peer is correct.
      - Slow down NTP attempts after several consecutive failures
2010-02-13 01:20:23 +00:00
zzz
f265db4037 fix stop button; catch and log exceptions better 2010-02-11 21:41:54 +00:00
zzz
62308f26bc * Plugins:
- Fix classpath setting for webapps
      - Implement uninstall args in clients.config
2010-02-11 19:18:26 +00:00
zzz
cada9fae44 flush requests in I2PTunelRunner 2010-02-10 20:13:07 +00:00
zzz
949aea951e * Plugins:
- Hook up update/delete/check/save buttons
      - Implement delete
      - Hide unless router.enablePlugins=true
2010-02-10 19:09:35 +00:00
zzz
cfc49ab261 * Plugins:
- Check plugin key against all installed plugins
      - Reword some error messages
    * VersionComparator: add '-' and '_' as valid separators
      to better support plugin and java version checking
2010-02-10 15:35:00 +00:00
zzz
880f1866dc take version number off jrobin jar so we can overwrite if we upgrade 2010-02-10 12:06:30 +00:00
zzz
54171e4be2 ... and more 2010-02-08 23:37:31 +00:00
zzz
a820c01ba5 strip HTML from fields 2010-02-08 23:28:09 +00:00
zzz
9d1ae891bb check for mismatched versions 2010-02-08 22:50:30 +00:00
zzz
2df7247e83 fix start webapp, add stop webapp 2010-02-08 22:19:59 +00:00
zzz
a109ebef28 stop button 2010-02-08 20:57:30 +00:00
zzz
c0135b592d plugin stopper 2010-02-08 20:37:49 +00:00
zzz
b7a0aeea34 plugin buttons 2010-02-08 19:04:46 +00:00
zzz
66375e25c6 start of a plugin version checker 2010-02-08 18:45:53 +00:00
zzz
85482a67f5 plugin description on configclients 2010-02-08 16:15:23 +00:00
zzz
9012baf51e plugin links 2010-02-07 19:01:06 +00:00
zzz
3c8355790f load translation bundles in plugins 2010-02-07 18:18:31 +00:00
zzz
e9f1da85e4 classpath for plugins 2010-02-07 17:13:44 +00:00
zzz
58adccfd4a start of a plugin starter 2010-02-07 13:32:49 +00:00
zzz
040f3e016e move jrobin from routerconsole.jar to its own jar 2010-02-06 20:48:14 +00:00
zzz
505d5f5cae * Plugins: New plugin downloader/installer
* configclients.jsp: Use new WebAppStarter so webapps that are
      started later also get the temp dir, password, and classpath
      configuration just like if they were started at the beginning
    * configupdate.jsp: Delay after checking for update so the
      summary bar will have buttons.
2010-02-06 20:25:13 +00:00
zzz
f7780b6745 * TrustedUpdate:
- Allow method to check if we know about a key
      - Add method to extract without verifying
2010-02-06 18:47:08 +00:00
zzz
7a59d15e9c - Pull jstl.jar and standard.jar out of susidns.war (-300KB someday)
- Remove duplicate classes from i2psnark.war (100KB)
2010-02-06 18:44:29 +00:00
zzz
9b141bd9dd * Webapps: Allow additions to a webapp classpath. This will let us:
- Pull jstl.jar and standard.jar out of susidns.war
      - Remove 100KB of duplicate classes from i2psnark.war
      - Add classpaths for plugins
2010-02-06 18:40:55 +00:00
zzz
375118fe02 Refactor and tag update status messages 2010-02-05 21:12:10 +00:00
zzz
3aebe45a7d refactor the storage of signing keys 2010-02-05 19:19:33 +00:00
zzz
2f8b55ceda propagate from branch 'i2p.i2p' (head d84bac5f340fb1f9f4826a3326847a84cf32b1a1)
to branch 'i2p.i2p.zzz.test' (head c055e344e2d86aa417bb248bb0a6c54ba3b2f52d)
2010-02-05 00:31:33 +00:00
zzz
b77be20cc1 set up transport cost constants 2010-02-05 00:31:00 +00:00
zzz
b0502b1873 Fix several VTBM read/write bugs after testing 2010-02-03 14:16:05 +00:00
zzz
d7015cf2e6 disable sending VTBMs 2010-02-01 14:46:00 +00:00
zzz
5689fa8512 propagate from branch 'i2p.i2p' (head 2b1a99ea78270f80514ced3860a7d54cc3f2e309)
to branch 'i2p.i2p.zzz.VTBM' (head 155eea7b96fa5ce48faec385242e0b6eb232b0dd)
2010-02-01 14:39:16 +00:00
zzz
25e51a945c - Fix first hop expiration for Build Messages, was way too long
- Randomize Build Message expiration to make it harder to guess hop position
      - Save expired tunnel build configs for a while, so that we will still use the tunnel
        and update peer stats if the reply comes in late
      - Don't update our own profile for Tunnel Build Replies
2010-02-01 14:17:11 +00:00
zzz
839986db22 * I2NP: Add UnknownI2NPMessage so we can route unknown message types 2010-01-31 16:31:36 +00:00
zzz
56b3e6a993 * Tunnel Building:
- Add getRecordCount() to TunnelBuildMessage and TunnelBuildReplyMessage
        so they can be extended.
      - New I2NP Messages VariableTunnelBuildMessage and VariableTunnelBuildReplyMessage,
        which contain the number of request slots in them.
      - Convert all static assumptions of 8 slots to getRecordCount()
      - Use the new VTBM if all hops in the tunnel and the OBEP or IBGW of the reply tunnel
        support it, and the tunnel is 4 hops or shorter.
      - Reply to a VTBM with a VTBRM of the same size
      - Make BuildReplyHandler static
      - Convert the currentlyBuilding List to a ConcurrentHashMap to speed reply lookups
        and eliminate a global lock; don't put fallback tunnels in there
      - Add new tunnel.corruptBuildReply stat
      - Various cleanups and javadoc

    Tested as compatible with current network, new messages untested.
2010-01-29 19:22:10 +00:00
2585 changed files with 152819 additions and 384793 deletions

3
.dockerignore Normal file
View File

@ -0,0 +1,3 @@
app/pkg-temp
app/build
app/pkg-mavencentral

73
.github/workflows/ant.yml vendored Normal file
View File

@ -0,0 +1,73 @@
# Mostly copied from https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant
# zlatinb
name: Java CI
on: [push]
permissions:
contents: read
pages: write
id-token: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: GetText
run: sudo apt install gettext git
- uses: actions/checkout@v4
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'
- name : Generate override.properties
run: |
rm -f override.properties
echo "build.built-by=GitHub Actions" >> override.properties
echo "noExe=true" >> override.properties
- name: build with Gradle
run: |
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
git clone -b i2p-2.4.0 https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
./gradlew assembleDebug
find . -name '*.apk'
- name: Upload i2p-debug-${{ github.sha }}.apk
uses: actions/upload-artifact@v4
with:
name: i2p-debug.apk
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk
trunk:
runs-on: ubuntu-latest
steps:
- name: GetText
run: sudo apt install gettext git
- uses: actions/checkout@v4
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'
- name : Generate override.properties
run: |
rm -f override.properties
echo "build.built-by=GitHub Actions" >> override.properties
echo "noExe=true" >> override.properties
grep -v I2P_ gradle.properties > gradle.properties.update
echo "I2P_VERSION=2.5.0-1" >> gradle.properties.update
echo "I2P_ANDROID_VERSION=2.5.0-1" >> gradle.properties.update
cp -v gradle.properties.update gradle.properties
- name: build with Gradle
run: |
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
git clone -b master https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
bash -c "cd $HOME/i2p.i2p && ./installer/resources/maven-dev-release.sh 1"
./gradlew assembleDebug
find . -name '*.apk'
- name: Upload i2p-debug-${{ github.sha }}.apk
uses: actions/upload-artifact@v4
with:
name: i2p-debug-trunk-${{ github.sha }}.apk
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk

22
.github/workflows/github-sync.yml vendored Normal file
View File

@ -0,0 +1,22 @@
# File: .github/workflows/github-sync.yml for i2p-hackers/i2p.android.base
on:
schedule:
- cron: "*/5 * * * *"
workflow_dispatch:
jobs:
repo-sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: repo-sync
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: repo-sync/github-sync@v2
with:
source_repo: "https://i2pgit.org/i2p-hackers/i2p.android.base"
source_branch: "master"
destination_branch: "master"
github_token: ${{ secrets.PAT }}

62
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,62 @@
name: Release
#on: [push]
on:
push:
# Sequence of patterns matched against refs/tags
tags:
- 'i2p-android-*.*.*' # Release i2p-firefox-1.2.3
- 'i2p-android-*.*.*-*' # Release i2p-firefox-1.2.3
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: |
CHANGELOG.md
sparse-checkout-cone-mode: false
- name: sleep 6 minutes
run: |
echo "sleeping 6 minutes to wait for artifacts"
sleep 1m
echo "sleeping 5 minutes to wait for artifacts"
sleep 1m
echo "sleeping 4 minutes to wait for artifacts"
sleep 1m
echo "sleeping 3 minutes to wait for artifacts"
sleep 1m
echo "sleeping 2 minutes to wait for artifacts"
sleep 1m
echo "sleeping 1 minutes to wait for artifacts"
sleep 1m
- name: Download artifacts
id: download-artifact
uses: dawidd6/action-download-artifact@v3
with:
skip_unpack: true
workflow: ant.yml
if_no_artifact_found: fail
# remove .zip file extension
#- run: for f in *.zip; do unzip "$f"; rm "$f"; done
- run: unzip i2p-debug.apk.zip
- run: echo "" | tee -a RELEASE.md
- run: echo "## Checksums" | tee -a RELEASE.md
- run: echo "" | tee -a RELEASE.md
- run: echo '```' | tee -a RELEASE.md
- run: sha256sum * | tee -a RELEASE.md
- run: echo '```' | tee -a RELEASE.md
- run: echo "" | tee -a RELEASE.md
- run: echo '```' | tee -a RELEASE.md
- run: file * | tee -a RELEASE.md
- run: echo '```' | tee -a RELEASE.md
- run: echo "" | tee -a RELEASE.md
- name: Upload artifacts
uses: ncipollo/release-action@v1
with:
artifacts: "*"
bodyFile: "RELEASE.md"

95
.github/workflows/sign.yml vendored Normal file
View File

@ -0,0 +1,95 @@
# Mostly copied from https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant
# zlatinb
name: Java Signed CI
on: [push]
permissions:
contents: read
pages: write
id-token: write
jobs:
build-signed:
runs-on: ubuntu-latest
steps:
- name: GetText
run: sudo apt install gettext git
- uses: actions/checkout@v4
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'
- name: Generate override.properties
env:
DEV_SIGNING_KEY: ${{ secrets.DEV_SIGNING_KEY }}
DEV_PASSWORD: ${{ secrets.DEV_PASSWORD }}
run: |
rm -f override.properties
mv etc/github.gradle.properties gradle.properties
mv etc/github.signing.properties signing.properties
mkdir -p $HOME/keystores/
echo $DEV_SIGNING_KEY | base64 --decode > $HOME/keystores/android-release.keystore
echo "KEY_ALIAS=mykey" >> signing.properties
echo "KEY_PASSWORD=$DEV_PASSWORD" >> signing.properties
echo "build.built-by=GitHub Actions" >> override.properties
echo "noExe=true" >> override.properties
- name: build with Gradle
run: |
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
git clone -b i2p-2.4.0 https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
./gradlew assembleRelease
find . -name '*.apk'
ls -lah $HOME/keystores/android-release.keystore
ls -d $HOME
- name: Upload i2p-debug-${{ github.sha }}.apk
uses: actions/upload-artifact@v4
with:
name: i2p-debug.apk
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk
trunk-signed:
runs-on: ubuntu-latest
steps:
- name: GetText
run: sudo apt install gettext git
- uses: actions/checkout@v4
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'
- name: Generate override.properties
env:
DEV_SIGNING_KEY: ${{ secrets.DEV_SIGNING_KEY }}
DEV_PASSWORD: ${{ secrets.DEV_PASSWORD }}
run: |
rm -f override.properties
echo "build.built-by=GitHub Actions" >> override.properties
echo "noExe=true" >> override.properties
mv etc/github.gradle.properties gradle.properties
mv etc/github.signing.properties signing.properties
mkdir -p $HOME/keystores/
echo $DEV_SIGNING_KEY | base64 --decode > $HOME/keystores/android-release.keystore
echo "KEY_ALIAS=mykey" >> signing.properties
echo "KEY_PASSWORD=$DEV_PASSWORD" >> signing.properties
grep -v I2P_ gradle.properties > gradle.properties.update
echo "I2P_VERSION=2.5.0-1" >> gradle.properties.update
echo "I2P_ANDROID_VERSION=2.5.0-1" >> gradle.properties.update
cp -v gradle.properties.update gradle.properties
- name: build with Gradle
run: |
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
git clone -b master https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
bash -c "cd $HOME/i2p.i2p && ./installer/resources/maven-dev-release.sh 1"
./gradlew assembleRelease
find . -name '*.apk'
ls -lah $HOME/keystores/android-release.keystore
ls -d $HOME
- name: Upload i2p-debug-${{ github.sha }}.apk
uses: actions/upload-artifact@v4
with:
name: i2p-debug-trunk-${{ github.sha }}.apk
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
etc/docker.signing.properties
signing.properties
.idea
.idea/
.gradle/
local.properties
override.properties
build

18
.tx/config Normal file
View File

@ -0,0 +1,18 @@
[main]
host = https://www.transifex.com
lang_map = pt_BR: pt-rBR, yi: ji, zh_CN: zh, zh_TW: zh-rTW, id: in, ru_RU: ru, sv_SE: sv, tr_TR: tr, uk_UA: uk, he: iw, es_AR: es-rAR
[o:otf:p:I2P:r:android]
file_filter = app/src/main/res/values-<lang>/strings.xml
source_file = app/src/main/res/values/strings.xml
source_lang = en
type = ANDROID
minimum_perc = 22
[o:otf:p:I2P:r:android_lib_helper]
file_filter = lib/helper/src/main/res/values-<lang>/strings.xml
source_file = lib/helper/src/main/res/values/strings.xml
source_lang = en
type = ANDROID
minimum_perc = 50

274
CHANGELOG Normal file
View File

@ -0,0 +1,274 @@
2.8.0
* Update I2P Library
* Migrate to AndroidX
* Migrate to MagicIndicator
2.7.1
* Update I2P Library
* Roll back ViewPageIndicator version, fixes crash, causes other issues
2.7.0
* Update I2P Library
2.6.0
* Update I2P Library
2.5.0
* Update I2P Library
2.4.0
* Update I2P Library
2.3.0
* Update I2P Library
2.2.0
* Add blocklist feed support
* Fix translations on stats page
* Various bugfixes
2.1.0-1
* adds support for adding base32 addresses to the local addressbook
* adds support for destinations with ports in the string to i2ptunnel
* adds support for remote applications launching I2P, via MR#3 from @RyeMantis
2.1.0
* Upgrades router to version 2.1.0
* Adds jcenter repository back to app/ target, removes jcenter from other targets
* explicitly set android.useAndroidX
2.0.1
* Fixes gitlab#49 by applying MUTABLE or IMMUTABLE flags across all PendingIntents
2.0.0
* Updates router to version 2.0.0
* Updates gradle plugin
* Remove Firefox from supported browsers list due to lack of about:config support
* Add Privacy Browser to supported browsers list and write guide for it
1.9.1
* Switches back to mavenCentral builds
* Fixes build process for F-Droid main
* Using tag i2p.i2p:i2p-android-1.9.0
* Allow b32 and blinded b32 to validate in I2PTunnel UI
1.9.0
* Updates router to version 1.9.0
* Using tag i2p.i2p:i2p-android-1.9.0
1.8.2
* This update fixes a bug where Family Keys are incorrectly handled by the Android router, leading
to a crash.
* This update fixes a bug wherein incorrect type-checking caused a crash when using the Network
Config page for some users.
1.8.1
* This update fixes a bug where certificates were unpacked to the wrong location on new installs,
resulting in the router failing to start.
* Decouples the Android version from the I2P library version to allow for android point
releases with less pain.
1.8.0
* This release updates the underlying I2P libraries to I2P version 1.8.0
* The SAM API now operates in "Interactive Authentication" mode. Users will be prompted via
the notificationArea to approve or ignore new SAM connections initiated by external apps.
* The network config menu now features a drop-down configuration instead of a slider configuration
(since reversed)
1.7.1
* This release updates the underlying I2P libraries to I2P version 1.7.1
1.7.0
* This release updates the underlying I2P libraries to I2P version 1.7.0
* Refactor of the unzipResourceToDir function
1.6.0
* This release updates the underlying I2P libraries to I2P version 1.6.0
1.5.0
* This release updates the underlying I2P libraries to I2P version 1.5.0
0.9.50 2021-05-18
* This release updates the underlying I2P libraries to I2P version 0.9.50
0.9.48 2020-12-02
* This release updates the underlying I2P libraries to I2P version 0.9.48
* Updates to browser configuration documentation
0.9.47-1 2020-10-29
* This release fixes a number of bugs arising from a misconfigured bootclasspath
* Fix a battery-management issue arising on some phones
0.9.47 / 2020-08-26
* Notification bug-fixes on platforms >8.0
0.9.46 / 2020-06-03
* catch ActivityNotFound exception in MainActivity
0.9.45 / 2020-03-07
* No significant changes
0.9.44 / 2019-12-03
* Updated translations
* Bumped target sdk version to 28, enforced by google
0.9.43-1 / 2019-10-28
* Fix crash at startup in TCG
0.9.43 / 2019-10-27
* Save state in background thread (tickets #2595, #2632)
* Fix ISE in language dialog (ticket #2631)
* Fix NPE in create tunnel (ticket #2629)
* Update logo after router killed in background
* Fix message in tunnels tabs when tunnels not up yet
* Hide tunnel actions while TCG is starting
* Add battery permissions dialog (ticket #2607)
0.9.42 / 2019-08-28
* Possible fix for tunnel edit dialog crash (ticket #2598)
0.9.41 / 2019-07-03
* New 64 bit libjbigi (ticket #2503)
* Update 32 bit jbigi to GMP 6.1.2
* Fix for client tunnels not starting after reseed
* UPnP Fixes (ticket #2499)
* WebView crash fixes (ticket #2390)
* i2ptunnel crash fix (ticket #2552)
* i2ptunnel ANR fix (ticket #2491)
* Browser help pages improvements (tickets #2521, 2523)
* Code cleanups and fixes
* Update visibility of floating menu items
* Put our router info at top of list
* Table layout cleanups
* Fixes for threads remaining after router stop
* Remove BOB
* Remove welterde IRC tunnel
* Various lint fixes
* New translations: Add cs, da, el
* Add missing translations to menu: ar, fi, gl, hu, zh_TW
0.9.40 / 2019-05-10
* Open local I2CP socket for 3rd party apps
* Fix News URLs
* Numerous bug fixes (see trac)
0.9.39 / 2019-03-23
* Set App ID
0.9.38 / 2019-01-27
0.9.37 / 2018-10-10
0.9.36 / 2018-08-27
0.9.35 / 2018-07-03
0.9.34 / 2018-04-25
0.9.33 / 2018-02-18
* Translation updates
0.9.32 / 2017-11-28
* Fixed "Application Not Responding" error when restarting all tunnels
* Fixed crashes when:
* opening the console menu
* starting the router
* starting the router for the first time
* viewing tunnels
* viewing the addressbook
* opening the addressbook menu
* configuring addressbook subscriptions
* using a configuration wizard
* loading a B64 Destination from file
* viewing tunnel settings
* saving tunnel settings
* installing a tunnel's recommended app without a market app
* installing a browser without a market app
* rotating the screen while using the built-in browser
* Added a "sync" icon to more clearly indicate tunnel "starting" status
* Updated Firefox browser config instructions for Firefox Quantum
* Translation updates
0.9.31 / 2017-08-19
* Fixed various crashes in the Tunnels UI
* Updated Firefox browser config instructions
* Minor bug fixes
* Dependency and translation updates
0.9.30 / 2017-05-20
* Fixed crashes when creating or deleting tunnels, or adding names to the
private addressbook
* Minor bug fixes
* Dependency and translation updates
0.9.29 / 2017-03-27
* Dependency and translation updates
0.9.28 / 2017-01-02
* Bug fixes and translation updates
0.9.27 / 2016-11-20 / 64ff68efe98c345acb6ba1d0432fa49d1d650358
* Removed kytv's IRC server from default tunnel list
* Translation updates
0.9.26 / 2016-06-13 / b003272c8b504bb0d904edca2e95359a57c9a52c
* Fixed "I2CP already listening" bug
* Fixed crash when adding tunnel to empty list
* Translation updates
0.9.25 / 2016-04-17 / 46d45a878a2b73394b26ca27dbe6c696dedcf1c3
* Fixed a bug on Samsung Android 4.2 devices
* Dependency improvements
* Translation updates
0.9.22 / 2015-10-10 / 0f73ef90b81e2cf3d55f0ea2b0a16e1f10da40ad
* Updated browser config guide
* Bug fixes and translation updates
0.9.20 / 2015-06-18 / 5fdaabeb5fa955caac90f1390adbdeaeae42fdf1
* Simplified the main interface
* Language can be configured
* Tunnels can now be edited
* Material design improvements
* Better support for tablets
* Improved graph rendering
* Bug fixes and translation updates
0.9.19.1 / 2015-04-15 / ed86e7e85161dbe3f15932fd4d195c551f8e2c71
* Fixed crash when opening advanced settings
0.9.19 / 2015-04-13 / 3cfb748946a5876dc06d5f81d811b142a88846f7
* Made internal state handling more stable
* Added graceful shutdown support
* Updated libjbigi to use GMP 6.0.0
* New libjbigi binary for armeabi-v7a to speed up newer devices
* Improved logging
* Bug fixes and translation updates
0.9.18 / 2015-03-04 / c2f4831a1617f4ce716a08640446fdd992c751ff
* I2P can start automatically when phone boots (configure in Setting)
* Updated browser configuration guides for Orfox and Firefox
* Tunnels for postman's mail server added to defaults (for new installs)
* Settings options for configuring UDP and TCP ports
* Bug fixes and translation updates
0.9.17.1 / 2014-12-14 / cd8bb5e3ac4238efac12179c78c4fa517fcaabec
* Fixed crashes in addressbook and netDb status page
* Fixed crash when opening an IRC client tunnel
* Updated translations
0.9.17 / 2014-12-01 / bcf947f433876f643e0f6dff81aac88848b797d3
* Migrated to the new Material design from Android Lollipop
* Added a browser configuration guide
* Improved the help screen
* Upgraded the I2P router to 0.9.17
* Various bug fixes and translation updates
0.9.15.1 / 2014-10-16 / 9cc4e80134cf9becb3838ed3cc78e0bed1363165
* Fixed a configuration bug
0.9.15 / 2014-10-16 / 9b51f78b791c28a580d57f1a5019c94493de6231
* Upgraded the I2P router to 0.9.15
* Added a help screen with some basic information
* Logs can now be copied to the clipboard
* Various user interface improvements and fixes

11
DEVELOPMENT-README.md Normal file
View File

@ -0,0 +1,11 @@
# Development Readme
## How to build development builds of the router core for android?
Check the RELEASE-PROCESS.md file for general information about how to build and to bump the version.
In your i2p.i2p codebase checkout, execute `./installer/resources/maven-dev-release.sh` with your build number as first argument.
The script locates itself and uses the same codebase as it's in, to produce the maven builds which will be locally installed.
Next, add the build number to the gradle.properties and build the android build as usual.

91
DOCKER.md Normal file
View File

@ -0,0 +1,91 @@
Docker Build Instructions
=========================
It is possible to build a container with a pre-installed environment for
correctly compiling an I2P for Android development build. Unlike the i2p.i2p
container, zero attempt has been made to optimize the size of the container,
as it contains a copy of the latest Android SDK, toolchains, and Android NDK,
which it must download. To save time, this is cached locally. It is likely to
take up to 30 GB of disk space to compile in this way, however, it is very easy
and convenient compared to the steps in RELEASE-PROCESS.md and may make
building Android reproducibly easier in the future.
Container dependencies
----------------------
- `menny/android_ndk` (third-party image) (reviewed by idk) (depends on menny/android_sdk
- `menny/android_sdk` (third-party image) (reviewed by idk) (depends on ubuntu/18.04)
- `ubuntu/18.04` (official docker container) (base container)
Build the container locally
---------------------------
Run:
docker build -t i2p.android.base .
To build the container. It will have a lot to download the first time, so it may take
a while to complete.
Run an Android build in the container
-------------------------------------
Copy the `etc/docker.signing.example.proprties` file to `etc/docker.signing.proprties`,
edit it to match your key information and rebuild the container.
Run:
docker run -it \
-u $(id -u):$(id -g) \
--name i2p.android.base \
-v $HOME/.gnupg/:/.gnupg/:ro \
-v $HOME/.i2p-plugin-keys/:/.i2p-plugin-keys/:ro \
-v /run/user/$(id -u)/:/run/user/$(id -u)/:ro \
i2p.android.base
To get the build artifacts for uploading to Maven out of the container, use:
docker cp i2p.android.base:/opt/workspace/i2p.i2p/pkg-mavencentral app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-i2p.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-mstreaming.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-router.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-servlet-i2p.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-streaming.jar app/pkg-mavencentral
To get the Android build artifacts out of the container, use:
docker cp i2p.android.base:/opt/workspace/i2p.android.base/app/build/ app/build
And your android applications will appear in the `app/build` directory, in the same
place where non-container builds would go.
If you encounter a permissions error when rebuilding, delete the `app/build`,
`app/pkg-mavencentral` and `app/pkg-temp` path.
rm -rf app/pkg-temp app/build app/pkg-mavencentral
Copypasta
---------
Once you have set up builds for the first time, from then on you can update the container and
build a fresh set of Maven jars and a new I2P for Android app by copy-pasting the following
commands:
``` sh
rm -rf app/pkg-temp app/build app/pkg-mavencentral
docker build -t i2p.android.base .
docker run -it \
-u $(id -u):$(id -g) \
--name i2p.android.base \
-v $HOME/.gnupg/:/.gnupg/:ro \
-v $HOME/.i2p-plugin-keys/:/.i2p-plugin-keys/:ro \
-v /run/user/$(id -u)/:/run/user/$(id -u)/:ro \
i2p.android.base
docker cp i2p.android.base:/opt/workspace/i2p.i2p/pkg-mavencentral app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-i2p.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-mstreaming.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-router.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-servlet-i2p.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-streaming.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.android.base/app/build/ app/build
```

39
Dockerfile Normal file
View File

@ -0,0 +1,39 @@
FROM menny/android_ndk
ENV VERSION=0.9.50
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
RUN echo 'deb http://deb.i2p2.de/ sid main' >> /etc/apt/sources.list
RUN echo 'deb-src http://deb.i2p2.de/ sid main' >> /etc/apt/sources.list
RUN echo 'deb http://archive.ubuntu.com/ubuntu trusty universe' >> /etc/apt/sources.list
RUN wget -O /etc/apt/trusted.gpg.d/i2p-debian-repo.key.asc https://geti2p.net/_static/i2p-debian-repo.key.asc
COPY etc/debian-jessie-repo.key.asc /etc/apt/trusted.gpg.d
RUN mkdir -p /opt/packages && wget -O /opt/packages/openjdk-7-jre-headless.deb http://security.debian.org/debian-security/pool/updates/main/o/openjdk-7/openjdk-7-jre-headless_7u261-2.6.22-1~deb8u1_amd64.deb
RUN apt-get update
RUN apt-get build-dep -y i2p i2p-router
RUN apt-get install -y ant openjdk-8* libxml2-utils junit4 libhamcrest-java libmockito-java libmaven-ant-tasks-java dpkg-sig maven
RUN cd /opt/packages && dpkg-sig -l openjdk-7-jre-headless.deb && dpkg -x openjdk-7-jre-headless.deb /opt/packages/openjdk-7-jre
RUN git clone https://github.com/i2p/i2p.i2p --depth=1 -b i2p-$VERSION /opt/workspace/i2p.i2p
RUN update-java-alternatives --jre-headless --set java-1.8.0-openjdk-amd64
RUN update-java-alternatives --set java-1.8.0-openjdk-amd64
RUN update-alternatives --set javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
RUN update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
RUN rm /opt/java/openjdk/ -rfv
COPY . /opt/workspace/i2p.android.base
COPY etc/docker.local.ndk.properties /opt/workspace/i2p.android.base/client/local.properties
COPY etc/docker.local.router.properties /opt/workspace/i2p.android.base/routerjars/local.properties
COPY etc/docker.local.sdk.properties /opt/workspace/i2p.android.base/local.properties
COPY etc/docker.override.properties /opt/workspace/i2p.android.base/override.properties
COPY etc/docker.override.properties /opt/workspace/i2p.i2p/override.properties
COPY etc/docker.signing.properties /opt/workspace/i2p.android.base/signing.properties
WORKDIR /opt/workspace/i2p.android.base
RUN find /opt/android-sdk-linux -type d -print0 | xargs -0 chown -R 1000:1000
RUN find /opt/android-sdk-linux -type d -print0 | xargs -0 chmod -Rc o+rw
RUN find /opt/android-sdk-linux -type d -print0 | xargs -0 chmod -c 0755
RUN find /opt/workspace -type d -print0 | xargs -0 chown -R 1000:1000
RUN find /opt/workspace -type d -print0 | xargs -0 chmod -Rc o+rw
RUN find /opt/workspace -type d -print0 | xargs -0 chmod -c 0755
CMD cd /opt/workspace/i2p.i2p && \
ant -k mavenCentral; \
cp -v *.jar pkg-mavencentral/; \
cd /opt/workspace/i2p.android.base && \
./gradlew --continue dependencies || true ; \
./gradlew --continue assembleRelease; tail -f README.md

View File

@ -1,44 +0,0 @@
Headless I2P installation instructions
1) java -jar i2pinstall.exe -console (you've already done this)
This will run the installer in text mode, including running the postinstall.sh
script. After that, you may run 'sh i2prouter start'
which will start the router and attempt to launch a browser.
If you do not have an X server running, the browser launch will probably fail, and
you may use:
lynx http://localhost:7657/index.jsp
to configure the router.
If you're having trouble, swing by http://forum.i2p2.de/, check the
website at http://www.i2p2.de/, or get on irc://irc.freenode.net/#i2p
I2P will create and store files and configuration data in the user directory
~/.i2p/ on Linux and %APPDATA%\I2P\ on Windows. This directory is created
when I2P is run for the first time. It also creates files in the system
temporary directory specified by the Java Virtual Machine.
To change the location of these directories, or to configure I2P to
put all files in this directory (the so-called "portable" configuration),
edit the files i2prouter (Linux) and wrapper.config (Linux and Windows)
where there are comments labeled "PORTABLE". Do this before you
run I2P for the first time.
To run I2P explicitly:
(*nix): sh i2prouter start
(win*): I2P.exe
To stop the router (gracefully):
lynx http://localhost:7657/configservice.jsp ("Shutdown gracefully")
To stop the router (immediately):
sh i2prouter stop
To uninstall I2P:
rm -rf $i2pInstallDir
Supported JVMs:
Windows: Latest available from http://java.sun.com/ (1.5+ supported)
Linux: Latest available from http://java.sun.com/ (1.5+ supported)
FreeBSD: Sun 1.5-compatible (NIO required)
various: http://www.kaffe.org/ Sun 1.5-compatible (NIO required)

View File

@ -1,32 +0,0 @@
I2P source installation instructions
Prerequisites to build from source:
Java SDK (preferably Sun) 1.5.0 or higher (1.6 recommended)
Apache Ant 1.7.0 or higher
Optional, For multilanguage support: The xgettext, msgfmt, and msgmerge tools installed
from the GNU gettext package http://www.gnu.org/software/gettext/
To build and install I2P from source, you must first build
and package up the appropriate installer by running:
ant pkg
This will produce a few key files:
* install.jar: the GUI and console installer
* i2pinstall.exe: the GUI and console installer wrapped for cross-platform execution
* i2pupdate.zip: the update package
From there, you can run the headless (console mode) installer:
java -jar i2pinstall.exe -console
Or run the GUI installer:
java -jar i2pinstall.exe
Or move the update file into an existing installation directory and restart.
Supported JVMs:
Windows: Latest available from http://java.sun.com/ (1.5+ supported)
Linux: Latest available from http://java.sun.com/ (1.5+ supported)
FreeBSD: Sun 1.5-compatible (NIO required)
various: http://www.kaffe.org/ Sun 1.5-compatible (NIO required)

View File

@ -25,209 +25,52 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
===================================
LICENSES
--------
License for the Android App:
Core:
Public domain except as listed below:
Copyright 2011 The I2P Project
ElGamal and DSA code:
Copyright (c) 2003, TheCrypto
See licenses/LICENSE-ElGamalDSA.txt
Licensed under the Apache License, Version 2.0 (the "License");
you may not use these files except in compliance with the License.
You may obtain a copy of the License at
SHA256 and HMAC-SHA256:
Copyright (c) 2000 - 2004 The Legion Of The Bouncy Castle
See licenses/LICENSE-SHA256.txt
http://www.apache.org/licenses/LICENSE-2.0
AES code:
Under the Cryptix (MIT) license, written by the Cryptix team
(That's what our website says but all our AES code looks like it is public domain)
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Crypto filters:
From the xlattice app - http://xlattice.sourceforge.net/
See licenses/LICENSE-BSD.txt
See the file licenses/LICENSE-Apache2.0.txt
SNTP code:
Copyright (c) 2004, Adam Buckley
See licenses/LICENSE-SNTP.txt
===================================
PRNG:
Copyright (C) 2001, 2002, Free Software Foundation, Inc.
See licenses/LICENSE-LGPLv2.1.txt
License for the MagicIndicator library:
GMP 4.1.3:
Copyright 1991, 1996, 1999, 2000 Free Software Foundation, Inc.
See licenses/LICENSE-LGPLv2.1.txt
MIT License
HashCash code:
Copyright 2006 Gregory Rubin grrubin@gmail.com
See licenses/LICENSE-HashCash.txt
Copyright (c) 2016 hackware1993
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
===================================
Router:
Public domain except as listed below:
UPnP.java:
From freenet
See licenses/LICENSE-GPLv2.txt
UPnP subsystem 1.7:
Copyright (C) 2003-2006 Satoshi Konno
See licenses/LICENSE-UPnP.txt
GeoIP data free to use, courtesy http://ip-to-country.webhosting.info/
Installer:
Launch4j 3.0.1:
Copyright (c) 2004, 2008 Grzegorz Kowal
See licenses/LICENSE-Launch4j.txt (in binary packages)
See installer/lib/launch4j/LICENSE.txt (in source packages)
The following projects are used by Launch4j...
MinGW binutils (http://www.mingw.org/)
Commons BeanUtils (http://jakarta.apache.org/commons/beanutils/)
Commons Logging (http://jakarta.apache.org/commons/logging/)
See licenses/LICENSE-Apache1.1.txt
See licenses/NOTICE-Commons-Logging.txt
XStream (http://xstream.codehaus.org/)
Copyright (c) 2003-2004, Joe Walnes
See licenses/LICENSE-XStream.txt
JGoodies Forms (http://www.jgoodies.com/freeware/forms/)
Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All rights reserved.
See licenses/LICENSE-JGoodies-Forms.txt
JGoodies Looks (http://www.jgoodies.com/freeware/looks/)
Copyright (c) 2003 JGoodies Karsten Lentzsch. All rights reserved.
See licenses/LICENSE-JGoodies-Looks.txt
Foxtrot (http://foxtrot.sourceforge.net/)
Copyright (c) 2002, Simone Bordet & Marco Cravero. All rights reserved.
See licenses/LICENSE-Foxtrot.txt
Nuvola Icon Theme (http://www.icon-king.com)
See licenses/LICENSE-LGPLv2.1.txt
Forms were created using Abeille Forms Designer (https://abeille.dev.java.net/)
Izpack 4.3.0:
Copyright (c) 2001-2008 Julien Ponge
See licenses/LICENSE-Apache2.0.txt
Wrapper 3.1.1:
Copyright (c) 1999, 2004 Tanuki Software
See licenses/LICENSE-Wrapper.txt
Applications:
Addressbook:
Copyright (c) 2004 Ragnarok
See licenses/LICENSE-Addressbook.txt
BOB:
Copyright (C) sponge
DWTFYWTPL
I2PSnark:
Copyright (C) 2003 Mark J. Wielaard
See licenses/LICENSE-GPLv2.txt
I2PTunnel:
(c) 2003 - 2004 mihi
GPLv2 with exception.
See licenses/LICENSE-I2PTunnel.txt
See licenses/LICENSE-GPLv2.txt
I2PTunnel SOCKS Proxy:
Copyright (c) 2004 by human
GPLv2 with exception.
See licenses/LICENSE-I2PTunnel.txt
See licenses/LICENSE-GPLv2.txt
I2PTunnel UDP and Streamr:
By welterde.
See licenses/LICENSE-GPLv2.txt
Jetty 5.1.12:
Copyright 2000-2004 Mort Bay Consulting Pty. Ltd.
See licenses/LICENSE-Apache1.1.txt
See licenses/LICENSE-Apache2.0.txt
See licenses/NOTICE-Commons-Logging.txt
JRobin 1.4.0:
See licenses/LICENSE-LGPLv2.1.txt
Ministreaming Lib:
By mihi.
See licenses/LICENSE-BSD.txt
Proxyscript:
By Cervantes.
Public domain.
Router console:
Public domain.
Flag icons: public domain, courtesy mjames@gmail.com http://www.famfamfam.com/
GeoIP Data:
Copyright (c) 2003 Direct Information Pvt. Ltd. All Rights Reserved.
See licenses/LICENSE-GeoIP.txt
SAM:
Public domain.
Streaming Lib:
Public domain.
SusiDNS:
Copyright (C) 2005 <susi23@mail.i2p>
See licenses/LICENSE-GPLv2.txt
SusiMail:
Copyright (C) 2004-2005 <susi23@mail.i2p>
See licenses/LICENSE-GPLv2.txt
Systray:
Public domain.
Bundles systray4j code:
See licenses/LICENSE-GPLv2.txt
Other Applications and Libraries
--------------------------------
The following applications and libraries are not used or bundled in
binary packages, therefore the licenses are not included in binary
distributions. See the source package for the additional license information.
Admin Manager:
Public domain
Atalk:
Public domain
Desktopgui
Copyright (c) Mathias De Maré
See apps/desktopgui/LICENSE
SAM C Library:
Copyright (c) 2004, Matthew P. Cashdollar <mpc@innographx.com>
See apps/sam/c/doc/license.txt
SAM C# Library:
Public domain.
See apps/sam/csharp/README
SAM Perl Library:
See licenses/LICENSE-GPLv2.txt
SAM Python Library:
Public domain.

View File

@ -1,132 +0,0 @@
# Makefile for building native I2P binaries and libraries with GCJ
#
# WARNING: Do not use this yet, as it may explode (etc).
#
GCJ=gcj #/usr/local/gcc-4.0.2/bin/gcj
EXTRA_LD_PATH= #/usr/local/gcc-4.0.2/lib
ANT=ant #/opt/apache-ant-1.6.5/bin/ant
ANT_TARGET=build2
NATIVE_DIR=native
##
# Define what jar files get into libi2p.so. The current setup is
# *incredibly* lazy, throwing everything in the .so, rather than
# give each .jar file its own .so.
# i2p.jar: base SDK
# mstreaming.jar: streaming API
# streaming.jar: full streaming lib implementation
# i2ptunnel.jar: I2PTunnel proxy
# sam.jar: SAM bridge and API
# i2psnark.jar: bittorrent client
# router.jar: full I2P router
# jbigi.jar: collection of native optimized GMP routines for crypto
JAR_BASE=i2p.jar mstreaming.jar streaming.jar
JAR_CLIENTS=i2ptunnel.jar sam.jar
JAR_ROUTER=router.jar
JAR_JBIGI=jbigi.jar
JAR_CONSOLE=\
javax.servlet.jar \
commons-el.jar \
commons-logging.jar \
jasper-runtime.jar \
jasper-compiler.jar \
org.mortbay.jetty.jar \
routerconsole.jar
LIBI2P_JARS=${JAR_BASE} ${JAR_CLIENTS} ${JAR_ROUTER} ${JAR_JBIGI}
LIBSAM_JARS=${JAR_BASE} sam.jar
LIBROUTER_JARS=i2p.jar ${JAR_ROUTER} ${JAR_JBIGI}
LIBCONSOLE_JARS=${LIBROUTER_JARS} ${JAR_CONSOLE}
LIBSNARK_JARS=${LIBROUTER_JARS} i2psnark.jar
# update:
# similar error with gcj 4.3.3.
#
# unfortunately, its not quite ready for most end users, as the
# ${JAR_CONSOLE} fails to compile with:
# org/apache/commons/logging/impl/LogKitLogger.java: In class 'org.apache.commons.logging.impl.LogKitLogger':
# .../LogKitLogger.java: In constructor '(java.lang.String)':
# .../LogKitLogger.java:91: error: cannot find file for class org.apache.log.Hierarchy
# .../LogKitLogger.java:91: error: cannot find file for class org.apache.log.Hierarchy
# .../LogKitLogger.java:104: error: cannot find file for class org.apache.log.Hierarchy
# .../LogKitLogger.java:104: confused by earlier errors, bailing out
#${JAR_CONSOLE}\
#${JAR_XML} \
#${JAR_SUCKER}
#${JAR_CONSOLE}
SYSTEM_PROPS=-DloggerFilenameOverride=logs/log-router-@.txt \
-Dorg.mortbay.http.Version.paranoid=true \
-Dorg.mortbay.util.FileResource.checkAliases=false \
-Dorg.mortbay.xml.XmlParser.NotValidating=true
#SYSTEM_PROPS=-Di2p.weakPRNG=true
OPTIMIZE=-O2
#OPTIMIZE=-O3
LD_LIBRARY_PATH=${EXTRA_LD_PATH}:.
all: jars native
@echo "* Build complete"
jars:
@${ANT} ${ANT_TARGET}
clean: native_clean
native: native_clean native_shared
@echo "* Native code build in ${NATIVE}"
native_clean:
@rm -rf ${NATIVE_DIR}
@mkdir ${NATIVE_DIR}
native_shared: libi2p.so
@cd build ; ${GCJ} ${OPTIMIZE} -fjni -L../${NATIVE_DIR} -li2p ${SYSTEM_PROPS} -o ../${NATIVE_DIR}/i2p_dsa --main=net.i2p.crypto.DSAEngine
@echo "* i2p_dsa is a simple test app with the DSA engine and Fortuna PRNG to make sure crypto is working"
@cd build ; ${GCJ} ${OPTIMIZE} -fjni -L../${NATIVE_DIR} -li2p ${SYSTEM_PROPS} -o ../${NATIVE_DIR}/prng --main=gnu.crypto.prng.FortunaStandalone
@cd build ; ${GCJ} ${OPTIMIZE} -fjni -L../${NATIVE_DIR} -li2p ${SYSTEM_PROPS} -o ../${NATIVE_DIR}/i2ptunnel --main=net.i2p.i2ptunnel.I2PTunnel
@echo "* i2ptunnel is mihi's I2PTunnel CLI"
@echo " run it as ./i2ptunnel -cli to avoid awt complaints"
@cd build ; ${GCJ} ${OPTIMIZE} -fjni -L../${NATIVE_DIR} -li2p ${SYSTEM_PROPS} -o ../${NATIVE_DIR}/i2ptunnelctl --main=net.i2p.i2ptunnel.TunnelControllerGroup
@echo "* i2ptunnelctl is a controller for I2PTunnel, reading i2ptunnel.config"
@echo " and launching the appropriate proxies"
#@cd build ; ${GCJ} ${OPTIMIZE} -fjni -L../${NATIVE_DIR} -li2p ${SYSTEM_PROPS} -o ../${NATIVE_DIR}/i2psnark --main=org.klomp.snark.Snark
#@echo "* i2psnark is an anonymous bittorrent client"
@cd build ; ${GCJ} ${OPTIMIZE} -fjni -L../${NATIVE_DIR} -li2p ${SYSTEM_PROPS} -o ../${NATIVE_DIR}/i2prouter --main=net.i2p.router.Router
@echo "* i2prouter is the main I2P router"
@echo " it can be used, and while the router console won't load,"
@echo " i2ptunnel will, so it will start all the proxies defined in i2ptunnel.config"
libi2p.so:
@echo "* Building $@"
@(cd build ; time ${GCJ} ${OPTIMIZE} -fPIC -fjni -shared -o ../${NATIVE_DIR}/$@ ${LIBI2P_JARS} ; cd .. )
@ls -l ${NATIVE_DIR}/$@
@echo "* $@ built"
sam: jars libi2psam.so
libi2psam.so:
@echo "* Building $@"
@rm -f ${NATIVE_DIR}/$@
@(cd build ; time ${GCJ} ${OPTIMIZE} -fPIC -fjni -shared -o ../${NATIVE_DIR}/$@ ${LIBSAM_JARS} ; cd .. )
@ls -l ${NATIVE_DIR}/$@
@echo "* $@ built"
router: jars libi2prouter.so
libi2prouter.so:
@echo "* Building $@"
@rm -f ${NATIVE_DIR}/$@
@(cd build ; time ${GCJ} ${OPTIMIZE} -fPIC -fjni -shared -o ../${NATIVE_DIR}/$@ ${LIBROUTER_JARS} ; cd .. )
@ls -l ${NATIVE_DIR}/$@
@echo "* $@ built"
console: jars libi2pconsole.so
# doesn't work, see above
libi2pconsole.so:
@echo "* Building $@"
@rm -f ${NATIVE_DIR}/$@
@(cd build ; time ${GCJ} ${OPTIMIZE} -fPIC -fjni -shared -o ../${NATIVE_DIR}/$@ ${LIBCONSOLE_JARS} ; cd .. )
@ls -l ${NATIVE_DIR}/$@
@echo "* $@ built"

165
README.md Normal file
View File

@ -0,0 +1,165 @@
# I2P Android
## Build process
### Dependencies:
- Java SDK (preferably Oracle/Sun or OpenJDK) 1.6.0 or higher
- Apache Ant 1.8.0 or higher
- I2P source
- Android SDK for API 28 or higher
- Android Build Tools 28.0.0 or higher
- Android Support Repository
- Gradle 2.2.1
### Gradle
The build system is based on Gradle. There are several methods for setting Gradle up:
* It can be downloaded from [the Gradle website](http://www.gradle.org/downloads).
* Most distributions will have Gradle packages. Be careful to check the
provided version; Debian and Ubuntu have old versions in their main
repositories. There is a [PPA](https://launchpad.net/~cwchien/+archive/gradle)
for Ubuntu with the latest version of Gradle.
* A Gradle wrapper is provided in the codebase. It takes all the same commands
as the regular `gradle` command. The first time that any command is run, it
will automatically download, cache and use the correct version of Gradle.
This is the simplest way to get started with the codebase. To use it, replace
`gradle` with `./gradlew` (or `./gradlew.bat` on Windows) in the commands
below.
Gradle will pull dependencies over the clearnet by default. To send all Gradle
connections from your user over Tor, create a `gradle.properties` file in
`~/.gradle/` containing:
```
systemProp.socksProxyHost=localhost
systemProp.socksProxyPort=9150
```
### Preparation
1. Download the Android SDK. The simplest method is to download [Android Studio](https://developer.android.com/sdk/installing/studio.html).
* If you are using an existing Android SDK, install the Android Support
Repository via the SDK Manager.
2. Check out the [`i2p.i2p`](https://github.com/i2p/i2p.i2p) repository.
3. Create a `local.properties` file in `i2p.android.base/lib/client` containing:
```
ndk.dir=/path/to/ndk
```
3. Create a `local.properties` file in `i2p.android.base/routerjars` containing:
```
i2psrc=/path/to/i2p.i2p
```
### Building from the command line
1. Create a `local.properties` file in `i2p.android.base` containing:
```
sdk.dir=/path/to/android-studio/sdk
```
1a. For building with a local router development build:
cd ../i2p.i2p
installer/resources/maven-dev-release.sh x // x is the build number, e.g. 6
cd back here
edit gradle.properties, add the build number x to I2P_PROPERTIES=0.9.xx-x
2. `gradle assembleDebug`
3. The APK files will be placed in `i2p.android.base/app/build/outputs/apk` subdirectories.
4. Install debug build on phone in USB debugging mode
adb install app/build/outputs/apk/free/debug/app-free-debug.apk
### Building with Android Studio
1. Import `i2p.android.base` into Android Studio. (This creates the `local.properties` file automatically).
2. Build and run the app (`Shift+F10`).
### Signing release builds
1. Create a `signing.properties` file in `i2p.android.base` containing:
```
STORE_FILE=/path/to/android.keystore
STORE_PASSWORD=store.password
KEY_ALIAS=key.alias
KEY_PASSWORD=key.password
```
2. `gradle assembleRelease`
## Client library
### "Uploading" to the local Maven repository (to use a local build of the library in a project)
1. `gradle :client:installArchives`
2. Add the local Maven repository to your project. For Gradle projects, add the following above any existing repositories (so it is checked first):
```
repositories {
mavenLocal()
}
```
### Uploading to Maven Central via Sonatype OSSRH
1. Add the following lines to your `~/.gradle/gradle.properties` (filling in the blanks):
```
signing.keyId=
signing.password=
signing.secretKeyRingFile=/path/to/secring.gpg
NEXUS_USERNAME=
NEXUS_PASSWORD=
```
2. `gradle :client:uploadArchives`
### Commands from the old build instructions that might be useful
```
# Create the android 4.4 (API 19) virtual device
# (don't make a custom hardware profile)
../android-sdk-linux/tools/android create avd --name i2p --target android-19
# then run the emulator:
# This may take a LONG time the first time (half an hour or more)...
# Run the debugger to ensure it is making progress
# -no-boot-anim for faster boot
# -dns-server 8.8.8.8 if the router can't reseed
# ../android-sdk-linux/tools/emulator -avd i2p -no-boot-anim -dns-server 8.8.8.8 &
../android-sdk-linux/tools/emulator -avd i2p &
# or to talk to a real device in debug mode:
# You have to do this if you get a permission error -
# Stop ddms, unplug the device, do the following,
# then plug in the device, then start ddms
adb kill-server
sudo adb start-server
adb devices
# Anyway, with I2P installed, click on the I2P icon on your device and enjoy!
#other helpful commands
../android-sdk-linux/platform-tools/adb shell
../android-sdk-linux/platform-tools/adb pull /some/file/on/emulator some-local-dir/
# copy the Dev Tools app from the emulator to your device
adb -e pull /system/app/Development.apk ./Development.apk
adb -d install Development.apk
# reinstall an existing apk onto the emulator
adb -e install -r bin/I2PAndroid-debug.apk
```

View File

@ -1,31 +0,0 @@
Prerequisites to build from source:
Java SDK (preferably Sun) 1.5.0 or higher (1.6 recommended)
Apache Ant 1.7.0 or higher
Optional, For multilanguage support: The xgettext, msgfmt, and msgmerge tools installed
from the GNU gettext package http://www.gnu.org/software/gettext/
To build:
ant pkg
Run 'ant' with no arguments to see other build options.
See INSTALL.txt or http://www.i2p2.de/download.html for installation instructions.
Documentation:
http://www.i2p2.de/
API: run 'ant javadoc' then start at build/javadoc/index.html
Latest release:
http://www.i2p2.de/download.html
To get development branch from source control:
http://www.i2p2.de/newdevelopers.html
FAQ:
http://www.i2p2.de/faq.html
Need help?
IRC irc.freenode.net #i2p
http://forum.i2p2.de/
Licenses:
See LICENSE.txt

128
RELEASE-PROCESS.md Normal file
View File

@ -0,0 +1,128 @@
# Release Process
Note to all future maintainers: We have 4 channels that need to be updated in order to have a successful
Android release. Many of these channels are updated at different rates, and at times you must wait on a
third-party service to complete it's tasks before you may continue. When completing an Android release,
keep in mind that you must update 1) Maven 2) Google Play 3) f-droid.i2p.io and 4) F-Droid main
repository.
At the time of this revision, 2020/09/13, the main Android maintainer is idk. idk updates Maven, Google
Play, and f-droid.i2p.io, and nextl00p handles working with the F-Droid project to provide an I2P release
in their main repository.
NOTE: The docker container built by the Dockerfile in this repostory ensures that the Pre-requisites and
Dependencies are properly met by obtaining them from the Debian package in `oldoldstable` and pre-configuring
the override.properties that is used in the Docker container.
## Tag Freezes and Translations
1-2 weeks before the software is released, I2P Desktop will have a "Tag Freeze" which is the deadline for
translations to be checked in. **When** that time comes, someone who has Transifex privileges should use
the command: `tx push -s -R I2P.android` to push any and all changed string resources to transifex for
translation.
**>> Beginning of Docker-enabled Steps <<**
## Prerequirements
0. Update the changelog!
1. Ensure you have the deprecated maven ant tasks. ( https://maven.apache.org/ant-tasks/download.cgi )
2. It should exist at `~/.ant/lib/maven-ant-tasks-2.1.3.jar`
3. Ensure you have hamcrest-integration, hamcrest-library, hamcrest-core in the hamcrest.home directory.
4. Ensure junit 4.12 at least in junit.home, ensure the jar file is named `junit4.jar`.
5. Ensure you have the Mockito framework and accompanying documentation in your $JAVA_HOME
6. Ensure to have updated the changelog with the changes done.
7. Ensure that you are configured to build i2p.i2p with Java 8. On Debian it is easiest to set with
`update-java-alternatives --set java-1.8.0-openjdk-amd64` and picking Java 8. **TODO:** add instructions for non-Debian-based
systems.
8. Ensure that you have a Java 1.7 bootclasspath available. (See **Maven Central** step 2A.)
## Get all the dependencies ready
### Maven Central
1. Check out a clean copy of i2p.i2p at the correct release version. (Make a clean checkout)
2. Build the maven packages via `ant mavenCentral` where you end up with mavencentral-*.jar files in the
current directory.
2. **A)** I2P for Android requires a Java 1.7 bootclasspath, but the servlet jar requires Java 8. So, to do the builds:
- First set `javac.compilerargs=-bootclasspath /path/to/java/7/rt.jar:/path/to/java/7/jce.jar` in override.properties
- Build with `ant mavenCentral`
**>> End of Docker-enabled Steps for Maven <<**
3. Login to http://oss.sonatype.org for uploading the mavencentral-*.jar bundles.
4. In nexus, choose "Staging Upload" and upload all of the files with upload mode set to "Artifacts with POM".
When uploading the files to nexus, you *must* upload the pom.xml files, and all of their artifacts. For each
component, you will need to upload a *.jar, a *.jar.asc, a *sources.jar, a *sources.jar.asc, a javadoc.jar,
and a javadoc.jar.asc, and a pom.xml and a pom.xml.asc from the pkg-mavencentral directory during the "Upload
Artifacts with POM" operation. You will need to do this once for each component you upload to Nexus.
5. Under "Staging Repositories" ensure all where uploaded correctly, select them all and press "Release"
in the toolbar.
#### Example override.properties:
javac.version=1.7
javac.target=1.7
javac.source=1.8
javac.compilerargs=-bootclasspath /home/user/StudioProjects/java7bootclasspath/rt.jar:/home/user/StudioProjects/java7bootclasspath/jce.jar
javac.compilerargs7=-bootclasspath /home/user/StudioProjects/java7bootclasspath/rt.jar:/home/user/StudioProjects/java7bootclasspath/jce.jar
build.built-by=name
### Android Common Build
Using Docker: in order to use Docker to generate a new Android apk for release, you will
need to run the build twice, once for the mavenCentral jars, and once for the actual Android
app. After doing the Maven release, follow these steps in the i2p.android.base repository, and re-run
the `docker run` step described in `DOCKER.md`
1. Edit `routerjars/local.properties` to use the clean i2p.i2p copy.
2. Pull the latest translations with `tx pull --use-git-timestamps` and commit them. (If you don't have the `tx` command,
do `pip install transifex-client` ). If there are broken translations, exclude them and only them.
- If there are any new translations, `mtn add` them, and add them to `app/src/main/res/values/arrays.xml`
(two places, alphabetical order please)
3. Ensure that `signing.properties` contains the details of the release key. If you are using Docker, see
`DOCKER.md` to perform this step for Docker builds by editing `etc/docker.signing.properties` instead.
4. Edit `gradle.properties` to bump the I2P version.
5. Edit `app/build.gradle` to bump the Android version number.
6. Edit `CHANGELOG` to add the release and date.
7. If the helper has changed since the last release, edit
`lib/helper/gradle.properties` to bump the version.
8. `./gradlew clean assembleRelease`
### Libraries
1. `./gradlew :lib:client:uploadArchives`
2. If the helper version was changed and should be released: `./gradlew :lib:helper:uploadArchives`
3. Check on Sonatype that everything worked, and close/release.
## Release Packages
### F-Droid Guide
This guide is for f-droid.i2p.io, not for F-Droid's main repository. The repository keystore **and** the
config.py used to generate the repository are required to complete this process successfully.
1. Ensure you have the release keys, the keyfile must be placed at `~/.local/share/fdroidserver/keystore.jks`
2. If it's the first time, or you have reinstalled anything, ensure `path/to/fdroid/config.py` has correct
information.
3. Assuming you already have ran `./gradlew clean assembleRelease` from a earlier step, continue.
4. `cp app/build/outputs/apk/free/release/app-free-release.apk path/to/fdroid/repo/I2P-VERSION.apk`
5. Update `path/to/fdroid/metadata/net.i2p.android.txt` (The versions at the bottom of the file)
6. Run `fdroid update` from inside the fdroid path (install fdroid command via `pip install fdroidserver`)
7. Zip/tar the local fdroid repo and archive. `rm fdroid.tgz && tar czf fdroid.tgz archive/ repo/` from the
fdroid directory.
8. Push to download server and put in place. (via SSH for example, `scp fdroid.tgz download.i2p2.de:~/`)
9. On the server run `bin-fd/update-fdroid` and `sudo bin-fd/update-app i2p 0.9.40` (This ensures we use the
exact same apk file for the download page as in fdroid and gplay)
10. Check F-Droid repo works, and app works.
### Google Play and finishing up
1. Verify which files that are changed via `mtn ls cha`. It shouldn't be much more than those bellow this
line and possible translations (`mtn ls unk`).
2. Commit your release changes, `mtn ci gradle.properties lib/helper/gradle.properties app/build.gradle`
3. Push free and donate builds to Google Play via https://play.google.com/apps/publish/
4. Tag the new release. Example `mtn tag h: android-0.9.36`
5. Push the monotone changes. Make sure that they are there at the next git sync.
6. Update download page (version and hash, including F-Droid)

View File

@ -1,30 +0,0 @@
ou will need atleast monotone > = 0.41 to get the most recent build source
and connect it to an already running i2p router.
OR:
You may download the actual "stable" source from
http://code.google.com/p/i2p/downloads/list
You will need to follwing tools to build the i2p and i2p-base packages:
bash >= 3.1.017
requiredbuilder >= 0.16.3 ( http://www.stabellini.net/requiredbuilder.html )
jre >= 6u11
jdk >= 6u11
apache-ant >= 1.7.1
perl >= 5.10.0
python >= 2.5.2
Reccomended:
monotone >= 0.41 ( http://pkgs.dr.ea.ms )
See also:
i2p/readme.txt
AND
i2p-base/readme.txt
for information and handy tips.

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project basedir="." default="slackpkg">
<target name="slackpkg">
<echo message="Building Slackware package." />
<exec executable="./i2p-base.SlackBuild">
</exec>
</target>
</project>

View File

@ -1,157 +0,0 @@
#!/bin/sh
#
#
# Now in the future we only need to look for '#I2P' and '#/I2P'
# for modifications to rc.local and rc.local_shutdown.
# I was a moron for not doing it this way in the first place :-) -- Sponge
#
#
touch /etc/rc.d/rc.local
touch /etc/rc.d/rc.local_shutdown
echo
echo -n "Check 1: /etc/rc.d/rc.local "
I2PRCA=`grep -c /etc/rc.d/rc.local -e '/etc/rc.d/rc.i2p'`
if [ $I2PRCA -eq 0 ] ; then
echo '#I2P' >> /etc/rc.d/rc.local
echo '( cd /tmp ; rm -Rf i2p-*.tmp )' >> /etc/rc.d/rc.local
echo "if [ -x /etc/rc.d/rc.i2p ] ; then" >> /etc/rc.d/rc.local
echo " sh /etc/rc.d/rc.i2p start" >> /etc/rc.d/rc.local
echo "fi" >> /etc/rc.d/rc.local
echo '#/I2P' >> /etc/rc.d/rc.local
echo "modified."
else
echo -n "looks OK so far,"
# Fix old installs, or where people have modified.
echo -n " Check 1A: "
I2PRCC=`grep -c /etc/rc.d/rc.local -e 'i2p-\*\.tmp'`
if [ $I2PRCC -eq 0 ] ; then
DATA=$(cat /etc/rc.d/rc.local | sed -re 's/if \[ -x \/etc\/rc\.d\/rc\.i2p \] ; then/#I2P\n\( cd \/tmp ; rm -Rf i2p-*.tmp \)\nif \[ -x \/etc\/rc.d\/rc.i2p \] ; then/')
echo "${DATA}" > /etc/rc.d/rc.local
echo -n "additional modifications applied,"
else
echo -n "looks OK so far,"
fi
echo -n " Check 1B: "
I2PRCE=`grep -c /etc/rc.d/rc.local -e 'i2p-\*\.tmp'`
if [ $I2PRCE -eq 0 ] ; then
DATATOP=$(cat /etc/rc.d/rc.local | sed -n '0,/i2p-\*\.tmp/p' | sed '$d' )
DATABOT=$(cat /etc/rc.d/rc.local | sed -n '/i2p-\*\.tmp/,$p' | sed -n '/^fi/,$p' | sed "1d")
echo "${DATATOP}" > /etc/rc.d/rc.local
echo '#I2P' >> /etc/rc.d/rc.local
echo '( cd /tmp ; rm -Rf i2p-*.tmp )' >> /etc/rc.d/rc.local
echo "if [ -x /etc/rc.d/rc.i2p ] ; then" >> /etc/rc.d/rc.local
echo " sh /etc/rc.d/rc.i2p start" >> /etc/rc.d/rc.local
echo "fi" >> /etc/rc.d/rc.local
echo '#/I2P' >> /etc/rc.d/rc.local
echo "${DATABOT}" >> /etc/rc.d/rc.local
echo -n "additional modifications applied,"
else
echo -n "looks ok so far,"
fi
echo -n " Check 1C: "
I2PRCF=`grep -c /etc/rc.d/rc.local -e '#/I2P'`
if [ $I2PRCF -eq 0 ] ; then
DATATOP=$(cat /etc/rc.d/rc.local | sed -n '0,/^#I2P/p' | sed '$d' )
DATABOT=$(cat /etc/rc.d/rc.local | sed -n '/^#I2P/,$p' | sed -n '/^fi/,$p' | sed "1d")
echo "${DATATOP}" > /etc/rc.d/rc.local
echo '#I2P' >> /etc/rc.d/rc.local
echo '( cd /tmp ; rm -Rf i2p-*.tmp )' >> /etc/rc.d/rc.local
echo "if [ -x /etc/rc.d/rc.i2p ] ; then" >> /etc/rc.d/rc.local
echo " sh /etc/rc.d/rc.i2p start" >> /etc/rc.d/rc.local
echo "fi" >> /etc/rc.d/rc.local
echo '#/I2P' >> /etc/rc.d/rc.local
echo "${DATABOT}" >> /etc/rc.d/rc.local
echo -n "additional modifications applied,"
else
echo -n "looks ok so far,"
fi
echo " Done."
fi
echo -n "Check 2: /etc/rc.d/rc.local_shutdown "
I2PRCB=`grep -c /etc/rc.d/rc.local_shutdown -e '/etc/rc.d/rc.i2p'`
if [ $I2PRCB -eq 0 ] ; then
echo "#I2P" >> /etc/rc.d/rc.local_shutdown
echo "if [ -x /etc/rc.d/rc.i2p ] ; then" >> /etc/rc.d/rc.local_shutdown
echo " sh /etc/rc.d/rc.i2p stop" >> /etc/rc.d/rc.local_shutdown
echo "fi" >> /etc/rc.d/rc.local_shutdown
echo "#/I2P" >> /etc/rc.d/rc.local_shutdown
echo "modified."
else
echo -n "looks OK so far,"
# Fix old installs
echo -n " Check 1A: "
I2PRCG=`grep -c /etc/rc.d/rc.local_shutdown -e '#I2P'`
if [ $I2PRCG -eq 0 ] ; then
DATATOP=$(cat /etc/rc.d/rc.local_shutdown | sed -n '0,/^if \[ -x \/etc\/rc\.d\/rc\.i2p \] ; then/p' | sed '$d' )
DATABOT=$(cat /etc/rc.d/rc.local_shutdown | sed -n '/^if \[ -x \/etc\/rc\.d\/rc\.i2p \] ; then/,$p' | sed -n '/^fi/,$p' | sed "1d")
echo "${DATATOP}" > /etc/rc.d/rc.local_shutdown
echo '#I2P' >> /etc/rc.d/rc.local_shutdown
echo "if [ -x /etc/rc.d/rc.i2p ] ; then" >> /etc/rc.d/rc.local_shutdown
echo " sh /etc/rc.d/rc.i2p stop" >> /etc/rc.d/rc.local_shutdown
echo "fi" >> /etc/rc.d/rc.local_shutdown
echo "#/I2P" >> /etc/rc.d/rc.local_shutdown
echo "${DATABOT}" >> /etc/rc.d/rc.local_shutdown
echo -n "additional modifications applied,"
else
echo -n "looks OK so far,"
fi
echo -n " Check 1B: "
I2PRCH=`grep -c /etc/rc.d/rc.local_shutdown -e '#/I2P'`
if [ $I2PRCH -eq 0 ] ; then
DATATOP=$(cat /etc/rc.d/rc.local_shutdown | sed -n '0,/^#I2P/p' | sed '$d' )
DATABOT=$(cat /etc/rc.d/rc.local_shutdown | sed -n '/^#I2P/,$p' | sed -n '/^fi/,$p' | sed "1d")
echo "${DATATOP}" > /etc/rc.d/rc.local_shutdown
echo '#I2P' >> /etc/rc.d/rc.local_shutdown
echo "if [ -x /etc/rc.d/rc.i2p ] ; then" >> /etc/rc.d/rc.local_shutdown
echo " sh /etc/rc.d/rc.i2p stop" >> /etc/rc.d/rc.local_shutdown
echo "fi" >> /etc/rc.d/rc.local_shutdown
echo "#/I2P" >> /etc/rc.d/rc.local_shutdown
echo "${DATABOT}" >> /etc/rc.d/rc.local_shutdown
echo -n "additional modifications applied,"
else
echo -n "looks OK so far,"
fi
echo " Done."
fi
if [ -f /etc/rc.d/rc.i2p ] ; then
if [ -x /etc/rc.d/rc.i2p ] ; then
chmod +x /etc/rc.d/rc.i2p.new
fi
# Hopefully get admin's attention.
echo -ne "\007" ; sleep 0.3
echo -ne "\007" ; sleep 0.3
echo -ne "\007" ; sleep 0.3
echo -ne "\007" ; sleep 0.3
echo -ne "\007" ; sleep 0.3
echo -ne "\007" ; sleep 0.3
echo -e "\007" ; sleep 0.3
echo "It apears that you already have /etc/rc.d/rc.i2p"
echo "You should replace it with /etc/rc.d/rc.i2p.new as soon as possible"
echo -ne "\007" ; sleep 0.3
echo -ne "\007" ; sleep 0.3
echo -ne "\007" ; sleep 0.3
echo -ne "\007" ; sleep 0.3
echo -ne "\007" ; sleep 0.3
echo -ne "\007" ; sleep 0.3
echo -e "\007" ; sleep 0.3
else
mv /etc/rc.d/rc.i2p.new /etc/rc.d/rc.i2p
echo
echo "Installation finished. The i2p start/stop script has been"
echo "installed in /etc/rc.d . You should chmod +x"
echo '/etc/rc.d/rc.i2p to start it on boot.'
echo
fi
exit

View File

@ -1,57 +0,0 @@
#!/bin/sh
#
# Heavily based on the Slackware 12.2 SlackBuild
# Slackware build script for I2P
#
# PLEASE READ THIS:
# How to start I2P:
# After installpkg command, doinst.sh will execute a post-installation script
# needed by I2P. After that you have to chmod +x /etc/rc.d/rc.i2p and start
# I2P service with /etc/rc.d/rc.i2p start.
#
# Now tell your browser to user this proxy: localhost on port 4444 and open
# this page: http://localhost:7657/index.jsp
#
# Here you can configure I2P, watch network status and navigate anonimously.
# It's suggested to subscribe to various dns host, like i2host.i2p
# For any additional information, visit i2host.i2p and forum.i2p
#
CWD=$(pwd)
TMP=/tmp
PKG=/$TMP/package-base-i2p
NAME=i2p-base
VERSION=0.0.2
BUILD=1sponge
ARCH=noarch
INSTALL_DIR=opt
# Less than slackware 13?
SLKPLT=$(cat /etc/slackware-version | sed -re "s/(Slackware )([0-9]*)(.*)/\2/")
if [ $SLKPLT -lt 13 ] ; then
EXT=tgz
else
EXT=txz
fi
rm -rf $PKG
mkdir -p $PKG
cd $PKG
chown -R root:root .
mkdir -p $PKG/etc/rc.d
mkdir -p $PKG/install
sed "s|directory|/$INSTALL_DIR/i2p/i2prouter|g" "$CWD/rc.i2p_def" > $PKG/etc/rc.d/rc.i2p.new
chmod 644 $PKG/etc/rc.d/rc.i2p.new
cat "$CWD/doinst.sh" > $PKG/install/doinst.sh
cat "$CWD/slack-desc" > $PKG/install/slack-desc
cd $PKG
#
# Not really that important to exec this
# as there aren't any deps we don't know.
#
# requiredbuilder -v -y -s $CWD $PKG
#
cat "$CWD/slack-required" > $PKG/install/slack-required
makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.$EXT

View File

@ -1,51 +0,0 @@
#!/bin/sh
# Start/stop i2p service.
i2p_start() {
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory start )"
}
i2p_stop() {
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory stop )"
}
i2p_restart() {
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory restart)"
}
i2p_status() {
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory status )"
}
i2p_console() {
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory console )"
}
i2p_dump() {
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory dump )"
}
case "$1" in
'start')
i2p_start
;;
'stop')
i2p_stop
;;
'restart')
i2p_restart
;;
'status')
i2p_status
;;
'console')
i2p_console
;;
'dump')
i2p_dump
;;
*)
echo "usage $0 start|stop|restart|status|console|dump"
;;
esac

View File

@ -1,10 +0,0 @@
An rc file called rc.i2p has been placed into the /etc/rc.d directory.
If you want to change installation dir, change the variable INSTALL_DIR
on base-i2p.SlackBuild and rebuild the package. You also will need to do the
same for the i2p package.
The install script will insert everything needed into /etc/rc.d/rc.local and
into /etc/rc.d/rc.local_shutdown automatically.
If you want to start I2P at boot you have to chmod +x /etc/rc.d/rc.i2p

View File

@ -1,19 +0,0 @@
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description. Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in. You must make
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
base-i2p: base-i2p (I2P anonymizing network base config files)
base-i2p:
base-i2p: I2P is an anonymizing network, offering a simple layer that
base-i2p: identity-sensitive applications can use to securely communicate. All
base-i2p: data is wrapped with several layers of encryption, and the network is
base-i2p: both distributed and dynamic, with no trusted parties.
base-i2p: Many applications are available that interface with I2P, including
base-i2p: mail, peer-peer file sharing, IRC chat, and others.
base-i2p:
base-i2p: This package provides the startup files.
base-i2p:

View File

@ -1 +0,0 @@
bash >= 3.1.017

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project basedir="." default="slackpkg">
<target name="slackpkg">
<echo message="Building Slackware package." />
<exec executable="./i2p.SlackBuild">
</exec>
</target>
</project>

View File

@ -1,72 +0,0 @@
#!/bin/sh
INST_DIR=directory
( cd install
echo
for i in *.config ; {
if [ -f $INST_DIR/$i ] ; then
echo "Please check ${INST_DIR}${i}, as there is a new version."
cp $i $INST_DIR/$i.new
else
cp $i $INST_DIR/$i
fi
}
)
( cd $INST_DIR
if [ -f blocklist.txt ] ; then
echo "Please check ${INST_DIR}blocklist.txt, as there is a new version."
else
mv blocklist.txt.new blocklist.txt
fi
)
( cd $INST_DIR/eepsite
if [ -f jetty.xml ] ; then
rm jetty.xml.new
else
mv jetty.xml.new jetty.xml
fi
)
( cd $INST_DIR/eepsite/docroot
if [ -f index.html ] ; then
rm index.html.new
else
mv index.html.new index.html
fi
if [ -f favicon.ico ] ; then
rm favicon.ico.new
else
mv favicon.ico.new favicon.ico
fi
)
echo
echo "FINISHING I2P INSTALLATION. PLEASE WAIT."
cd $INST_DIR
OS_ARCH=`uname -m`
X86_64=`echo "$OS_ARCH" | grep x86_64`
if [ "X$X86_64" = "X" ]; then
wrapperpath="./lib/wrapper/linux"
else
wrapperpath="./lib/wrapper/linux64"
fi
cp $wrapperpath/libwrapper.so ./lib/
cp $wrapperpath/wrapper.jar ./lib/
cp $wrapperpath/i2psvc .
rm -rf ./lib/wrapper
chmod 744 ./i2psvc
echo
echo "Installation finished."
echo
exit

View File

@ -1,130 +0,0 @@
#!/bin/sh
#
# Heavily based on the Slackware 12.2 SlackBuild
# Slackware build script for I2P
#
# PLEASE READ THIS:
# Probably you will never have to update I2P packages with upgradepkg,
# just because I2P has an auto-update function.
# Really you should not ever use any "upgrade" method.
#
# The correct way to upgrade is to:
# 1: install the upgrade
# 2: remove the old package
#
# It is a terrible shame that upgradepkg doesn't do this, infact,
# it would actually be the correct way for *any* package!
#
#
BUILD=1sponge
INSTALL_DIR=opt
NAME=i2p
ARCH=noarch
# Less than slackware 13?
SLKPLT=$(cat /etc/slackware-version | sed -re "s/(Slackware )([0-9]*)(.*)/\2/")
if [ $SLKPLT -lt 13 ] ; then
EXT=tgz
else
EXT=txz
fi
#
# This mess is here due to the totally moronic way i2p does versioning.
# We correct it here.
#
ROUTER=$(echo -ne "_")$(cat ../../router/java/src/net/i2p/router/RouterVersion.java | grep -e "public final static long BUILD" | cut -f2 -d"=" | cut -f1 -d";" | sed -re "s/ //g")
if [ "$ROUTER" == "_" ] ; then
ROUTER="_0"
fi
#
# That was the easy one, now for the tough one.
#
CORE=$(cat ../../core/java/src/net/i2p/CoreVersion.java | grep -e "public final static String VERSION" | cut -f2 -d'"' | sed -re "s/ //g")
CORE1=$(echo -n $CORE.x.x | sed -re "s/(.*)\.(.*)\.(.*)\.(.*)/\1/")
CORE2=$(echo -n $CORE.x | sed -re "s/(.*)\.(.*)\.(.*)\.(.*)/\1/")
if [ "$CORE.x.x" == "$CORE1" ] ; then
CORE=$(echo -ne $CORE".0.0")
fi
if [ "$CORE.x" == "$CORE2" ] ; then
CORE=$(echo -ne $CORE".0")
fi
VERSION=$(echo $CORE$ROUTER)
#
# Whew!
# OK, let's build i2p
#
CWD=$(pwd)
TMP=/tmp
PKG=$TMP/package-i2p
rm -rf $PKG
mkdir -p $PKG
cd $CWD/../../
ant distclean
#ant dist
ant tarball
tar xjvf i2p.tar.bz2 -C $TMP
cd $TMP/i2p
chown -R root:root .
mkdir -p $PKG/$INSTALL_DIR/
cp -a ../i2p $PKG/$INSTALL_DIR/
mkdir -p $PKG/install
#############################################################################
# Preconfigureation to make package smaller
#############################################################################
cd $PKG/$INSTALL_DIR/i2p
# wrapper.config $INSTALL_PATH and $SYSTEM_java_io_tmpdir
sed "s|\$INSTALL_PATH|$INSTALL_DIR/i2p|g" wrapper.config > a
sed "s|\$SYSTEM_java_io_tmpdir|/var/tmp|g" a > wrapper.config
# eepget %INSTALL_PATH
sed "s|\$INSTALL_PATH|$INSTALL_DIR/i2p|g" eepget > a
rm eepget
mv a eepget
# runplain.sh %INSTALL_PATH and %SYSTEM_java_io_tmpdir
sed "s|%INSTALL_PATH|$INSTALL_DIR/i2p|g" runplain.sh > a
sed "s|%SYSTEM_java_io_tmpdir|/var/tmp|g" a > runplain.sh
# i2prouter %INSTALL_PATH and %SYSTEM_java_io_tmpdir
sed "s|%INSTALL_PATH|$INSTALL_DIR/i2p|g" i2prouter > a
sed "s|%SYSTEM_java_io_tmpdir|/var/tmp|g" a > i2prouter
chmod 744 ./i2prouter
chmod 744 ./osid
chmod 744 ./runplain.sh
chmod 744 ./eepget
chmod 744 ./scripts/i2pbench.sh
chmod 744 ./scripts/i2ptest.sh
rm -Rf ./lib/*.dll ./*.bat ./*.exe ./installer ./icons ./a postinstall.sh
mv $PKG/$INSTALL_DIR/i2p/*.config $PKG/install
mv $PKG/$INSTALL_DIR/i2p/blocklist.txt $PKG/$INSTALL_DIR/i2p/blocklist.txt.new
mv $PKG/$INSTALL_DIR/i2p/eepsite/jetty.xml $PKG/$INSTALL_DIR/i2p/eepsite/jetty.xml.new
mv $PKG/$INSTALL_DIR/i2p/eepsite/docroot/index.html $PKG/$INSTALL_DIR/i2p/eepsite/docroot/index.html.new
mv $PKG/$INSTALL_DIR/i2p/eepsite/docroot/favicon.ico $PKG/$INSTALL_DIR/i2p/eepsite/docroot/favicon.ico.new
sed "s|directory|/$INSTALL_DIR/i2p/|g" $CWD/doinst.sh > $PKG/install/doinst.sh
cat $CWD/slack-desc > $PKG/install/slack-desc
cd $PKG
#
# requiredbuilder fucks up REALLY bad, and thinks java is perl?!
# It also did not catch the shell requirements! BOOOOOOOOOOO! HISSSSSSSS!
#
# requiredbuilder -v -y -s $CWD $PKG
#
cat $CWD/slack-required > $PKG/install/slack-required
makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.$EXT

View File

@ -1,47 +0,0 @@
Building:
The i2p package will be installed in /opt/i2p
If you want to change installation dir, change the variable INSTALL_DIR
on i2p.SlackBuild and rebuild the package. You will also need to do the same
in the base-i2p package.
Installation and Upgrade:
Probably you will never have to update i2p packages. However if you do,
be sure to installpkg first, then removepkg or custom config files can
be lost with upgradepkg. I2P has an auto-update function. However using
installpkg then removepkg lowers the demand on the I2P network as a
whole, and is by far faster.
After installpkg command, doinst.sh will execute a postinstallation script
needed by I2P. Be sure to also install the base-i2p package.
Optional:
chmod +x /etc/rc.d/rc.i2p only if you want it to start on boot and stop on
shutdown.
How to start I2P:
Start I2P service with-
sh /etc/rc.d/rc.i2p start
Now tell your browser to user this proxy: localhost on port 4444 and open
this page: http://localhost:7657/index.jsp
Here you can configure I2P, watch network status and navigate anonimously.
It's suggested to subscribe to various addressbook hosts so that you can
get to the many available eepsites and other service on I2P. These are not
set up by default for security reasons.
Please see the faqs on http://www.i2p2.i2p/ or http://www.i2p2.de/ on how
to subscribe to the various addressbook services.
To stop I2P:
/etc/rc.d/rc.i2p stop
For any additional information:
Within I2P- http://www.i2p2.i2p/, http://forum.i2p/, http://zzz.i2p
Internet (not reccomended!) - http://www.i2p2.de/, http://forum.i2p2.de/

View File

@ -1,19 +0,0 @@
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description. Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in. You must make
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
|-----handy-ruler----------------------------------------------------------|
i2p: i2p (an anonymizing network)
i2p:
i2p: I2P is an anonymizing network, offering a simple layer that
i2p: identity-sensitive applications can use to securely communicate. All
i2p: data is wrapped with several layers of encryption, and the network is
i2p: both distributed and dynamic, with no trusted parties.
i2p: Many applications are available that interface with I2P, including
i2p: mail, peer-peer file sharing, IRC chat, and others.
i2p: WARNING: To upgrade installpkg FIRST _THEN_ removepkg.
i2p: For more information, see: http://www.i2p2.de/
i2p:

View File

@ -1,4 +0,0 @@
jre >= 5
i2p-base >= 0.0.1
bash >= 3.1.017

130
TODO Normal file
View File

@ -0,0 +1,130 @@
# Fixes
- Create tunnel wizard
<zzz> hmm would be nice if they could be shared-client or have an option
<zzz> was setting up email tunnels
- Browser
<zzzccc> Bug report: i2p browser treats 302 as an error
<zzzccc> Bug 2: rotate screen in i2p browser seems to go back one page
- Console text change
<zzz> "download" and "upload" at the bottom of the status is a little misleading..
<zzz> maybe 'downstream bandwidth' or 'inbound usage' ?
- Fix visibility of advanced tunnel parameter changes
<zzz> when I change an advanced tunnel param e.g. length or variance, the change isn't displayed, I have to go back and forward again to see the change
# New UI fixes
- Addressbook action items are in tunnel overflow menu after moving from console to tunnels
- Material design:
- Style for addressbook headers
- Change console FAM icon when possible
<zzz> on the bottom right, the + and x icons might be better as a double-up arrow and double-down arrow?
- Use Material design for LongPressButton
- Highlight selected tunnel in two-pane mode
# Short-term
- Remove peers page (HTML version)
- Add firewall help page showing current port settings
- GMP 6
- Fetch all JARs from Maven Central (ie. upload everything that I2P Android uses)
- Disable uPnP when on cell networks
<zzz> spewing UPnP out into cell networks is a waste of time at best and a security risk at worst, but you really want it for wifi
- Rewrite settings config handling
- Rewrite InitActivities
- I2PTunnel
- Improve tunnel list status indicators
- Icon overlay to indicate which tunnels are shared
- Or reorder / group tunnels?
- Show all messages somewhere
- Bottom toolbar?
- Icons/header images for tunnel types on details page
- Setting to close when not on WiFi
- Progress feedback for addressbook subscriptions reload
- Display release notes directly on new router version
- Fill out help pages
- Fix navigation to specific settings pages
- Rewrite release notes to be release-specific
- Fix release notes UI, either make back button use clear or add buttons
- Notify user when autostart fails?
- NetDB tablet view fixes
- Refresh detail fragment when changing tab
- Move list to correct item when changing tab
- Create nav history when viewing RI from LS
- Handle NetDB null cases (failed lookup of requested hash in detail page)
- Include GeoIP db for country info
- Maybe change router-off mechanic for various pages? Enable as they become available?
# Medium-term
- SQLite naming service backend to store addresses more effectively
- Leverage for name completion in e.g. browsers
- Create/edit tunnels while router is not running
- Separate out shared tunnel config
- Convey to users that one config controls all shared tunnels
- Network profiles
- User selects profile in settings
- Change network participation etc. based on profile
- Also look at connection type: Connectivity.isConnectionFast()
- Expose log level overrides
- Bug report feature
- Replace peers page (native version)
- Improve graphs
- Show fixed x range, not only available data
- Think about pan/zoom
- How to persist data across restarts?
- Enable apps to specify when they don't need the router anymore
# Silent Store approval checks to confirm/implement
- Known Vulnerabilities
- Apps will be tested to ensure that they are not susceptible to known
publicly disclosed vulnerabilities. For example:
- Heartbleed
- Poodle
- MasterKey
- Common Path Traversal attacks
- Common SQL Injection attacks
- Network Security Protocols
- All Apps that require transmission of data from the App to a system that
does not exist on the device must use, at a minimum, TLS1.1 standards.
However, Blackphone would prefer the usage of TLS1.2.
- Apps must not use algorithms for cryptographic purposes that are considered
obsolete or outdated i.e. MD5, SHA1, RC4, DES, or any encryption algorithm
that is weaker than AES128.
- Transport Layer Protection
- All network communication should be encrypted
- Not vulnerable to SSl Strip
- Data Leakage
- No storage of sensitive data outside of application sandbox
- Files should not be created with MODE_WORLD_READABLE or MODE_WORLD_WRITABLE
- Copy & Paste will be evaluated on a case by case basis
- App logs should not contain sensitive information
- Authentication and Authorization
- Validate that authentication credentials are not stored on the device
- Must use an approved password-based key derivation function ie. PBKDF2, scrypt
- Data-at-rest Encryption
- Must use at a minimum AES128 with modes CCM or GCM
- Should not store the encryption key on the file system
- Permission Checks
- The App must function with all permissions disabled
- Apps must not hard crash if a permission is disabled
- Apps should ask users to enable permissions that are disabled if needed to
function properly and explain why the permission is necessary
- Privacy Policy
- Apps must have a privacy policy that details how customer data is used,
stored, shared, etc...
- Apps must be configured with the customer opted out by default
- App logs should not contain PII
- Error Handling
- Apps should follow best-practices for error handling and logging
# Long-term
- Reproducible builds
- Extract RouterService into a library
- Remote router support
- Implement a "router wrapper" that can represent a local or remote router
- Implement/use client APIs to talk to remote router
- I2CP
- I2PControl

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.i2p.router"
android:versionCode="1"
android:versionName="1.0.0">
<uses-permission android:name="android.permission.INTERNET" />
<!-- 3 = 1.5, 2 = 1.1, 1 = 1.0; would probably work with 1 but don't have a 1.0 SDK to test against -->
<uses-sdk android:minSdkVersion="2" />
<application android:label="@string/app_name">
<activity android:name=".I2PAndroid"
android:label="@string/app_name"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -1,29 +0,0 @@
These instructions are for the 1.5 Android SDK.
The build file is not compatible with the 1.1 SDK any more.
1.6 and 2.0 SDKs are untested.
#Unzip the android SDK in ../../
#So then the android tools will be in ../../android-sdk-linux_x86-1.5_r2/tools/
# create a file local.properties with the following line:
# sdk-location=/path/to/your/android-sdk-linux_x86-1.5_r2
#then build the android apk file:
ant debug
# Create the android 1.5 virtual device
# (don't make a custom hardware profile)
../../android-sdk-linux_x86-1.5_r2/tools/android create avd --name i2p --target 2
#then run the emulator:
../../android-sdk-linux_x86-1.5_r2/tools/emulator -avd i2p &
#then wait a couple minutes until the emulator is up
#then install the I2P app
ant install
#then run the debugger
../../android-sdk-linux_x86-1.5_r2/tools/ddms &
#to rebuild and reinstall to emulator:
ant reinstall

View File

@ -1,352 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name=".I2PAndroid" default="help">
<!-- The local.properties file is created and updated by the 'android' tool.
It contain the path to the SDK. It should *NOT* be checked in in Version
Control Systems. -->
<property file="local.properties"/>
<!-- The build.properties file can be created by you and is never touched
by the 'android' tool. This is the place to change some of the default property values
used by the Ant rules.
Here are some properties you may want to change/update:
application-package
the name of your application package as defined in the manifest. Used by the
'uninstall' rule.
source-folder
the name of the source folder. Default is 'src'.
out-folder
the name of the output folder. Default is 'bin'.
Properties related to the SDK location or the project target should be updated
using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your application and
should be checked in in Version Control Systems.
-->
<property file="build.properties"/>
<!-- The default.properties file is created and updated by the 'android' tool, as well
as ADT.
This file is an integral part of the build system for your application and
should be checked in in Version Control Systems. -->
<property file="default.properties"/>
<!-- Custom Android task to deal with the project target, and import the proper rules.
This requires ant 1.6.0 or above. -->
<path id="android.antlibs">
<pathelement path="${sdk-location}/tools/lib/anttasks.jar" />
<pathelement path="${sdk-location}/tools/lib/sdklib.jar" />
<pathelement path="${sdk-location}/tools/lib/androidprefs.jar" />
<pathelement path="${sdk-location}/tools/lib/apkbuilder.jar" />
<pathelement path="${sdk-location}/tools/lib/jarutils.jar" />
</path>
<taskdef name="setup"
classname="com.android.ant.SetupTask"
classpathref="android.antlibs"/>
<!-- Execute the Android Setup task that will setup some properties specific to the target,
and import the rules files.
To customize the rules, copy/paste them below the task, and disable import by setting
the import attribute to false:
<setup import="false" />
This will ensure that the properties are setup correctly but that your customized
targets are used.
-->
<setup import="false" />
<!--
================================================================================
New I2P rules
================================================================================
-->
<target name="buildrouter" depends="dirs" >
<!-- build router and core -->
<ant dir=".." target="buildrouter" />
<!-- router -->
<copy file="../build/router.jar" todir="${external-libs-folder}" />
<!-- core -->
<mkdir dir="tmp" />
<unjar src="../build/i2p.jar" dest="tmp/" />
<delete file="tmp/net/i2p/util/LogWriter.class" />
<!-- org.bouncycastle.crypto already in android
but we need a little trickery because our HMac is incompatible...
and the libs aren't in the SDK to compile against??? -->
<jar destfile="${external-libs-folder}/crypto.jar" >
<fileset dir="tmp/" >
<include name="org/bouncycastle/crypto/Digest.class" />
<include name="org/bouncycastle/crypto/Mac.class" />
<include name="org/bouncycastle/crypto/digests/GeneralDigest.class" />
<include name="org/bouncycastle/crypto/digests/MD5Digest.class" />
</fileset>
</jar>
<delete>
<fileset dir="tmp/" >
<include name="org/bouncycastle/crypto/Digest.class" />
<include name="org/bouncycastle/crypto/Mac.class" />
<include name="org/bouncycastle/crypto/digests/GeneralDigest.class" />
<include name="org/bouncycastle/crypto/digests/MD5Digest.class" />
</fileset>
</delete>
<!--
<delete dir="tmp/org/bouncycastle/" />
<delete file="tmp/net/i2p/crypto/HMACGenerator.class" />
-->
<delete file="tmp/org/bouncycastle/" />
<!-- lots of unneeded stuff could be deleted here -->
<jar destfile="${external-libs-folder}/i2p.jar" basedir="tmp/" />
<!-- some resources -->
<mkdir dir="res/drawable/" />
<copy file="../installer/resources/themes/console/images/i2plogo.png" todir="res/drawable/" />
<copy file="../installer/resources/blocklist.txt" tofile="res/raw/blocklist_txt" />
</target>
<target name="hackcleanup">
<delete file="${external-libs-folder}/crypto.jar" />
</target>
<!--
================================================================================
From here down copied from SDK platforms/android-1.1/templates/android_rules.xml
and then modified
================================================================================
-->
<!--
This rules file is meant to be imported by the custom Ant task:
com.android.ant.AndroidInitTask
The following properties are put in place by the importing task:
android-jar, android-aidl, aapt, aidl, and dx
Additionnaly, the task sets up the following classpath reference:
android.target.classpath
This is used by the compiler task as the boot classpath.
-->
<!-- Custom tasks -->
<taskdef name="aaptexec"
classname="com.android.ant.AaptExecLoopTask"
classpathref="android.antlibs"/>
<taskdef name="apkbuilder"
classname="com.android.ant.ApkBuilderTask"
classpathref="android.antlibs"/>
<!-- Properties -->
<property name="android-tools" value="${sdk-location}/tools" />
<!-- Input directories -->
<property name="source-folder" value="src" />
<property name="gen-folder" value="gen" />
<property name="resource-folder" value="res" />
<property name="asset-folder" value="assets" />
<property name="source-location" value="${basedir}/${source-folder}" />
<!-- folder for the 3rd party java libraries -->
<property name="external-libs-folder" value="libs" />
<!-- folder for the native libraries -->
<property name="native-libs-folder" value="libs" />
<!-- Output directories -->
<property name="gen-folder" value="gen" />
<property name="out-folder" value="bin" />
<property name="out-classes" value="${out-folder}/classes" />
<property name="out-classes-location" value="${basedir}/${out-classes}"/>
<!-- out folders for a parent project if this project is an instrumentation project -->
<property name="main-out-folder" value="../${out-folder}" />
<property name="main-out-classes" value="${main-out-folder}/classes"/>
<!-- Intermediate files -->
<property name="dex-file" value="classes.dex" />
<property name="intermediate-dex" value="${out-folder}/${dex-file}" />
<!-- dx does not properly support incorrect / or \ based on the platform
and Ant cannot convert them because the parameter is not a valid path.
Because of this we have to compute different paths depending on the platform. -->
<condition property="intermediate-dex-location"
value="${basedir}\${intermediate-dex}"
else="${basedir}/${intermediate-dex}" >
<os family="windows"/>
</condition>
<!-- The final package file to generate -->
<property name="out-debug-package" value="${out-folder}/${ant.project.name}-debug.apk"/>
<!-- Tools -->
<condition property="exe" value=".exe" else=""><os family="windows"/></condition>
<property name="adb" value="${android-tools}/adb${exe}"/>
<!-- rules -->
<!-- Create the output directories if they don't exist yet. -->
<target name="dirs">
<echo>Creating output directories if needed...</echo>
<mkdir dir="${resource-folder}" />
<mkdir dir="${external-libs-folder}" />
<mkdir dir="${gen-folder}" />
<mkdir dir="${out-folder}" />
<mkdir dir="${out-classes}" />
</target>
<!-- Generate the R.java file for this project's resources. -->
<target name="resource-src" depends="dirs">
<echo>Generating R.java / Manifest.java from the resources...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg path="${gen-folder}" />
<arg value="-M" />
<arg path="AndroidManifest.xml" />
<arg value="-S" />
<arg path="${resource-folder}" />
<arg value="-I" />
<arg path="${android-jar}" />
</exec>
</target>
<!-- Generate java classes from .aidl files. -->
<target name="aidl" depends="dirs">
<echo>Compiling aidl files into Java classes...</echo>
<apply executable="${aidl}" failonerror="true">
<arg value="-p${android-aidl}" />
<arg value="-I${source-folder}" />
<arg value="-o${gen-folder}" />
<fileset dir="${source-folder}">
<include name="**/*.aidl"/>
</fileset>
</apply>
</target>
<!-- Compile this project's .java files into .class files. -->
<!-- I2P add buildrouter -->
<target name="compile" depends="buildrouter, resource-src, aidl">
<javac encoding="ascii" target="1.5" debug="true" extdirs=""
destdir="${out-classes}"
bootclasspathref="android.target.classpath">
<src path="${source-folder}" />
<src path="${gen-folder}" />
<classpath>
<fileset dir="${external-libs-folder}" includes="*.jar"/>
<pathelement path="${main-out-classes}"/>
</classpath>
</javac>
</target>
<!-- Convert this project's .class files into .dex files. -->
<!-- I2P add hackcleanup -->
<target name="dex" depends="compile, hackcleanup">
<echo>Converting compiled files and external libraries into ${out-folder}/${dex-file}...</echo>
<apply executable="${dx}" failonerror="true" parallel="true">
<!-- I2P this is a bad sign that we need this -->
<arg value="-JXmx256m" />
<arg value="--dex" />
<arg value="--output=${intermediate-dex-location}" />
<arg path="${out-classes-location}" />
<fileset dir="${external-libs-folder}" includes="*.jar"/>
</apply>
</target>
<!-- Put the project's resources into the output package file
This actually can create multiple resource package in case
Some custom apk with specific configuration have been
declared in default.properties.
-->
<target name="package-resources">
<echo>Packaging resources</echo>
<aaptexec executable="${aapt}"
command="package"
manifest="AndroidManifest.xml"
resources="${resource-folder}"
assets="${asset-folder}"
androidjar="${android-jar}"
outfolder="${out-folder}"
basename="${ant.project.name}" />
</target>
<!-- Package the application and sign it with a debug key.
This is the default target when building. It is used for debug. -->
<target name="debug" depends="dex, package-resources">
<apkbuilder
outfolder="${out-folder}"
basename="${ant.project.name}"
signed="true"
verbose="false">
<file path="${intermediate-dex}" />
<sourcefolder path="${source-folder}" />
<jarfolder path="${external-libs-folder}" />
<nativefolder path="${native-libs-folder}" />
</apkbuilder>
</target>
<!-- Package the application without signing it.
This allows for the application to be signed later with an official publishing key. -->
<target name="release" depends="dex, package-resources">
<apkbuilder
outfolder="${out-folder}"
basename="${ant.project.name}"
signed="false"
verbose="false">
<file path="${intermediate-dex}" />
<sourcefolder path="${source-folder}" />
<jarfolder path="${external-libs-folder}" />
<nativefolder path="${native-libs-folder}" />
</apkbuilder>
<echo>All generated packages need to be signed with jarsigner before they are published.</echo>
</target>
<!-- Install the package on the default emulator -->
<target name="install" depends="debug">
<echo>Installing ${out-debug-package} onto default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="install" />
<arg path="${out-debug-package}" />
</exec>
</target>
<target name="reinstall" depends="debug">
<echo>Installing ${out-debug-package} onto default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="install" />
<arg value="-r" />
<arg path="${out-debug-package}" />
</exec>
</target>
<!-- Uinstall the package from the default emulator -->
<target name="uninstall">
<echo>Uninstalling ${application-package} from the default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="uninstall" />
<arg path="${application-package}" />
</exec>
</target>
<target name="help">
<!-- displays starts at col 13
|13 80| -->
<echo>Android Ant Build. Available targets:</echo>
<echo> help: Displays this help.</echo>
<echo> debug: Builds the application and sign it with a debug key.</echo>
<echo> release: Builds the application. The generated apk file must be</echo>
<echo> signed before it is published.</echo>
<echo> install: Installs the debug package onto a running emulator or</echo>
<echo> device. This can only be used if the application has </echo>
<echo> not yet been installed.</echo>
<echo> reinstall: Installs the debug package on a running emulator or</echo>
<echo> device that already has the application.</echo>
<echo> The signatures must match.</echo>
<echo> uninstall: uninstall the application from a running emulator or</echo>
<echo> device.</echo>
</target>
</project>

View File

@ -1,11 +0,0 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-2

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, I2PAndroid"
/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/i2plogo"
/>
</LinearLayout>

View File

@ -1,3 +0,0 @@
logger.defaultLevel=INFO
logger.record.net.i2p.router.transport.FIFOBandwidthRefiller=ERROR
logger.record.net.i2p.stat.Rate=ERROR

View File

@ -1,16 +0,0 @@
# initial router.config
# temp directory
i2p.dir.temp=/data/data/net.i2p.router/files/tmp
i2p.dir.pid=/data/data/net.i2p.router/files/tmp
# save memory
prng.buffers=2
router.decayingBloomFilterM=20
stat.full=false
i2np.udp.maxConnections=30
# no I2CP
i2p.dummyClientFacade=true
# for now
i2np.ntcp.enable=false
# not on android
i2np.upnp.enable=false
routerconsole.geoip.enable=false

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">I2PAndroid</string>
</resources>

View File

@ -1,142 +0,0 @@
package net.i2p.router;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
import android.os.Bundle;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.List;
import net.i2p.router.Router;
import net.i2p.router.RouterLaunch;
// import net.i2p.util.NativeBigInteger;
public class I2PAndroid extends Activity
{
static Context _context;
private static final String DIR = "/data/data/net.i2p.router/files";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
_context = this; // Activity extends Context
debugStuff();
initialize();
// 300ms per run
// 5x slower than java on my server and 50x slower than native on my server
// NativeBigInteger.main(null);
}
public void onRestart()
{
System.err.println("onRestart called");
super.onRestart();
}
public void onStart()
{
System.err.println("onStart called");
super.onStart();
RouterLaunch.main(null);
System.err.println("Router.main finished");
}
public void onResume()
{
System.err.println("onResume called");
super.onResume();
}
public void onPause()
{
System.err.println("onPause called");
super.onPause();
}
public void onStop()
{
System.err.println("onStop called");
super.onStop();
// from routerconsole ContextHelper
List contexts = RouterContext.listContexts();
if ( (contexts == null) || (contexts.size() <= 0) )
throw new IllegalStateException("No contexts. This is usually because the router is either starting up or shutting down.");
RouterContext ctx = (RouterContext)contexts.get(0);
// shutdown() doesn't return so use shutdownGracefully()
ctx.router().shutdownGracefully(Router.EXIT_HARD);
System.err.println("shutdown complete");
}
public void onDestroy()
{
System.err.println("onDestroy called");
super.onDestroy();
}
public static Context getContext() {
return _context;
}
private void debugStuff() {
System.err.println("java.io.tmpdir" + ": " + System.getProperty("java.io.tmpdir"));
System.err.println("java.vendor" + ": " + System.getProperty("java.vendor"));
System.err.println("java.version" + ": " + System.getProperty("java.version"));
System.err.println("os.arch" + ": " + System.getProperty("os.arch"));
System.err.println("os.name" + ": " + System.getProperty("os.name"));
System.err.println("os.version" + ": " + System.getProperty("os.version"));
System.err.println("user.dir" + ": " + System.getProperty("user.dir"));
System.err.println("user.home" + ": " + System.getProperty("user.home"));
System.err.println("user.name" + ": " + System.getProperty("user.name"));
}
private void initialize() {
// Until we can edit the router.config on the device,
// copy it from the resource every time.
// File f = new I2PFile("router.config");
// if (!f.exists()) {
copyResourceToFile(R.raw.router_config, "router.config");
copyResourceToFile(R.raw.logger_config, "logger.config");
copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt");
// }
// Set up the locations so Router and WorkingDir can find them
System.setProperty("i2p.dir.base", DIR);
System.setProperty("i2p.dir.config", DIR);
System.setProperty("wrapper.logfile", DIR + "/wrapper.log");
}
private void copyResourceToFile(int resID, String f) {
InputStream in = null;
FileOutputStream out = null;
System.err.println("Creating file " + f + " from resource");
byte buf[] = new byte[4096];
try {
// Context methods
in = getResources().openRawResource(resID);
out = openFileOutput(f, 0);
int read = 0;
while ( (read = in.read(buf)) != -1)
out.write(buf, 0, read);
} catch (IOException ioe) {
} catch (Resources.NotFoundException nfe) {
} finally {
if (in != null) try { in.close(); } catch (IOException ioe) {}
if (out != null) try { out.close(); } catch (IOException ioe) {}
}
}
}

View File

@ -1,163 +0,0 @@
package net.i2p.util;
/*
* public domain
*
*/
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
/**
* bridge to android logging
*
* @author zzz
*/
class LogWriter implements Runnable {
private final static long CONFIG_READ_ITERVAL = 10 * 1000;
private long _lastReadConfig = 0;
private long _numBytesInCurrentFile = 0;
private OutputStream _currentOut; // = System.out
private int _rotationNum = -1;
private String _logFilenamePattern;
private File _currentFile;
private LogManager _manager;
private boolean _write;
private LogWriter() { // nop
}
public LogWriter(LogManager manager) {
_manager = manager;
}
public void stopWriting() {
_write = false;
}
public void run() {
_write = true;
try {
while (_write) {
flushRecords();
rereadConfig();
}
System.err.println("Done writing");
} catch (Exception e) {
System.err.println("Error writing the logs: " + e.getMessage());
e.printStackTrace();
}
}
public void flushRecords() { flushRecords(true); }
public void flushRecords(boolean shouldWait) {
try {
List records = _manager._removeAll();
if (records == null) return;
for (int i = 0; i < records.size(); i++) {
LogRecord rec = (LogRecord) records.get(i);
writeRecord(rec);
}
} catch (Throwable t) {
t.printStackTrace();
} finally {
if (shouldWait) {
try {
synchronized (this) {
this.wait(10*1000);
}
} catch (InterruptedException ie) { // nop
}
}
}
}
public String currentFile() {
return _currentFile != null ? _currentFile.getAbsolutePath() : "uninitialized";
}
private void rereadConfig() {
long now = Clock.getInstance().now();
if (now - _lastReadConfig > CONFIG_READ_ITERVAL) {
_manager.rereadConfig();
_lastReadConfig = now;
}
}
private void writeRecord(LogRecord rec) {
if (rec.getThrowable() == null)
log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage());
else
log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage(), rec.getThrowable());
}
public void log(int priority, Class src, String name, String threadName, String msg) {
if (src != null) {
String tag = src.getName();
int dot = tag.lastIndexOf(".");
if (dot >= 0)
tag = tag.substring(dot + 1);
android.util.Log.println(toAndroidLevel(priority),
tag,
'[' + threadName + "] " + msg);
} else if (name != null)
android.util.Log.println(toAndroidLevel(priority),
name,
'[' + threadName + "] " + msg);
else
android.util.Log.println(toAndroidLevel(priority),
threadName, msg);
}
public void log(int priority, Class src, String name, String threadName, String msg, Throwable t) {
if (src != null) {
String tag = src.getName();
int dot = tag.lastIndexOf(".");
if (dot >= 0)
tag = tag.substring(dot + 1);
android.util.Log.println(toAndroidLevel(priority),
tag,
'[' + threadName + "] " + msg +
' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
} else if (name != null)
android.util.Log.println(toAndroidLevel(priority),
name,
'[' + threadName + "] " + msg +
' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
else
android.util.Log.println(toAndroidLevel(priority),
threadName,
msg + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
}
private static int toAndroidLevel(int level) {
switch (level) {
case Log.DEBUG:
return android.util.Log.DEBUG;
case Log.INFO:
return android.util.Log.INFO;
case Log.WARN:
return android.util.Log.WARN;
case Log.ERROR:
case Log.CRIT:
default:
return android.util.Log.ERROR;
}
}
private static final String replace(String pattern, int num) {
char c[] = pattern.toCharArray();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < c.length; i++) {
if ( (c[i] != '#') && (c[i] != '@') )
buf.append(c[i]);
else
buf.append(num);
}
return buf.toString();
}
}

273
app/build.gradle Normal file
View File

@ -0,0 +1,273 @@
apply plugin: 'com.android.application'
repositories {
mavenLocal()
mavenCentral()
maven { url 'https://jitpack.io' }
}
android {
namespace 'net.i2p.android.router'
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
defaultConfig {
versionCode Integer.parseInt(project.I2P_ANDROID_VERSION_CODE as String)
versionName "$I2P_ANDROID_VERSION"
minSdkVersion 21
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
// For Espresso
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
release
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
}
}
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
abortOnError false
checkReleaseBuilds false
disable 'MissingDefaultResource'
}
packagingOptions {
resources {
excludes += ['LICENSE.txt']
}
}
flavorDimensions 'tier'
productFlavors {
free {
dimension 'tier'
applicationId 'net.i2p.android'
}
donate {
dimension 'tier'
applicationId 'net.i2p.android.donate'
}
legacy {
dimension 'tier'
applicationId 'net.i2p.android.router'
}
}
}
dependencies {
implementation "androidx.appcompat:appcompat:1.5.1"
implementation "androidx.preference:preference:1.2.0"
implementation "androidx.annotation:annotation:1.5.0"
implementation 'androidx.recyclerview:recyclerview:1.0.0'
// Local dependencies
implementation project(':lib:client')
implementation project(':lib:helper')
implementation project(path: ':routerjars', configuration: 'routerjars')
// Android Support Repository dependencies
/*def supportVersion = '28.0.0'
implementation "com.android.support:support-v4:$supportVersion"
implementation "com.android.support:appcompat-v7:$supportVersion"
implementation "com.android.support:preference-v7:$supportVersion"
implementation "com.android.support:preference-v14:$supportVersion"
implementation "com.android.support:recyclerview-v7:$supportVersion"*/
implementation 'com.google.android.material:material:1.9.0'
// Remote dependencies
implementation 'com.androidplot:androidplot-core:1.5.11'
implementation 'com.eowise:recyclerview-stickyheaders:0.5.2@aar'
//implementation 'com.inkapplications.viewpageindicator:library:2.4.4'
implementation 'com.github.hackware1993:MagicIndicator:1.7.0' // for androidx
implementation 'com.pnikosis:materialish-progress:1.7'
implementation "net.i2p:router:$I2P_VERSION"
implementation "net.i2p:i2p:$I2P_VERSION"
implementation "net.i2p.client:mstreaming:$I2P_VERSION"
implementation "net.i2p.client:streaming:$I2P_VERSION"
implementation 'net.i2p.android.ext:floatingactionbutton:1.10.1'
implementation 'com.github.SufficientlySecure:html-textview:v3.6'
// Testing-only dependencies
androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.2') {
exclude group: 'com.android.support', module: 'support-annotations'
}
}
dependencies {
implementation "androidx.appcompat:appcompat:1.5.1"
implementation "androidx.preference:preference:1.2.0"
implementation "androidx.annotation:annotation:1.5.0"
implementation 'androidx.test.espresso:espresso-core:3.6.1'
implementation 'androidx.test.ext:junit:1.2.1'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}
dependencies {
// ...existing code...
// Force consistent lifecycle versions
implementation('androidx.lifecycle:lifecycle-viewmodel:2.5.1')
implementation('androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1')
// Exclude older versions
configurations.all {
resolutionStrategy {
force 'androidx.lifecycle:lifecycle-viewmodel:2.5.1'
force 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
}
}
}
project.ext.i2pbase = "../i2p.i2p"
def Properties props = new Properties()
def propFile = new File(project(':routerjars').projectDir, 'local.properties')
if (propFile.canRead()) {
props.load(new FileInputStream(propFile))
if (props != null &&
props.containsKey('i2psrc')) {
i2pbase = props['i2psrc']
} else {
println 'local.properties found but some entries are missing'
}
} else {
println 'local.properties not found'
}
task certificatesZip(type: Zip) {
archiveName = 'certificates_zip'
from files('' + i2pbase + '/installer/resources/certificates')
}
task copyI2PResources(type: Copy) {
// Force this to always run: Copy only detects source changes, not if missing in destination
outputs.upToDateWhen { false }
into 'src/main/res'
into('drawable') {
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/i2plogo.png')
}
into('raw') {
from(i2pbase + '/installer/resources/blocklist.txt') { rename { 'blocklist_txt' } }
from(i2pbase + '/installer/resources/hosts.txt') { rename { 'hosts_txt' } }
from(i2pbase + '/installer/resources/proxy') {
include { elem ->
elem.name.endsWith('.ht')
}
rename { String name ->
name.toLowerCase(Locale.US).replace('-', '_').replace('.', '_')
}
filter { String line ->
// Remove links to routerconsole
def m = line =~ /127.0.0.1:7657/
if (m.getCount()) {
// Links around content
line = line.replaceAll(/<a href="http:\/\/127.0.0.1:7657[^>]*>(.+?)<\/a>/) { fullmatch, content ->
content
}
// Links in translation substitutions
line = line.replaceAll(/"<a href=\\"http:\/\/127.0.0.1:7657[^>]*>", "<\/a>"/, '"", ""')
}
// Remove "Configuration - Help - Addressbook" heading
def n = line =~ /Configuration.+Help.+Addressbook/
if (n.getCount())
""
else
line
}
}
from('../LICENSE.txt') { rename { 'license_app_txt' } }
from('../licenses/LICENSE-Apache2.0.txt') { rename { 'license_apache20_txt' } }
from(i2pbase + '/licenses') {
include { elem ->
elem.name in [
'LICENSE-ElGamalDSA.txt',
'LICENSE-SHA256.txt',
'LICENSE-BSD.txt',
'LICENSE-SNTP.txt',
'LICENSE-LGPLv2.1.txt',
'LICENSE-InstallCert.txt',
'LICENSE-BlockFile.txt',
'LICENSE-GPLv2.txt',
'LICENSE-GPLv3.txt',
'LICENSE-LGPLv3.txt',
'LICENSE-FatCowIcons.txt',
'LICENSE-Addressbook.txt',
]
}
rename { String name ->
name.toLowerCase(Locale.US).replace('-', '_').replace('.', '_')
}
}
from certificatesZip
}
}
// For peers WebView
task copyI2PAssets(type: Copy) {
// Force this to always run: Copy only detects source changes, not if missing in destination
outputs.upToDateWhen { false }
into 'src/main/assets/themes/console'
into('images') {
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/i2plogo.png')
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/inbound.png')
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/outbound.png')
}
into('light') {
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/light/console.css')
}
into('light/images') {
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/light/images/header.png')
}
}
preBuild.dependsOn copyI2PResources
preBuild.dependsOn copyI2PAssets
task cleanI2PResources(type: Delete) {
delete file('src/main/res/drawable/i2plogo.png')
delete fileTree('src/main/res/raw') {
include 'blocklist_txt'
include 'hosts_txt'
include '*_ht'
include 'license_*'
include 'certificates_zip'
}
}
task cleanI2PAssets(type: Delete) {
delete fileTree('src/main/assets/themes/console/images')
delete file('src/main/assets/themes/console/light/console.css')
delete file('src/main/assets/themes/console/light/images/header.png')
}
clean.dependsOn cleanI2PResources
clean.dependsOn cleanI2PAssets
props = new Properties()
propFile = new File(project.rootDir, 'signing.properties')
if (propFile.canRead()) {
props.load(new FileInputStream(propFile))
if (props != null &&
props.containsKey('STORE_FILE') &&
props.containsKey('STORE_PASSWORD') &&
props.containsKey('KEY_ALIAS') &&
props.containsKey('KEY_PASSWORD')) {
android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
android.signingConfigs.release.storePassword = props['STORE_PASSWORD']
android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']
} else {
println 'signing.properties found but some entries are missing'
android.buildTypes.release.signingConfig = null
}
} else {
println 'signing.properties not found'
android.buildTypes.release.signingConfig = null
}

29
app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,29 @@
# Add project specific ProGuard rules here.
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
-dontobfuscate
-dontoptimize
-dontpreverify
-dontshrink
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Workaround for Samsung Android 4.2 bug
# https://code.google.com/p/android/issues/detail?id=78377
# https://code.google.com/p/android/issues/detail?id=78377#c188
# https://code.google.com/p/android/issues/detail?id=78377#c302
-keepattributes **
-keep class !android.support.v7.view.menu.**,** {*;}
-dontwarn **
-dontnote **

View File

@ -0,0 +1,115 @@
package net.i2p.android;
import androidx.test.core.app.ActivityScenario;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import net.i2p.android.router.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static androidx.test.espresso.Espresso.closeSoftKeyboard;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;
import static androidx.test.espresso.Espresso.pressBack;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.swipeLeft;
import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.hasSibling;
import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withParent;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.not;
@RunWith(AndroidJUnit4.class)
public class I2PActivityTest {
private ActivityScenario<I2PActivity> scenario;
@Before
public void setUp() {
scenario = ActivityScenario.launch(I2PActivity.class);
}
@Test
public void testMainTabs() {
onView(withId(R.id.router_onoff_button)).check(matches(isDisplayed()));
// Press "Tunnels" tab
onView(allOf(withText(R.string.label_tunnels),
not(isDescendantOfA(withId(R.id.main_scrollview))))).perform(click());
onView(withId(R.id.router_onoff_button)).check(matches(not(isDisplayed())));
onView(withText(R.string.label_i2ptunnel_client)).check(matches(isDisplayed()));
// Press "Addresses" tab
onView(withText(R.string.label_addresses)).perform(click());
onView(withText(R.string.label_i2ptunnel_client)).check(matches(not(isDisplayed())));
onView(withText(R.string.label_router)).check(matches(isDisplayed()));
// Press "Console" tab
onView(withText(R.string.label_console)).perform(click());
// Addressbook fragment should have been destroyed
onView(withText(R.string.label_router)).check(doesNotExist());
onView(withId(R.id.router_onoff_button)).check(matches(isDisplayed()));
}
@Test
public void testMainSwipe() {
onView(withId(R.id.router_onoff_button)).check(matches(isDisplayed()));
onView(allOf(withId(R.id.pager), withParent(hasSibling(withId(R.id.main_toolbar))))).perform(swipeLeft());
onView(withId(R.id.router_onoff_button)).check(matches(not(isDisplayed())));
onView(withText(R.string.label_i2ptunnel_client)).check(matches(isDisplayed()));
onView(allOf(withId(R.id.pager), withParent(hasSibling(withId(R.id.main_toolbar))))).perform(swipeLeft());
// TODO: test tunnels ViewPager
onView(allOf(withId(R.id.pager), withParent(hasSibling(withId(R.id.main_toolbar))))).perform(swipeLeft());
onView(withText(R.string.label_i2ptunnel_client)).check(matches(not(isDisplayed())));
onView(withText(R.string.label_router)).check(matches(isDisplayed()));
// TODO: test addressbook ViewPager
}
@Test
public void testSettingsNavigation() {
// Open settings menu
openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());
onView(withText(R.string.menu_settings)).perform(click());
// Open bandwidth page
onView(withText(R.string.settings_label_bandwidth_net)).perform(click());
onView(withText(R.string.settings_label_startOnBoot)).check(matches(isDisplayed()));
pressBack();
// Open graphs page
onView(withText(R.string.label_graphs)).perform(click());
onView(withText(R.string.router_not_running)).check(matches(isDisplayed()));
pressBack();
// Open logging page
onView(withText(R.string.settings_label_logging)).perform(click());
onView(withText(R.string.settings_label_default_log_level)).check(matches(isDisplayed()));
pressBack();
// Open addressbook page
onView(withText(R.string.label_addressbook)).perform(click());
onView(withText("Subscriptions")).check(matches(isDisplayed()));
closeSoftKeyboard();
pressBack();
// Open graphs page
onView(withText(R.string.settings_label_advanced)).perform(click());
onView(withText(R.string.settings_label_transports)).check(matches(isDisplayed()));
pressBack();
// Check back exits settings
onView(withText(R.string.settings_label_advanced)).check(matches(isDisplayed()));
pressBack();
onView(withText(R.string.settings_label_advanced)).check(doesNotExist());
}
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">I2P DEBUG</string>
</resources>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
android:title="@string/settings_label_bandwidth_net">
<extra
android:name="settings"
android:value="net" />
</header>
<header
android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
android:title="@string/label_graphs">
<extra
android:name="settings"
android:value="graphs" />
</header>
<header
android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
android:title="@string/settings_label_logging">
<extra
android:name="settings"
android:value="logging" />
</header>
<header
android:title="@string/label_addressbook">
<intent
android:targetPackage="net.i2p.android.donate"
android:targetClass="net.i2p.android.router.addressbook.AddressbookSettingsActivity" />
</header>
<header
android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
android:title="@string/settings_label_advanced">
<extra
android:name="settings"
android:value="advanced" />
</header>
</preference-headers>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<Preference android:title="@string/settings_label_bandwidth_net">
<intent
android:targetPackage="net.i2p.android.donate"
android:targetClass="net.i2p.android.router.SettingsActivity"
android:action="net.i2p.android.router.PREFS_NET" />
</Preference>
<Preference android:title="@string/label_graphs">
<intent
android:targetPackage="net.i2p.android.donate"
android:targetClass="net.i2p.android.router.SettingsActivity"
android:action="net.i2p.android.router.PREFS_GRAPHS" />
</Preference>
<Preference android:title="@string/settings_label_logging">
<intent
android:targetPackage="net.i2p.android.donate"
android:targetClass="net.i2p.android.router.SettingsActivity"
android:action="net.i2p.android.router.PREFS_LOGGING" />
</Preference>
<Preference android:title="@string/label_addressbook">
<intent
android:targetPackage="net.i2p.android.donate"
android:targetClass="net.i2p.android.router.addressbook.AddressbookSettingsActivity" />
</Preference>
<Preference android:title="@string/settings_label_advanced">
<intent
android:targetPackage="net.i2p.android.donate"
android:targetClass="net.i2p.android.router.SettingsActivity"
android:action="net.i2p.android.router.PREFS_ADVANCED" />
</Preference>
</PreferenceScreen>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
android:title="@string/settings_label_bandwidth_net">
<extra
android:name="settings"
android:value="net" />
</header>
<header
android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
android:title="@string/label_graphs">
<extra
android:name="settings"
android:value="graphs" />
</header>
<header
android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
android:title="@string/settings_label_logging">
<extra
android:name="settings"
android:value="logging" />
</header>
<header
android:title="@string/label_addressbook">
<intent
android:targetPackage="net.i2p.android.router"
android:targetClass="net.i2p.android.router.addressbook.AddressbookSettingsActivity" />
</header>
<header
android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
android:title="@string/settings_label_advanced">
<extra
android:name="settings"
android:value="advanced" />
</header>
</preference-headers>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<Preference android:title="@string/settings_label_bandwidth_net">
<intent
android:targetPackage="net.i2p.android.router"
android:targetClass="net.i2p.android.router.SettingsActivity"
android:action="net.i2p.android.router.PREFS_NET" />
</Preference>
<Preference android:title="@string/label_graphs">
<intent
android:targetPackage="net.i2p.android.router"
android:targetClass="net.i2p.android.router.SettingsActivity"
android:action="net.i2p.android.router.PREFS_GRAPHS" />
</Preference>
<Preference android:title="@string/settings_label_logging">
<intent
android:targetPackage="net.i2p.android.router"
android:targetClass="net.i2p.android.router.SettingsActivity"
android:action="net.i2p.android.router.PREFS_LOGGING" />
</Preference>
<Preference android:title="@string/label_addressbook">
<intent
android:targetPackage="net.i2p.android.router"
android:targetClass="net.i2p.android.router.addressbook.AddressbookSettingsActivity" />
</Preference>
<Preference android:title="@string/settings_label_advanced">
<intent
android:targetPackage="net.i2p.android.router"
android:targetClass="net.i2p.android.router.SettingsActivity"
android:action="net.i2p.android.router.PREFS_ADVANCED" />
</Preference>
</PreferenceScreen>

View File

@ -0,0 +1,241 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.i2p.android.router"
android:installLocation="auto"
android:sharedUserId="net.i2p">
<uses-sdk xmlns:tools="http://schemas.android.com/tools"
tools:overrideLibrary="android.support.v14.preference" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<!-- following two are for UPnP -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<!-- required for reliable core functionality on Android, see:
https://geti2p.net/en/docs/applications/embedding
heading: "Design for and Encourage Long Uptimes"
-->
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<application
android:icon="@drawable/ic_launcher_itoopie"
android:label="@string/app_name"
android:theme="@style/Theme.I2P">
<service
android:name=".service.RouterService"
android:icon="@drawable/ic_launcher_itoopie"
android:enabled="true"
android:exported="true"
android:label="@string/app_name"
android:foregroundServiceType="specialUse">
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="i2p_router_background_process_required_network_operation"/>
<intent-filter>
<action android:name="net.i2p.android.router.service.IRouterState" />
</intent-filter>
</service>
<provider
android:name=".provider.CacheProvider"
android:authorities="${applicationId}.provider" />
<receiver
android:name=".receiver.OnBootReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver
android:name=".receiver.RemoteStartReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="net.i2p.android.router.receiver.START_I2P" />
</intent-filter>
</receiver>
<activity
android:name="net.i2p.android.I2PActivity"
android:icon="@drawable/ic_launcher_itoopie"
android:label="@string/app_name"
android:launchMode="singleTop"
android:exported="true">
<!-- Console filters -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="net.i2p.android.router.START_I2P" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="net.i2p.android.router.service.APPROVE_SAM" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- Addressbook filters -->
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable_addressbook" />
</activity>
<activity
android:name=".NewsActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/label_news"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name="net.i2p.android.help.HelpActivity"
android:label="@string/menu_help"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name="net.i2p.android.help.BrowserConfigActivity"
android:label="@string/label_browser_configuration"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name=".LicenseActivity"
android:label="@string/label_licenses"
android:parentActivityName="net.i2p.android.help.HelpActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.help.HelpActivity" />
</activity>
<activity
android:name=".web.WebActivity"
android:configChanges="orientation|keyboardHidden"
android:exported="true"
android:label="I2P Web Browser">
<!-- Disabled, this browser is not very secure
Temporarily enabled until an alternative browser is ready -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="*.i2p"
android:scheme="http" />
</intent-filter>
</activity>
<activity
android:name=".SettingsActivity"
android:label="@string/menu_settings"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name=".addressbook.AddressbookSettingsActivity"
android:label="@string/label_addressbook"
android:launchMode="singleTop"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name=".addressbook.AddressbookAddWizardActivity"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name="net.i2p.android.i2ptunnel.TunnelDetailActivity"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name="net.i2p.android.i2ptunnel.preferences.EditTunnelActivity"
android:label="@string/edit_tunnel"
android:parentActivityName="net.i2p.android.i2ptunnel.TunnelDetailActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.i2ptunnel.TunnelDetailActivity" />
</activity>
<activity
android:name="net.i2p.android.i2ptunnel.TunnelWizardActivity"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name=".log.LogActivity"
android:label="@string/label_logs"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name=".log.LogDetailActivity"
android:label="@string/log_entry"
android:parentActivityName=".log.LogActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.router.log.LogActivity" />
</activity>
<activity
android:name=".stats.RateGraphActivity"
android:label="@string/label_graphs"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name=".stats.PeersActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/label_peers_status"
android:launchMode="singleTop"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name=".netdb.NetDbActivity"
android:label="NetDB"
android:parentActivityName="net.i2p.android.I2PActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.I2PActivity" />
</activity>
<activity
android:name=".netdb.NetDbDetailActivity"
android:label="NetDB Detail"
android:parentActivityName=".netdb.NetDbActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.router.netdb.NetDbActivity" />
</activity>
</application>
</manifest>

View File

@ -0,0 +1,152 @@
//package android.support.v4.view;
package androidx.viewpager.widget;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
//import android.support.v4.os.ParcelableCompat;
import androidx.core.os.ParcelableCompat;
//import android.support.v4.os.ParcelableCompatCreatorCallbacks;
import androidx.core.os.ParcelableCompatCreatorCallbacks;
import androidx.viewpager.widget.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Toast;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
public class CustomViewPager extends ViewPager {
private boolean mEnabled;
private int mFixedPage;
private int mFixedPageString;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
mEnabled = false;
mFixedPage = -1;
mFixedPageString = 0;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return mEnabled && mFixedPage < 0 && super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// See Nov. 20, 2013 comment at:
// https://github.com/JakeWharton/ViewPagerIndicator/pull/257
// Our ticket #2488
// prevent NPE if fake dragging and touching ViewPager
if(isFakeDragging()) return false;
return mEnabled && mFixedPage < 0 && super.onInterceptTouchEvent(event);
}
@Override
public void setCurrentItem(int item) {
if ((mEnabled && (mFixedPage < 0 || item == mFixedPage))
|| (!mEnabled && item == 0))
super.setCurrentItem(item);
else if (!mEnabled)
Toast.makeText(getContext(), Util.getRouterContext() == null ?
R.string.router_not_running : R.string.router_shutting_down,
Toast.LENGTH_SHORT).show();
else if (mFixedPageString > 0)
Toast.makeText(getContext(), getContext().getString(mFixedPageString),
Toast.LENGTH_SHORT).show();
}
public void setPagingEnabled(boolean enabled) {
mEnabled = enabled;
updatePagingState();
}
public void setFixedPage(int page, int res) {
mFixedPage = page;
mFixedPageString = res;
updatePagingState();
}
public void updatePagingState() {
if (mEnabled) {
if (mFixedPage >= 0 && getCurrentItem() != mFixedPage)
setCurrentItem(mFixedPage);
} else if (getCurrentItem() != 0)
setCurrentItem(0);
}
public static class SavedState extends ViewPager.SavedState {
boolean enabled;
int fixedPage;
int fixedPageString;
public SavedState(Parcelable superState) {
super(superState);
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(enabled ? 1 : 0);
out.writeInt(fixedPage);
out.writeInt(fixedPageString);
}
@Override
public String toString() {
return "CustomViewPager.SavedState{"
+ Integer.toHexString(System.identityHashCode(this))
+ " enabled=" + enabled + " fixedPage=" + fixedPage + "}";
}
public static final Parcelable.Creator<SavedState> CREATOR
= ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks<SavedState>() {
@Override
public SavedState createFromParcel(Parcel in, ClassLoader loader) {
return new SavedState(in, loader);
}
@Override
public SavedState[] newArray(int size) {
return new SavedState[size];
}
});
SavedState(Parcel in, ClassLoader loader) {
super(in, loader);
enabled = in.readInt() != 0;
fixedPage = in.readInt();
fixedPageString = in.readInt();
}
}
@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.enabled = mEnabled;
ss.fixedPage = mFixedPage;
ss.fixedPageString = mFixedPageString;
return ss;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState)state;
super.onRestoreInstanceState(ss.getSuperState());
mEnabled = ss.enabled;
mFixedPage = ss.fixedPage;
mFixedPageString = ss.fixedPageString;
}
}

View File

@ -0,0 +1,163 @@
package com.pavelsikun.seekbarpreference;
import android.content.Context;
import android.content.res.TypedArray;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
//import android.support.v7.preference.Preference;
import androidx.preference.Preference;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import net.i2p.android.router.R;
/**
* Based on MaterialSeekBarController created by mrbimc on 30.09.15.
*/
public class MaterialSeekBarController implements SeekBar.OnSeekBarChangeListener {
private final String TAG = getClass().getName();
public static final int DEFAULT_CURRENT_VALUE = 50;
private static final int DEFAULT_MAX_VALUE = 100;
private static final String DEFAULT_MEASUREMENT_UNIT = "";
private int mMaxValue;
private int mMaxDigits;
private int mCurrentValue;
private String mMeasurementUnit;
private SeekBar mSeekBar;
private TextView mSeekBarValue;
private TextView mMeasurementUnitView;
private Context mContext;
private Persistable mPersistable;
public MaterialSeekBarController(Context context, AttributeSet attrs, Persistable persistable) {
mContext = context;
mPersistable = persistable;
init(attrs, null);
}
private void init(AttributeSet attrs, View view) {
setValuesFromXml(attrs);
if(view != null) onBindView(view);
}
private void setValuesFromXml(@Nullable AttributeSet attrs) {
if (attrs == null) {
mCurrentValue = DEFAULT_CURRENT_VALUE;
mMaxValue = DEFAULT_MAX_VALUE;
mMeasurementUnit = DEFAULT_MEASUREMENT_UNIT;
} else {
TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.SeekBarPreference);
try {
mMaxValue = a.getInt(R.styleable.SeekBarPreference_msbp_maxValue, DEFAULT_MAX_VALUE);
mCurrentValue = a.getInt(R.styleable.SeekBarPreference_msbp_defaultValue, DEFAULT_CURRENT_VALUE);
if(mCurrentValue > mMaxValue) mCurrentValue = mMaxValue / 2;
mMeasurementUnit = a.getString(R.styleable.SeekBarPreference_msbp_measurementUnit);
if (mMeasurementUnit == null)
mMeasurementUnit = DEFAULT_MEASUREMENT_UNIT;
} finally {
a.recycle();
}
}
mMaxDigits = (int) Math.log10(mMaxValue) + 1;
}
public void onBindView(@NonNull View view) {
mSeekBar = (SeekBar) view.findViewById(R.id.seekbar);
mSeekBar.setMax(mMaxValue);
mSeekBar.setOnSeekBarChangeListener(this);
mSeekBarValue = (TextView) view.findViewById(R.id.seekbar_value);
setPaddedValue(mCurrentValue);
mMeasurementUnitView = (TextView) view.findViewById(R.id.measurement_unit);
mMeasurementUnitView.setText(mMeasurementUnit);
mSeekBar.setProgress(mCurrentValue);
if (!view.isEnabled()) {
mSeekBar.setEnabled(false);
mSeekBarValue.setEnabled(false);
}
}
protected void onSetInitialValue(boolean restoreValue, @NonNull Object defaultValue) {
mCurrentValue = mMaxValue / 2;
try {
mCurrentValue = (Integer) defaultValue;
} catch (Exception ex) {
Log.e(TAG, "Invalid default value: " + defaultValue.toString());
}
}
public void setEnabled(boolean enabled) {
if (mSeekBar != null) mSeekBar.setEnabled(enabled);
if (mSeekBarValue != null) mSeekBarValue.setEnabled(enabled);
}
public void onDependencyChanged(Preference dependency, boolean disableDependent) {
if (mSeekBar != null) mSeekBar.setEnabled(!disableDependent);
if (mSeekBarValue != null) mSeekBarValue.setEnabled(!disableDependent);
}
//SeekBarListener:
@Override
public void onProgressChanged(@NonNull SeekBar seekBar, int progress, boolean fromUser) {
mCurrentValue = progress;
setPaddedValue(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(@NonNull SeekBar seekBar) {
setCurrentValue(mCurrentValue);
}
private void setPaddedValue(int value) {
//mSeekBarValue.setText(String.format("%0" + mMaxDigits +"d", value));
mSeekBarValue.setText(String.format("%" + mMaxDigits +"d", value));
}
//public methods for manipulating this widget from java:
public void setCurrentValue(int value) {
mCurrentValue = value;
if (mPersistable != null) mPersistable.onPersist(value);
}
public int getCurrentValue() {
return mCurrentValue;
}
public void setMaxValue(int maxValue) {
mMaxValue = maxValue;
if (mSeekBar != null) mSeekBar.setMax(mMaxValue);
}
public int getMaxValue() {
return mMaxValue;
}
public void setMeasurementUnit(String measurementUnit) {
mMeasurementUnit = measurementUnit;
if (mMeasurementUnitView != null) mMeasurementUnitView.setText(mMeasurementUnit);
}
public String getMeasurementUnit() {
return mMeasurementUnit;
}
}

View File

@ -0,0 +1,8 @@
package com.pavelsikun.seekbarpreference;
/**
* Created by mrbimc on 04.10.15.
*/
public interface Persistable {
void onPersist(int value);
}

View File

@ -0,0 +1,106 @@
package com.pavelsikun.seekbarpreference;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
import androidx.annotation.NonNull;
//import android.support.v7.preference.Preference;
import androidx.preference.Preference;
//import android.support.v7.preference.PreferenceViewHolder;
import androidx.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import net.i2p.android.router.R;
public class SeekBarPreference extends Preference implements Persistable {
private MaterialSeekBarController mController;
public SeekBarPreference(Context context) {
super(context);
init(null);
}
public SeekBarPreference(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
public SeekBarPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(attrs);
}
private void init(AttributeSet attrs) {
setLayoutResource(R.layout.seekbar_preference);
mController = new MaterialSeekBarController(getContext(), attrs, this);
}
@Override
public void onBindViewHolder(@NonNull PreferenceViewHolder viewHolder) {
super.onBindViewHolder(viewHolder);
mController.onBindView(viewHolder.itemView);
}
@Override
protected Object onGetDefaultValue(@NonNull TypedArray ta, int index) {
if(mController != null) return ta.getInt(index, mController.getCurrentValue());
else return null;
}
@Override
protected void onSetInitialValue(boolean restoreValue, @NonNull Object defaultValue) {
int average = mController.getMaxValue() / 2;
if(restoreValue) mController.setCurrentValue(getPersistedInt(average));
else mController.onSetInitialValue(restoreValue, defaultValue);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
mController.setEnabled(enabled);
}
@Override
public void onDependencyChanged(Preference dependency, boolean disableDependent) {
super.onDependencyChanged(dependency, disableDependent);
mController.onDependencyChanged(dependency, disableDependent);
}
@Override
public void onPersist(int value) {
persistInt(value);
notifyChanged();
}
public String getMeasurementUnit() {
return mController.getMeasurementUnit();
}
public void setMeasurementUnit(String measurementUnit) {
mController.setMeasurementUnit(measurementUnit);
}
public int getMaxValue() {
return mController.getMaxValue();
}
public void setMaxValue(int maxValue) {
mController.setMaxValue(maxValue);
}
public int getCurrentValue() {
return mController.getCurrentValue();
}
public void setCurrentValue(int value) {
mController.setCurrentValue(value);
}
}

View File

@ -0,0 +1,382 @@
package net.i2p.android;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
//import android.support.v4.app.FragmentManager;
import androidx.fragment.app.FragmentManager;
//import android.support.v4.content.LocalBroadcastManager;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
//import android.support.v7.widget.Toolbar;
import androidx.appcompat.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import net.i2p.android.help.HelpActivity;
import net.i2p.android.i2ptunnel.TunnelsContainer;
import net.i2p.android.router.ConsoleContainer;
import net.i2p.android.router.MainFragment;
import net.i2p.android.router.R;
import net.i2p.android.router.SettingsActivity;
import net.i2p.android.router.addressbook.AddressbookContainer;
import net.i2p.android.router.service.AndroidSAMSecureSession;
import net.i2p.android.router.service.RouterService;
import net.i2p.android.router.service.State;
import net.i2p.android.router.util.Connectivity;
import net.i2p.android.router.util.Util;
import net.i2p.android.util.MemoryFragmentPagerAdapter;
import androidx.viewpager.widget.CustomViewPager;
import net.i2p.android.widget.SlidingTabLayout;
import net.i2p.router.RouterContext;
import java.io.File;
/**
* The main activity of the app. Contains a ViewPager that holds the three main
* views:
* <ul>
* <li>The console</li>
* <li>The addressbook</li>
* <li>The tunnel manager</li>
* </ul>
*/
public class I2PActivity extends I2PActivityBase implements
MainFragment.RouterControlListener {
CustomViewPager mViewPager;
ViewPagerAdapter mViewPagerAdapter;
SlidingTabLayout mSlidingTabLayout;
private boolean mAutoStartFromIntent = false;
private boolean _keep = true;
private boolean _startPressed = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_viewpager);
Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
mViewPager = (CustomViewPager) findViewById(R.id.pager);
mViewPagerAdapter = new ViewPagerAdapter(this, getSupportFragmentManager());
mViewPager.setAdapter(mViewPagerAdapter);
mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
// Center the tabs in the layout
mSlidingTabLayout.setDistributeEvenly(true);
// Customize tab color
mSlidingTabLayout.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
@Override
public int getIndicatorColor(int position) {
return getResources().getColor(R.color.accent);
}
});
// Give the SlidingTabLayout the ViewPager
mSlidingTabLayout.setViewPager(mViewPager);
_keep = true;
}
public static class ViewPagerAdapter extends MemoryFragmentPagerAdapter {
private static final int NUM_ITEMS = 3;
private Context mContext;
public ViewPagerAdapter(Context context, FragmentManager fm) {
super(fm);
mContext = context;
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new ConsoleContainer();
case 1:
return new TunnelsContainer();
case 2:
return new AddressbookContainer();
default:
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return mContext.getString(R.string.label_console);
case 1:
return mContext.getString(R.string.label_tunnels);
case 2:
return mContext.getString(R.string.label_addresses);
default:
return null;
}
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
Util.d("Initializing...");
InitActivities init = new InitActivities(this);
init.debugStuff();
init.initialize();
super.onPostCreate(savedInstanceState);
handleIntents();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
handleIntents();
}
private void handleIntents() {
if (getIntent() == null)
return;
Intent intent = getIntent();
String action = intent.getAction();
Util.d("handleIntent: intent=" + intent.toString());
if (action == null)
return;
Util.d("handleIntent: action=" + action);
Bundle extra = intent.getExtras();
if (extra != null)
Util.d("handleIntent extra=" + extra.toString());
switch (action) {
case "net.i2p.android.router.START_I2P":
if (mViewPager.getCurrentItem() != 0)
mViewPager.setCurrentItem(0, false);
autoStart();
break;
case "net.i2p.android.router.service.APPROVE_SAM":
Util.w("Affirmed SAM Connection");
String ID = extra.getString("ID");
Util.d("SAM ID was: " + ID);
AndroidSAMSecureSession.affirmResult(ID);
break;
case Intent.ACTION_PICK:
mViewPager.setFixedPage(2, R.string.select_an_address);
break;
}
}
private void autoStart() {
if (canStart()) {
if (Connectivity.isConnected(this)) {
mAutoStartFromIntent = true;
onStartRouterClicked();
} else {
// Not connected to a network
// TODO: Notify user
}
} else {
// TODO: Notify user
}
}
@Override
public void onStart() {
super.onStart();
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
IntentFilter filter = new IntentFilter();
filter.addAction(RouterService.LOCAL_BROADCAST_STATE_NOTIFICATION);
filter.addAction(RouterService.LOCAL_BROADCAST_STATE_CHANGED);
lbm.registerReceiver(onStateChange, filter);
}
private BroadcastReceiver onStateChange = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
State state = intent.getParcelableExtra(RouterService.LOCAL_BROADCAST_EXTRA_STATE);
if (_startPressed && Util.getRouterContext() != null)
_startPressed = false;
// Update menus, FAMs etc.
supportInvalidateOptionsMenu();
// Update main paging state
mViewPager.setPagingEnabled(!(Util.isStopping(state) || Util.isStopped(state)));
// If I2P was started by another app and is running, return to that app
if (state == State.RUNNING && mAutoStartFromIntent) {
I2PActivity.this.setResult(RESULT_OK);
finish();
}
}
};
@Override
public void onResume() {
super.onResume();
// Handle edge cases after shutting down router
mViewPager.updatePagingState();
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(RouterService.LOCAL_BROADCAST_REQUEST_STATE));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_base_actions, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_settings:
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
case R.id.menu_help:
Intent hi = new Intent(this, HelpActivity.class);
switch (mViewPager.getCurrentItem()) {
case 1:
hi.putExtra(HelpActivity.CATEGORY, HelpActivity.CAT_I2PTUNNEL);
break;
case 2:
hi.putExtra(HelpActivity.CATEGORY, HelpActivity.CAT_ADDRESSBOOK);
break;
}
startActivity(hi);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void onBackPressed() {
super.onBackPressed();
RouterContext ctx = Util.getRouterContext();
// RouterService svc = _routerService; Which is better to use?!
_keep = Connectivity.isConnected(this) && (ctx != null || _startPressed);
Util.d("*********************************************************");
Util.d("Back pressed, Keep? " + _keep);
Util.d("*********************************************************");
}
@Override
public void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(this).unregisterReceiver(onStateChange);
}
@Override
public void onDestroy() {
super.onDestroy();
if (!_keep) {
Thread t = new Thread(new KillMe());
t.start();
}
}
private class KillMe implements Runnable {
public void run() {
Util.d("*********************************************************");
Util.d("KillMe started!");
Util.d("*********************************************************");
try {
Thread.sleep(500); // is 500ms long enough?
} catch (InterruptedException ex) {
}
System.exit(0);
}
}
private boolean canStart() {
RouterService svc = _routerService;
return (svc == null) || (!_isBound) || svc.canManualStart();
}
private boolean canStop() {
RouterService svc = _routerService;
return svc != null && _isBound && svc.canManualStop();
}
// MainFragment.RouterControlListener
public boolean shouldShowOnOff() {
return (canStart() && Connectivity.isConnected(this)) || (canStop() && !isGracefulShutdownInProgress());
}
public boolean shouldBeOn() {
String action = getIntent().getAction();
return (canStop()) ||
(action != null && action.equals("net.i2p.android.router.START_I2P"));
}
public void onStartRouterClicked() {
_startPressed = true;
RouterService svc = _routerService;
if (svc != null && _isBound) {
setPref(PREF_AUTO_START, true);
svc.manualStart();
} else {
(new File(Util.getFileDir(this), "wrapper.log")).delete();
startRouter();
}
}
public boolean onStopRouterClicked() {
RouterService svc = _routerService;
if (svc != null && _isBound) {
setPref(PREF_AUTO_START, false);
svc.manualQuit();
return true;
}
return false;
}
/** @since 0.9.19 */
public boolean isGracefulShutdownInProgress() {
RouterService svc = _routerService;
return svc != null && svc.isGracefulShutdownInProgress();
}
/** @since 0.9.19 */
public boolean onGracefulShutdownClicked() {
RouterService svc = _routerService;
if(svc != null && _isBound) {
setPref(PREF_AUTO_START, false);
svc.gracefulShutdown();
return true;
}
return false;
}
/** @since 0.9.19 */
public boolean onCancelGracefulShutdownClicked() {
RouterService svc = _routerService;
if(svc != null && _isBound) {
setPref(PREF_AUTO_START, false);
svc.cancelGracefulShutdown();
return true;
}
return false;
}
}

View File

@ -0,0 +1,208 @@
package net.i2p.android;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.IBinder;
//import android.support.v7.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatActivity;
import net.i2p.android.router.service.RouterBinder;
import net.i2p.android.router.service.RouterService;
import net.i2p.android.router.util.Util;
import net.i2p.android.util.LocaleManager;
public abstract class I2PActivityBase extends AppCompatActivity {
/**
* Router variables
*/
protected boolean _isBound;
protected boolean _triedBind;
protected ServiceConnection _connection;
protected RouterService _routerService;
private SharedPreferences _sharedPrefs;
private static final String SHARED_PREFS = "net.i2p.android.router";
protected static final String PREF_AUTO_START = "autoStart";
/**
* true leads to a poor install experience, very slow to paint the screen
*/
protected static final boolean DEFAULT_AUTO_START = false;
private final LocaleManager localeManager = new LocaleManager();
/**
* Called when the activity is first created.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
Util.d(this + " onCreate called");
localeManager.onCreate(this);
super.onCreate(savedInstanceState);
_sharedPrefs = getSharedPreferences(SHARED_PREFS, 0);
}
@Override
public void onRestart() {
Util.d(this + " onRestart called");
super.onRestart();
}
@Override
public void onStart() {
Util.d(this + " onStart called");
super.onStart();
if (_sharedPrefs.getBoolean(PREF_AUTO_START, DEFAULT_AUTO_START))
startRouter();
else
bindRouter(false);
}
/**
* @param def default
*/
public boolean getPref(String pref, boolean def) {
return _sharedPrefs.getBoolean(pref, def);
}
/**
* @param def default
*/
public String getPref(String pref, String def) {
return _sharedPrefs.getString(pref, def);
}
/**
* @return success
*/
public boolean setPref(String pref, boolean val) {
SharedPreferences.Editor edit = _sharedPrefs.edit();
edit.putBoolean(pref, val);
return edit.commit();
}
/**
* @return success
*/
public boolean setPref(String pref, String val) {
SharedPreferences.Editor edit = _sharedPrefs.edit();
edit.putString(pref, val);
return edit.commit();
}
@Override
public void onResume() {
Util.d(this + " onResume called");
super.onResume();
localeManager.onResume(this);
}
public void notifyLocaleChanged() {
localeManager.onResume(this);
}
@Override
public void onPause() {
Util.d(this + " onPause called");
super.onPause();
}
@Override
public void onSaveInstanceState(Bundle outState) {
Util.d(this + " onSaveInstanceState called");
super.onSaveInstanceState(outState);
}
@Override
public void onStop() {
Util.d(this + " onStop called");
unbindRouter();
super.onStop();
}
@Override
public void onDestroy() {
Util.d(this + " onDestroy called");
super.onDestroy();
}
////// Service stuff
/**
* Start the service and bind to it
*/
protected boolean startRouter() {
Intent intent = new Intent();
intent.setClassName(this, "net.i2p.android.router.service.RouterService");
Util.d(this + " calling startService");
ComponentName name = startService(intent);
if (name == null)
Util.d(this + " XXXXXXXXXXXXXXXXXXXX got null from startService!");
Util.d(this + " got from startService: " + name);
boolean success = bindRouter(true);
if (!success)
Util.d(this + " Bind router failed");
return success;
}
/**
* Bind only
*/
protected boolean bindRouter(boolean autoCreate) {
Intent intent = new Intent(RouterBinder.class.getName());
intent.setClassName(this, "net.i2p.android.router.service.RouterService");
Util.d(this + " calling bindService");
_connection = new RouterConnection();
_triedBind = bindService(intent, _connection, autoCreate ? BIND_AUTO_CREATE : 0);
Util.d(this + " bindService: auto create? " + autoCreate + " success? " + _triedBind);
return _triedBind;
}
protected void unbindRouter() {
Util.d(this + " unbindRouter called with _isBound:" + _isBound + " _connection:" + _connection + " _triedBind:" + _triedBind);
if (_triedBind && _connection != null)
unbindService(_connection);
_triedBind = false;
_connection = null;
_routerService = null;
_isBound = false;
}
/**
* Class for interacting with the main interface of the RouterService.
*/
protected class RouterConnection implements ServiceConnection {
public void onServiceConnected(ComponentName name, IBinder service) {
Util.d(this + " connected to router service");
RouterBinder binder = (RouterBinder) service;
RouterService svc = binder.getService();
_routerService = svc;
_isBound = true;
onRouterBind(svc);
}
public void onServiceDisconnected(ComponentName name) {
Util.d(this + " disconnected from router service!!!!!!!");
// save memory
_routerService = null;
_isBound = false;
onRouterUnbind();
}
}
/**
* callback from ServiceConnection, override as necessary
*/
protected void onRouterBind(RouterService svc) {
}
/**
* callback from ServiceConnection, override as necessary
*/
protected void onRouterUnbind() {
}
}

View File

@ -0,0 +1,325 @@
package net.i2p.android;
import android.content.Context;
import android.content.res.Resources;
import android.os.Build;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
import net.i2p.data.DataHelper;
import net.i2p.util.FileUtil;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
// Wouldn't this be better as a private class in MainActivity?
class InitActivities {
private final Context ctx;
private final String myDir;
private final String _ourVersion;
private static final String CONFIG_FILE = "android.config";
private static final String PROP_NEW_INSTALL = "i2p.newInstall";
private static final String PROP_NEW_VERSION = "i2p.newVersion";
private static final String PROP_INSTALLED_VERSION = "i2p.version";
public InitActivities(Context c) {
ctx = c;
myDir = Util.getFileDir(c);
Util.i("My app directory is "+myDir);
_ourVersion = Util.getOurVersion(c);
}
void debugStuff() {
Util.d("java.io.tmpdir" + ": " + System.getProperty("java.io.tmpdir"));
Util.d("java.vendor" + ": " + System.getProperty("java.vendor"));
Util.d("java.version" + ": " + System.getProperty("java.version"));
Util.d("os.arch" + ": " + System.getProperty("os.arch"));
Util.d("os.name" + ": " + System.getProperty("os.name"));
Util.d("os.version" + ": " + System.getProperty("os.version"));
Util.d("user.dir" + ": " + System.getProperty("user.dir"));
Util.d("user.home" + ": " + System.getProperty("user.home"));
Util.d("user.name" + ": " + System.getProperty("user.name"));
Util.d("getFilesDir()" + ": " + myDir);
Util.d("max mem" + ": " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()));
Util.d("Package" + ": " + ctx.getPackageName());
Util.d("Version" + ": " + _ourVersion);
Util.d("MODEL" + ": " + Build.MODEL);
Util.d("DISPLAY" + ": " + Build.DISPLAY);
Util.d("VERSION" + ": " + Build.VERSION.RELEASE);
Util.d("SDK" + ": " + Build.VERSION.SDK_INT);
}
void initialize() {
Util.i("Initializing the I2P resources");
List<Properties> lProps = Util.getPropertiesFromPreferences(ctx);
Properties props = lProps.get(0);
props.setProperty("i2p.dir.temp", myDir + "/tmp");
props.setProperty("i2p.dir.pid", myDir + "/tmp");
// Time disabled in default router.config
// But lots of time problems on Android, not all carriers support NITZ
// and there was no NTP before 3.0. Tablets should be fine?
// Phones in airplane mode with wifi enabled still a problem.
// Deactivated phones in airplane mode definitely won't have correct time.
if (Build.VERSION.SDK_INT < 11) // Honeycomb 3.0
props.setProperty("time.disabled", "false");
mergeResourceToFile(R.raw.router_config, "router.config", props);
mergeResourceToFile(R.raw.logger_config, "logger.config", lProps.get(1));
// This is not needed for now, i2ptunnel.config only contains tunnel
// settings, which can now be configured manually. We don't want to
// overwrite the user's tunnels.
//mergeResourceToFile(R.raw.i2ptunnel_config, "i2ptunnel.config", null);
copyResourceToFileIfAbsent(R.raw.i2ptunnel_config, "i2ptunnel.config");
// FIXME this is a memory hog to merge this way
mergeResourceToFile(R.raw.hosts_txt, "hosts.txt", null);
mergeResourceToFile(R.raw.more_hosts_txt, "hosts.txt", null);
copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt");
File abDir = new File(myDir, "addressbook");
abDir.mkdir();
copyResourceToFileIfAbsent(R.raw.subscriptions_txt, "addressbook/subscriptions.txt");
mergeResourceToFile(R.raw.addressbook_config_txt, "addressbook/config.txt", null);
File docsDir = new File(myDir, "docs");
docsDir.mkdir();
/*copyResourceToFile(R.raw.ahelper_conflict_header_ht, "docs/ahelper-conflict-header.ht");
copyResourceToFile(R.raw.ahelper_new_header_ht, "docs/ahelper-new-header.ht");
copyResourceToFile(R.raw.ahelper_notfound_header_ht, "docs/ahelper-notfound-header.ht");
copyResourceToFile(R.raw.auth_header_ht, "docs/auth-header.ht");
copyResourceToFile(R.raw.baduri_header_ht, "docs/baduri-header.ht");
copyResourceToFile(R.raw.denied_header_ht, "docs/denied-header.ht");
copyResourceToFile(R.raw.dnf_header_ht, "docs/dnf-header.ht");
copyResourceToFile(R.raw.dnfb_header_ht, "docs/dnfb-header.ht");
copyResourceToFile(R.raw.dnfh_header_ht, "docs/dnfh-header.ht");
copyResourceToFile(R.raw.dnfp_header_ht, "docs/dnfp-header.ht");
copyResourceToFile(R.raw.enc_header_ht, "docs/enc-header.ht");
copyResourceToFile(R.raw.encp_header_ht, "docs/encp-header.ht");
copyResourceToFile(R.raw.localhost_header_ht, "docs/localhost-header.ht");
copyResourceToFile(R.raw.nols_header_ht, "docs/nols-header.ht");
copyResourceToFile(R.raw.nolsp_header_ht, "docs/nolsp-header.ht");
copyResourceToFile(R.raw.noproxy_header_ht, "docs/noproxy-header.ht");
copyResourceToFile(R.raw.protocol_header_ht, "docs/protocol-header.ht");
copyResourceToFile(R.raw.reset_header_ht, "docs/reset-header.ht");
copyResourceToFile(R.raw.resetp_header_ht, "docs/resetp-header.ht");*/
File cssDir = new File(docsDir, "themes/console/light");
cssDir.mkdirs();
//copyResourceToFile(R.raw.console_css, "docs/themes/console/light/console.css");
//copyResourceToFile(R.raw.android_css, "docs/themes/console/light/android.css");
File imgDir = new File(docsDir, "themes/console/images");
imgDir.mkdir();
copyResourceToFile(R.drawable.i2plogo, "docs/themes/console/images/i2plogo.png");
copyResourceToFile(R.drawable.itoopie_sm, "docs/themes/console/images/itoopie_sm.png");
//copyResourceToFile(R.drawable.outbound, "docs/themes/console/images/outbound.png");
//copyResourceToFile(R.drawable.inbound, "docs/themes/console/images/inbound.png");
File img2Dir = new File(cssDir, "images");
img2Dir.mkdir();
//copyResourceToFile(R.drawable.header, "docs/themes/console/light/images/header.png");
File certDir = new File(myDir, "certificates");
certDir.mkdir();
File certificates = new File(myDir, "certificates");
File[] allCertificates = certificates.listFiles();
if ( allCertificates != null) {
for (File f : allCertificates) {
Util.d("Deleting old certificate file/dir " + f);
FileUtil.rmdir(f, false);
}
}
File netDBDir = new File(myDir, "netDB");
netDBDir.mkdir();
//unzipResourceToDir(R.raw.netdb_zip, "netDB");
unzipResourceToDir(R.raw.certificates_zip, "certificates");
// Set up the locations so settings can find them
System.setProperty("i2p.dir.base", myDir);
System.setProperty("i2p.dir.config", myDir);
System.setProperty("wrapper.logfile", myDir + "/wrapper.log");
}
/**
* @param f relative to base dir
*/
private void copyResourceToFileIfAbsent(int resID, String f) {
File file = new File(myDir, f);
if (!file.exists())
copyResourceToFile(resID, f);
}
/**
* @param f relative to base dir
*/
private void copyResourceToFile(int resID, String f) {
InputStream in = null;
FileOutputStream out = null;
Util.d("Creating file " + f + " from resource");
byte buf[] = new byte[4096];
try {
// Context methods
in = ctx.getResources().openRawResource(resID);
out = new FileOutputStream(new File(myDir, f));
int read;
while ( (read = in.read(buf)) != -1)
out.write(buf, 0, read);
} catch (IOException ioe) {
Util.e("copyResourceToFile" + "IOE: ", ioe);
} catch (Resources.NotFoundException nfe) {
Util.e("copyResourceToFile" + "NFE: ", nfe);
} finally {
if (in != null) try { in.close(); } catch (IOException ioe) {
Util.e("copyResourceToFile" + "IOE in.close(): ", ioe);
}
if (out != null) try { out.close(); } catch (IOException ioe) {
Util.e("copyResourceToFile" + "IOE out.close(): ", ioe);
}
}
}
/**
* @param folder relative to base dir
*/
private void unzipResourceToDir(int resID, String folder) {
InputStream in = null;
FileOutputStream out = null;
ZipInputStream zis = null;
Util.i("Creating files in '" + myDir + "/" + folder + "/' from resource");
try {
// Context methods
in = ctx.getResources().openRawResource(resID);
zis = new ZipInputStream((in));
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null) {
out = null;
Util.i("unzipping "+ze);
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count;
while ((count = zis.read(buffer)) != -1) {
baos.write(buffer, 0, count);
}
String name = ze.getName();
File f = new File(myDir + "/" + folder +"/" + name);
String canonicalPath = f.getCanonicalPath().replace("/user/0/", "/data/");
// account for canonical path differences when using .aab bundles
if (!canonicalPath.startsWith(myDir.replace("/user/0/", "/data/"))) {
// If these don't match, there's a path-traversal possibility.
// So ignore it.
Util.e("Path mismatch bug " + canonicalPath.toString() + " " + myDir.toString());
} else if (ze.isDirectory()) {
Util.i("Creating directory " + myDir + "/" + folder +"/" + name + " from resource");
f.mkdir();
} else {
Util.i("Creating file " + myDir + "/" + folder +"/" + name + " from resource");
//create all the leading directories
File newFile = new File(myDir+"/"+folder+"/"+name);
newFile.getParentFile().mkdirs();
byte[] bytes = baos.toByteArray();
out = new FileOutputStream(f);
out.write(bytes);
}
} catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: ", ioe);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: interior out.close ", ioe);
}
out = null;
}
}
}
} catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: ", ioe);
} catch (Resources.NotFoundException nfe) {
Util.e("unzipResourceToDir" + "NFE: ", nfe);
} finally {
if (in != null) try { in.close(); } catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: in.close() ", ioe);
}
if (out != null) try { out.close(); } catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: out.close() ", ioe);
}
if (zis != null) try { zis.close(); } catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: zis.close() ", ioe);
}
}
}
/**
* Load defaults from resource,
* then add props from settings,
* and write back.
*
* @param f relative to base dir
* @param overrides local overrides or null
*/
private void mergeResourceToFile(int resID, String f, Properties overrides) {
Util.mergeResourceToFile(ctx, myDir, f, resID, overrides, null);
}
/**
* Check for new version.
* FIXME we could just use shared prefs for this instead of storing in a file
* @return true if new version
*/
private boolean checkNewVersion() {
Properties props = new Properties();
Util.i("Checking for a new install/version");
InputStream fin = null;
try {
fin = ctx.openFileInput(CONFIG_FILE);
DataHelper.loadProps(props, fin);
} catch (IOException ioe) {
Util.i("Looks like a new install");
} finally {
if (fin != null) {
try {
Util.i("fin was not null "+CONFIG_FILE);
fin.close();
} catch (IOException ioe) {
Util.i("Error loading config:", ioe);
}
}else {
Util.i("fin was null");
}
}
String oldVersion = props.getProperty(PROP_INSTALLED_VERSION);
Util.i("Old version is:"+oldVersion);
boolean newInstall = oldVersion == null;
if (newInstall)
return true;
boolean newVersion = !_ourVersion.equals(oldVersion);
if (newVersion) {
Util.d("New version " + _ourVersion);
props.setProperty(PROP_INSTALLED_VERSION, _ourVersion);
try {
DataHelper.storeProps(props, ctx.getFileStreamPath(CONFIG_FILE));
} catch (IOException ioe) {
Util.d("Failed to write " + CONFIG_FILE);
}
}
return newVersion;
}
}

View File

@ -0,0 +1,159 @@
package net.i2p.android.apps;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
import net.i2p.I2PAppContext;
import net.i2p.data.DataHelper;
import net.i2p.util.EepGet;
import net.i2p.util.Log;
/**
* EepGet and return as a string. 256KB max.
*/
public class EepGetFetcher implements EepGet.StatusListener {
private final I2PAppContext _context;
private final Log _log;
private final String _url;
private final EepGet _eepget;
private final File _file;
private boolean _success;
private static final long MAX_LEN = 256*1024;
private static final String ERROR_HEADER = "<html><head><title>Not Found</title></head><body>";
private static final String ERROR_URL = "<p>Unable to load URL: ";
private static final String ERROR_ROUTER = "<p>Your router (or the HTTP proxy) does not appear to be running.</p>";
private static final String ERROR_FOOTER = "</body></html>";
/**
* Writes to temp file, call getData()
* to get the data as a String.
* Temp file sticks around forever.
*/
public EepGetFetcher(String url) {
_context = I2PAppContext.getGlobalContext();
_log = _context.logManager().getLog(EepGetFetcher.class);
_url = url;
_file = new File(_context.getTempDir(), "eepget-" + _context.random().nextLong());
_eepget = new EepGet(_context, true, "localhost", 4444, 0, -1, MAX_LEN,
_file.getAbsolutePath(), null, url,
true, null, null, null);
// use new 0.8.8 feature
_eepget.setWriteErrorToOutput();
//_eepget.addStatusListener(this);
}
/**
* Writes to output stream
*/
public EepGetFetcher(String url, OutputStream out, boolean writeErrorToStream) {
_context = I2PAppContext.getGlobalContext();
_log = _context.logManager().getLog(EepGetFetcher.class);
_url = url;
_file = null;
_eepget = new EepGet(_context, true, "localhost", 4444, 0, -1, MAX_LEN,
null, out, url,
true, null, null, null);
if (writeErrorToStream)
_eepget.setWriteErrorToOutput();
}
public void addStatusListener(EepGet.StatusListener l) {
_eepget.addStatusListener(l);
}
public boolean fetch() {
_success = _eepget.fetch();
return _success;
}
/**
* @return non-null
*/
public String getContentType() {
if (_eepget.getStatusCode() < 0)
return "text/html";
String rv = _eepget.getContentType();
if (rv == null)
return "text/html";
int semi = rv.indexOf(";");
if (semi > 0)
rv = rv.substring(0, semi);
return rv.toLowerCase(Locale.US);
}
/**
* @return non-null
*/
public String getEncoding() {
if (_eepget.getStatusCode() < 0)
return "UTF-8";
String type = _eepget.getContentType();
String rv;
if (type == null || !type.startsWith("text"))
rv = "ISO-8859-1";
else
rv = "UTF-8";
return rv;
}
/**
* @return -1 if nothing back from server
*/
public int getStatusCode() {
return _eepget.getStatusCode();
}
/**
* Only for the constructor without the output stream
* Only call ONCE!
* FIXME we don't get the proxy error pages this way
*/
public String getData() {
String rv;
int statusCode = _eepget.getStatusCode();
if (statusCode < 0) {
rv = ERROR_HEADER + ERROR_URL + "<a href=\"" + _url + "\">" + _url +
"</a></p>" + ERROR_ROUTER + ERROR_FOOTER;
_file.delete();
} else if (_file.length() <= 0) {
rv = ERROR_HEADER + ERROR_URL + "<a href=\"" + _url + "\">" + _url +
"</a> No data returned, error code: " + statusCode +
"</p>" + ERROR_FOOTER;
_file.delete();
} else {
InputStream fis = null;
try {
fis = new FileInputStream(_file);
byte[] data = new byte[(int) _file.length()];
DataHelper.read(fis, data);
rv = new String(data, getEncoding());
} catch (IOException ioe) {
_log.error("fetcher", ioe);
rv = "I/O error";
} finally {
if (fis != null) try { fis.close(); } catch (IOException ioe) {}
_file.delete();
}
}
return rv;
}
public void attemptFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt, int numRetries, Exception cause) {}
public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {}
public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {}
public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {}
public void headerReceived(String url, int attemptNum, String key, String val) {}
public void attempting(String url) {}
}

View File

@ -0,0 +1,617 @@
package net.i2p.android.apps;
import static net.i2p.app.ClientAppState.INITIALIZED;
import static net.i2p.app.ClientAppState.RUNNING;
import static net.i2p.app.ClientAppState.STARTING;
import static net.i2p.app.ClientAppState.STOPPED;
import static net.i2p.app.ClientAppState.STOPPING;
import static net.i2p.app.ClientAppState.UNINITIALIZED;
import static net.i2p.update.UpdateType.BLOCKLIST;
import android.content.Context;
import net.i2p.android.router.NewsActivity;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Notifications;
import net.i2p.app.ClientApp;
import net.i2p.app.ClientAppManager;
import net.i2p.app.ClientAppState;
import net.i2p.crypto.SU3File;
import net.i2p.data.Base64;
import net.i2p.data.DataHelper;
import net.i2p.data.Hash;
import net.i2p.router.Banlist;
import net.i2p.router.Blocklist;
import net.i2p.router.RouterContext;
import net.i2p.router.news.BlocklistEntries;
import net.i2p.router.news.NewsEntry;
import net.i2p.router.news.NewsMetadata;
import net.i2p.router.news.NewsXMLParser;
import net.i2p.util.Addresses;
import net.i2p.util.EepGet;
import net.i2p.util.FileUtil;
import net.i2p.util.I2PAppThread;
import net.i2p.util.Log;
import net.i2p.util.RFC822Date;
import net.i2p.util.ReusableGZIPInputStream;
import net.i2p.util.SecureFile;
import net.i2p.util.SecureFileOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
/**
* From router console, simplified since we don't deal with router versions
* or updates.
*
* As of 0.9.41, implements ClientApp to hang us off the ClientAppManager,
* so we can remove the static reference.
*/
public class NewsFetcher implements Runnable, EepGet.StatusListener, ClientApp {
private final Context mCtx;
private final RouterContext _context;
private final Notifications _notif;
private final Log _log;
private long _lastFetch;
private long _lastUpdated;
private String _lastModified;
private boolean _invalidated;
private File _newsFile;
private File _tempFile;
private volatile boolean _isRunning = true;
private Thread _thread;
private final ClientAppManager _mgr;
private volatile ClientAppState _state = UNINITIALIZED;
public static final String APP_NAME = "NewsFetcher";
static final String PROP_BLOCKLIST_TIME = "router.blocklistVersion";
private static final String BLOCKLIST_DIR = "docs/feed/blocklist";
private static final String BLOCKLIST_FILE = "blocklist.txt";
/**
* As of 0.9.41, returns a new one every time. Only call once.
*/
public static /* final */ synchronized NewsFetcher getInstance(
Context context, RouterContext ctx, Notifications notif) {
return new NewsFetcher(context, ctx, notif);
}
private static final String NEWS_DIR = "docs";
private static final String NEWS_FILE = "news.xml";
private static final String TEMP_NEWS_FILE = "news.xml.temp";
/**
* Changed in 0.9.11 to the b32 for psi.i2p, run by psi.
* We may be able to change it to psi.i2p in a future release after
* the hostname propagates.
*
* @since 0.7.14 not configurable
*/
private static final String BACKUP_NEWS_URL_SU3 = "http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news/news.su3";
private static final String PROP_LAST_CHECKED = "router.newsLastChecked";
private static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency";
private static final String DEFAULT_REFRESH_FREQUENCY = 24 * 60 * 60 * 1000 + "";
private static final String PROP_NEWS_URL = "router.newsURL";
public static final String DEFAULT_NEWS_URL_SU3 = "http://tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq.b32.i2p/news.su3";
private NewsFetcher(Context context, RouterContext ctx, Notifications notif) {
mCtx = context;
_context = ctx;
_notif = notif;
_log = ctx.logManager().getLog(NewsFetcher.class);
try {
String last = ctx.getProperty(PROP_LAST_CHECKED);
if (last != null)
_lastFetch = Long.parseLong(last);
} catch (NumberFormatException nfe) {
}
File newsDir = new File(_context.getRouterDir(), NEWS_DIR);
// isn't already there on android
newsDir.mkdir();
_newsFile = new File(newsDir, NEWS_FILE);
_tempFile = new File(_context.getTempDir(), TEMP_NEWS_FILE);
updateLastFetched();
_mgr = ctx.clientAppManager();
changeState(INITIALIZED);
_mgr.register(this);
}
private void updateLastFetched() {
if (_newsFile.exists()) {
if (_lastUpdated == 0)
_lastUpdated = _newsFile.lastModified();
if (_lastFetch == 0)
_lastFetch = _lastUpdated;
if (_lastModified == null)
_lastModified = RFC822Date.to822Date(_lastFetch);
} else {
_lastUpdated = 0;
_lastFetch = 0;
_lastModified = null;
}
}
public String status() {
StringBuilder buf = new StringBuilder(128);
long now = _context.clock().now();
if (_lastUpdated > 0) {
buf.append(mCtx.getString(R.string.news_last_updated,
DataHelper.formatDuration2(now - _lastUpdated)))
.append('\n');
}
if (_lastFetch > _lastUpdated) {
buf.append(mCtx.getString(R.string.news_last_checked,
DataHelper.formatDuration2(now - _lastFetch)));
}
return buf.toString();
}
// Runnable
private static final long INITIAL_DELAY = 5 * 60 * 1000;
private static final long RUN_DELAY = 30 * 60 * 1000;
public void run() {
changeState(RUNNING);
try {
run2();
} finally {
_mgr.unregister(this);
changeState(STOPPED);
}
}
private void run2() {
try {
Thread.sleep(INITIAL_DELAY);
} catch (InterruptedException ie) {
return;
}
while (_isRunning && _context.router().isAlive()) {
if (shouldFetchNews()) {
fetchNews();
}
try {
Thread.sleep(RUN_DELAY);
} catch (InterruptedException ie) {
break;
}
}
}
private boolean shouldFetchNews() {
if (_invalidated)
return true;
updateLastFetched();
String freq = _context.getProperty(PROP_REFRESH_FREQUENCY,
DEFAULT_REFRESH_FREQUENCY);
try {
long ms = Long.parseLong(freq);
if (ms <= 0)
return false;
if (_lastFetch + ms < _context.clock().now()) {
return true;
} else {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Last fetched " + DataHelper.formatDuration(_context.clock().now() - _lastFetch) + " ago");
return false;
}
} catch (NumberFormatException nfe) {
if (_log.shouldLog(Log.ERROR))
_log.error("Invalid refresh frequency: " + freq);
return false;
}
}
/**
* Call this when changing news URLs to force an update next time the timer fires.
*
* @since 0.8.7
*/
void invalidateNews() {
_lastModified = null;
_invalidated = true;
}
public void fetchNews() {
String newsURL = _context.getProperty(PROP_NEWS_URL, DEFAULT_NEWS_URL_SU3);
String proxyHost = "127.0.0.1";
int proxyPort = 4444;
if (_tempFile.exists())
_tempFile.delete();
try {
// EepGet get = null;
EepGet get = new EepGet(_context, true, proxyHost, proxyPort, 0, _tempFile.getAbsolutePath(), newsURL, true, null, _lastModified);
get.addStatusListener(this);
if (get.fetch()) {
_lastModified = get.getLastModified();
_invalidated = false;
} else {
// backup news location - always proxied
_tempFile.delete();
get = new EepGet(_context, true, proxyHost, proxyPort, 0, _tempFile.getAbsolutePath(), BACKUP_NEWS_URL_SU3, true, null, _lastModified);
get.addStatusListener(this);
if (get.fetch())
_lastModified = get.getLastModified();
}
} catch (Throwable t) {
_log.error("Error fetching the news", t);
}
}
// EepGet.StatusListener
public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {
// ignore
}
public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {
if (_log.shouldLog(Log.INFO))
_log.info("News fetched from " + url + " with " + (alreadyTransferred + bytesTransferred));
long now = _context.clock().now();
if (_tempFile.exists() && _tempFile.length() > 0) {
File from;
if (url.endsWith(".su3")) {
try {
from = processSU3();
} catch (IOException ioe) {
_log.error("Failed to extract the news file", ioe);
_tempFile.delete();
return;
}
} else {
from = _tempFile;
}
boolean copied = FileUtil.rename(from, _newsFile);
_tempFile.delete();
if (copied) {
_lastUpdated = now;
// Notify user
_notif.notify(mCtx.getString(R.string.news_updated),
mCtx.getString(R.string.view_news),
NewsActivity.class);
} else {
if (_log.shouldLog(Log.ERROR))
_log.error("Failed to copy the news file!");
}
} else {
if (_log.shouldLog(Log.WARN))
_log.warn("Transfer complete, but no file? - probably 304 Not Modified");
}
_lastFetch = now;
_context.router().setConfigSetting(PROP_LAST_CHECKED, "" + now);
_context.router().saveConfig();
}
public void attemptFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt, int numRetries, Exception cause) {
// ignore
}
public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {
if (_log.shouldLog(Log.WARN))
_log.warn("Failed to fetch the news from " + url);
_tempFile.delete();
}
public void headerReceived(String url, int attemptNum, String key, String val) {
}
public void attempting(String url) {
}
//
// SU3 handlers
//
/**
* Process the fetched su3 news file _tempFile.
* Handles 3 types of contained files: xml.gz (preferred), xml, and html (old format fake xml)
*
* @return the temp file contining the HTML-format news.xml
* @since 0.9.20
*/
private File processSU3() throws IOException {
SU3File su3 = new SU3File(_context, _tempFile);
// real xml, maybe gz, maybe not
File to1 = new File(_context.getTempDir(), "tmp-" + _context.random().nextInt() + ".xml");
// real xml
File to2 = new File(_context.getTempDir(), "tmp2-" + _context.random().nextInt() + ".xml");
try {
su3.verifyAndMigrate(to1);
int type = su3.getFileType();
if (su3.getContentType() != SU3File.CONTENT_NEWS)
throw new IOException("bad content type: " + su3.getContentType());
if (type == SU3File.TYPE_HTML)
return to1;
if (type != SU3File.TYPE_XML && type != SU3File.TYPE_XML_GZ)
throw new IOException("bad file type: " + type);
File xml;
if (type == SU3File.TYPE_XML_GZ) {
gunzip(to1, to2);
xml = to2;
to1.delete();
} else {
xml = to1;
}
NewsXMLParser parser = new NewsXMLParser(_context);
parser.parse(xml);
xml.delete();
NewsMetadata data = parser.getMetadata();
List<NewsEntry> entries = parser.getEntries();
BlocklistEntries ble = parser.getBlocklistEntries();
if (ble != null && ble.isVerified())
processBlocklistEntries(ble);
else
_log.info("No blocklist entries found in news feed");
String sudVersion = su3.getVersionString();
String signingKeyName = su3.getSignerString();
File to3 = new File(_context.getTempDir(), "tmp3-" + _context.random().nextInt() + ".xml");
outputOldNewsXML(data, entries, sudVersion, signingKeyName, to3);
return to3;
} finally {
to2.delete();
}
}
/**
* Process blocklist entries
*
* @since 0.9.57
*/
private void processBlocklistEntries(BlocklistEntries ble) {
long oldTime = _context.getProperty(PROP_BLOCKLIST_TIME, 0L);
if (ble.updated <= oldTime) {
if (_log.shouldWarn())
_log.warn("Not processing blocklist " + DataHelper.formatDate(ble.updated) +
", already have " + DataHelper.formatDate(oldTime));
return;
}
Blocklist bl = _context.blocklist();
Banlist ban = _context.banlist();
String reason = "Blocklist feed " + DataHelper.formatDate(ble.updated);
int banned = 0;
for (Iterator<String> iter = ble.entries.iterator(); iter.hasNext(); ) {
String s = iter.next();
if (s.length() == 44) {
byte[] b = Base64.decode(s);
if (b == null || b.length != Hash.HASH_LENGTH) {
iter.remove();
continue;
}
Hash h = Hash.create(b);
if (!ban.isBanlistedForever(h)) {
ban.banlistRouterForever(h, reason);
_context.commSystem().forceDisconnect(h);
}
} else {
byte[] ip = Addresses.getIP(s);
if (ip == null) {
iter.remove();
continue;
}
if (!bl.isBlocklisted(ip))
bl.add(ip);
}
if (++banned >= BlocklistEntries.MAX_ENTRIES) {
// prevent somebody from destroying the whole network
break;
}
}
for (String s : ble.removes) {
if (s.length() == 44) {
byte[] b = Base64.decode(s);
if (b == null || b.length != Hash.HASH_LENGTH)
continue;
Hash h = Hash.create(b);
if (ban.isBanlistedForever(h))
ban.unbanlistRouter(h);
} else {
byte[] ip = Addresses.getIP(s);
if (ip == null)
continue;
if (bl.isBlocklisted(ip))
bl.remove(ip);
}
}
// Save the blocks. We do not save the unblocks.
File f = new SecureFile(_context.getConfigDir(), BLOCKLIST_DIR);
f.mkdirs();
f = new File(f, BLOCKLIST_FILE);
boolean fail = false;
BufferedWriter out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(f), "UTF-8"));
out.write("# ");
out.write(ble.supdated);
out.newLine();
banned = 0;
for (String s : ble.entries) {
s = s.replace(':', ';'); // IPv6
out.write(reason);
out.write(':');
out.write(s);
out.newLine();
if (++banned >= BlocklistEntries.MAX_ENTRIES)
break;
}
} catch (IOException ioe) {
_log.error("Error writing blocklist", ioe);
fail = true;
} finally {
if (out != null) try {
out.close();
} catch (IOException ioe) {}
}
if (!fail) {
f.setLastModified(ble.updated);
String upd = Long.toString(ble.updated);
_context.router().saveConfig(PROP_BLOCKLIST_TIME, upd);
}
if (_log.shouldWarn())
_log.warn("Processed " + ble.entries.size() + " blocks and " + ble.removes.size() + " unblocks from news feed");
}
/**
* Gunzip the file
*
* @since 0.9.20
*/
private static void gunzip(File from, File to) throws IOException {
ReusableGZIPInputStream in = ReusableGZIPInputStream.acquire();
OutputStream out = null;
try {
in.initialize(new FileInputStream(from));
out = new SecureFileOutputStream(to);
byte buf[] = new byte[4096];
int read;
while ((read = in.read(buf)) != -1) {
out.write(buf, 0, read);
}
} finally {
if (out != null) try {
out.close();
} catch (IOException ioe) {}
ReusableGZIPInputStream.release(in);
}
}
/**
* Output in the old format.
*
* @since 0.9.20
*/
private void outputOldNewsXML(NewsMetadata data, List<NewsEntry> entries,
String sudVersion, String signingKeyName, File to) throws IOException {
NewsMetadata.Release latestRelease = data.releases.get(0);
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(to), "UTF-8"));
out.write("<!--\n");
// update metadata in old format
out.write("<i2p.release ");
if (latestRelease.i2pVersion != null)
out.write(" version=\"" + latestRelease.i2pVersion + '"');
if (latestRelease.minVersion != null)
out.write(" minVersion=\"" + latestRelease.minVersion + '"');
if (latestRelease.minJavaVersion != null)
out.write(" minJavaVersion=\"" + latestRelease.minJavaVersion + '"');
String su3Torrent = "";
String su2Torrent = "";
for (NewsMetadata.Update update : latestRelease.updates) {
if (update.torrent != null) {
if ("su3".equals(update.type))
su3Torrent = update.torrent;
else if ("su2".equals(update.type))
su2Torrent = update.torrent;
}
}
if (!su2Torrent.isEmpty())
out.write(" su2Torrent=\"" + su2Torrent + '"');
if (!su3Torrent.isEmpty())
out.write(" su3Torrent=\"" + su3Torrent + '"');
out.write("/>\n");
// su3 and feed metadata for debugging
out.write("** News version:\t" + DataHelper.stripHTML(sudVersion) + '\n');
out.write("** Signed by:\t" + signingKeyName + '\n');
out.write("** Feed:\t" + DataHelper.stripHTML(data.feedTitle) + '\n');
out.write("** Feed ID:\t" + DataHelper.stripHTML(data.feedID) + '\n');
out.write("** Feed Date:\t" + (new Date(data.feedUpdated)) + '\n');
out.write("-->\n");
if (entries == null)
return;
for (NewsEntry e : entries) {
if (e.title == null || e.content == null)
continue;
out.write("<!-- Entry Date: " + (new Date(e.updated)) + " -->\n");
out.write("<h3>");
out.write(e.title);
out.write("</h3>\n");
out.write(e.content);
out.write("\n\n");
}
} finally {
if (out != null) try {
out.close();
} catch (IOException ioe) {}
}
}
////// begin ClientApp interface
/**
* @since 0.9.41
*/
public synchronized void startup() {
changeState(STARTING);
_thread = new I2PAppThread(this, "NewsFetcher", true);
_thread.start();
}
/**
* @since 0.9.41
*/
public synchronized void shutdown(String[] args) {
if (_state != RUNNING)
return;
changeState(STOPPING);
_isRunning = false;
if (_thread != null)
_thread.interrupt();
changeState(STOPPED);
}
/**
* @since 0.9.41
*/
public ClientAppState getState() {
return _state;
}
/**
* @since 0.9.41
*/
public String getName() {
return APP_NAME;
}
/**
* @since 0.9.41
*/
public String getDisplayName() {
return APP_NAME;
}
////// end ClientApp interface
////// begin ClientApp helpers
/**
* @since 0.9.41
*/
private void changeState(ClientAppState state) {
changeState(state, null);
}
/**
* @since 0.9.41
*/
private synchronized void changeState(ClientAppState state, Exception e) {
_state = state;
_mgr.notify(this, state, null, e);
}
////// end ClientApp helpers
}

View File

@ -0,0 +1,109 @@
package net.i2p.android.help;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class Browser implements Comparable<Browser> {
public final String packageName;
public final CharSequence label;
public final Drawable icon;
public final boolean isKnown;
public final boolean isSupported;
public final boolean isRecommended;
private boolean isInstalled;
/**
* A browser that we don't know about.
*
* @param pm the PackageManager used to find the browser
* @param browser the browser
*/
public Browser(PackageManager pm, ResolveInfo browser) {
this(
browser.activityInfo.packageName,
browser.loadLabel(pm),
browser.loadIcon(pm),
true, false, false, false
);
}
/**
* A browser that we know about.
*
* @param pm the PackageManager used to find the browser
* @param browser the browser
* @param supported can this browser be used with I2P?
*/
public Browser(PackageManager pm, ResolveInfo browser, boolean supported, boolean recommended) {
this(
browser.activityInfo.packageName,
browser.loadLabel(pm),
browser.loadIcon(pm),
true, true, supported, recommended
);
}
public Browser(String pn, CharSequence l, Drawable ic, boolean i, boolean k, boolean s, boolean r) {
packageName = pn;
label = l;
icon = ic;
isInstalled = i;
isKnown = k;
isSupported = s;
isRecommended = r;
}
@Override
public int compareTo(@NonNull Browser browser) {
// Sort order: supported -> unknown -> unsupported
int a = getOrder(this);
int b = getOrder(browser);
if (a < b)
return -1;
else if (a > b)
return 1;
return label.toString().compareTo(browser.label.toString());
}
private static int getOrder(Browser browser) {
if (browser.isKnown) {
if (browser.isRecommended)
return 0;
else if (browser.isSupported)
return 1;
else
return 3;
} else
return 2;
}
public boolean isInstalled(Context context){
if (isInstalled) {
return true;
}
// Find all installed browsers that listen for ".i2p"
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://stats.i2p"));
final PackageManager pm = context.getPackageManager();
List<ResolveInfo> installedBrowsers = pm.queryIntentActivities(intent, 0);
for (ResolveInfo browser : installedBrowsers) {
if (browser.activityInfo.packageName.equals(packageName)) {
isInstalled = true;
break;
}
}
return isInstalled;
}
}

View File

@ -0,0 +1,128 @@
package net.i2p.android.help;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.net.Uri;
//import android.support.v7.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import net.i2p.android.router.R;
public class BrowserAdapter extends RecyclerView.Adapter<BrowserAdapter.ViewHolder> {
private Context mCtx;
private Browser[] mBrowsers;
private OnBrowserSelectedListener mListener;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView mIcon;
public TextView mLabel;
public ImageView mStatus;
public ViewHolder(View v) {
super(v);
mIcon = (ImageView) v.findViewById(R.id.browser_icon);
mLabel = (TextView) v.findViewById(R.id.browser_label);
mStatus = (ImageView) v.findViewById(R.id.browser_status_icon);
}
}
public interface OnBrowserSelectedListener {
void onBrowserSelected(Browser browser);
}
public BrowserAdapter(Context ctx, OnBrowserSelectedListener listener) {
mCtx = ctx;
mListener = listener;
}
public void setBrowsers(Browser[] browsers) {
mBrowsers = browsers;
notifyDataSetChanged();
}
public void clear() {
mBrowsers = null;
notifyDataSetChanged();
}
// Create new views (invoked by the layout manager)
@Override
public BrowserAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.listitem_browser, parent, false);
return new ViewHolder(v);
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final Browser browser = mBrowsers[position];
holder.mIcon.setImageDrawable(browser.icon);
holder.mLabel.setText(browser.label);
if (browser.isKnown) {
if (browser.isRecommended && browser.isInstalled(mCtx)) {
holder.mStatus.setImageDrawable(
mCtx.getResources().getDrawable(R.drawable.ic_stars_white_24dp));
holder.mStatus.setVisibility(View.VISIBLE);
} else if (browser.isSupported && browser.isInstalled(mCtx)) {
holder.mStatus.setImageDrawable(
mCtx.getResources().getDrawable(R.drawable.ic_stars_white_24dp));
holder.mStatus.setVisibility(View.INVISIBLE);
} else if (browser.isSupported && !browser.isInstalled(mCtx)) {
holder.mStatus.setImageDrawable(
mCtx.getResources().getDrawable(R.drawable.ic_shop_white_24dp));
holder.mStatus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String uriMarket = "market://search?q=pname:" + browser.packageName;
Uri uri = Uri.parse(uriMarket);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
try {
mCtx.startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(mCtx, R.string.no_market_app, Toast.LENGTH_LONG).show();
}
}
});
holder.mStatus.setVisibility(View.VISIBLE);
} else if (browser.isInstalled(mCtx) && !browser.isSupported) {
// Make the icon gray-scale to show it is unsupported
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
holder.mIcon.setColorFilter(filter);
holder.mLabel.setTextColor(
mCtx.getResources().getColor(R.color.primary_text_disabled_material_dark));
}
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.onBrowserSelected(browser);
}
});
}
// Return the size of the dataset (invoked by the layout manager)
@Override
public int getItemCount() {
if (mBrowsers != null)
return mBrowsers.length;
return 0;
}
}

View File

@ -0,0 +1,106 @@
package net.i2p.android.help;
import android.os.Bundle;
//import android.support.v7.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatActivity;
//import android.support.v7.widget.Toolbar;
import androidx.appcompat.widget.Toolbar;
import android.view.MenuItem;
import net.i2p.android.router.R;
import net.i2p.android.util.LocaleManager;
import java.lang.reflect.Field;
public class BrowserConfigActivity extends AppCompatActivity implements
BrowserAdapter.OnBrowserSelectedListener {
/**
* Whether or not the activity is in two-pane mode, i.e. running on a tablet
* device.
*/
private boolean mTwoPane;
private final LocaleManager localeManager = new LocaleManager();
@Override
public void onCreate(Bundle savedInstanceState) {
localeManager.onCreate(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_help);
// Set the action bar
Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (findViewById(R.id.detail_fragment) != null) {
// The detail container view will be present only in the
// large-screen layouts (res/values-large and
// res/values-sw600dp). If this view is present, then the
// activity should be in two-pane mode.
mTwoPane = true;
}
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.main_fragment, new BrowserListFragment())
.commit();
}
}
@Override
public void onResume() {
super.onResume();
localeManager.onResume(this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// BrowserAdapter.OnBrowserSelected
@Override
public void onBrowserSelected(Browser browser) {
int file;
if (browser.isKnown) {
if (browser.isSupported) {
// Check for embedded browser
if (browser.packageName.startsWith("net.i2p.android"))
file = R.raw.help_embedded_browser;
else {
// Load the configuration guide for this browser
try {
String name = "help_" + browser.packageName.replace('.', '_');
Class res = R.raw.class;
Field field = res.getField(name);
file = field.getInt(null);
} catch (Exception e) {
file = R.raw.help_unknown_browser;
}
}
} else
file = R.raw.help_unsupported_browser;
} else
file = R.raw.help_unknown_browser;
HelpHtmlFragment configFrag = HelpHtmlFragment.newInstance(file);
if (mTwoPane) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.detail_fragment, configFrag)
.commit();
} else {
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_fragment, configFrag)
.addToBackStack("config" + browser.packageName)
.commit();
}
}
}

View File

@ -0,0 +1,219 @@
package net.i2p.android.help;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
//import android.support.v4.app.LoaderManager;
import androidx.loader.app.LoaderManager;
//import android.support.v4.content.Loader;
import androidx.loader.content.Loader;
//import android.support.v7.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
//import android.support.v7.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import net.i2p.android.router.R;
import net.i2p.android.router.util.BetterAsyncTaskLoader;
import net.i2p.android.widget.DividerItemDecoration;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.List;
import java.util.Map;
public class BrowserListFragment extends Fragment implements
LoaderManager.LoaderCallbacks<List<Browser>> {
private static final int BROWSER_LOADER_ID = 1;
private BrowserAdapter.OnBrowserSelectedListener mCallback;
private BrowserAdapter mAdapter;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (BrowserAdapter.OnBrowserSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnBrowserSelectedListener");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_help_browsers, container, false);
RecyclerView mRecyclerView = (RecyclerView) v.findViewById(R.id.browser_list);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
// use a linear layout manager
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new BrowserAdapter(getActivity(), mCallback);
mRecyclerView.setAdapter(mAdapter);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(BROWSER_LOADER_ID, null, this);
}
// LoaderManager.LoaderCallbacks<List<Browser>>
@Override
public Loader<List<Browser>> onCreateLoader(int id, Bundle args) {
return new BrowserLoader(getActivity());
}
public static class BrowserLoader extends BetterAsyncTaskLoader<List<Browser>> {
private List<String> recommended;
private List<String> recommendedLabels;
private List<String> supported;
private List<String> supportedLabels;
private List<String> unsupported;
public BrowserLoader(Context context) {
super(context);
recommended = Arrays.asList(
getContext().getResources().getStringArray(R.array.recommended_browsers));
recommendedLabels = Arrays.asList(
getContext().getResources().getStringArray(R.array.recommended_browser_labels));
supported = Arrays.asList(
getContext().getResources().getStringArray(R.array.supported_browsers));
supportedLabels = Arrays.asList(
getContext().getResources().getStringArray(R.array.supported_browser_labels));
unsupported = allBrowsers(context);//Arrays.asList(
//context.getResources().getStringArray(R.array.unsupported_browsers));
}
public List<String> allBrowsers(Context context){
//try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
List<ResolveInfo> browserList;
PackageManager pm = context.getPackageManager();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
// gets all
browserList = pm.queryIntentActivities(intent, PackageManager.MATCH_ALL);
} else {
browserList = pm.queryIntentActivities(intent, 0);
}
//}catch()
List<String> finalResult = new ArrayList<String>();
for (ResolveInfo ri : browserList){
finalResult.add(ri.resolvePackageName);
}
return finalResult;
}
@Override
public List<Browser> loadInBackground() {
List<Browser> browsers = new ArrayList<>();
Map<String, String> recommendedMap = new HashMap<>();
for (int i = 0; i < recommended.size(); i++) {
recommendedMap.put(recommended.get(i), recommendedLabels.get(i));
}
Map<String, String> supportedMap = new HashMap<>();
for (int i = 0; i < supported.size(); i++) {
supportedMap.put(supported.get(i), supportedLabels.get(i));
}
// Find all installed browsers that listen for ".i2p"
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://stats.i2p"));
final PackageManager pm = getContext().getPackageManager();
Set<ResolveInfo> installedBrowsers = new HashSet<>(pm.queryIntentActivities(intent, 0));
// Compare installed browsers to supported browsers
for (ResolveInfo browser : installedBrowsers) {
if (recommended.contains(browser.activityInfo.packageName)) {
browsers.add(new Browser(pm, browser, true, true));
recommendedMap.remove(browser.activityInfo.packageName);
} else if (supported.contains(browser.activityInfo.packageName) ||
browser.activityInfo.packageName.startsWith("net.i2p.android")) {
browsers.add(new Browser(pm, browser, true, false));
supportedMap.remove(browser.activityInfo.packageName);
} else if (unsupported.contains(browser.activityInfo.packageName))
browsers.add(new Browser(pm, browser, false, false));
else
browsers.add(new Browser(pm, browser));
}
// Now add the remaining recommended and supported browsers
for (Map.Entry<String, String> browser : recommendedMap.entrySet()) {
browsers.add(new Browser(browser.getKey(), browser.getValue(),
getDrawableForPackage(browser.getKey()),
false, true, true, true));
}
for (Map.Entry<String, String> browser : supportedMap.entrySet()) {
browsers.add(new Browser(browser.getKey(), browser.getValue(),
getDrawableForPackage(browser.getKey()),
false, true, true, false));
}
Collections.sort(browsers);
return browsers;
}
private Drawable getDrawableForPackage(String packageName) {
try {
String name = "icon_" + packageName.replace('.', '_');
Class res = R.drawable.class;
Field field = res.getField(name);
int drawable = field.getInt(null);
return getContext().getResources().getDrawable(drawable);
} catch (Exception e) {
return null;
}
}
@Override
protected void onStartMonitoring() {
}
@Override
protected void onStopMonitoring() {
}
@Override
protected void releaseResources(List<Browser> data) {
}
}
@Override
public void onLoadFinished(Loader<List<Browser>> listLoader, List<Browser> browsers) {
if (listLoader.getId() == BROWSER_LOADER_ID)
mAdapter.setBrowsers(browsers.toArray(new Browser[browsers.size()]));
}
@Override
public void onLoaderReset(Loader<List<Browser>> listLoader) {
if (listLoader.getId() == BROWSER_LOADER_ID)
mAdapter.clear();
}
}

View File

@ -0,0 +1,169 @@
package net.i2p.android.help;
import android.content.Intent;
import android.os.Bundle;
//import android.support.v4.app.NavUtils;
import androidx.core.app.NavUtils;
//import android.support.v4.app.TaskStackBuilder;
import androidx.core.app.TaskStackBuilder;
//import android.support.v7.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatActivity;
//import android.support.v7.widget.Toolbar;
import androidx.appcompat.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import net.i2p.android.router.LicenseActivity;
import net.i2p.android.router.R;
import net.i2p.android.router.dialog.TextResourceDialog;
import net.i2p.android.util.LocaleManager;
public class HelpActivity extends AppCompatActivity implements
HelpListFragment.OnEntrySelectedListener {
public static final String CATEGORY = "help_category";
public static final int CAT_MAIN = 0;
public static final int CAT_CONFIGURE_BROWSER = 1;
public static final int CAT_ADDRESSBOOK = 2;
public static final int CAT_I2PTUNNEL = 3;
/**
* Whether or not the activity is in two-pane mode, i.e. running on a tablet
* device.
*/
private boolean mTwoPane;
private int mCategory;
private final LocaleManager localeManager = new LocaleManager();
@Override
public void onCreate(Bundle savedInstanceState) {
localeManager.onCreate(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_help);
// Set the action bar
Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (findViewById(R.id.detail_fragment) != null) {
// The detail container view will be present only in the
// large-screen layouts (res/values-large and
// res/values-sw600dp). If this view is present, then the
// activity should be in two-pane mode.
mTwoPane = true;
}
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.main_fragment, new HelpListFragment())
.commit();
}
mCategory = getIntent().getIntExtra(CATEGORY, -1);
if (mCategory >= 0) {
showCategory(mCategory);
}
}
@Override
public void onResume() {
super.onResume();
localeManager.onResume(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_help_actions, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (mCategory >= 0) {
onBackPressed();
} else {
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
// This activity is NOT part of this app's task, so create a new task
// when navigating up, with a synthesized back stack.
TaskStackBuilder.create(this)
// Add all of this activity's parents to the back stack
.addNextIntentWithParentStack(upIntent)
// Navigate up to the closest parent
.startActivities();
} else {
// This activity is part of this app's task, so simply
// navigate up to the logical parent activity.
NavUtils.navigateUpTo(this, upIntent);
}
}
return true;
case R.id.menu_help_licenses:
Intent lic = new Intent(HelpActivity.this, LicenseActivity.class);
startActivity(lic);
return true;
case R.id.menu_help_release_notes:
TextResourceDialog dialog = new TextResourceDialog();
Bundle args = new Bundle();
args.putString(TextResourceDialog.TEXT_DIALOG_TITLE,
getResources().getString(R.string.label_release_notes));
args.putInt(TextResourceDialog.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
dialog.setArguments(args);
dialog.show(getSupportFragmentManager(), "release_notes");
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (mCategory >= 0)
mCategory = -1;
}
// HelpListFragment.OnEntrySelectedListener
@Override
public void onEntrySelected(int entry) {
if (entry == CAT_CONFIGURE_BROWSER) {
Intent i = new Intent(this, BrowserConfigActivity.class);
startActivity(i);
} else {
mCategory = entry;
showCategory(entry);
}
}
private void showCategory(int category) {
int file;
switch (category) {
case CAT_ADDRESSBOOK:
file = R.raw.help_addressbook;
break;
case CAT_I2PTUNNEL:
file = R.raw.help_i2ptunnel;
break;
case CAT_MAIN:
default:
file = R.raw.help_main;
break;
}
HelpHtmlFragment f = HelpHtmlFragment.newInstance(file);
if (mTwoPane) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.detail_fragment, f).commit();
} else {
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_fragment, f)
.addToBackStack("help" + category)
.commit();
}
}
}

View File

@ -0,0 +1,37 @@
package net.i2p.android.help;
import android.os.Bundle;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ScrollView;
import net.i2p.android.router.R;
import org.sufficientlysecure.htmltextview.HtmlTextView;
public class HelpHtmlFragment extends Fragment {
public static final String ARG_HTML_FILE = "htmlFile";
static HelpHtmlFragment newInstance(int htmlFile) {
HelpHtmlFragment f = new HelpHtmlFragment();
Bundle args = new Bundle();
args.putInt(ARG_HTML_FILE, htmlFile);
f.setArguments(args);
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ScrollView scroller = new ScrollView(getActivity());
HtmlTextView text = new HtmlTextView(getActivity());
scroller.addView(text);
int padH = getResources().getDimensionPixelOffset(R.dimen.activity_horizontal_margin);
int padV = getResources().getDimensionPixelOffset(R.dimen.activity_vertical_margin);
text.setPadding(padH, padV, padH, padV);
text.setHtml(getArguments().getInt(ARG_HTML_FILE));
return scroller;
}
}

View File

@ -0,0 +1,48 @@
package net.i2p.android.help;
import android.app.Activity;
import android.os.Bundle;
//import android.support.v4.app.ListFragment;
import androidx.fragment.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import net.i2p.android.router.R;
public class HelpListFragment extends ListFragment {
OnEntrySelectedListener mEntrySelectedCallback;
// Container Activity must implement this interface
public interface OnEntrySelectedListener {
void onEntrySelected(int entry);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mEntrySelectedCallback = (OnEntrySelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnEntrySelectedListener");
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(ArrayAdapter.createFromResource(getActivity(),
R.array.help_categories, R.layout.listitem_text));
}
@Override
public void onListItemClick(ListView parent, View view, int pos, long id) {
super.onListItemClick(parent, view, pos, id);
mEntrySelectedCallback.onEntrySelected(pos);
}
}

View File

@ -0,0 +1,67 @@
package net.i2p.android.i2ptunnel;
import android.content.Intent;
import android.os.Bundle;
//import android.support.v4.app.ActivityCompat;
import androidx.core.app.ActivityCompat;
//import android.support.v7.widget.Toolbar;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import net.i2p.android.I2PActivityBase;
import net.i2p.android.i2ptunnel.preferences.EditTunnelActivity;
import net.i2p.android.router.R;
public class TunnelDetailActivity extends I2PActivityBase implements
TunnelDetailFragment.TunnelDetailListener {
private boolean transitionReversed;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
transitionReversed = false;
if (savedInstanceState == null) {
int tunnelId = getIntent().getIntExtra(TunnelDetailFragment.TUNNEL_ID, 0);
TunnelDetailFragment detailFrag = TunnelDetailFragment.newInstance(tunnelId);
getSupportFragmentManager().beginTransaction()
.add(android.R.id.content, detailFrag).commit();
}
}
@Override
public void onStart() {
super.onStart();
Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar);
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
@Override
public void finish() {
if (transitionReversed)
super.finish();
else {
transitionReversed = true;
ActivityCompat.finishAfterTransition(this);
}
}
// TunnelDetailFragment.TunnelDetailListener
@Override
public void onEditTunnel(int tunnelId) {
Intent editIntent = new Intent(this, EditTunnelActivity.class);
editIntent.putExtra(TunnelDetailFragment.TUNNEL_ID, tunnelId);
startActivity(editIntent);
}
public void onTunnelDeleted(int tunnelId, int numTunnelsLeft) {
finish();
}
}

View File

@ -0,0 +1,385 @@
package net.i2p.android.i2ptunnel;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
//import android.support.v4.app.DialogFragment;
import androidx.fragment.app.DialogFragment;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
//import android.support.v4.view.ViewCompat;
import androidx.core.view.ViewCompat;
//import android.support.v7.app.AlertDialog;
import androidx.appcompat.app.AlertDialog;
//import android.support.v7.widget.Toolbar;
import androidx.appcompat.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import net.i2p.I2PAppContext;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
import net.i2p.android.util.FragmentUtils;
import net.i2p.app.ClientAppState;
import net.i2p.i2ptunnel.TunnelController;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import java.util.List;
public class TunnelDetailFragment extends Fragment {
public static final String TUNNEL_ID = "tunnel_id";
TunnelDetailListener mCallback;
private TunnelControllerGroup mGroup;
private TunnelEntry mTunnel;
private Toolbar mToolbar;
private ImageView mStatus;
public static TunnelDetailFragment newInstance(int tunnelId) {
TunnelDetailFragment f = new TunnelDetailFragment();
Bundle args = new Bundle();
args.putInt(TUNNEL_ID, tunnelId);
f.setArguments(args);
return f;
}
// Container Activity must implement this interface
public interface TunnelDetailListener {
void onEditTunnel(int tunnelId);
void onTunnelDeleted(int tunnelId, int numTunnelsLeft);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
mCallback = FragmentUtils.getParent(this, TunnelDetailListener.class);
if (mCallback == null)
throw new ClassCastException("Parent must implement TunnelDetailListener");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String error;
List<TunnelController> controllers;
try {
mGroup = TunnelControllerGroup.getInstance();
error = mGroup == null ? getResources().getString(R.string.i2ptunnel_not_initialized) : null;
controllers = mGroup == null ? null : mGroup.getControllers();
} catch (IllegalArgumentException iae) {
mGroup = null;
controllers = null;
error = iae.toString();
}
if (mGroup == null) {
Toast.makeText(getActivity().getApplicationContext(),
error, Toast.LENGTH_LONG).show();
getActivity().finish();
} else if (getArguments().containsKey(TUNNEL_ID)) {
int tunnelId = getArguments().getInt(TUNNEL_ID);
try {
TunnelController controller = controllers.get(tunnelId);
mTunnel = new TunnelEntry(getActivity(), controller, tunnelId);
} catch (IndexOutOfBoundsException e) {
// Tunnel doesn't exist
Util.e("Could not load tunnel details", e);
Toast.makeText(getActivity().getApplicationContext(),
R.string.i2ptunnel_no_tunnel_details, Toast.LENGTH_LONG).show();
getActivity().finish();
}
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_i2ptunnel_detail, container, false);
mToolbar = (Toolbar) v.findViewById(R.id.detail_toolbar);
mToolbar.inflateMenu(R.menu.fragment_i2ptunnel_detail_actions);
mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
return onToolbarItemSelected(menuItem);
}
});
updateToolbar();
if (mTunnel != null) {
mStatus = (ImageView) v.findViewById(R.id.tunnel_status);
updateStatus();
ViewCompat.setTransitionName(mStatus, "status" + mTunnel.getId());
TextView name = (TextView) v.findViewById(R.id.tunnel_name);
name.setText(mTunnel.getName());
TextView type = (TextView) v.findViewById(R.id.tunnel_type);
type.setText(mTunnel.getType());
TextView description = (TextView) v.findViewById(R.id.tunnel_description);
description.setText(mTunnel.getDescription());
if (!mTunnel.getDetails().isEmpty()) {
v.findViewById(R.id.tunnel_details_container).setVisibility(View.VISIBLE);
TextView details = (TextView) v.findViewById(R.id.tunnel_details);
View copyDetails = v.findViewById(R.id.tunnel_details_copy);
details.setText(mTunnel.getDetails());
if (!mTunnel.isClient()) {
copyDetails.setVisibility(View.VISIBLE);
copyDetails.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
copyToClipbardLegacy();
else
copyToClipboardHoneycomb();
Toast.makeText(getActivity(), R.string.address_copied_to_clipboard, Toast.LENGTH_SHORT).show();
}
});
}
}
View accessIfacePortItem = v.findViewById(R.id.tunnel_access_interface_port_item);
TextView accessIfacePort = (TextView) v.findViewById(R.id.tunnel_access_interface_port);
View accessIfaceOpen = v.findViewById(R.id.tunnel_access_open);
View targetIfacePortItem = v.findViewById(R.id.tunnel_target_interface_port_item);
TextView targetIfacePort = (TextView) v.findViewById(R.id.tunnel_target_interface_port);
View targetIfaceOpen = v.findViewById(R.id.tunnel_target_open);
switch (mTunnel.getInternalType()) {
case "httpbidirserver":
accessIfacePort.setText(mTunnel.getClientLink(false));
setupOpen(accessIfaceOpen, true);
v.findViewById(R.id.icon_link_access).setVisibility(View.GONE);
targetIfacePort.setText(mTunnel.getServerLink(false));
setupOpen(targetIfaceOpen, false);
break;
case "streamrserver":
accessIfacePort.setText(mTunnel.getServerLink(false));
setupOpen(accessIfaceOpen, true);
targetIfacePortItem.setVisibility(View.GONE);
break;
case "streamrclient":
accessIfacePortItem.setVisibility(View.GONE);
targetIfacePort.setText(mTunnel.getClientLink(false));
setupOpen(targetIfaceOpen, false);
break;
default:
if (mTunnel.isClient()) {
accessIfacePort.setText(mTunnel.getClientLink(false));
setupOpen(accessIfaceOpen, true);
targetIfacePortItem.setVisibility(View.GONE);
} else {
accessIfacePortItem.setVisibility(View.GONE);
targetIfacePort.setText(mTunnel.getServerLink(false));
setupOpen(targetIfaceOpen, false);
}
}
CheckBox autoStart = (CheckBox) v.findViewById(R.id.tunnel_autostart);
autoStart.setChecked(mTunnel.startAutomatically());
}
return v;
}
private void setupOpen(View open, final boolean client) {
if (mTunnel.isRunning() &&
(client ? mTunnel.isClientLinkValid() : mTunnel.isServerLinkValid())) {
open.setVisibility(View.VISIBLE);
open.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(client ? mTunnel.getClientLink(true) : mTunnel.getServerLink(true)));
try {
startActivity(i);
} catch (ActivityNotFoundException e) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.install_recommended_app)
.setMessage(R.string.app_needed_for_this_tunnel_type)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
Uri uri = mTunnel.getRecommendedAppForTunnel();
if (uri != null) {
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(getContext(),
R.string.no_market_app,
Toast.LENGTH_LONG).show();
}
}
}
})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.show();
}
}
});
} else
open.setVisibility(View.GONE);
}
private void updateToolbar() {
Menu menu = mToolbar.getMenu();
MenuItem start = menu.findItem(R.id.action_start_tunnel);
MenuItem stop = menu.findItem(R.id.action_stop_tunnel);
if (mTunnel != null && mGroup != null &&
(mGroup.getState() == ClientAppState.STARTING ||
mGroup.getState() == ClientAppState.RUNNING)) {
boolean isStopped = mTunnel.getStatus() == TunnelEntry.NOT_RUNNING;
start.setVisible(isStopped);
start.setEnabled(isStopped);
stop.setVisible(!isStopped);
stop.setEnabled(!isStopped);
} else {
start.setVisible(false);
start.setEnabled(false);
stop.setVisible(false);
stop.setEnabled(false);
}
}
private void updateStatus() {
mStatus.setImageDrawable(mTunnel.getStatusIcon());
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
mStatus.setBackgroundDrawable(mTunnel.getStatusBackground());
else
mStatus.setBackground(mTunnel.getStatusBackground());
}
private boolean onToolbarItemSelected(MenuItem item) {
if (mTunnel == null)
return false;
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_start_tunnel:
mTunnel.getController().startTunnelBackground();
Toast.makeText(getActivity().getApplicationContext(),
getResources().getString(R.string.i2ptunnel_msg_tunnel_starting)
+ ' ' + mTunnel.getName(), Toast.LENGTH_LONG).show();
// Reload the toolbar to change the start/stop action
updateToolbar();
// Update the status icon
updateStatus();
return true;
case R.id.action_stop_tunnel:
mTunnel.getController().stopTunnel();
Toast.makeText(getActivity().getApplicationContext(),
getResources().getString(R.string.i2ptunnel_msg_tunnel_stopping)
+ ' ' + mTunnel.getName(), Toast.LENGTH_LONG).show();
// Reload the toolbar to change the start/stop action
updateToolbar();
// Update the status icon
updateStatus();
return true;
case R.id.action_edit_tunnel:
mCallback.onEditTunnel(mTunnel.getId());
return true;
case R.id.action_delete_tunnel:
DialogFragment dg = DeleteTunnelDialogFragment.newInstance();
dg.show(getChildFragmentManager(), "delete_tunnel_dialog");
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void onDeleteTunnel() {
List<String> msgs = TunnelUtil.deleteTunnel(
I2PAppContext.getGlobalContext(),
mGroup, mTunnel.getId(), null);
Toast.makeText(getActivity().getApplicationContext(),
msgs.get(0), Toast.LENGTH_LONG).show();
mCallback.onTunnelDeleted(mTunnel.getId(),
mGroup.getControllers().size());
}
private void copyToClipbardLegacy() {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(mTunnel.getDetails());
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void copyToClipboardHoneycomb() {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText(
mTunnel.getName(), mTunnel.getDetails());
clipboard.setPrimaryClip(clip);
}
public static class DeleteTunnelDialogFragment extends DialogFragment {
TunnelDetailFragment mListener;
public static DialogFragment newInstance() {
return new DeleteTunnelDialogFragment();
}
private void onAttachToParentFragment(Fragment fragment) {
// Verify that the host fragment implements the callback interface
try {
// Instantiate the TunnelDetailFragment so we can send events to the host
mListener = (TunnelDetailFragment) fragment;
} catch (ClassCastException e) {
// The fragment doesn't implement the interface, throw exception
throw new ClassCastException(fragment.toString()
+ " must be TunnelDetailFragment");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onAttachToParentFragment(getParentFragment());
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage(R.string.i2ptunnel_delete_confirm_message)
.setPositiveButton(R.string.i2ptunnel_delete_confirm_button,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
mListener.onDeleteTunnel();
}
})
.setNegativeButton(android.R.string.cancel, null)
.create();
}
}
}

View File

@ -0,0 +1,312 @@
package net.i2p.android.i2ptunnel;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.widget.Toast;
import net.i2p.I2PAppContext;
import net.i2p.android.i2ptunnel.util.SaveTunnelTask;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
import net.i2p.data.Destination;
import net.i2p.data.PrivateKeyFile;
import net.i2p.i2ptunnel.TunnelController;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.i2ptunnel.ui.TunnelConfig;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
/**
* A single tunnel.
* Stored by the TunnelEntryAdapter.
*/
public class TunnelEntry {
public static final int RUNNING = 1;
public static final int STARTING = 2;
public static final int NOT_RUNNING = 3;
public static final int STANDBY = 4;
private final Context mContext;
private final TunnelController mController;
private final int mId;
/**
* @param tcg non-null
* @return the new TunnelEntry, or null if there was an error.
*/
public static TunnelEntry createNewTunnel(
Context ctx,
TunnelControllerGroup tcg,
TunnelConfig cfg) {
int tunnelId = tcg.getControllers().size();
TunnelEntry ret = null;
List<String> msgs = new ArrayList<>();
SaveTunnelTask task = new SaveTunnelTask(tcg, -1, cfg);
try {
msgs.addAll(task.execute().get());
TunnelController cur = TunnelUtil.getController(tcg, tunnelId);
ret = new TunnelEntry(ctx, cur, tunnelId);
} catch (InterruptedException e) {
Util.e("Interrupted while saving tunnel config", e);
msgs.add(ctx.getString(R.string.i2ptunnel_msg_config_save_failed));
} catch (ExecutionException e) {
Util.e("Error while saving tunnel config", e);
msgs.add(ctx.getString(R.string.i2ptunnel_msg_config_save_failed));
}
// TODO: Do something else with the other messages.
Toast.makeText(ctx.getApplicationContext(),
msgs.get(0), Toast.LENGTH_LONG).show();
return ret;
}
public TunnelEntry(Context context, TunnelController controller, int id) {
mContext = context;
mController = controller;
mId = id;
}
public int getId() {
return mId;
}
public TunnelController getController() {
return mController;
}
/* General tunnel data for any type */
public String getName() {
if (mController.getName() != null)
return mController.getName();
else
return mContext.getResources()
.getString(R.string.i2ptunnel_new_tunnel);
}
public String getInternalType() {
return mController.getType();
}
public String getType() {
return TunnelUtil.getTypeName(mController.getType(), mContext);
}
public String getDescription() {
String rv = mController.getDescription();
if (rv != null)
return rv;
return "";
}
public boolean startAutomatically() {
return mController.getStartOnLoad();
}
public int getStatus() {
if (mController.getIsRunning()) {
if (isClient() && mController.getIsStandby())
return STANDBY;
else
return RUNNING;
} else if (mController.getIsStarting()) return STARTING;
else return NOT_RUNNING;
}
public boolean isRunning() {
switch (getStatus()) {
case STANDBY:
case RUNNING:
return true;
default:
return false;
}
}
public boolean isClient() {
return TunnelUtil.isClient(mController.getType());
}
/* Client tunnel data */
public boolean isSharedClient() {
return Boolean.parseBoolean(mController.getSharedClient());
}
/**
* Call this to see if it is okay to linkify getClientLink()
* @return true if getClientLink() can be linkified, false otherwise.
*/
public boolean isClientLinkValid() {
return ("ircclient".equals(mController.getType())) &&
mController.getListenOnInterface() != null &&
mController.getListenPort() != null;
}
/**
* @return valid host:port only if isClientLinkValid() is true
*/
public String getClientLink(boolean linkify) {
String host = getClientInterface();
String port = getClientPort();
String link = host + ":" + port;
if (linkify) {
if ("ircclient".equals(mController.getType()))
link = "irc://" + link;
}
return link;
}
public String getClientInterface() {
String rv;
if ("streamrclient".equals(mController.getType()))
rv = mController.getTargetHost();
else
rv = mController.getListenOnInterface();
return rv != null ? rv : "";
}
public String getClientPort() {
String rv = mController.getListenPort();
return rv != null ? rv : "";
}
public String getClientDestination() {
String rv;
if ("client".equals(getInternalType()) ||
"ircclient".equals(getInternalType()) ||
"streamrclient".equals(getInternalType()))
rv = mController.getTargetDestination();
else
rv = mController.getProxyList();
return rv != null ? rv : "";
}
/* Server tunnel data */
/**
* Call this to see if it is okay to linkify getServerLink()
* @return true if getServerLink() can be linkified, false otherwise.
*/
public boolean isServerLinkValid() {
return ("httpserver".equals(mController.getType()) ||
"httpbidirserver".equals(mController.getType())) &&
mController.getTargetHost() != null &&
mController.getTargetPort() != null;
}
/**
* @return valid host:port only if isServerLinkValid() is true
*/
public String getServerLink(boolean linkify) {
String host;
if ("streamrserver".equals(getInternalType()))
host = mController.getListenOnInterface();
else
host = mController.getTargetHost();
String port = mController.getTargetPort();
if (host == null) host = "";
if (port == null) port = "";
if (host.indexOf(':') >= 0)
host = '[' + host + ']';
String link = host + ":" + port;
if (linkify) {
if ("httpserver".equals(mController.getType()) ||
"httpbidirserver".equals(mController.getType()))
link = "http://" + link;
}
return link;
}
public String getDestinationBase64() {
String rv = mController.getMyDestination();
if (rv != null)
return rv;
// if not running, do this the hard way
String keyFile = mController.getPrivKeyFile();
if (keyFile != null && keyFile.trim().length() > 0) {
PrivateKeyFile pkf = new PrivateKeyFile(keyFile);
try {
Destination d = pkf.getDestination();
if (d != null)
return d.toBase64();
} catch (Exception e) {}
}
return "";
}
public String getDestHashBase32() {
String rv = mController.getMyDestHashBase32();
if (rv != null)
return rv;
return "";
}
/* Data for some client and server tunnels */
/* Other output formats */
public boolean isTunnelLinkValid() {
if (isClient()) return isClientLinkValid();
else return isServerLinkValid();
}
public String getTunnelLink(boolean linkify) {
if (isClient()) return getClientLink(linkify);
else return getServerLink(linkify);
}
public Uri getRecommendedAppForTunnel() {
int resId = 0;
if ("ircclient".equals(mController.getType()))
resId = R.string.market_irc;
if (resId > 0)
return Uri.parse(mContext.getString(resId));
else
return null;
}
public String getDetails() {
String details;
if (isClient())
details = getClientDestination();
else
details = getDestHashBase32();
return details;
}
public Drawable getStatusIcon() {
switch (getStatus()) {
case STANDBY:
return mContext.getResources()
.getDrawable(R.drawable.ic_schedule_black_24dp);
case STARTING:
return mContext.getResources()
.getDrawable(R.drawable.ic_sync_black_24dp);
case RUNNING:
case NOT_RUNNING:
default:
return null;
}
}
public Drawable getStatusBackground() {
switch (getStatus()) {
case STANDBY:
case STARTING:
return mContext.getResources()
.getDrawable(R.drawable.tunnel_yellow);
case RUNNING:
return mContext.getResources()
.getDrawable(R.drawable.tunnel_green);
case NOT_RUNNING:
default:
return mContext.getResources()
.getDrawable(R.drawable.tunnel_red);
}
}
}

View File

@ -0,0 +1,233 @@
package net.i2p.android.i2ptunnel;
import android.content.Context;
import android.os.Build;
//import android.support.v4.util.Pair;
import androidx.core.util.Pair;
//import android.support.v4.view.ViewCompat;
import androidx.core.view.ViewCompat;
//import android.support.v7.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import net.i2p.android.router.R;
import net.i2p.android.util.FragmentUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Contains the List of TunnelEntries.
* There's two of these, one for client tunnels and
* one for server tunnels.
* Created by the TunnelListFragment.
*/
public class TunnelEntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context mCtx;
private final boolean mClientTunnels;
private final TunnelListFragment.OnTunnelSelectedListener mListener;
private final FragmentUtils.TwoPaneProvider mTwoPane;
private List<TunnelEntry> mTunnels;
/**
* The current activated item position. Only used on tablets.
*/
private int mActivatedPosition = -1;
public static class SimpleViewHolder extends RecyclerView.ViewHolder {
public SimpleViewHolder(View itemView) {
super(itemView);
}
}
public static class TunnelViewHolder extends RecyclerView.ViewHolder {
public final ImageView status;
public final TextView name;
public final TextView description;
public final TextView interfacePort;
public TunnelViewHolder(View itemView) {
super(itemView);
status = (ImageView) itemView.findViewById(R.id.tunnel_status);
name = (TextView) itemView.findViewById(R.id.tunnel_name);
description = (TextView) itemView.findViewById(R.id.tunnel_description);
interfacePort = (TextView) itemView.findViewById(R.id.tunnel_interface_port);
}
}
public TunnelEntryAdapter(Context context, boolean clientTunnels,
TunnelListFragment.OnTunnelSelectedListener listener,
FragmentUtils.TwoPaneProvider twoPane) {
super();
mCtx = context;
mClientTunnels = clientTunnels;
mListener = listener;
mTwoPane = twoPane;
}
public void setTunnels(List<TunnelEntry> tunnels) {
mTunnels = tunnels;
notifyDataSetChanged();
}
public void addTunnel(TunnelEntry tunnel) {
if (mTunnels == null)
mTunnels = new ArrayList<TunnelEntry>();
boolean wasEmpty = mTunnels.isEmpty();
mTunnels.add(tunnel);
if (wasEmpty) {
notifyDataSetChanged();
} else {
notifyItemInserted(mTunnels.size() - 1);
}
}
public TunnelEntry getTunnel(int position) {
if (position < 0)
return null;
return mTunnels.get(position);
}
public void setActivatedPosition(int position) {
mActivatedPosition = position;
}
public int getActivatedPosition() {
return mActivatedPosition;
}
public void clearActivatedPosition() {
mActivatedPosition = -1;
}
@Override
public int getItemViewType(int position) {
if (mTunnels == null)
return R.string.router_not_running;
else if (mTunnels.isEmpty())
return R.layout.listitem_empty;
else
return R.layout.listitem_i2ptunnel;
}
// Create new views (invoked by the layout manager)
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
int vt = viewType;
if (viewType == R.string.router_not_running)
vt = R.layout.listitem_empty;
View v = LayoutInflater.from(parent.getContext())
.inflate(vt, parent, false);
switch (viewType) {
case R.layout.listitem_i2ptunnel:
return new TunnelViewHolder(v);
default:
return new SimpleViewHolder(v);
}
}
private void setClipboard(Context context, String text) {
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(text);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text);
clipboard.setPrimaryClip(clip);
}
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
switch (holder.getItemViewType()) {
case R.string.router_not_running:
((TextView) holder.itemView).setText(
mCtx.getString(R.string.i2ptunnel_not_initialized));
break;
case R.layout.listitem_empty:
((TextView) holder.itemView).setText(mClientTunnels ?
R.string.no_configured_client_tunnels :
R.string.no_configured_server_tunnels);
break;
case R.layout.listitem_i2ptunnel:
final TunnelViewHolder tvh = (TunnelViewHolder) holder;
final TunnelEntry tunnel = getTunnel(position);
tvh.status.setImageDrawable(tunnel.getStatusIcon());
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
tvh.status.setBackgroundDrawable(tunnel.getStatusBackground());
else
tvh.status.setBackground(tunnel.getStatusBackground());
ViewCompat.setTransitionName(tvh.status,
"status" + tunnel.getId());
tvh.name.setText(tunnel.getName());
tvh.description.setText(tunnel.getDescription());
tvh.interfacePort.setText(tunnel.getTunnelLink(false));
tvh.itemView.setSelected(mTwoPane.isTwoPane() && position == mActivatedPosition);
tvh.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO
// lint priority 8/10
// lint: Do not treat position as fixed; only use immediately and call holder.getAdapterPosition() to look it up later
// javadocs: Note that unlike ListView, RecyclerView will not call this method again
// if the position of the item changes in the data set unless the item itself is invalidated
// or the new position cannot be determined.
// For this reason, you should only use the position parameter while acquiring
// the related data item inside this method and should not keep a copy of it.
// If you need the position of an item later on (e.g. in a click listener),
// use RecyclerView.ViewHolder.getAdapterPosition() which will have the updated adapter position.
int oldPosition = mActivatedPosition;
mActivatedPosition = position;
notifyItemChanged(oldPosition);
notifyItemChanged(position);
Pair<View, String> statusPair = Pair.create(
(View)tvh.status,
ViewCompat.getTransitionName(tvh.status));
Pair<View, String>[] pairs = new Pair[]{ statusPair};
mListener.onTunnelSelected(tunnel.getId(), pairs);
view.invalidate();
}
});
tvh.itemView.setOnLongClickListener(new View.OnLongClickListener() {
//@Override
public boolean onLongClick(View view) {
setClipboard(mCtx, tunnel.getDestHashBase32());
Toast clipboardMessage = Toast.makeText(mCtx, R.string.copied_base32_system_notification_title, Toast. LENGTH_LONG);
clipboardMessage.setGravity(Gravity.TOP, 0, 0); //optional
clipboardMessage.show();
view.invalidate();
return true;
}
});
break;
default:
break;
}
}
// Return the size of the dataset (invoked by the layout manager)
@Override
public int getItemCount() {
if (mTunnels == null || mTunnels.isEmpty())
return 1;
return mTunnels.size();
}
}

View File

@ -0,0 +1,149 @@
package net.i2p.android.i2ptunnel;
import android.content.Context;
import android.os.Handler;
//import android.support.v4.content.AsyncTaskLoader;
import androidx.loader.content.AsyncTaskLoader;
import net.i2p.android.router.util.Util;
import net.i2p.i2ptunnel.TunnelController;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.router.RouterContext;
import java.util.ArrayList;
import java.util.List;
public class TunnelEntryLoader extends AsyncTaskLoader<List<TunnelEntry>> {
private final TunnelControllerGroup mGroup;
private final boolean mClientTunnels;
private List<TunnelEntry> mData;
private final Handler mHandler;
private TunnelControllerMonitor mMonitor;
public TunnelEntryLoader(Context context, TunnelControllerGroup tcg, boolean clientTunnels) {
super(context);
mGroup = tcg;
mClientTunnels = clientTunnels;
mHandler = new Handler();
}
@Override
public List<TunnelEntry> loadInBackground() {
// Don't load tunnels if the router is not running
// TODO: in future we might be able to view and edit tunnels while router is not running
RouterContext routerContext = Util.getRouterContext();
if (routerContext == null)
return null;
List<TunnelEntry> ret = new ArrayList<>();
List<TunnelController> controllers = mGroup.getControllers();
for (int i = 0; i < controllers.size(); i++) {
TunnelEntry tunnel = new TunnelEntry(getContext(), controllers.get(i), i);
if ( (mClientTunnels && tunnel.isClient()) ||
(!mClientTunnels && !tunnel.isClient()) )
ret.add(tunnel);
}
return ret;
}
@Override
public void deliverResult(List<TunnelEntry> data) {
if (isReset()) {
// The Loader has been reset; ignore the result and invalidate the data.
if (data != null) {
releaseResources(data);
return;
}
}
// Hold a reference to the old data so it doesn't get garbage collected.
// We must protect it until the new data has been delivered.
List<TunnelEntry> oldData = mData;
mData = data;
if (isStarted()) {
// If the Loader is in a started state, have the superclass deliver the
// results to the client.
super.deliverResult(data);
}
// Invalidate the old data as we don't need it any more.
if (oldData != null && oldData != data) {
releaseResources(oldData);
}
}
@Override
protected void onStartLoading() {
if (mData != null) {
// Deliver any previously loaded data immediately.
deliverResult(mData);
}
// Begin monitoring the underlying data source.
mMonitor = new TunnelControllerMonitor();
mHandler.postDelayed(mMonitor, 50);
if (takeContentChanged() || mData == null) {
// When the observer detects a change, it should call onContentChanged()
// on the Loader, which will cause the next call to takeContentChanged()
// to return true. If this is ever the case (or if the current data is
// null), we force a new load.
forceLoad();
}
}
@Override
protected void onStopLoading() {
// The Loader is in a stopped state, so we should attempt to cancel the
// current load (if there is one).
cancelLoad();
// Note that we leave the observer as is. Loaders in a stopped state
// should still monitor the data source for changes so that the Loader
// will know to force a new load if it is ever started again.
}
@Override
protected void onReset() {
// Ensure the loader has been stopped.
onStopLoading();
// At this point we can release the resources associated with 'mData'.
if (mData != null) {
releaseResources(mData);
mData = null;
}
// The Loader is being reset, so we should stop monitoring for changes.
if (mMonitor != null) {
mHandler.removeCallbacks(mMonitor);
mMonitor = null;
}
}
@Override
public void onCanceled(List<TunnelEntry> data) {
// Attempt to cancel the current asynchronous load.
super.onCanceled(data);
// The load has been canceled, so we should release the resources
// associated with 'data'.
releaseResources(data);
}
private void releaseResources(List<TunnelEntry> data) {
// For a simple List, there is nothing to do. For something like a Cursor, we
// would close it in this method. All resources associated with the Loader
// should be released here.
}
private class TunnelControllerMonitor implements Runnable {
public void run() {
// There is no way (yet) to monitor for changes to the list of
// TunnelControllers, so just force a refresh every 10 seconds.
onContentChanged();
mHandler.postDelayed(this, 10 * 1000);
}
}
}

View File

@ -0,0 +1,260 @@
package net.i2p.android.i2ptunnel;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
//import android.support.v4.app.LoaderManager;
import androidx.loader.app.LoaderManager;
//import android.support.v4.content.Loader;
import androidx.loader.content.Loader;
//import android.support.v4.content.LocalBroadcastManager;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
//import android.support.v4.util.Pair;
import androidx.core.util.Pair;
//import android.support.v7.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
//import android.support.v7.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.pnikosis.materialishprogress.ProgressWheel;
import net.i2p.android.router.R;
import net.i2p.android.router.service.RouterService;
import net.i2p.android.router.service.State;
import net.i2p.android.router.util.Util;
import net.i2p.android.util.FragmentUtils;
import net.i2p.android.widget.DividerItemDecoration;
import net.i2p.android.widget.LoadingRecyclerView;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import java.util.ArrayList;
import java.util.List;
/**
* The list of tunnels.
* There's two of these, one for client tunnels and
* one for server tunnels.
* Creates the TunnelEntryAdapter.
*/
public class TunnelListFragment extends Fragment implements
LoaderManager.LoaderCallbacks<List<TunnelEntry>> {
public static final String SHOW_CLIENT_TUNNELS = "show_client_tunnels";
private static final int CLIENT_LOADER_ID = 1;
private static final int SERVER_LOADER_ID = 2;
/**
* The serialization (saved instance state) Bundle key representing the
* activated item position. Only used on tablets.
*/
private static final String STATE_ACTIVATED_POSITION = "activated_position";
OnTunnelSelectedListener mCallback;
FragmentUtils.TwoPaneProvider mTwoPane;
private TunnelControllerGroup mGroup;
private LoadingRecyclerView mRecyclerView;
private TunnelEntryAdapter mAdapter;
private boolean mClientTunnels;
private static final String KEY_SELECTED_TUNNEL = "selected_tunnel";
// Container Activity must implement this interface
public interface OnTunnelSelectedListener {
void onTunnelSelected(int tunnelId, Pair<View, String>[] pairs);
}
public static TunnelListFragment newInstance(boolean showClientTunnels) {
TunnelListFragment f = new TunnelListFragment();
Bundle args = new Bundle();
args.putBoolean(TunnelListFragment.SHOW_CLIENT_TUNNELS, showClientTunnels);
f.setArguments(args);
return f;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
mCallback = FragmentUtils.getParent(this, OnTunnelSelectedListener.class);
if (mCallback == null)
throw new ClassCastException("Parent must implement OnTunnelSelectedListener");
mTwoPane = FragmentUtils.getParent(this, FragmentUtils.TwoPaneProvider.class);
if (mTwoPane == null)
throw new ClassCastException("Parent must implement TwoPaneProvider");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_list, container, false);
mRecyclerView = (LoadingRecyclerView) v.findViewById(R.id.list);
View empty = v.findViewById(R.id.empty);
ProgressWheel loading = (ProgressWheel) v.findViewById(R.id.loading);
mRecyclerView.setLoadingView(empty, loading);
return v;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (savedInstanceState != null) {
int tunnelId = savedInstanceState.getInt(KEY_SELECTED_TUNNEL, -1);
if (tunnelId != -1) {
mCallback.onTunnelSelected(tunnelId, null);
}
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mClientTunnels = getArguments().getBoolean(SHOW_CLIENT_TUNNELS);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
// use a linear layout manager
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
// Set the adapter for the list view
mAdapter = new TunnelEntryAdapter(getActivity(), mClientTunnels, mCallback, mTwoPane);
mRecyclerView.setAdapter(mAdapter);
// Restore the previously serialized activated item position.
if (savedInstanceState != null
&& savedInstanceState.containsKey(STATE_ACTIVATED_POSITION))
mAdapter.setActivatedPosition(savedInstanceState
.getInt(STATE_ACTIVATED_POSITION));
else
mAdapter.clearActivatedPosition();
// Initialize the adapter in case the RouterService has not been created
if (Util.getRouterContext() == null)
mAdapter.setTunnels(null);
}
@Override
public void onStart() {
super.onStart();
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getActivity());
IntentFilter filter = new IntentFilter();
filter.addAction(RouterService.LOCAL_BROADCAST_STATE_NOTIFICATION);
filter.addAction(RouterService.LOCAL_BROADCAST_STATE_CHANGED);
lbm.registerReceiver(onStateChange, filter);
}
private State lastRouterState = null;
private BroadcastReceiver onStateChange = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
State state = intent.getParcelableExtra(RouterService.LOCAL_BROADCAST_EXTRA_STATE);
if (lastRouterState == null || lastRouterState != state) {
updateState(state);
lastRouterState = state;
}
}
};
public void updateState(State state) {
try {
if (state == State.INIT ||
state == State.STARTING || // Wait until RouterContext is initialised
state == State.STOPPING ||
state == State.STOPPED ||
state == State.MANUAL_STOPPING ||
state == State.MANUAL_STOPPED ||
state == State.MANUAL_QUITTING ||
state == State.MANUAL_QUITTED)
getLoaderManager().destroyLoader(mClientTunnels ? CLIENT_LOADER_ID : SERVER_LOADER_ID);
else
initTunnels();
} catch (IllegalStateException ise) {
// Fragment isn't attached to any activity, so ignore state change
}
}
private void initTunnels() {
if (mGroup == null) {
try {
mGroup = TunnelControllerGroup.getInstance();
} catch (IllegalArgumentException iae) {
Util.e("Could not load tunnels", iae);
mGroup = null;
}
}
if (mGroup != null && isAdded()) {
mRecyclerView.setLoading(true);
getLoaderManager().initLoader(mClientTunnels ? CLIENT_LOADER_ID
: SERVER_LOADER_ID, null, this);
}
}
@Override
public void onResume() {
super.onResume();
// Triggers loader init via updateState() if the router is running
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(new Intent(RouterService.LOCAL_BROADCAST_REQUEST_STATE));
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
int activatedPosition = mAdapter.getActivatedPosition();
if (activatedPosition >= 0) {
// Serialize and persist the activated item position.
outState.putInt(STATE_ACTIVATED_POSITION, activatedPosition);
}
}
@Override
public void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(onStateChange);
}
public void addTunnel(TunnelEntry tunnelEntry) {
mAdapter.addTunnel(tunnelEntry);
}
// LoaderManager.LoaderCallbacks<List<TunnelEntry>>
public Loader<List<TunnelEntry>> onCreateLoader(int id, Bundle args) {
return new TunnelEntryLoader(getActivity(), mGroup, mClientTunnels);
}
public void onLoadFinished(Loader<List<TunnelEntry>> loader,
List<TunnelEntry> data) {
if (loader.getId() == (mClientTunnels ?
CLIENT_LOADER_ID : SERVER_LOADER_ID)) {
mAdapter.setTunnels(data);
}
}
public void onLoaderReset(Loader<List<TunnelEntry>> loader) {
if (loader.getId() == (mClientTunnels ?
CLIENT_LOADER_ID : SERVER_LOADER_ID)) {
if (Util.getRouterContext() == null)
mAdapter.setTunnels(null);
else
mAdapter.setTunnels(new ArrayList<TunnelEntry>());
}
}
}

View File

@ -0,0 +1,74 @@
package net.i2p.android.i2ptunnel;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
//import android.support.v4.app.DialogFragment;
import androidx.fragment.app.DialogFragment;
//import android.support.v7.app.AlertDialog;
import androidx.appcompat.app.AlertDialog;
import net.i2p.android.router.R;
import net.i2p.android.wizard.model.AbstractWizardModel;
import net.i2p.android.wizard.ui.AbstractWizardActivity;
public class TunnelWizardActivity extends AbstractWizardActivity {
@Override
protected AbstractWizardModel onCreateModel() {
return new TunnelWizardModel(this);
}
@Override
protected DialogFragment onGetFinishWizardDialog() {
return FinishWizardDialogFragment.newInstance();
}
public void onFinishWizard() {
Intent result = new Intent();
result.putExtra(TunnelsContainer.TUNNEL_WIZARD_DATA, mWizardModel.save());
setResult(Activity.RESULT_OK, result);
finish();
}
public static class FinishWizardDialogFragment extends DialogFragment {
TunnelWizardActivity mListener;
public static DialogFragment newInstance() {
return new FinishWizardDialogFragment();
}
public void onAttach(Context context) {
super.onAttach(context);
// Verify that the host fragment implements the callback interface
try {
// Instantiate the TunnelWizardActivity so we can send events to the host
mListener = (TunnelWizardActivity) context;
} catch (ClassCastException e) {
// The fragment doesn't implement the interface, throw exception
throw new ClassCastException(context.toString()
+ " must be TunnelWizardActivity");
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage(R.string.i2ptunnel_wizard_submit_confirm_message)
.setPositiveButton(R.string.i2ptunnel_wizard_submit_confirm_button,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
mListener.onFinishWizard();
}
})
.setNegativeButton(android.R.string.cancel, null)
.create();
}
}
}

View File

@ -0,0 +1,125 @@
package net.i2p.android.i2ptunnel;
import android.content.Context;
import android.content.res.Resources;
import net.i2p.android.router.R;
import net.i2p.android.wizard.model.AbstractWizardModel;
import net.i2p.android.wizard.model.BranchPage;
import net.i2p.android.wizard.model.Conditional;
import net.i2p.android.wizard.model.I2PDestinationPage;
import net.i2p.android.wizard.model.PageList;
import net.i2p.android.wizard.model.SingleFixedBooleanPage;
import net.i2p.android.wizard.model.SingleFixedChoicePage;
import net.i2p.android.wizard.model.SingleTextFieldPage;
public class TunnelWizardModel extends AbstractWizardModel {
public TunnelWizardModel(Context context) {
super(context);
}
@Override
protected PageList onNewRootPageList() {
Resources res = mContext.getResources();
Conditional cTunnelType = new Conditional();
Conditional cClientType = new Conditional();
Conditional cServerType = new Conditional();
return new PageList(
new BranchPage(this, res.getString(R.string.i2ptunnel_wizard_k_client_server))
.addBranch(res.getString(R.string.i2ptunnel_wizard_v_client),
new SingleFixedChoicePage(this, res.getString(R.string.i2ptunnel_wizard_k_type))
.setChoices(
res.getString(R.string.i2ptunnel_type_client),
res.getString(R.string.i2ptunnel_type_httpclient),
res.getString(R.string.i2ptunnel_type_ircclient),
res.getString(R.string.i2ptunnel_type_sockstunnel),
res.getString(R.string.i2ptunnel_type_socksirctunnel),
res.getString(R.string.i2ptunnel_type_connectclient),
res.getString(R.string.i2ptunnel_type_streamrclient))
.setRequired(true)
.makeConditional(cClientType))
.addBranch(res.getString(R.string.i2ptunnel_wizard_v_server),
new SingleFixedChoicePage(this, res.getString(R.string.i2ptunnel_wizard_k_type))
.setChoices(
res.getString(R.string.i2ptunnel_type_server),
res.getString(R.string.i2ptunnel_type_httpserver),
res.getString(R.string.i2ptunnel_type_httpbidirserver),
res.getString(R.string.i2ptunnel_type_ircserver),
res.getString(R.string.i2ptunnel_type_streamrserver))
.setRequired(true)
.makeConditional(cServerType))
.setRequired(true)
.makeConditional(cTunnelType),
new SingleTextFieldPage(this, res.getString(R.string.i2ptunnel_wizard_k_name))
.setDescription(res.getString(R.string.i2ptunnel_wizard_desc_name))
.setRequired(true),
new SingleTextFieldPage(this, res.getString(R.string.i2ptunnel_wizard_k_desc))
.setDescription(res.getString(R.string.i2ptunnel_wizard_desc_desc)),
new I2PDestinationPage(this, res.getString(R.string.i2ptunnel_wizard_k_dest))
.setDescription(res.getString(R.string.i2ptunnel_wizard_desc_dest))
.setRequired(true)
.setEqualAnyCondition(cClientType,
res.getString(R.string.i2ptunnel_type_client),
res.getString(R.string.i2ptunnel_type_ircclient),
res.getString(R.string.i2ptunnel_type_streamrclient)),
new SingleTextFieldPage(this, res.getString(R.string.i2ptunnel_wizard_k_outproxies))
.setDescription(res.getString(R.string.i2ptunnel_wizard_desc_outproxies))
.setEqualAnyCondition(cClientType,
res.getString(R.string.i2ptunnel_type_httpclient),
res.getString(R.string.i2ptunnel_type_connectclient),
res.getString(R.string.i2ptunnel_type_sockstunnel),
res.getString(R.string.i2ptunnel_type_socksirctunnel)),
// Not set required because a default is specified.
// Otherwise user would need to edit the field to
// enable the Next button.
new SingleTextFieldPage(this, res.getString(R.string.i2ptunnel_wizard_k_target_host))
.setDefault("127.0.0.1")
.setDescription(res.getString(R.string.i2ptunnel_wizard_desc_target_host))
.setEqualCondition(cClientType,
res.getString(R.string.i2ptunnel_type_streamrclient))
.setEqualAnyCondition(cServerType,
res.getString(R.string.i2ptunnel_type_server),
res.getString(R.string.i2ptunnel_type_httpserver),
res.getString(R.string.i2ptunnel_type_httpbidirserver),
res.getString(R.string.i2ptunnel_type_ircserver)),
new SingleTextFieldPage(this, res.getString(R.string.i2ptunnel_wizard_k_target_port))
.setDescription(res.getString(R.string.i2ptunnel_wizard_desc_target_port))
.setNumeric(true)
.setRequired(true)
.setEqualCondition(cTunnelType, res.getString(R.string.i2ptunnel_wizard_v_server)),
// Not set required because a default is specified.
new SingleTextFieldPage(this, res.getString(R.string.i2ptunnel_wizard_k_reachable_on))
.setDefault("127.0.0.1")
.setDescription(res.getString(R.string.i2ptunnel_wizard_desc_reachable_on))
.setEqualAnyCondition(cClientType,
res.getString(R.string.i2ptunnel_type_client),
res.getString(R.string.i2ptunnel_type_httpclient),
res.getString(R.string.i2ptunnel_type_ircclient),
res.getString(R.string.i2ptunnel_type_sockstunnel),
res.getString(R.string.i2ptunnel_type_socksirctunnel),
res.getString(R.string.i2ptunnel_type_connectclient))
.setEqualAnyCondition(cServerType,
res.getString(R.string.i2ptunnel_type_httpbidirserver),
res.getString(R.string.i2ptunnel_type_streamrserver)),
new SingleTextFieldPage(this, res.getString(R.string.i2ptunnel_wizard_k_binding_port))
.setDescription(res.getString(R.string.i2ptunnel_wizard_k_binding_port))
.setNumeric(true)
.setRequired(true)
.setEqualCondition(cTunnelType, res.getString(R.string.i2ptunnel_wizard_v_client))
.setEqualCondition(cServerType, res.getString(R.string.i2ptunnel_type_httpbidirserver)),
new SingleFixedBooleanPage(this, res.getString(R.string.i2ptunnel_wizard_k_auto_start))
.setDescription(res.getString(R.string.i2ptunnel_wizard_desc_auto_start))
.setRequired(true)
);
}
}

View File

@ -0,0 +1,394 @@
package net.i2p.android.i2ptunnel;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
//import android.support.v4.app.ActivityCompat;
import androidx.core.app.ActivityCompat;
//import android.support.v4.app.ActivityOptionsCompat;
import androidx.core.app.ActivityOptionsCompat;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
//import android.support.v4.app.FragmentManager;
import androidx.fragment.app.FragmentManager;
//import android.support.v4.app.FragmentPagerAdapter;
import androidx.fragment.app.FragmentPagerAdapter;
//import android.support.v4.util.Pair;
import androidx.core.util.Pair;
//import android.support.v4.view.ViewPager;
import androidx.viewpager.widget.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.Toast;
import com.google.android.material.tabs.TabLayout;
import net.lucode.hackware.magicindicator.MagicIndicator;
import net.lucode.hackware.magicindicator.ViewPagerHelper;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ColorTransitionPagerTitleView;
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.SimplePagerTitleView;
import androidx.core.content.ContextCompat;
import net.i2p.android.i2ptunnel.preferences.EditTunnelContainerFragment;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
import net.i2p.android.util.FragmentUtils;
import net.i2p.app.ClientAppState;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.i2ptunnel.ui.TunnelConfig;
import net.i2p.router.RouterContext;
import java.util.List;
/**
* The top level Fragment of the tunnels tabs.
* Creates client and server TunnelListFragments,
* the options menu, and the new tunnel wizard button.
*/
public class TunnelsContainer extends Fragment implements
FragmentUtils.TwoPaneProvider,
TunnelListFragment.OnTunnelSelectedListener,
TunnelDetailFragment.TunnelDetailListener {
static final int TUNNEL_WIZARD_REQUEST = 1;
public static final String TUNNEL_WIZARD_DATA = "tunnel_wizard_data";
/**
* Whether or not the activity is in two-pane mode, i.e. running on a tablet
* device.
*/
private boolean mTwoPane;
ViewPager mViewPager;
MagicIndicator mPageIndicator;
FragmentPagerAdapter mFragPagerAdapter;
private static final String FRAGMENT_CLIENT = "client_fragment";
private static final String FRAGMENT_SERVER = "server_fragment";
private static final int FRAGMENT_ID_CLIENT = 0;
private static final int FRAGMENT_ID_SERVER = 1;
TunnelListFragment mClientFrag;
TunnelListFragment mServerFrag;
private ImageButton mNewTunnel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
private static boolean showActions() {
RouterContext rCtx = Util.getRouterContext();
TunnelControllerGroup tcg = TunnelControllerGroup.getInstance();
return rCtx != null && tcg != null &&
tcg.getState() == ClientAppState.RUNNING;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.container_tunnels, container, false);
mViewPager = v.findViewById(R.id.pager);
mPageIndicator = v.findViewById(R.id.magic_indicator);
mNewTunnel = v.findViewById(R.id.promoted_action);
mNewTunnel.setVisibility(showActions() ? View.VISIBLE : View.GONE);
// Initialize ViewPager adapter
mFragPagerAdapter = new TunnelsPagerAdapter(getChildFragmentManager());
mViewPager.setAdapter(mFragPagerAdapter);
if (v.findViewById(R.id.detail_fragment) != null) {
mTwoPane = true;
}
if (savedInstanceState != null) {
mClientFrag = (TunnelListFragment) getChildFragmentManager().getFragment(
savedInstanceState, FRAGMENT_CLIENT);
mServerFrag = (TunnelListFragment) getChildFragmentManager().getFragment(
savedInstanceState, FRAGMENT_SERVER);
}
setupMagicIndicator();
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Initialize ViewPager and adapter
mFragPagerAdapter = new TunnelsPagerAdapter(getChildFragmentManager());
mViewPager.setAdapter(mFragPagerAdapter);
setupMagicIndicator();
// Setup New Tunnel button
mNewTunnel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent wi = new Intent(getActivity(), TunnelWizardActivity.class);
startActivityForResult(wi, TUNNEL_WIZARD_REQUEST);
}
});
}
public class TunnelsPagerAdapter extends FragmentPagerAdapter {
private static final int NUM_ITEMS = 2;
public TunnelsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case FRAGMENT_ID_CLIENT:
return (mClientFrag = TunnelListFragment.newInstance(true));
case FRAGMENT_ID_SERVER:
return (mServerFrag = TunnelListFragment.newInstance(false));
default:
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case FRAGMENT_ID_CLIENT:
return getActivity().getString(R.string.label_i2ptunnel_client);
case FRAGMENT_ID_SERVER:
return getActivity().getString(R.string.label_i2ptunnel_server);
default:
return null;
}
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.fragment_i2ptunnel_list_actions, menu);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
boolean showActions = showActions();
menu.findItem(R.id.action_start_all_tunnels).setVisible(showActions);
menu.findItem(R.id.action_stop_all_tunnels).setVisible(showActions);
menu.findItem(R.id.action_restart_all_tunnels).setVisible(showActions);
// Was causing a NPE in version 4745238 (0.9.31)
if (mNewTunnel != null) {
mNewTunnel.setVisibility(showActions ? View.VISIBLE : View.GONE);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
TunnelControllerGroup tcg = TunnelControllerGroup.getInstance();
if (tcg == null)
return false;
// Handle presses on the action bar items
List<String> msgs;
switch (item.getItemId()) {
case R.id.action_start_all_tunnels:
msgs = tcg.startAllControllers();
break;
case R.id.action_stop_all_tunnels:
msgs = tcg.stopAllControllers();
break;
case R.id.action_restart_all_tunnels:
// Do a manual stop-start cycle, because tcg.restartAllControllers() happens in the
// foreground, whereas tcg.startAllControllers() fires off threads for starting.
msgs = tcg.stopAllControllers();
msgs.addAll(tcg.startAllControllers());
break;
default:
return super.onOptionsItemSelected(item);
}
// TODO: Do something with the other messages
if (msgs.size() > 0)
Toast.makeText(getActivity().getApplicationContext(),
msgs.get(0), Toast.LENGTH_LONG).show();
return true;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == TUNNEL_WIZARD_REQUEST) {
if (resultCode == Activity.RESULT_OK) {
Bundle tunnelData = data.getExtras().getBundle(TUNNEL_WIZARD_DATA);
// ticket #2483
if (tunnelData == null)
return;
// TODO fetch earlier
TunnelControllerGroup tcg = TunnelControllerGroup.getInstance();
if (tcg == null) {
// router went away
Toast.makeText(getActivity().getApplicationContext(),
R.string.router_not_running, Toast.LENGTH_LONG).show();
return;
}
TunnelConfig cfg = TunnelUtil.createConfigFromWizard(getActivity(), tcg, tunnelData);
TunnelEntry tunnel = TunnelEntry.createNewTunnel(getActivity(), tcg, cfg);
if (tunnel != null) {
if (tunnel.isClient() && mClientFrag != null)
mClientFrag.addTunnel(tunnel);
else if (mServerFrag != null)
mServerFrag.addTunnel(tunnel);
}
}
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Since the pager fragments don't have known tags or IDs, the only way to persist the
// reference is to use putFragment/getFragment. Remember, we're not persisting the exact
// Fragment instance. This mechanism simply gives us a way to persist access to the
// 'current' fragment instance for the given fragment (which changes across orientation
// changes).
//
// The outcome of all this is that the "Refresh" menu button refreshes the stream across
// orientation changes.
if (mClientFrag != null)
getChildFragmentManager().putFragment(outState, FRAGMENT_CLIENT, mClientFrag);
if (mServerFrag != null)
getChildFragmentManager().putFragment(outState, FRAGMENT_SERVER, mServerFrag);
}
// FragmentUtils.TwoPaneProvider
public boolean isTwoPane() {
return mTwoPane;
}
// TunnelListFragment.OnTunnelSelectedListener
public final void onTunnelSelected(int tunnelId, Pair<View, String>[] pairs) {
if (mTwoPane) {
// In two-pane mode, show the detail view in this activity by
// adding or replacing the detail fragment using a
// fragment transaction.
try {
TunnelDetailFragment detailFrag = TunnelDetailFragment.newInstance(tunnelId);
getChildFragmentManager().beginTransaction()
.replace(R.id.detail_fragment, detailFrag)
.commitNow(); // Use commitNow() to execute synchronously
} catch (Exception e) {
Log.e("TunnelsContainer", "Failed to update detail fragment", e);
}
} else {
// In single-pane mode, simply start the detail activity
// for the selected item ID.
Intent detailIntent = new Intent(getActivity(), TunnelDetailActivity.class);
detailIntent.putExtra(TunnelDetailFragment.TUNNEL_ID, tunnelId);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(), pairs);
ActivityCompat.startActivity(getActivity(), detailIntent, options.toBundle());
}
}
// TunnelDetailFragment.TunnelDetailListener
@Override
public void onEditTunnel(int tunnelId) {
Fragment editFrag = EditTunnelContainerFragment.newInstance(tunnelId);
getChildFragmentManager().beginTransaction()
.replace(R.id.detail_fragment, editFrag)
.addToBackStack("")
.commit();
}
public void onTunnelDeleted(int tunnelId, int numTunnelsLeft) {
// Should only get here in two-pane mode, but just to be safe:
if (mTwoPane) {
if (numTunnelsLeft > 0) {
TunnelDetailFragment detailFrag = TunnelDetailFragment.newInstance(
(tunnelId > 0 ? tunnelId - 1 : 0));
getChildFragmentManager().beginTransaction()
.replace(R.id.detail_fragment, detailFrag).commit();
} else {
TunnelDetailFragment detailFrag = (TunnelDetailFragment) getChildFragmentManager().findFragmentById(R.id.detail_fragment);
getChildFragmentManager().beginTransaction()
.remove(detailFrag).commit();
}
}
}
private void setupMagicIndicator() {
if (mPageIndicator == null || getContext() == null) {
return;
}
CommonNavigator commonNavigator = new CommonNavigator(getContext());
commonNavigator.setAdjustMode(true); // Add this line for better spacing
commonNavigator.setAdapter(new CommonNavigatorAdapter() {
@Override
public int getCount() {
return mFragPagerAdapter.getCount();
}
@Override
public IPagerTitleView getTitleView(Context context, final int index) {
SimplePagerTitleView simplePagerTitleView = new ColorTransitionPagerTitleView(context);
simplePagerTitleView.setText(mFragPagerAdapter.getPageTitle(index));
simplePagerTitleView.setTextSize(16); // Add this line to increase text size
simplePagerTitleView.setNormalColor(ContextCompat.getColor(context,
R.color.primary_text_disabled_material_dark));
simplePagerTitleView.setSelectedColor(ContextCompat.getColor(context,
R.color.primary_text_default_material_dark));
simplePagerTitleView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(index);
}
});
return simplePagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
LinePagerIndicator indicator = new LinePagerIndicator(context);
indicator.setMode(LinePagerIndicator.MODE_WRAP_CONTENT);
indicator.setColors(ContextCompat.getColor(context, R.color.primary));
indicator.setLineHeight(dpToPx(context, 3));
return indicator;
}
});
mPageIndicator.setNavigator(commonNavigator);
ViewPagerHelper.bind(mPageIndicator, mViewPager);
}
private int dpToPx(Context context, int dp) {
float density = context.getResources().getDisplayMetrics().density;
return Math.round(dp * density);
}
}

View File

@ -0,0 +1,198 @@
package net.i2p.android.i2ptunnel.preferences;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
//import android.support.v7.app.AlertDialog;
import androidx.appcompat.app.AlertDialog;
//import android.support.v7.preference.CheckBoxPreference;
import androidx.preference.CheckBoxPreference;
//import android.support.v7.preference.Preference;
import androidx.preference.Preference;
//import android.support.v7.preference.PreferenceCategory;
import androidx.preference.PreferenceCategory;
//import android.support.v7.preference.PreferenceScreen;
import androidx.preference.PreferenceScreen;
import net.i2p.android.i2ptunnel.util.TunnelLogic;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.router.R;
public class AdvancedTunnelPreferenceFragment extends BaseTunnelPreferenceFragment {
public static AdvancedTunnelPreferenceFragment newInstance(int tunnelId) {
AdvancedTunnelPreferenceFragment f = new AdvancedTunnelPreferenceFragment();
Bundle args = new Bundle();
args.putInt(ARG_TUNNEL_ID, tunnelId);
f.setArguments(args);
return f;
}
@Override
protected void loadPreferences() {
String type = TunnelUtil.getController(mGroup, mTunnelId).getType();
new TunnelPreferences(type).runLogic();
}
class TunnelPreferences extends TunnelLogic {
PreferenceScreen ps;
PreferenceCategory tunParamCategory;
public TunnelPreferences(String type) {
super(type);
}
@Override
protected void general() {
}
@Override
protected void generalClient() {
}
@Override
protected void generalClientStreamr(boolean isStreamr) {
}
@Override
protected void generalClientPort() {
}
@Override
protected void generalClientPortStreamr(boolean isStreamr) {
}
@Override
protected void generalClientProxy(boolean isProxy) {
}
@Override
protected void generalClientProxyHttp(boolean isHttp) {
}
@Override
protected void generalClientStandardOrIrc(boolean isStandardOrIrc) {
}
@Override
protected void generalClientIrc() {
}
@Override
protected void generalServerHttp() {
}
@Override
protected void generalServerHttpBidirOrStreamr(boolean isStreamr) {
}
@Override
protected void generalServerPort() {
}
@Override
protected void generalServerPortStreamr(boolean isStreamr) {
}
@Override
protected void advanced() {
addPreferencesFromResource(R.xml.tunnel_adv);
ps = getPreferenceScreen();
tunParamCategory = (PreferenceCategory) ps.findPreference(
getString(R.string.TUNNEL_CAT_TUNNEL_PARAMS));
}
@Override
protected void advancedStreamr(boolean isStreamr) {
if (isStreamr)
tunParamCategory.removePreference(tunParamCategory.findPreference(getString(R.string.TUNNEL_OPT_PROFILE)));
}
@Override
protected void advancedServerOrStreamrClient(boolean isServerOrStreamrClient) {
if (isServerOrStreamrClient)
tunParamCategory.removePreference(tunParamCategory.findPreference(getString(R.string.TUNNEL_OPT_DELAY_CONNECT)));
}
@Override
protected void advancedServer() {
addPreferencesFromResource(R.xml.tunnel_adv_server);
}
@Override
protected void advancedServerHttp(boolean isHttp) {
if (isHttp)
addPreferencesFromResource(R.xml.tunnel_adv_server_http);
else {
PreferenceCategory accessCtlCategory = (PreferenceCategory) ps.findPreference(
getString(R.string.TUNNEL_CAT_ACCESS_CONTROL));
accessCtlCategory.removePreference(accessCtlCategory.findPreference(getString(R.string.TUNNEL_OPT_REJECT_INPROXY)));
}
}
@Override
protected void advancedIdle() {
addPreferencesFromResource(R.xml.tunnel_adv_idle);
}
@Override
protected void advancedIdleServerOrStreamrClient(boolean isServerOrStreamrClient) {
if (isServerOrStreamrClient)
ps.removePreference(ps.findPreference(getString(R.string.TUNNEL_OPT_DELAY_OPEN)));
}
@Override
protected void advancedClient() {
PreferenceCategory idleCategory = (PreferenceCategory) ps.findPreference(
getString(R.string.TUNNEL_CAT_IDLE)
);
addPreferencesFromResource(R.xml.tunnel_adv_idle_client, idleCategory);
// PERSISTENT_KEY and NEW_KEYS can't be set simultaneously
final CheckBoxPreference nk = (CheckBoxPreference) findPreference(getString(R.string.TUNNEL_OTP_NEW_KEYS));
nk.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
final SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
if ((Boolean) o && prefs.getBoolean(getString(R.string.TUNNEL_OPT_PERSISTENT_KEY),
getResources().getBoolean(R.bool.DEFAULT_PERSISTENT_KEY))) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.new_keys_on_reopen_conflict_title)
.setMessage(R.string.new_keys_on_reopen_conflict_msg)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(getString(R.string.TUNNEL_OPT_PERSISTENT_KEY), false);
editor.apply();
nk.setChecked(true);
}
})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.show();
return false;
} else
return true;
}
});
}
@Override
protected void advancedClientHttp() {
addPreferencesFromResource(R.xml.tunnel_adv_client_http);
}
@Override
protected void advancedClientProxy() {
addPreferencesFromResource(R.xml.tunnel_adv_client_proxy);
}
@Override
protected void advancedOther() {
addPreferencesFromResource(R.xml.tunnel_adv_other);
}
}
}

View File

@ -0,0 +1,128 @@
package net.i2p.android.i2ptunnel.preferences;
import android.os.Build;
import android.os.Bundle;
//import android.support.v7.preference.Preference;
import androidx.preference.Preference;
//import android.support.v7.preference.PreferenceGroup;
import androidx.preference.PreferenceGroup;
//import android.support.v7.preference.PreferenceScreen;
import androidx.preference.PreferenceScreen;
import android.widget.Toast;
import net.i2p.android.i2ptunnel.util.SaveTunnelTask;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.preferences.util.CustomPreferenceFragment;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.i2ptunnel.ui.TunnelConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.CancellationException;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.TimeUnit;
public abstract class BaseTunnelPreferenceFragment extends CustomPreferenceFragment {
protected static final String ARG_TUNNEL_ID = "tunnelId";
protected TunnelControllerGroup mGroup;
protected int mTunnelId;
@Override
public void onCreatePreferences(Bundle paramBundle, String s) {
String error;
try {
mGroup = TunnelControllerGroup.getInstance();
error = mGroup == null ? getResources().getString(R.string.i2ptunnel_not_initialized) : null;
} catch (IllegalArgumentException iae) {
mGroup = null;
error = iae.toString();
}
if (mGroup == null) {
Toast.makeText(getActivity().getApplicationContext(),
error, Toast.LENGTH_LONG).show();
getActivity().finish();
} else if (getArguments().containsKey(ARG_TUNNEL_ID)) {
mTunnelId = getArguments().getInt(ARG_TUNNEL_ID, 0);
try {
TunnelUtil.writeTunnelToPreferences(getActivity(), mGroup, mTunnelId);
} catch (IllegalArgumentException e) {
// Tunnel doesn't exist, or the tunnel config file could not be read
Util.e("Could not load tunnel details", e);
Toast.makeText(getActivity().getApplicationContext(),
R.string.i2ptunnel_no_tunnel_details, Toast.LENGTH_LONG).show();
getActivity().finish();
}
// https://stackoverflow.com/questions/17880437/which-settings-file-does-preferencefragment-read-write
getPreferenceManager().setSharedPreferencesName(TunnelUtil.getPreferencesFilename(mTunnelId));
try {
loadPreferences();
} catch (IllegalArgumentException iae) {
// mGroup couldn't load its config file
Toast.makeText(getActivity().getApplicationContext(),
iae.toString(), Toast.LENGTH_LONG).show();
getActivity().finish();
}
}
}
@Override
public void onPause() {
super.onPause();
// Pre-Honeycomb: onPause() is the last method guaranteed to be called.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
saveTunnel();
}
@Override
public void onStop() {
super.onStop();
// Honeycomb and above: onStop() is the last method guaranteed to be called.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
saveTunnel();
}
private void saveTunnel() {
if (mGroup != null) {
TunnelConfig cfg = TunnelUtil.createConfigFromPreferences(getActivity(), mGroup, mTunnelId);
SaveTunnelTask task = new SaveTunnelTask(mGroup, mTunnelId, cfg);
try {
// TODO: There used to be a possible ANR here, because the underlying I2P code
// checks if the session is open as part of updating its config. We may need to save
// completely asynchronously (and ensure we do actually save before the app closes).
task.execute().get(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Util.e("Interrupted while saving tunnel config", e);
} catch (ExecutionException e) {
Util.e("Error while saving tunnel config", e);
} catch (CancellationException e) {
Util.e("Cancelled while saving tunnel config", e);
} catch (TimeoutException e) {
Util.e("Timed out while savomg tunnel config", e);
}
}
}
protected abstract void loadPreferences();
/**
* http://stackoverflow.com/a/20806812
*
* @param id the Preferences XML to load
* @param newParent the parent PreferenceGroup to add the new Preferences to.
*/
protected void addPreferencesFromResource(int id, PreferenceGroup newParent) {
PreferenceScreen screen = getPreferenceScreen();
int last = screen.getPreferenceCount();
addPreferencesFromResource(id);
while (screen.getPreferenceCount() > last) {
Preference p = screen.getPreference(last);
screen.removePreference(p); // decreases the preference count
newParent.addPreference(p);
}
}
}

View File

@ -0,0 +1,63 @@
package net.i2p.android.i2ptunnel.preferences;
import android.content.Intent;
import android.os.Bundle;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
//import android.support.v4.app.FragmentManager;
import androidx.fragment.app.FragmentManager;
//import android.support.v7.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatActivity;
//import android.support.v7.widget.Toolbar;
import androidx.appcompat.widget.Toolbar;
import net.i2p.android.i2ptunnel.TunnelDetailActivity;
import net.i2p.android.i2ptunnel.TunnelDetailFragment;
import net.i2p.android.router.R;
import net.i2p.android.util.LocaleManager;
public class EditTunnelActivity extends AppCompatActivity {
private int mTunnelId;
private final LocaleManager localeManager = new LocaleManager();
@Override
public void onCreate(Bundle savedInstanceState) {
localeManager.onCreate(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single_fragment);
// Set the action bar
Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (savedInstanceState == null) {
mTunnelId = getIntent().getIntExtra(TunnelDetailFragment.TUNNEL_ID, 0);
Fragment editFrag = GeneralTunnelPreferenceFragment.newInstance(mTunnelId);
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment, editFrag).commit();
}
}
@Override
public void onResume() {
super.onResume();
localeManager.onResume(this);
}
@Override
public boolean onSupportNavigateUp() {
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 0) {
fragmentManager.popBackStack();
} else {
Intent intent = new Intent(this, TunnelDetailActivity.class);
intent.putExtra(TunnelDetailFragment.TUNNEL_ID, mTunnelId);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
return true;
}
}

View File

@ -0,0 +1,67 @@
package net.i2p.android.i2ptunnel.preferences;
import android.os.Bundle;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
//import android.support.v4.app.FragmentManager;
import androidx.fragment.app.FragmentManager;
//import android.support.v7.widget.Toolbar;
import androidx.appcompat.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import net.i2p.android.router.R;
/**
* A shim that emulates EditTunnelActivity to provide a Toolbar with navigation
* in two-pane mode.
*/
public class EditTunnelContainerFragment extends Fragment {
private static final String ARG_TUNNEL_ID = "tunnelId";
public static EditTunnelContainerFragment newInstance(int tunnelId) {
EditTunnelContainerFragment f = new EditTunnelContainerFragment();
Bundle args = new Bundle();
args.putInt(ARG_TUNNEL_ID, tunnelId);
f.setArguments(args);
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.activity_single_fragment, container, false);
// Set the action bar
Toolbar toolbar = (Toolbar) v.findViewById(R.id.main_toolbar);
toolbar.setTitle(R.string.edit_tunnel);
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Try and navigate back through the edit tunnel fragments.
// Otherwise, pop us back off.
FragmentManager fragmentManager = getChildFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 0)
fragmentManager.popBackStack();
else
getFragmentManager().popBackStack();
}
});
return v;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (savedInstanceState == null) {
int tunnelId = getArguments().getInt(ARG_TUNNEL_ID);
BaseTunnelPreferenceFragment editFrag = GeneralTunnelPreferenceFragment.newInstance(tunnelId);
getChildFragmentManager().beginTransaction()
.add(R.id.fragment, editFrag).commit();
}
}
}

View File

@ -0,0 +1,280 @@
package net.i2p.android.i2ptunnel.preferences;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
//import android.support.v7.app.AlertDialog;
import androidx.appcompat.app.AlertDialog;
//import android.support.v7.preference.CheckBoxPreference;
import androidx.preference.CheckBoxPreference;
//import android.support.v7.preference.ListPreference;
import androidx.preference.ListPreference;
//import android.support.v7.preference.Preference;
import androidx.preference.Preference;
//import android.support.v7.preference.PreferenceCategory;
import androidx.preference.PreferenceCategory;
//import android.support.v7.preference.PreferenceScreen;
import androidx.preference.PreferenceScreen;
import net.i2p.android.i2ptunnel.util.TunnelLogic;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.router.R;
import net.i2p.util.Addresses;
import java.util.Set;
public class GeneralTunnelPreferenceFragment extends BaseTunnelPreferenceFragment {
private CheckBoxPreference persistentKeys;
public static GeneralTunnelPreferenceFragment newInstance(int tunnelId) {
GeneralTunnelPreferenceFragment f = new GeneralTunnelPreferenceFragment();
Bundle args = new Bundle();
args.putInt(ARG_TUNNEL_ID, tunnelId);
f.setArguments(args);
return f;
}
@Override
protected void loadPreferences() {
String type = TunnelUtil.getController(mGroup, mTunnelId).getType();
new TunnelPreferences(type).runLogic();
}
@Override
public void onStart() {
super.onStart();
// In case this was changed when toggling NEW_KEYS and then we navigated back
if (persistentKeys != null)
persistentKeys.setChecked(getPreferenceManager().getSharedPreferences().getBoolean(
getString(R.string.TUNNEL_OPT_PERSISTENT_KEY),
getResources().getBoolean(R.bool.DEFAULT_PERSISTENT_KEY)
));
}
class TunnelPreferences extends TunnelLogic {
PreferenceScreen ps;
PreferenceCategory generalCategory;
PreferenceCategory portCategory;
public TunnelPreferences(String type) {
super(type);
}
@Override
protected void general() {
addPreferencesFromResource(R.xml.tunnel_gen);
ps = getPreferenceScreen();
generalCategory = (PreferenceCategory) ps.findPreference(
getString(R.string.TUNNEL_CAT_GENERAL));
portCategory = (PreferenceCategory) ps.findPreference(
getString(R.string.TUNNEL_CAT_PORT));
}
@Override
protected void generalClient() {
addPreferencesFromResource(R.xml.tunnel_gen_client, generalCategory);
// PERSISTENT_KEY and NEW_KEYS can't be set simultaneously
persistentKeys = (CheckBoxPreference) findPreference(getString(R.string.TUNNEL_OPT_PERSISTENT_KEY));
persistentKeys.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
final SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
if ((Boolean) o && prefs.getBoolean(getString(R.string.TUNNEL_OTP_NEW_KEYS),
getResources().getBoolean(R.bool.DEFAULT_NEW_KEYS))) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.persistent_key_conflict_title)
.setMessage(R.string.persistent_key_conflict_msg)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(getString(R.string.TUNNEL_OTP_NEW_KEYS), false);
editor.apply();
persistentKeys.setChecked(true);
}
})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.show();
return false;
} else
return true;
}
});
}
@Override
protected void generalClientStreamr(boolean isStreamr) {
if (isStreamr) {
generalCategory.removePreference(generalCategory.findPreference(getString(R.string.TUNNEL_SHARED_CLIENT)));
addPreferencesFromResource(R.xml.tunnel_gen_server_port, portCategory);
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_TARGET_PORT)));
// # TODO: See trac issue #2296
//portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_USE_SSL)));
}
}
@Override
protected void generalClientPort() {
addPreferencesFromResource(R.xml.tunnel_gen_client_port, portCategory);
}
@Override
protected void generalClientPortStreamr(boolean isStreamr) {
ListPreference reachableBy = (ListPreference) portCategory.findPreference(getString(R.string.TUNNEL_INTERFACE));
if (isStreamr)
portCategory.removePreference(reachableBy);
else
setupReachableBy(reachableBy);
}
private void setupReachableBy(final ListPreference reachableBy) {
reachableBy.setEnabled(false);
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
Set<String> interfaceSet = Addresses.getAllAddresses();
final String[] interfaces = interfaceSet.toArray(new String[interfaceSet.size()]);
Activity activity = getActivity();
if (activity != null) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
reachableBy.setEntries(interfaces);
reachableBy.setEntryValues(interfaces);
reachableBy.setEnabled(true);
}
});
}
return null;
}
}.execute();
}
@Override
protected void generalClientProxy(boolean isProxy) {
if (isProxy) {
generalCategory.removePreference(generalCategory.findPreference(getString(R.string.TUNNEL_DEST)));
addPreferencesFromResource(R.xml.tunnel_gen_client_proxy);
}
}
@Override
protected void generalClientProxyHttp(boolean isHttp) {
if (!isHttp)
ps.removePreference(ps.findPreference(getString(R.string.TUNNEL_HTTPCLIENT_SSL_OUTPROXIES)));
}
@Override
protected void generalClientStandardOrIrc(boolean isStandardOrIrc) {
/*
# TODO: See trac issue #2296
if (!isStandardOrIrc)
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_USE_SSL)));
*/
}
@Override
protected void generalClientIrc() {
addPreferencesFromResource(R.xml.tunnel_gen_client_irc);
}
@Override
protected void generalServerHttp() {
addPreferencesFromResource(R.xml.tunnel_gen_server_http, generalCategory);
}
@Override
protected void generalServerHttpBidirOrStreamr(boolean isStreamr) {
addPreferencesFromResource(R.xml.tunnel_gen_client_port, portCategory);
// # TODO: See trac issue #2296
//portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_USE_SSL)));
if (isStreamr)
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_LISTEN_PORT)));
setupReachableBy((ListPreference) portCategory.findPreference(getString(R.string.TUNNEL_INTERFACE)));
}
@Override
protected void generalServerPort() {
addPreferencesFromResource(R.xml.tunnel_gen_server_port, portCategory);
}
@Override
protected void generalServerPortStreamr(boolean isStreamr) {
if (isStreamr) {
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_TARGET_HOST)));
// # TODO: See trac issue #2296
//portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_USE_SSL)));
}
}
@Override
protected void advanced() {
Preference advanced = new Preference(getActivity());
advanced.setKey(getString(R.string.TUNNEL_CAT_ADVANCED));
advanced.setTitle(R.string.settings_label_advanced);
advanced.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Fragment fragment = AdvancedTunnelPreferenceFragment.newInstance(mTunnelId);
getFragmentManager().beginTransaction()
.replace(R.id.fragment, fragment)
.addToBackStack(null)
.commit();
return true;
}
});
ps.addPreference(advanced);
}
@Override
protected void advancedStreamr(boolean isStreamr) {
}
@Override
protected void advancedServerOrStreamrClient(boolean isServerOrStreamrClient) {
}
@Override
protected void advancedServer() {
}
@Override
protected void advancedServerHttp(boolean isHttp) {
}
@Override
protected void advancedIdle() {
}
@Override
protected void advancedIdleServerOrStreamrClient(boolean isServerOrStreamrClient) {
}
@Override
protected void advancedClient() {
}
@Override
protected void advancedClientHttp() {
}
@Override
protected void advancedClientProxy() {
}
@Override
protected void advancedOther() {
}
}
}

View File

@ -0,0 +1,32 @@
package net.i2p.android.i2ptunnel.util;
import android.os.AsyncTask;
import net.i2p.I2PAppContext;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.i2ptunnel.ui.TunnelConfig;
import java.util.List;
/**
* Save a TunnelConfig.
*
* This must be performed in a background thread, because the underlying I2P code calls
* InetAddress.getByName(), which will trigger a NetworkOnMainThreadException otherwise.
*/
public class SaveTunnelTask extends AsyncTask<Void, Void, List<String>> {
final TunnelControllerGroup mGroup;
final int mTunnelId;
final TunnelConfig mCfg;
public SaveTunnelTask(TunnelControllerGroup group, int tunnelId, TunnelConfig cfg) {
mGroup = group;
mTunnelId = tunnelId;
mCfg = cfg;
}
@Override
protected List<String> doInBackground(Void... voids) {
return TunnelUtil.saveTunnel(I2PAppContext.getGlobalContext(), mGroup, mTunnelId, mCfg);
}
}

View File

@ -0,0 +1,101 @@
package net.i2p.android.i2ptunnel.util;
/**
* Generic class for handling the composition of tunnel properties.
* <p/>
* See I2PTunnel's editClient.jsp and editServer.jsp for composition logic.
* <p/>
* Some of the abstract methods have boolean parameters. These are the methods
* where the corresponding tunnel properties may or may not exist, depending on
* the value of the boolean. In all other abstract methods, all corresponding
* tunnel properties always exist.
*/
public abstract class TunnelLogic {
protected final String mType;
public TunnelLogic(String type) {
mType = type;
}
public void runLogic() {
boolean isProxy = "httpclient".equals(mType) ||
"connectclient".equals(mType) ||
"sockstunnel".equals(mType) ||
"socksirctunnel".equals(mType);
general();
if (TunnelUtil.isClient(mType)) {
generalClient();
generalClientStreamr("streamrclient".equals(mType));
generalClientPort();
generalClientPortStreamr("streamrclient".equals(mType));
generalClientProxy(isProxy);
if (isProxy)
generalClientProxyHttp("httpclient".equals(mType));
generalClientStandardOrIrc("client".equals(mType) || "ircclient".equals(mType));
if ("ircclient".equals(mType))
generalClientIrc();
} else {
if ("httpserver".equals(mType) || "httpbidirserver".equals(mType))
generalServerHttp();
if ("httpbidirserver".equals(mType) || "streamrserver".equals(mType))
generalServerHttpBidirOrStreamr("streamrserver".equals(mType));
generalServerPort();
generalServerPortStreamr("streamrserver".equals(mType));
}
advanced();
advancedStreamr("streamrclient".equals(mType) || "streamrserver".equals(mType));
advancedServerOrStreamrClient(!TunnelUtil.isClient(mType) || "streamrclient".equals(mType));
if (!TunnelUtil.isClient(mType)) {
advancedServer();
advancedServerHttp("httpserver".equals(mType) || "httpbidirserver".equals(mType));
}
advancedIdle();
// streamr client sends pings so it will never be idle
advancedIdleServerOrStreamrClient(!TunnelUtil.isClient(mType) || "streamrclient".equals(mType));
if (TunnelUtil.isClient(mType)) {
advancedClient();
if ("httpclient".equals(mType))
advancedClientHttp();
if (isProxy)
advancedClientProxy();
}
advancedOther();
}
protected abstract void general();
protected abstract void generalClient();
protected abstract void generalClientStreamr(boolean isStreamr);
protected abstract void generalClientPort();
protected abstract void generalClientPortStreamr(boolean isStreamr);
protected abstract void generalClientProxy(boolean isProxy);
protected abstract void generalClientProxyHttp(boolean isHttp);
protected abstract void generalClientStandardOrIrc(boolean isStandardOrIrc);
protected abstract void generalClientIrc();
protected abstract void generalServerHttp();
protected abstract void generalServerHttpBidirOrStreamr(boolean isStreamr);
protected abstract void generalServerPort();
protected abstract void generalServerPortStreamr(boolean isStreamr);
protected abstract void advanced();
protected abstract void advancedStreamr(boolean isStreamr);
protected abstract void advancedServerOrStreamrClient(boolean isServerOrStreamrClient);
protected abstract void advancedServer();
protected abstract void advancedServerHttp(boolean isHttp);
protected abstract void advancedIdle();
protected abstract void advancedIdleServerOrStreamrClient(boolean isServerOrStreamrClient);
protected abstract void advancedClient();
protected abstract void advancedClientHttp();
protected abstract void advancedClientProxy();
protected abstract void advancedOther();
}

View File

@ -0,0 +1,803 @@
package net.i2p.android.i2ptunnel.util;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle;
import net.i2p.I2PAppContext;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
import net.i2p.android.wizard.model.Page;
import net.i2p.i2ptunnel.TunnelController;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.i2ptunnel.ui.GeneralHelper;
import net.i2p.i2ptunnel.ui.TunnelConfig;
public class TunnelUtil extends GeneralHelper {
public static final String PREFERENCES_FILENAME_PREFIX = "tunnel.";
public TunnelUtil(I2PAppContext context, TunnelControllerGroup tcg) {
super(context, tcg);
}
public TunnelUtil(TunnelControllerGroup tcg) {
super(tcg);
}
/* General tunnel data for any type */
public static String getTypeFromName(String typeName, Context ctx) {
Resources res = ctx.getResources();
if (res.getString(R.string.i2ptunnel_type_client).equals(typeName))
return "client";
else if (res.getString(R.string.i2ptunnel_type_httpclient).equals(typeName))
return "httpclient";
else if (res.getString(R.string.i2ptunnel_type_ircclient).equals(typeName))
return "ircclient";
else if (res.getString(R.string.i2ptunnel_type_server).equals(typeName))
return "server";
else if (res.getString(R.string.i2ptunnel_type_httpserver).equals(typeName))
return "httpserver";
else if (res.getString(R.string.i2ptunnel_type_sockstunnel).equals(typeName))
return "sockstunnel";
else if (res.getString(R.string.i2ptunnel_type_socksirctunnel).equals(typeName))
return "socksirctunnel";
else if (res.getString(R.string.i2ptunnel_type_connectclient).equals(typeName))
return "connectclient";
else if (res.getString(R.string.i2ptunnel_type_ircserver).equals(typeName))
return "ircserver";
else if (res.getString(R.string.i2ptunnel_type_streamrclient).equals(typeName))
return "streamrclient";
else if (res.getString(R.string.i2ptunnel_type_streamrserver).equals(typeName))
return "streamrserver";
else if (res.getString(R.string.i2ptunnel_type_httpbidirserver).equals(typeName))
return "httpbidirserver";
else
return typeName;
}
public static String getTypeName(String type, Context context) {
Resources res = context.getResources();
switch (type) {
case "client":
return res.getString(R.string.i2ptunnel_type_client);
case "httpclient":
return res.getString(R.string.i2ptunnel_type_httpclient);
case "ircclient":
return res.getString(R.string.i2ptunnel_type_ircclient);
case "server":
return res.getString(R.string.i2ptunnel_type_server);
case "httpserver":
return res.getString(R.string.i2ptunnel_type_httpserver);
case "sockstunnel":
return res.getString(R.string.i2ptunnel_type_sockstunnel);
case "socksirctunnel":
return res.getString(R.string.i2ptunnel_type_socksirctunnel);
case "connectclient":
return res.getString(R.string.i2ptunnel_type_connectclient);
case "ircserver":
return res.getString(R.string.i2ptunnel_type_ircserver);
case "streamrclient":
return res.getString(R.string.i2ptunnel_type_streamrclient);
case "streamrserver":
return res.getString(R.string.i2ptunnel_type_streamrserver);
case "httpbidirserver":
return res.getString(R.string.i2ptunnel_type_httpbidirserver);
default:
return type;
}
}
public static boolean isClient(String type) {
return TunnelController.isClient(type);
}
public static String getPreferencesFilename(int tunnel) {
return PREFERENCES_FILENAME_PREFIX + tunnel;
}
public static void writeTunnelToPreferences(Context ctx, TunnelControllerGroup tcg, int tunnel) {
new TunnelUtil(tcg).writeTunnelToPreferences(ctx, tunnel);
}
public void writeTunnelToPreferences(Context ctx, int tunnel) {
Resources res = ctx.getResources();
if (getController(tunnel) == null)
throw new IllegalArgumentException("Cannot write non-existent tunnel to Preferences");
// Get the current preferences for this tunnel
SharedPreferences preferences = ctx.getSharedPreferences(
getPreferencesFilename(tunnel), Context.MODE_PRIVATE);
// Clear all previous values
SharedPreferences.Editor ed = preferences.edit().clear();
// Load the tunnel config into the preferences
String type = getTunnelType(tunnel);
ed.putString(res.getString(R.string.TUNNEL_TYPE), type);
new TunnelToPreferences(ed, res, tunnel, type).runLogic();
ed.apply();
}
class TunnelToPreferences extends TunnelLogic {
final SharedPreferences.Editor ed;
final Resources res;
final int tunnel;
public TunnelToPreferences(SharedPreferences.Editor ed, Resources res, int tunnel, String type) {
super(type);
this.ed = ed;
this.res = res;
this.tunnel = tunnel;
}
@Override
protected void general() {
ed.putString(res.getString(R.string.TUNNEL_NAME), getTunnelName(tunnel));
ed.putString(res.getString(R.string.TUNNEL_DESCRIPTION), getTunnelDescription(tunnel));
ed.putBoolean(res.getString(R.string.TUNNEL_START_ON_LOAD), shouldStartAutomatically(tunnel));
if (!isClient(mType) || getPersistentClientKey(tunnel))
ed.putString(res.getString(R.string.TUNNEL_PRIV_KEY_FILE), getPrivateKeyFile(tunnel));
}
@Override
protected void generalClient() {
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_PERSISTENT_KEY), getPersistentClientKey(tunnel));
}
@Override
protected void generalClientStreamr(boolean isStreamr) {
if (isStreamr)
ed.putString(res.getString(R.string.TUNNEL_TARGET_HOST), getTargetHost(tunnel));
else
ed.putBoolean(res.getString(R.string.TUNNEL_SHARED_CLIENT), isSharedClient(tunnel));
}
@Override
protected void generalClientPort() {
ed.putInt(res.getString(R.string.TUNNEL_LISTEN_PORT), getClientPort(tunnel));
}
@Override
protected void generalClientPortStreamr(boolean isStreamr) {
if (!isStreamr)
ed.putString(res.getString(R.string.TUNNEL_INTERFACE), getClientInterface(tunnel));
}
@Override
protected void generalClientProxy(boolean isProxy) {
if (isProxy)
ed.putString(res.getString(R.string.TUNNEL_PROXIES), getClientDestination(tunnel));
else
ed.putString(res.getString(R.string.TUNNEL_DEST), getClientDestination(tunnel));
}
@Override
protected void generalClientProxyHttp(boolean isHttp) {
if (isHttp)
ed.putString(res.getString(R.string.TUNNEL_HTTPCLIENT_SSL_OUTPROXIES), getSslProxies(tunnel));
}
@Override
protected void generalClientStandardOrIrc(boolean isStandardOrIrc) {
/* # TODO: See trac issue #2296
if (isStandardOrIrc)
ed.putBoolean(res.getString(R.string.TUNNEL_USE_SSL), isSSLEnabled(tunnel));
*/
}
@Override
protected void generalClientIrc() {
ed.putBoolean(res.getString(R.string.TUNNEL_IRCCLIENT_ENABLE_DCC), getDCC(tunnel));
}
@Override
protected void generalServerHttp() {
ed.putString(res.getString(R.string.TUNNEL_SPOOFED_HOST), getSpoofedHost(tunnel));
}
@Override
protected void generalServerHttpBidirOrStreamr(boolean isStreamr) {
ed.putString(res.getString(R.string.TUNNEL_INTERFACE), getClientInterface(tunnel));
if (!isStreamr)
ed.putInt(res.getString(R.string.TUNNEL_LISTEN_PORT), getClientPort(tunnel));
}
@Override
protected void generalServerPort() {
ed.putInt(res.getString(R.string.TUNNEL_TARGET_PORT), getTargetPort(tunnel));
}
@Override
protected void generalServerPortStreamr(boolean isStreamr) {
if (!isStreamr) {
ed.putString(res.getString(R.string.TUNNEL_TARGET_HOST), getTargetHost(tunnel));
// # TODO: See trac issue #2296
//ed.putBoolean(res.getString(R.string.TUNNEL_USE_SSL), isSSLEnabled(tunnel));
}
}
@Override
protected void advanced() {
ed.putInt(res.getString(R.string.TUNNEL_OPT_LENGTH),
getTunnelDepth(tunnel, res.getInteger(R.integer.DEFAULT_TUNNEL_LENGTH)));
ed.putInt(res.getString(R.string.TUNNEL_OPT_VARIANCE),
getTunnelVariance(tunnel, res.getInteger(R.integer.DEFAULT_TUNNEL_VARIANCE)));
ed.putInt(res.getString(R.string.TUNNEL_OPT_QUANTITY),
getTunnelQuantity(tunnel, res.getInteger(R.integer.DEFAULT_TUNNEL_QUANTITY)));
ed.putInt(res.getString(R.string.TUNNEL_OPT_BACKUP_QUANTITY),
getTunnelBackupQuantity(tunnel, res.getInteger(R.integer.DEFAULT_TUNNEL_BACKUP_QUANTITY)));
}
@Override
protected void advancedStreamr(boolean isStreamr) {
if (!isStreamr)
ed.putString(res.getString(R.string.TUNNEL_OPT_PROFILE),
isInteractive(tunnel) ? "interactive" : "bulk");
}
@Override
protected void advancedServerOrStreamrClient(boolean isServerOrStreamrClient) {
if (!isServerOrStreamrClient)
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_DELAY_CONNECT),
shouldDelayConnect(tunnel));
}
@Override
protected void advancedServer() {
//ed.putBoolean(res.getString(R.string.TUNNEL_OPT_ENCRYPT), getEncrypt(tunnel));
//ed.putString(res.getString(R.string.TUNNEL_OPT_ENCRYPT_KEY), getEncryptKey(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_ACCESS_MODE), getAccessMode(tunnel));
ed.putString(res.getString(R.string.TUNNEL_OPT_ACCESS_LIST), getAccessList(tunnel));
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_UNIQUE_LOCAL), getUniqueLocal(tunnel));
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_MULTIHOME), getMultihome(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_LIMIT_MINUTE), getLimitMinute(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_LIMIT_HOUR), getLimitHour(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_LIMIT_DAY), getLimitDay(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_TOTAL_MINUTE), getTotalMinute(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_TOTAL_HOUR), getTotalHour(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_TOTAL_DAY), getTotalDay(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_MAX_STREAMS), getMaxStreams(tunnel));
}
@Override
protected void advancedServerHttp(boolean isHttp) {
if (isHttp) {
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_REJECT_INPROXY), getRejectInproxy(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_POST_CHECK_TIME), getPostCheckTime(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_POST_MAX), getPostMax(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_POST_BAN_TIME), getPostBanTime(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_POST_TOTAL_MAX), getPostTotalMax(tunnel));
ed.putInt(res.getString(R.string.TUNNEL_OPT_POST_TOTAL_BAN_TIME), getPostTotalBanTime(tunnel));
}
}
@Override
protected void advancedIdle() {
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_REDUCE_IDLE),
getReduceOnIdle(tunnel, res.getBoolean(R.bool.DEFAULT_REDUCE_ON_IDLE)));
ed.putInt(res.getString(R.string.TUNNEL_OPT_REDUCE_QUANTITY),
getReduceCount(tunnel, res.getInteger(R.integer.DEFAULT_REDUCE_COUNT)));
ed.putInt(res.getString(R.string.TUNNEL_OPT_REDUCE_TIME),
getReduceTime(tunnel, res.getInteger(R.integer.DEFAULT_REDUCE_TIME)));
}
@Override
protected void advancedIdleServerOrStreamrClient(boolean isServerOrStreamrClient) {
if (!isServerOrStreamrClient)
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_DELAY_OPEN), getDelayOpen(tunnel));
}
@Override
protected void advancedClient() {
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_CLOSE_IDLE),
getCloseOnIdle(tunnel, res.getBoolean(R.bool.DEFAULT_CLOSE_ON_IDLE)));
ed.putInt(res.getString(R.string.TUNNEL_OPT_CLOSE_TIME),
getCloseTime(tunnel, res.getInteger(R.integer.DEFAULT_CLOSE_TIME)));
ed.putBoolean(res.getString(R.string.TUNNEL_OTP_NEW_KEYS), getNewDest(tunnel));
}
@Override
protected void advancedClientHttp() {
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_HTTPCLIENT_PASS_UA), getAllowUserAgent(tunnel));
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_HTTPCLIENT_PASS_REFERER), getAllowReferer(tunnel));
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_HTTPCLIENT_PASS_ACCEPT), getAllowAccept(tunnel));
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_HTTPCLIENT_ALLOW_SSL), getAllowInternalSSL(tunnel));
ed.putString(res.getString(R.string.TUNNEL_OPT_JUMP_LIST), getJumpList(tunnel));
}
@Override
protected void advancedClientProxy() {
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_LOCAL_AUTH), !"false".equals(getProxyAuth(tunnel)));
ed.putString(res.getString(R.string.TUNNEL_OPT_LOCAL_USERNAME), "");
ed.putString(res.getString(R.string.TUNNEL_OPT_LOCAL_PASSWORD), "");
ed.putBoolean(res.getString(R.string.TUNNEL_OPT_OUTPROXY_AUTH), getOutproxyAuth(tunnel));
ed.putString(res.getString(R.string.TUNNEL_OPT_OUTPROXY_USERNAME), getOutproxyUsername(tunnel));
ed.putString(res.getString(R.string.TUNNEL_OPT_OUTPROXY_PASSWORD), getOutproxyPassword(tunnel));
}
@Override
protected void advancedOther() {
ed.putInt(res.getString(R.string.TUNNEL_OPT_SIGTYPE), getSigType(tunnel, mType));
ed.putString(res.getString(R.string.TUNNEL_OPT_CUSTOM_OPTIONS), getCustomOptionsString(tunnel));
}
}
public static TunnelConfig createConfigFromPreferences(Context ctx, TunnelControllerGroup tcg, int tunnel) {
return new TunnelUtil(tcg).createConfigFromPreferences(ctx, tunnel);
}
public TunnelConfig createConfigFromPreferences(Context ctx, int tunnel) {
Resources res = ctx.getResources();
// Get the current preferences for this tunnel
SharedPreferences prefs = ctx.getSharedPreferences(
getPreferencesFilename(tunnel), Context.MODE_PRIVATE);
// Create the TunnelConfig
TunnelConfig cfg = new TunnelConfig();
// Update the TunnelConfig from the preferences
cfg.setType(prefs.getString(res.getString(R.string.TUNNEL_TYPE), null));
String type = cfg.getType();
new TunnelConfigFromPreferences(cfg, prefs, res, _group, tunnel, type).runLogic();
return cfg;
}
class TunnelConfigFromPreferences extends TunnelLogic {
final TunnelConfig cfg;
final SharedPreferences prefs;
final Resources res;
final TunnelControllerGroup tcg;
final int tunnel;
public TunnelConfigFromPreferences(TunnelConfig cfg, SharedPreferences prefs, Resources res,
TunnelControllerGroup tcg, int tunnel, String type) {
super(type);
this.cfg = cfg;
this.prefs = prefs;
this.res = res;
this.tcg = tcg;
this.tunnel = tunnel;
}
@Override
protected void general() {
cfg.setName(prefs.getString(res.getString(R.string.TUNNEL_NAME), null));
cfg.setDescription(prefs.getString(res.getString(R.string.TUNNEL_DESCRIPTION), null));
cfg.setStartOnLoad(prefs.getBoolean(res.getString(R.string.TUNNEL_START_ON_LOAD),
res.getBoolean(R.bool.DEFAULT_START_ON_LOAD)));
if (!isClient(mType) || prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_PERSISTENT_KEY),
res.getBoolean(R.bool.DEFAULT_PERSISTENT_KEY)))
cfg.setPrivKeyFile(prefs.getString(res.getString(R.string.TUNNEL_PRIV_KEY_FILE),
getPrivateKeyFile(tcg, tunnel)));
}
@Override
protected void generalClient() {
// See advancedClient() for persistent key handling
}
@Override
protected void generalClientStreamr(boolean isStreamr) {
if (isStreamr)
cfg.setTargetHost(prefs.getString(res.getString(R.string.TUNNEL_TARGET_HOST), null));
else
cfg.setShared(prefs.getBoolean(res.getString(R.string.TUNNEL_SHARED_CLIENT),
res.getBoolean(R.bool.DEFAULT_SHARED_CLIENTS)));
}
@Override
protected void generalClientPort() {
cfg.setPort(prefs.getInt(res.getString(R.string.TUNNEL_LISTEN_PORT), -1));
}
@Override
protected void generalClientPortStreamr(boolean isStreamr) {
if (!isStreamr)
cfg.setReachableBy(prefs.getString(res.getString(R.string.TUNNEL_INTERFACE), "127.0.0.1"));
}
@Override
protected void generalClientProxy(boolean isProxy) {
if (isProxy)
cfg.setProxyList(prefs.getString(res.getString(R.string.TUNNEL_PROXIES), null));
else
cfg.setTargetDestination(prefs.getString(res.getString(R.string.TUNNEL_DEST), null));
}
@Override
protected void generalClientProxyHttp(boolean isHttp) {
if (isHttp)
cfg.setSslProxies(prefs.getString(res.getString(R.string.TUNNEL_HTTPCLIENT_SSL_OUTPROXIES), null));
}
@Override
protected void generalClientStandardOrIrc(boolean isStandardOrIrc) {
/* # TODO: See trac issue #2296
if (isStandardOrIrc)
cfg.setUseSSL(prefs.getBoolean(res.getString(R.string.TUNNEL_USE_SSL), false));
*/
}
@Override
protected void generalClientIrc() {
cfg.setDCC(prefs.getBoolean(res.getString(R.string.TUNNEL_IRCCLIENT_ENABLE_DCC), false));
}
@Override
protected void generalServerHttp() {
cfg.setSpoofedHost(prefs.getString(res.getString(R.string.TUNNEL_SPOOFED_HOST), null));
}
@Override
protected void generalServerHttpBidirOrStreamr(boolean isStreamr) {
cfg.setReachableBy(prefs.getString(res.getString(R.string.TUNNEL_INTERFACE), "127.0.0.1"));
if (!isStreamr)
cfg.setPort(prefs.getInt(res.getString(R.string.TUNNEL_LISTEN_PORT), -1));
}
@Override
protected void generalServerPort() {
cfg.setTargetPort(prefs.getInt(res.getString(R.string.TUNNEL_TARGET_PORT), -1));
}
@Override
protected void generalServerPortStreamr(boolean isStreamr) {
if (!isStreamr) {
cfg.setTargetHost(prefs.getString(res.getString(R.string.TUNNEL_TARGET_HOST), "127.0.0.1"));
// # TODO: See trac issue #2296
//cfg.setUseSSL(prefs.getBoolean(res.getString(R.string.TUNNEL_USE_SSL), false));
}
}
@Override
protected void advanced() {
cfg.setTunnelDepth(prefs.getInt(res.getString(R.string.TUNNEL_OPT_LENGTH),
res.getInteger(R.integer.DEFAULT_TUNNEL_LENGTH)));
cfg.setTunnelVariance(prefs.getInt(res.getString(R.string.TUNNEL_OPT_VARIANCE),
res.getInteger(R.integer.DEFAULT_TUNNEL_VARIANCE)));
cfg.setTunnelQuantity(prefs.getInt(res.getString(R.string.TUNNEL_OPT_QUANTITY),
res.getInteger(R.integer.DEFAULT_TUNNEL_QUANTITY)));
cfg.setTunnelBackupQuantity(prefs.getInt(res.getString(R.string.TUNNEL_OPT_BACKUP_QUANTITY),
res.getInteger(R.integer.DEFAULT_TUNNEL_BACKUP_QUANTITY)));
}
@Override
protected void advancedStreamr(boolean isStreamr) {
if (!isStreamr)
cfg.setProfile(prefs.getString(res.getString(R.string.TUNNEL_OPT_PROFILE), "bulk"));
}
@Override
protected void advancedServerOrStreamrClient(boolean isServerOrStreamrClient) {
if (!isServerOrStreamrClient)
cfg.setConnectDelay(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_DELAY_CONNECT), false));
}
@Override
protected void advancedServer() {
//cfg.setEncrypt(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_ENCRYPT), false));
//cfg.setEncryptKey(prefs.getString(res.getString(R.string.TUNNEL_OPT_ENCRYPT_KEY), ""));
cfg.setAccessMode(prefs.getInt(res.getString(R.string.TUNNEL_OPT_ACCESS_MODE), 0));
cfg.setAccessList(prefs.getString(res.getString(R.string.TUNNEL_OPT_ACCESS_LIST), ""));
cfg.setUniqueLocal(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_UNIQUE_LOCAL), false));
cfg.setMultihome(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_MULTIHOME), false));
cfg.setLimitMinute(prefs.getInt(res.getString(R.string.TUNNEL_OPT_LIMIT_MINUTE), 0));
cfg.setLimitHour(prefs.getInt(res.getString(R.string.TUNNEL_OPT_LIMIT_HOUR), 0));
cfg.setLimitDay(prefs.getInt(res.getString(R.string.TUNNEL_OPT_LIMIT_DAY), 0));
cfg.setTotalMinute(prefs.getInt(res.getString(R.string.TUNNEL_OPT_TOTAL_MINUTE), 0));
cfg.setTotalHour(prefs.getInt(res.getString(R.string.TUNNEL_OPT_TOTAL_HOUR), 0));
cfg.setTotalDay(prefs.getInt(res.getString(R.string.TUNNEL_OPT_TOTAL_DAY), 0));
cfg.setMaxStreams(prefs.getInt(res.getString(R.string.TUNNEL_OPT_MAX_STREAMS), 0));
}
@Override
protected void advancedServerHttp(boolean isHttp) {
if (isHttp) {
cfg.setRejectInproxy(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_REJECT_INPROXY), false));
cfg.setPostCheckTime(prefs.getInt(res.getString(R.string.TUNNEL_OPT_POST_CHECK_TIME), 0));
cfg.setPostMax(prefs.getInt(res.getString(R.string.TUNNEL_OPT_POST_MAX), 0));
cfg.setPostBanTime(prefs.getInt(res.getString(R.string.TUNNEL_OPT_POST_BAN_TIME), 0));
cfg.setPostTotalMax(prefs.getInt(res.getString(R.string.TUNNEL_OPT_POST_TOTAL_MAX), 0));
cfg.setPostTotalBanTime(prefs.getInt(res.getString(R.string.TUNNEL_OPT_POST_TOTAL_BAN_TIME), 0));
}
}
@Override
protected void advancedIdle() {
cfg.setReduce(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_REDUCE_IDLE),
res.getBoolean(R.bool.DEFAULT_REDUCE_ON_IDLE)));
cfg.setReduceCount(prefs.getInt(res.getString(R.string.TUNNEL_OPT_REDUCE_QUANTITY),
res.getInteger(R.integer.DEFAULT_REDUCE_COUNT)));
cfg.setReduceTime(prefs.getInt(res.getString(R.string.TUNNEL_OPT_REDUCE_TIME),
res.getInteger(R.integer.DEFAULT_REDUCE_TIME)));
}
@Override
protected void advancedIdleServerOrStreamrClient(boolean isServerOrStreamrClient) {
if (!isServerOrStreamrClient)
cfg.setDelayOpen(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_DELAY_OPEN),
res.getBoolean(R.bool.DEFAULT_DELAY_OPEN)));
}
@Override
protected void advancedClient() {
cfg.setClose(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_CLOSE_IDLE),
res.getBoolean(R.bool.DEFAULT_CLOSE_ON_IDLE)));
cfg.setCloseTime(prefs.getInt(res.getString(R.string.TUNNEL_OPT_CLOSE_TIME),
res.getInteger(R.integer.DEFAULT_CLOSE_TIME)));
cfg.setNewDest(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_PERSISTENT_KEY),
res.getBoolean(R.bool.DEFAULT_PERSISTENT_KEY)) ? 2 :
prefs.getBoolean(res.getString(R.string.TUNNEL_OTP_NEW_KEYS), res.getBoolean(R.bool.DEFAULT_NEW_KEYS)) ? 1 : 0);
}
@Override
protected void advancedClientHttp() {
cfg.setAllowUserAgent(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_HTTPCLIENT_PASS_UA), false));
cfg.setAllowReferer(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_HTTPCLIENT_PASS_REFERER), false));
cfg.setAllowAccept(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_HTTPCLIENT_PASS_ACCEPT), false));
cfg.setAllowInternalSSL(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_HTTPCLIENT_ALLOW_SSL), false));
cfg.setJumpList(prefs.getString(res.getString(R.string.TUNNEL_OPT_JUMP_LIST),
res.getString(R.string.DEFAULT_JUMP_LIST)));
}
@Override
protected void advancedClientProxy() {
cfg.setProxyAuth(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_LOCAL_AUTH), false) ? "digest" : "false");
String username = prefs.getString(res.getString(R.string.TUNNEL_OPT_LOCAL_USERNAME), "");
if (!username.isEmpty()) {
cfg.setProxyUsername(username);
cfg.setProxyPassword(prefs.getString(res.getString(R.string.TUNNEL_OPT_LOCAL_PASSWORD), ""));
}
cfg.setOutproxyAuth(prefs.getBoolean(res.getString(R.string.TUNNEL_OPT_OUTPROXY_AUTH), false));
cfg.setOutproxyUsername(prefs.getString(res.getString(R.string.TUNNEL_OPT_OUTPROXY_USERNAME), ""));
cfg.setOutproxyPassword(prefs.getString(res.getString(R.string.TUNNEL_OPT_OUTPROXY_PASSWORD), ""));
}
@Override
protected void advancedOther() {
cfg.setSigType(Integer.toString(prefs.getInt(res.getString(R.string.TUNNEL_OPT_SIGTYPE),
res.getInteger(R.integer.DEFAULT_SIGTYPE))));
cfg.setCustomOptions(prefs.getString(res.getString(R.string.TUNNEL_OPT_CUSTOM_OPTIONS), null));
}
}
/**
* @param data non-null
*/
public static TunnelConfig createConfigFromWizard(
Context ctx, TunnelControllerGroup tcg, Bundle data) {
return new TunnelUtil(tcg).createConfigFromWizard(ctx, data);
}
/**
* @param data non-null
*/
public TunnelConfig createConfigFromWizard(Context ctx, Bundle data) {
// Get the Bundle keys
Resources res = ctx.getResources();
// Create the TunnelConfig
TunnelConfig cfg = new TunnelConfig();
// Update the TunnelConfig from the tunnel wizard settings
String kClientServer = res.getString(R.string.i2ptunnel_wizard_k_client_server);
String kType = res.getString(R.string.i2ptunnel_wizard_k_type);
try {
String clientServer = data.getBundle(kClientServer).getString(Page.SIMPLE_DATA_KEY);
String typeName = data.getBundle(clientServer + ":" + kType).getString(Page.SIMPLE_DATA_KEY);
String type = getTypeFromName(typeName, ctx);
cfg.setType(type);
new TunnelConfigFromWizard(cfg, data, res, _group, type).runLogic();
} catch (NullPointerException ex) {
Util.e("Exception while trying to create config from wizard: "+ex.getMessage());
}
return cfg;
}
class TunnelConfigFromWizard extends TunnelLogic {
final TunnelConfig cfg;
final Bundle data;
final Resources res;
final TunnelControllerGroup tcg;
public TunnelConfigFromWizard(TunnelConfig cfg, Bundle data, Resources res,
TunnelControllerGroup tcg, String type) {
super(type);
this.cfg = cfg;
this.data = data;
this.res = res;
this.tcg = tcg;
}
@Override
protected void general() {
cfg.setName(data.getBundle(res.getString(R.string.i2ptunnel_wizard_k_name)).getString(Page.SIMPLE_DATA_KEY));
cfg.setDescription(data.getBundle(res.getString(R.string.i2ptunnel_wizard_k_desc)).getString(Page.SIMPLE_DATA_KEY));
cfg.setStartOnLoad(data.getBundle(res.getString(R.string.i2ptunnel_wizard_k_auto_start)).getBoolean(Page.SIMPLE_DATA_KEY));
if (!isClient(mType) || res.getBoolean(R.bool.DEFAULT_PERSISTENT_KEY))
cfg.setPrivKeyFile(getPrivateKeyFile(tcg, -1));
}
@Override
protected void generalClient() {
// See advancedClient() for persistent key handling
}
@Override
protected void generalClientStreamr(boolean isStreamr) {
if (isStreamr)
cfg.setTargetHost(data.getBundle(res.getString(R.string.i2ptunnel_wizard_k_target_host)).getString(Page.SIMPLE_DATA_KEY));
else
cfg.setShared(res.getBoolean(R.bool.DEFAULT_SHARED_CLIENTS));
// Only set default tunnel parameters if this is not going to be a shared tunnel
if (isStreamr || res.getBoolean(R.bool.DEFAULT_SHARED_CLIENTS)) {
cfg.setTunnelDepth(res.getInteger(R.integer.DEFAULT_TUNNEL_LENGTH));
cfg.setTunnelVariance(res.getInteger(R.integer.DEFAULT_TUNNEL_VARIANCE));
cfg.setTunnelQuantity(res.getInteger(R.integer.DEFAULT_TUNNEL_QUANTITY));
cfg.setTunnelBackupQuantity(res.getInteger(R.integer.DEFAULT_TUNNEL_BACKUP_QUANTITY));
}
}
@Override
protected void generalClientPort() {
cfg.setPort(Integer.parseInt(data.getBundle(
res.getString(R.string.i2ptunnel_wizard_k_binding_port)).getString(Page.SIMPLE_DATA_KEY)));
}
@Override
protected void generalClientPortStreamr(boolean isStreamr) {
if (!isStreamr)
cfg.setReachableBy(data.getBundle(res.getString(R.string.i2ptunnel_wizard_k_reachable_on)).getString(Page.SIMPLE_DATA_KEY));
}
@Override
protected void generalClientProxy(boolean isProxy) {
if (isProxy)
cfg.setProxyList(data.getBundle(res.getString(R.string.i2ptunnel_wizard_k_outproxies)).getString(Page.SIMPLE_DATA_KEY));
else
cfg.setTargetDestination(data.getBundle(res.getString(R.string.i2ptunnel_wizard_k_dest)).getString(Page.SIMPLE_DATA_KEY));
}
@Override
protected void generalClientProxyHttp(boolean isHttp) {
if (isHttp)
cfg.setSslProxies(null);
}
@Override
protected void generalClientStandardOrIrc(boolean isStandardOrIrc) {
if (isStandardOrIrc)
cfg.setUseSSL(false);
}
@Override
protected void generalClientIrc() {
cfg.setDCC(false);
}
@Override
protected void generalServerHttp() {
cfg.setSpoofedHost(null);
}
@Override
protected void generalServerHttpBidirOrStreamr(boolean isStreamr) {
cfg.setReachableBy(data.getBundle(res.getString(R.string.i2ptunnel_wizard_k_reachable_on)).getString(Page.SIMPLE_DATA_KEY));
if (!isStreamr)
cfg.setPort(Integer.parseInt(data.getBundle(
res.getString(R.string.i2ptunnel_wizard_k_binding_port)).getString(Page.SIMPLE_DATA_KEY)));
}
@Override
protected void generalServerPort() {
cfg.setTargetPort(Integer.parseInt(data.getBundle(
res.getString(R.string.i2ptunnel_wizard_k_target_port)).getString(Page.SIMPLE_DATA_KEY)));
}
@Override
protected void generalServerPortStreamr(boolean isStreamr) {
if (!isStreamr) {
cfg.setTargetHost(data.getBundle(res.getString(R.string.i2ptunnel_wizard_k_target_host)).getString(Page.SIMPLE_DATA_KEY));
cfg.setUseSSL(false);
}
}
@Override
protected void advanced() {
// Tunnel parameters handled in generalClientStreamr()
}
@Override
protected void advancedStreamr(boolean isStreamr) {
if (!isStreamr)
cfg.setProfile("bulk");
}
@Override
protected void advancedServerOrStreamrClient(boolean isServerOrStreamrClient) {
if (!isServerOrStreamrClient)
cfg.setConnectDelay(false);
}
@Override
protected void advancedServer() {
cfg.setEncrypt(false);
cfg.setAccessMode(0);
cfg.setUniqueLocal(false);
cfg.setMultihome(false);
cfg.setLimitMinute(0);
cfg.setLimitHour(0);
cfg.setLimitDay(0);
cfg.setTotalMinute(0);
cfg.setTotalHour(0);
cfg.setTotalDay(0);
cfg.setMaxStreams(0);
}
@Override
protected void advancedServerHttp(boolean isHttp) {
if (isHttp) {
cfg.setRejectInproxy(false);
cfg.setPostCheckTime(0);
cfg.setPostMax(0);
cfg.setPostBanTime(0);
cfg.setPostTotalMax(0);
cfg.setPostTotalBanTime(0);
}
}
@Override
protected void advancedIdle() {
cfg.setReduce(res.getBoolean(R.bool.DEFAULT_REDUCE_ON_IDLE));
cfg.setReduceCount(res.getInteger(R.integer.DEFAULT_REDUCE_COUNT));
cfg.setReduceTime(res.getInteger(R.integer.DEFAULT_REDUCE_TIME));
}
@Override
protected void advancedIdleServerOrStreamrClient(boolean isServerOrStreamrClient) {
if (!isServerOrStreamrClient)
cfg.setDelayOpen(res.getBoolean(R.bool.DEFAULT_DELAY_OPEN));
}
@Override
protected void advancedClient() {
cfg.setClose(res.getBoolean(R.bool.DEFAULT_CLOSE_ON_IDLE));
cfg.setCloseTime(res.getInteger(R.integer.DEFAULT_CLOSE_TIME));
cfg.setNewDest(res.getBoolean(R.bool.DEFAULT_PERSISTENT_KEY) ? 2 :
res.getBoolean(R.bool.DEFAULT_NEW_KEYS) ? 1 : 0);
}
@Override
protected void advancedClientHttp() {
cfg.setAllowUserAgent(false);
cfg.setAllowReferer(false);
cfg.setAllowAccept(false);
cfg.setAllowInternalSSL(false);
cfg.setJumpList(res.getString(R.string.DEFAULT_JUMP_LIST));
}
@Override
protected void advancedClientProxy() {
cfg.setProxyAuth("false");
cfg.setOutproxyAuth(false);
}
@Override
protected void advancedOther() {
cfg.setSigType(Integer.toString(res.getInteger(R.integer.DEFAULT_SIGTYPE)));
}
}
}

View File

@ -0,0 +1,60 @@
package net.i2p.android.preferences;
import android.os.Bundle;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
//import android.support.v7.preference.Preference;
import androidx.preference.Preference;
import net.i2p.android.router.R;
import net.i2p.android.router.SettingsActivity;
public class AdvancedPreferenceFragment extends I2PreferenceFragment {
private static final String PREFERENCE_CATEGORY_TRANSPORTS = "preference_category_transports";
private static final String PREFERENCE_CATEGORY_EXPL_TUNNELS = "preference_category_expl_tunnels";
@Override
public void onCreatePreferences(Bundle paramBundle, String s) {
addPreferencesFromResource(R.xml.settings_advanced);
findPreference(PREFERENCE_CATEGORY_TRANSPORTS)
.setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_TRANSPORTS));
findPreference(PREFERENCE_CATEGORY_EXPL_TUNNELS)
.setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_EXPL_TUNNELS));
}
@Override
public void onResume() {
super.onResume();
((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_advanced);
}
private class CategoryClickListener implements Preference.OnPreferenceClickListener {
private String category;
public CategoryClickListener(String category) {
this.category = category;
}
@Override
public boolean onPreferenceClick(Preference preference) {
Fragment fragment;
switch (category) {
case PREFERENCE_CATEGORY_TRANSPORTS:
fragment = new TransportsPreferenceFragment();
break;
case PREFERENCE_CATEGORY_EXPL_TUNNELS:
fragment = new ExploratoryPoolPreferenceFragment();
break;
default:
throw new AssertionError();
}
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, fragment)
.addToBackStack(null)
.commit();
return true;
}
}
}

View File

@ -0,0 +1,35 @@
package net.i2p.android.preferences;
import android.os.Bundle;
import net.i2p.android.router.R;
import net.i2p.android.router.SettingsActivity;
public class AppearancePreferenceFragment extends I2PreferenceFragment {
@Override
public void onCreatePreferences(Bundle paramBundle, String s) {
addPreferencesFromResource(R.xml.settings_appearance);
}
@Override
public void onStart() {
super.onStart();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(
(SettingsActivity) getActivity()
);
}
@Override
public void onResume() {
super.onResume();
((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_appearance);
}
@Override
public void onStop() {
super.onStop();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
(SettingsActivity) getActivity()
);
}
}

View File

@ -0,0 +1,19 @@
package net.i2p.android.preferences;
import android.os.Bundle;
import net.i2p.android.router.R;
import net.i2p.android.router.SettingsActivity;
public class ExploratoryPoolPreferenceFragment extends I2PreferenceFragment {
@Override
public void onCreatePreferences(Bundle paramBundle, String s) {
addPreferencesFromResource(R.xml.settings_expl_tunnels);
}
@Override
public void onResume() {
super.onResume();
((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_exploratory_pool);
}
}

View File

@ -0,0 +1,111 @@
package net.i2p.android.preferences;
import android.content.SharedPreferences;
import android.os.Bundle;
//import android.support.v7.preference.CheckBoxPreference;
import androidx.preference.CheckBoxPreference;
//import android.support.v7.preference.PreferenceCategory;
import androidx.preference.PreferenceCategory;
//import android.support.v7.preference.PreferenceManager;
import androidx.preference.PreferenceManager;
//import android.support.v7.preference.PreferenceScreen;
import androidx.preference.PreferenceScreen;
import net.i2p.android.router.R;
import net.i2p.android.router.SettingsActivity;
import net.i2p.android.router.service.StatSummarizer;
import net.i2p.android.router.util.Util;
import net.i2p.router.RouterContext;
import net.i2p.stat.FrequencyStat;
import net.i2p.stat.Rate;
import net.i2p.stat.RateStat;
import net.i2p.stat.StatManager;
import java.util.Map;
import java.util.SortedSet;
public class GraphsPreferenceFragment extends I2PreferenceFragment {
public static final String GRAPH_PREFERENCES_SEEN = "graphPreferencesSeen";
@Override
public void onCreatePreferences(Bundle paramBundle, String s) {
addPreferencesFromResource(R.xml.settings_graphs);
setupGraphSettings();
}
@Override
public void onResume() {
super.onResume();
((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.label_graphs);
}
private void setupGraphSettings() {
PreferenceScreen ps = getPreferenceScreen();
RouterContext ctx = Util.getRouterContext();
if (ctx == null) {
PreferenceCategory noRouter = new PreferenceCategory(getActivity());
noRouter.setTitle(R.string.router_not_running);
ps.addPreference(noRouter);
} else if (StatSummarizer.instance() == null) {
PreferenceCategory noStats = new PreferenceCategory(getActivity());
noStats.setTitle(R.string.stats_not_ready);
ps.addPreference(noStats);
} else {
StatManager mgr = ctx.statManager();
Map<String, SortedSet<String>> all = mgr.getStatsByGroup();
for (String group : all.keySet()) {
SortedSet<String> stats = all.get(group);
if (stats.size() == 0) continue;
PreferenceCategory groupPrefs = new PreferenceCategory(getActivity());
groupPrefs.setKey("stat.groups." + group);
groupPrefs.setTitle(group);
ps.addPreference(groupPrefs);
for (String stat : stats) {
String key;
String description;
boolean canBeGraphed = false;
boolean currentIsGraphed = false;
RateStat rs = mgr.getRate(stat);
if (rs != null) {
description = rs.getDescription();
long period = rs.getPeriods()[0]; // should be the minimum
key = stat + "." + period;
if (period <= 10*60*1000) {
Rate r = rs.getRate(period);
canBeGraphed = r != null;
if (canBeGraphed) {
currentIsGraphed = r.getSummaryListener() != null;
}
}
} else {
FrequencyStat fs = mgr.getFrequency(stat);
if (fs != null) {
key = stat;
description = fs.getDescription();
// FrequencyStats cannot be graphed, but can be logged.
// XXX: Should log settings be here as well, or in a
// separate settings menu?
} else {
Util.e("Stat does not exist?! [" + stat + "]");
continue;
}
}
CheckBoxPreference statPref = new CheckBoxPreference(getActivity());
statPref.setKey("stat.summaries." + key);
statPref.setTitle(stat);
statPref.setSummary(description);
statPref.setEnabled(canBeGraphed);
statPref.setChecked(currentIsGraphed);
groupPrefs.addPreference(statPref);
}
}
// The user has now seen the current (possibly default) configuration
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
if (!prefs.getBoolean(GRAPH_PREFERENCES_SEEN, false))
prefs.edit()
.putBoolean(GRAPH_PREFERENCES_SEEN, true)
.apply();
}
}
}

View File

@ -0,0 +1,72 @@
package net.i2p.android.preferences;
import android.widget.Toast;
import net.i2p.I2PAppContext;
import net.i2p.android.preferences.util.CustomPreferenceFragment;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
import net.i2p.router.RouterContext;
import java.util.List;
import java.util.Properties;
import java.util.Set;
/**
* A PreferenceFragment that handles saving router settings.
*/
public abstract class I2PreferenceFragment extends CustomPreferenceFragment {
@Override
public void onPause() {
List<Properties> lProps = Util.getPropertiesFromPreferences(getActivity());
Properties props = lProps.get(0);
Properties propsToRemove = lProps.get(1);
Properties logSettings = lProps.get(2);
Set toRemove = propsToRemove.keySet();
boolean restartRequired = Util.checkAndCorrectRouterConfig(getActivity(), props, toRemove);
// Apply new config if we are running.
RouterContext rCtx = Util.getRouterContext();
if (rCtx != null) {
rCtx.router().saveConfig(props, toRemove);
// Merge in new log settings
saveLoggingChanges(rCtx, logSettings);
} else {
// Merge in new config settings, write the file.
Util.mergeResourceToFile(getActivity(),
Util.getFileDir(getActivity()),
"router.config", R.raw.router_config, props, toRemove);
// Merge in new log settings
saveLoggingChanges(I2PAppContext.getGlobalContext(), logSettings);
}
// Store the settings in Android
super.onPause();
if (restartRequired)
Toast.makeText(getActivity(), R.string.settings_router_restart_required, Toast.LENGTH_LONG).show();
}
private void saveLoggingChanges(I2PAppContext ctx, Properties logSettings) {
boolean shouldSave = false;
for (Object key : logSettings.keySet()) {
if ("logger.defaultLevel".equals(key)) {
String defaultLevel = (String) logSettings.get(key);
String oldDefault = ctx.logManager().getDefaultLimit();
if (!defaultLevel.equals(oldDefault)) {
shouldSave = true;
ctx.logManager().setDefaultLimit(defaultLevel);
}
}
}
if (shouldSave) {
ctx.logManager().saveConfig();
}
}
}

View File

@ -0,0 +1,54 @@
package net.i2p.android.preferences;
import android.os.Bundle;
//import android.support.v7.preference.PreferenceScreen;
import androidx.preference.PreferenceScreen;
import net.i2p.android.router.R;
import net.i2p.android.router.SettingsActivity;
import net.i2p.android.router.util.Util;
import net.i2p.router.RouterContext;
import net.i2p.util.LogManager;
public class LoggingPreferenceFragment extends I2PreferenceFragment {
@Override
public void onCreatePreferences(Bundle paramBundle, String s) {
addPreferencesFromResource(R.xml.settings_logging);
setupLoggingSettings();
}
@Override
public void onResume() {
super.onResume();
((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_logging);
}
private void setupLoggingSettings() {
PreferenceScreen ps = getPreferenceScreen();
RouterContext ctx = Util.getRouterContext();
if (ctx != null) {
LogManager mgr = ctx.logManager();
// Log level overrides
/*
StringBuilder buf = new StringBuilder(32*1024);
Properties limits = mgr.getLimits();
TreeSet<String> sortedLogs = new TreeSet<String>();
for (Iterator iter = limits.keySet().iterator(); iter.hasNext(); ) {
String prefix = (String)iter.next();
sortedLogs.add(prefix);
}
for (Iterator iter = sortedLogs.iterator(); iter.hasNext(); ) {
String prefix = (String)iter.next();
String level = limits.getProperty(prefix);
buf.append(prefix).append('=').append(level).append('\n');
}
*/
/* Don't show, there are no settings that require the router
} else {
PreferenceCategory noRouter = new PreferenceCategory(getActivity());
noRouter.setTitle(R.string.router_not_running);
ps.addPreference(noRouter);
*/
}
}
}

View File

@ -0,0 +1,19 @@
package net.i2p.android.preferences;
import android.os.Bundle;
import net.i2p.android.router.R;
import net.i2p.android.router.SettingsActivity;
public class NetworkPreferenceFragment extends I2PreferenceFragment {
@Override
public void onCreatePreferences(Bundle paramBundle, String s) {
addPreferencesFromResource(R.xml.settings_net);
}
@Override
public void onResume() {
super.onResume();
((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_bandwidth_net);
}
}

View File

@ -0,0 +1,128 @@
package net.i2p.android.preferences;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
//import android.support.v7.preference.CheckBoxPreference;
//import android.support.v7.preference.Preference;
//import android.support.v7.preference.PreferenceManager;
//import android.support.v7.preference.PreferenceScreen;
import androidx.preference.CheckBoxPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import android.widget.Toast;
import net.i2p.android.router.R;
import net.i2p.android.router.SettingsActivity;
import net.i2p.android.preferences.util.PortPreference;
import net.i2p.android.router.util.Util;
import net.i2p.router.RouterContext;
public class TransportsPreferenceFragment extends I2PreferenceFragment {
@Override
public void onCreatePreferences(Bundle paramBundle, String s) {
// Load any properties that the router might have changed on us.
loadProperties();
addPreferencesFromResource(R.xml.settings_transports);
setupTransportSettings();
}
@Override
public void onResume() {
super.onResume();
((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_transports);
}
@SuppressLint("ApplySharedPref")
private void loadProperties() {
Context context= getActivity();
RouterContext ctx = Util.getRouterContext();
if (ctx != null) {
final String udpPortKey = context.getString(R.string.PROP_UDP_INTERNAL_PORT);
final String ntcpPortKey = context.getString(R.string.PROP_I2NP_NTCP_PORT);
final String ntcpAutoPortKey = context.getString(R.string.PROP_I2NP_NTCP_AUTO_PORT);
int udpPort = ctx.getProperty(udpPortKey, -1);
int ntcpPort = ctx.getProperty(ntcpPortKey, -1);
boolean ntcpAutoPort = ctx.getBooleanPropertyDefaultTrue(ntcpAutoPortKey);
if (ntcpPort < 0 && ntcpAutoPort)
ntcpPort = udpPort;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getInt(udpPortKey, -1) != udpPort ||
prefs.getInt(ntcpPortKey, -1) != ntcpPort) {
SharedPreferences.Editor editor = prefs.edit();
editor.putInt(udpPortKey, udpPort);
editor.putInt(ntcpPortKey, ntcpPort);
// commit() instead of apply() because this needs to happen
// before AdvancedPreferenceFragment loads its Preferences.
editor.commit();
}
}
}
private void setupTransportSettings() {
final Context context= getActivity();
PreferenceScreen ps = getPreferenceScreen();
final String udpEnableKey = context.getString(R.string.PROP_ENABLE_UDP);
final String ntcpEnableKey = context.getString(R.string.PROP_ENABLE_NTCP);
final String udpPortKey = context.getString(R.string.PROP_UDP_INTERNAL_PORT);
final String ntcpPortKey = context.getString(R.string.PROP_I2NP_NTCP_PORT);
final String ntcpAutoPortKey = context.getString(R.string.PROP_I2NP_NTCP_AUTO_PORT);
final CheckBoxPreference udpEnable = (CheckBoxPreference) ps.findPreference(udpEnableKey);
final CheckBoxPreference ntcpEnable = (CheckBoxPreference) ps.findPreference(ntcpEnableKey);
final PortPreference udpPort = (PortPreference) ps.findPreference(udpPortKey);
final PortPreference ntcpPort = (PortPreference) ps.findPreference(ntcpPortKey);
final CheckBoxPreference ntcpAutoPort = (CheckBoxPreference) ps.findPreference(ntcpAutoPortKey);
udpEnable.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final Boolean checked = (Boolean) newValue;
if (checked || ntcpEnable.isChecked())
return true;
else {
Toast.makeText(context, R.string.settings_need_transport_enabled, Toast.LENGTH_LONG).show();
return false;
}
}
});
ntcpEnable.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final Boolean checked = (Boolean) newValue;
if (checked || udpEnable.isChecked())
return true;
else {
Toast.makeText(context, R.string.settings_need_transport_enabled, Toast.LENGTH_LONG).show();
return false;
}
}
});
udpPort.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (ntcpAutoPort.isChecked())
ntcpPort.setText((String) newValue);
return true;
}
});
ntcpAutoPort.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final Boolean checked = (Boolean) newValue;
if (checked)
ntcpPort.setText(udpPort.getText());
return true;
}
});
}
}

View File

@ -0,0 +1,78 @@
package net.i2p.android.preferences.util;
import android.content.Context;
import android.content.res.TypedArray;
//import android.support.v7.preference.EditTextPreference;
import androidx.preference.EditTextPreference;
import android.util.AttributeSet;
import net.i2p.android.router.R;
public class ConnectionLimitPreference extends EditTextPreference {
private boolean mValueInTitle;
public ConnectionLimitPreference(Context context) {
this(context, null);
}
public ConnectionLimitPreference(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public ConnectionLimitPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
void init(Context context, AttributeSet attrs) {
TypedArray attr = context.obtainStyledAttributes(attrs, R.styleable.ConnectionLimitPreference, 0, 0);
mValueInTitle = attr.getBoolean(R.styleable.ConnectionLimitPreference_clp_valueInTitle, false);
attr.recycle();
}
@Override
public CharSequence getTitle() {
if (mValueInTitle)
return formatValue((String) super.getTitle());
else
return super.getTitle();
}
@Override
public CharSequence getSummary() {
if (mValueInTitle)
return super.getSummary();
else
return formatValue((String) super.getSummary());
}
private CharSequence formatValue(String format) {
String text = getText();
if ("0".equals(text))
text = getContext().getString(R.string.unlimited);
if (format == null)
format = "%s";
return String.format(format, text);
}
@Override
protected String getPersistedString(String defaultReturnValue) {
if(getSharedPreferences().contains(getKey())) {
int intValue = getPersistedInt(0);
return String.valueOf(intValue);
} else {
return defaultReturnValue;
}
}
@Override
protected boolean persistString(String value) {
try {
return value != null && persistInt(Integer.valueOf(value));
} catch (NumberFormatException e) {
return false;
}
}
}

View File

@ -0,0 +1,25 @@
package net.i2p.android.preferences.util;
import android.os.Bundle;
//import android.support.v7.preference.EditTextPreferenceDialogFragmentCompat;
import androidx.preference.EditTextPreferenceDialogFragmentCompat;
import android.text.InputType;
import android.view.View;
import android.widget.EditText;
public class ConnectionLimitPreferenceDialog extends EditTextPreferenceDialogFragmentCompat {
public static ConnectionLimitPreferenceDialog newInstance(String key) {
final ConnectionLimitPreferenceDialog fragment = new ConnectionLimitPreferenceDialog();
final Bundle b = new Bundle(1);
b.putString(ARG_KEY, key);
fragment.setArguments(b);
return fragment;
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
((EditText)view.findViewById(android.R.id.edit)).setInputType(
InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
}
}

View File

@ -0,0 +1,37 @@
package net.i2p.android.preferences.util;
//import android.support.v4.app.DialogFragment;
import androidx.fragment.app.DialogFragment;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
/**
* Handles custom Preferences.
*/
public abstract class CustomPreferenceFragment extends PreferenceFragmentCompat {
private static final String DIALOG_FRAGMENT_TAG =
"android.support.v7.preference.PreferenceFragment.DIALOG";
@Override
public void onDisplayPreferenceDialog(Preference preference) {
// check if dialog is already showing
if (getFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) {
return;
}
DialogFragment f = null;
if (preference instanceof ConnectionLimitPreference) {
f = ConnectionLimitPreferenceDialog.newInstance(preference.getKey());
} else if (preference instanceof IntEditTextPreference) {
f = IntEditTextPreferenceDialog.newInstance(preference.getKey());
} else if (preference instanceof PortPreference) {
f = PortPreferenceDialog.newInstance(preference.getKey());
} else {
super.onDisplayPreferenceDialog(preference);
}
if (f != null) {
f.setTargetFragment(this, 0);
f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
}
}
}

View File

@ -0,0 +1,48 @@
package net.i2p.android.preferences.util;
import android.content.Context;
//import android.support.v7.preference.EditTextPreference;
import androidx.preference.EditTextPreference;
import android.util.AttributeSet;
public class IntEditTextPreference extends EditTextPreference {
public IntEditTextPreference(Context context) {
super(context);
}
public IntEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public CharSequence getSummary() {
String summary = (String) super.getSummary();
if (summary == null)
summary = "%s";
return String.format(summary, getText());
}
@Override
protected String getPersistedString(String defaultReturnValue) {
if(getSharedPreferences().contains(getKey())) {
int intValue = getPersistedInt(0);
return String.valueOf(intValue);
} else {
return defaultReturnValue;
}
}
@Override
protected boolean persistString(String value) {
try {
return value != null && persistInt(Integer.valueOf(value));
} catch (NumberFormatException e) {
return false;
}
}
}

View File

@ -0,0 +1,25 @@
package net.i2p.android.preferences.util;
import android.os.Bundle;
//import android.support.v7.preference.EditTextPreferenceDialogFragmentCompat;
import androidx.preference.EditTextPreferenceDialogFragmentCompat;
import android.text.InputType;
import android.view.View;
import android.widget.EditText;
public class IntEditTextPreferenceDialog extends EditTextPreferenceDialogFragmentCompat {
public static IntEditTextPreferenceDialog newInstance(String key) {
final IntEditTextPreferenceDialog fragment = new IntEditTextPreferenceDialog();
final Bundle b = new Bundle(1);
b.putString(ARG_KEY, key);
fragment.setArguments(b);
return fragment;
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
((EditText)view.findViewById(android.R.id.edit)).setInputType(
InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
}
}

View File

@ -0,0 +1,44 @@
package net.i2p.android.preferences.util;
import android.content.Context;
//import android.support.v7.preference.ListPreference;
import androidx.preference.ListPreference;
import android.util.AttributeSet;
public class IntListPreference extends ListPreference {
public IntListPreference(Context context) {
super(context);
}
public IntListPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected boolean persistString(String value) {
if (getSharedPreferences().contains(getKey())) {
try {
getPersistedInt(0);
} catch (ClassCastException e) {
// Fix for where this preference was previously stored in a ListPreference
getSharedPreferences().edit().remove(getKey()).apply();
}
}
return value != null && persistInt(Integer.valueOf(value));
}
@Override
protected String getPersistedString(String defaultReturnValue) {
if(getSharedPreferences().contains(getKey())) {
try {
int intValue = getPersistedInt(0);
return String.valueOf(intValue);
} catch (ClassCastException e) {
return super.getPersistedString("0");
}
} else {
return defaultReturnValue;
}
}
}

View File

@ -0,0 +1,57 @@
package net.i2p.android.preferences.util;
import android.content.Context;
//import android.support.v7.preference.EditTextPreference;
import androidx.preference.EditTextPreference;
import android.util.AttributeSet;
import net.i2p.android.router.R;
public class PortPreference extends EditTextPreference {
public PortPreference(Context context) {
super(context);
}
public PortPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PortPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public CharSequence getSummary() {
int port = getPersistedInt(-1);
if (port < 0)
return getContext().getResources().getString(R.string.unset);
else
return String.valueOf(port);
}
@Override
protected String getPersistedString(String defaultReturnValue) {
int port = getPersistedInt(-1);
if (port < 0)
return defaultReturnValue;
else
return String.valueOf(port);
}
@Override
protected boolean persistString(String value) {
if (value == null || value.isEmpty())
return persistInt(-1);
int port;
try {
port = Integer.valueOf(value);
if (port < 0)
port = -1;
} catch (NumberFormatException e) {
port = -1;
}
return persistInt(port);
}
}

Some files were not shown because too many files have changed in this diff Show More