Compare commits

...

114 Commits

Author SHA1 Message Date
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
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
d2959ddc3f Espresso testing support 2015-04-02 12:17:06 +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
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
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
142 changed files with 4759 additions and 1932 deletions

View File

@ -1,6 +1,6 @@
[main]
host = https://www.transifex.com
lang_map = pt_BR: pt-rBR, ru_RU: ru, sv_SE: sv, tr_TR: tr, zh_CN: zh
lang_map = pt_BR: pt-rBR, ru_RU: ru, sv_SE: sv, tr_TR: tr, uk_UA: uk, zh_CN: zh
[I2P.android]
file_filter = app/src/main/res/values-<lang>/strings.xml

33
CHANGELOG Normal file
View File

@ -0,0 +1,33 @@
0.9.19
* Made internal state handling more stable
* Added graceful shutdown support
* 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

View File

@ -8,9 +8,9 @@
- Apache Ant 1.8.0 or higher
- I2P source
- Android SDK for API 21
- Android Build Tools 21.0.2
- Android Build Tools 21.1.2
- Android Support Repository
- Gradle 2.1
- Gradle 2.2.1
### Gradle

59
TODO
View File

@ -3,11 +3,22 @@
- Better twopane column widths
<zzz> on the i2ptunnel and addressbook pages on the tablet, the columns are too skinny, they aren't as wide as the tab
<zzz> only a few addressbook entries wrap but on i2ptunnel everything is wrapped and most of the screen is empty
- 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
# Short-term
- 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
- I2PTunnel
- Show all messages somewhere
- Improve detail page, expose advanced settings
- Add edit page
- Progress feedback for addressbook subscriptions reload
- Display release notes directly on new router version
- Fill out help pages
- Rewrite release notes to be release-specific
@ -31,10 +42,50 @@
- Show fixed x range, not only available data
- Think about pan/zoom
- How to persist data across restarts?
- I2PTunnel
- Show all messages somewhere
- Improve detail page, expose advanced settings
- Add edit page
# 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

View File

@ -5,10 +5,13 @@ android {
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
defaultConfig {
versionCode 4745224
versionName '0.9.17'
versionCode 4745226
versionName '0.9.18'
minSdkVersion 9
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
// For Espresso
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
release
@ -16,13 +19,24 @@ android {
buildTypes {
release {
signingConfig signingConfigs.release
runProguard false
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
lintOptions {
abortOnError false
}
packagingOptions {
exclude 'LICENSE.txt'
}
productFlavors {
free {
applicationId 'net.i2p.android'
@ -37,23 +51,35 @@ android {
}
dependencies {
// Local dependencies
compile project(':routerjars')
compile project(':client')
compile 'com.android.support:support-v4:21.0.2'
compile 'com.android.support:appcompat-v7:21.0.2'
compile 'com.android.support:recyclerview-v7:21.0.2'
compile 'com.android.support:cardview-v7:21.0.2'
compile 'net.i2p.android.ext:floatingactionbutton:1.1.0'
// Android Support Repository dependencies
compile 'com.android.support:support-v4:21.0.3'
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.android.support:recyclerview-v7:21.0.3'
// Remote dependencies
compile 'net.i2p.android.ext:floatingactionbutton:1.8.0'
compile files('libs/androidplot-core-0.6.1.jar')
compile ('com.android.support:support-v4-preferencefragment:1.0.0@aar'){
exclude module: 'support-v4'
}
// Testing-only dependencies
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
}
dependencyVerification {
verify = [
'com.android.support:support-v4:126a4c291f41f75f3fff4968e9d397bc8454cdff4d8f994cbe0524e3bad76e72',
'com.android.support:appcompat-v7:b760fd3d0b0b0547a1bcef9031b40939f31049ba955f04c8fdc5aa09a25d19e9',
'com.android.support:recyclerview-v7:71ef0f5659b3019dc33c5ffb346ea01df1f66735506f38d43fd783fbcb0370ce',
'com.android.support:cardview-v7:cb4d7ee9ebb6edffa7203eff0d207b4e88425599a8ed37d94b650bc84390c4eb',
'net.i2p.android.ext:floatingactionbutton:84cf5b67a66337bef59b46f57468c730387ca766b5a5f06ca852ba46cabbc0fb',
'com.android.support:support-v4:703572d3015a088cc5604b7e38885af3d307c829d0c5ceaf8654ff41c71cd160',
'com.android.support:appcompat-v7:5dbeb5316d0a6027d646ae552804c3baa5e3bd53f7f33db50904d51505c8a0e5',
'com.android.support:recyclerview-v7:e525ad3f33c84bb12b73d2dc975b55364a53f0f2d0697e043efba59ba73e22d2',
'net.i2p.android.ext:floatingactionbutton:a20d1f0cae15f8965b81486ba31245937968ae6ee5fa6e8a3ea21d7f6c6243ab',
'com.android.support:support-v4-preferencefragment:5470f5872514a6226fa1fc6f4e000991f38805691c534cf0bd2778911fc773ad',
]
}
@ -74,68 +100,65 @@ if (propFile.canRead()) {
println 'local.properties not found'
}
task copyDrawableResources(type: Copy) {
from file(i2pbase + '/installer/resources/themes/console/images/i2plogo.png')
into 'src/main/res/drawable'
}
task certificatesZip(type: Zip) {
archiveName = 'certificates_zip'
from files('' + i2pbase + '/installer/resources/certificates')
}
task copyRawResources(type:Copy) {
from(i2pbase + '/installer/resources/blocklist.txt') { rename { 'blocklist_txt' } }
from(i2pbase + '/installer/resources/hosts.txt') { rename { 'hosts_txt' } }
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 ->
String part = name.substring(8, name.lastIndexOf('.txt'))
String.format('license_%s_txt',
part.toLowerCase(Locale.US).replace('.', '_'))
}
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 + '/installer/resources/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('../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 ->
String part = name.substring(8, name.lastIndexOf('.txt'))
String.format('license_%s_txt',
part.toLowerCase(Locale.US).replace('.', '_'))
}
}
from certificatesZip
}
from certificatesZip
into 'src/main/res/raw'
}
task copyI2PResources
copyI2PResources.dependsOn copyDrawableResources
copyI2PResources.dependsOn copyRawResources
// For peers WebView
task copyConsoleImagesAssets(type: Copy) {
from file(i2pbase + '/installer/resources/themes/console/images/i2plogo.png')
from file(i2pbase + '/installer/resources/themes/console/images/inbound.png')
from file(i2pbase + '/installer/resources/themes/console/images/outbound.png')
into 'src/main/assets/themes/console/images'
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 + '/installer/resources/themes/console/images/i2plogo.png')
from file(i2pbase + '/installer/resources/themes/console/images/inbound.png')
from file(i2pbase + '/installer/resources/themes/console/images/outbound.png')
}
into('light') {
from file(i2pbase + '/installer/resources/themes/console/light/console.css')
}
into('light/images') {
from file(i2pbase + '/installer/resources/themes/console/light/images/header.png')
}
}
task copyConsoleLightAssets(type: Copy) {
from file(i2pbase + '/installer/resources/themes/console/light/console.css')
into 'src/main/assets/themes/console/light'
}
task copyConsoleLightImagesAssets(type: Copy) {
from file(i2pbase + '/installer/resources/themes/console/light/images/header.png')
into 'src/main/assets/themes/console/light/images'
}
task copyI2PAssets
copyI2PAssets.dependsOn copyConsoleImagesAssets
copyI2PAssets.dependsOn copyConsoleLightAssets
copyI2PAssets.dependsOn copyConsoleLightImagesAssets
preBuild.dependsOn copyI2PResources
preBuild.dependsOn copyI2PAssets

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.debug"
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.debug"
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.debug"
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.debug"
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.debug"
android:targetClass="net.i2p.android.router.addressbook.AddressbookSettingsActivity" />
</Preference>
<Preference android:title="@string/settings_label_advanced">
<intent
android:targetPackage="net.i2p.android.debug"
android:targetClass="net.i2p.android.router.SettingsActivity"
android:action="net.i2p.android.router.PREFS_ADVANCED" />
</Preference>
</PreferenceScreen>

View File

@ -5,6 +5,7 @@
<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" />
<application
android:icon="@drawable/ic_launcher_itoopie"
@ -20,7 +21,12 @@
</service>
<provider
android:name=".provider.CacheProvider"
android:authorities="net.i2p.android" />
android:authorities="${applicationId}.provider" />
<receiver android:name=".receiver.OnBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
@ -39,7 +45,7 @@
<activity
android:name=".NewsActivity"
android:configChanges="orientation|keyboardHidden"
android:label="I2P News"
android:label="@string/label_news"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
@ -47,7 +53,7 @@
</activity>
<activity
android:name="net.i2p.android.help.HelpActivity"
android:label="Help"
android:label="@string/menu_help"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
@ -55,7 +61,7 @@
</activity>
<activity
android:name="net.i2p.android.help.BrowserConfigActivity"
android:label="Browser Configuration"
android:label="@string/label_browser_configuration"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
@ -63,7 +69,7 @@
</activity>
<activity
android:name=".LicenseActivity"
android:label="I2P License Information"
android:label="@string/label_licenses"
android:parentActivityName="net.i2p.android.help.HelpActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
@ -88,7 +94,7 @@
</activity>
<activity
android:name=".SettingsActivity"
android:label="I2P Settings"
android:label="@string/menu_settings"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
@ -105,7 +111,7 @@
</activity>
<activity
android:name=".addressbook.AddressbookActivity"
android:label="Addressbook"
android:label="@string/label_addressbook"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
@ -129,7 +135,7 @@
</activity>
<activity
android:name="net.i2p.android.i2ptunnel.TunnelListActivity"
android:label="I2PTunnel"
android:label="@string/label_i2ptunnel"
android:launchMode="singleTop"
android:parentActivityName=".MainActivity">
<meta-data
@ -142,7 +148,15 @@
android:parentActivityName="net.i2p.android.i2ptunnel.TunnelListActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="net.i2p.android.router.i2ptunnel.TunnelListActivity" />
android:value="net.i2p.android.i2ptunnel.TunnelListActivity" />
</activity>
<activity
android:name="net.i2p.android.i2ptunnel.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"

View File

@ -3,6 +3,7 @@ package net.i2p.android.help;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
public class Browser implements Comparable<Browser> {
public final String packageName;
@ -55,7 +56,7 @@ public class Browser implements Comparable<Browser> {
}
@Override
public int compareTo(Browser browser) {
public int compareTo(@NonNull Browser browser) {
// Sort order: supported -> unknown -> unsupported
int a = getOrder(this);
int b = getOrder(browser);

View File

@ -102,12 +102,12 @@ public class BrowserListFragment extends Fragment implements
@Override
public List<Browser> loadInBackground() {
List<Browser> browsers = new ArrayList<Browser>();
Map<String, String> recommendedMap = new HashMap<String, String>();
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<String, String>();
Map<String, String> supportedMap = new HashMap<>();
for (int i = 0; i < supported.size(); i++) {
supportedMap.put(supported.get(i), supportedLabels.get(i));
}

View File

@ -2,6 +2,8 @@ package net.i2p.android.help;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v4.app.TaskStackBuilder;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
@ -24,6 +26,7 @@ public class HelpActivity extends ActionBarActivity implements
* device.
*/
private boolean mTwoPane;
private int mCategory;
@Override
public void onCreate(Bundle savedInstanceState) {
@ -49,9 +52,10 @@ public class HelpActivity extends ActionBarActivity implements
.commit();
}
int category = getIntent().getIntExtra(CATEGORY, -1);
if (category >= 0)
showCategory(category);
mCategory = getIntent().getIntExtra(CATEGORY, -1);
if (mCategory >= 0) {
showCategory(mCategory);
}
}
@Override
@ -64,7 +68,24 @@ public class HelpActivity extends ActionBarActivity implements
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
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);
@ -84,6 +105,13 @@ public class HelpActivity extends ActionBarActivity implements
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (mCategory >= 0)
mCategory = -1;
}
// HelpListFragment.OnEntrySelectedListener
@Override
@ -91,8 +119,10 @@ public class HelpActivity extends ActionBarActivity implements
if (entry == CAT_CONFIGURE_BROWSER) {
Intent i = new Intent(this, BrowserConfigActivity.class);
startActivity(i);
} else
} else {
mCategory = entry;
showCategory(entry);
}
}
private void showCategory(int category) {

View File

@ -0,0 +1,27 @@
package net.i2p.android.i2ptunnel;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import net.i2p.android.router.R;
public class EditTunnelActivity extends ActionBarActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_help_onepane);
// Set the action bar
Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (savedInstanceState == null) {
int tunnelId = getIntent().getIntExtra(TunnelDetailFragment.TUNNEL_ID, 0);
EditTunnelFragment editFrag = EditTunnelFragment.newInstance(tunnelId);
getSupportFragmentManager().beginTransaction()
.add(R.id.main_fragment, editFrag).commit();
}
}
}

View File

@ -0,0 +1,272 @@
package net.i2p.android.i2ptunnel;
import android.os.Build;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.support.v4.preference.PreferenceFragment;
import net.i2p.I2PAppContext;
import net.i2p.android.i2ptunnel.util.TunnelLogic;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.router.R;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.i2ptunnel.ui.TunnelConfig;
public class EditTunnelFragment extends PreferenceFragment {
private static final String ARG_TUNNEL_ID = "tunnelId";
private TunnelControllerGroup mGroup;
private int mTunnelId;
public static EditTunnelFragment newInstance(int tunnelId) {
EditTunnelFragment f = new EditTunnelFragment();
Bundle args = new Bundle();
args.putInt(ARG_TUNNEL_ID, tunnelId);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle paramBundle) {
super.onCreate(paramBundle);
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) {
// TODO Show error
} else if (getArguments().containsKey(ARG_TUNNEL_ID)) {
mTunnelId = getArguments().getInt(ARG_TUNNEL_ID, 0);
TunnelUtil.writeTunnelToPreferences(getActivity(), mGroup, mTunnelId);
// https://stackoverflow.com/questions/17880437/which-settings-file-does-preferencefragment-read-write
getPreferenceManager().setSharedPreferencesName(TunnelUtil.getPreferencesFilename(mTunnelId));
loadPreferences();
}
}
@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);
TunnelUtil.saveTunnel(I2PAppContext.getGlobalContext(), mGroup, mTunnelId, cfg);
}
}
private void loadPreferences() {
String type = TunnelUtil.getController(mGroup, mTunnelId).getType();
new TunnelPreferences(type).runLogic();
}
class TunnelPreferences extends TunnelLogic {
PreferenceScreen ps;
PreferenceCategory generalCategory;
PreferenceCategory portCategory;
PreferenceScreen advanced;
PreferenceCategory tunParamCategory;
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);
}
@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)));
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) {
if (isStreamr)
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_INTERFACE)));
}
@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) {
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);
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_USE_SSL)));
if (isStreamr)
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_LISTEN_PORT)));
}
@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)));
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_USE_SSL)));
}
}
@Override
protected void advanced() {
addPreferencesFromResource(R.xml.tunnel_adv);
advanced = (PreferenceScreen) ps.findPreference(
getString(R.string.TUNNEL_CAT_ADVANCED));
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, advanced);
}
@Override
protected void advancedServerHttp(boolean isHttp) {
if (isHttp)
addPreferencesFromResource(R.xml.tunnel_adv_server_http, advanced);
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, advanced);
}
@Override
protected void advancedIdleServerOrStreamrClient(boolean isServerOrStreamrClient) {
if (isServerOrStreamrClient)
advanced.removePreference(advanced.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);
}
@Override
protected void advancedClientHttp() {
addPreferencesFromResource(R.xml.tunnel_adv_client_http, advanced);
}
@Override
protected void advancedClientProxy() {
addPreferencesFromResource(R.xml.tunnel_adv_client_proxy, advanced);
}
@Override
protected void advancedOther() {
addPreferencesFromResource(R.xml.tunnel_adv_other, advanced);
}
}
/**
* http://stackoverflow.com/a/20806812
*
* @param id the Preferences XML to load
* @param newParent the parent PreferenceGroup to add the new Preferences to.
*/
private 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

@ -1,16 +1,20 @@
package net.i2p.android.i2ptunnel;
import android.content.Intent;
import android.os.Bundle;
import net.i2p.android.router.I2PActivityBase;
import net.i2p.android.router.R;
import android.os.Bundle;
public class TunnelDetailActivity extends I2PActivityBase implements
TunnelDetailFragment.OnTunnelDeletedListener {
TunnelDetailFragment.TunnelDetailListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportActionBar().setDisplayShowTitleEnabled(false);
if (savedInstanceState == null) {
int tunnelId = getIntent().getIntExtra(TunnelDetailFragment.TUNNEL_ID, 0);
TunnelDetailFragment detailFrag = TunnelDetailFragment.newInstance(tunnelId);
@ -19,7 +23,14 @@ public class TunnelDetailActivity extends I2PActivityBase implements
}
}
// TunnelDetailFragment.OnTunnelDeletedListener
// 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

@ -1,15 +1,11 @@
package net.i2p.android.i2ptunnel;
import java.util.List;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.router.R;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
@ -22,10 +18,17 @@ import android.widget.CheckBox;
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.i2ptunnel.TunnelControllerGroup;
import java.util.List;
public class TunnelDetailFragment extends Fragment {
public static final String TUNNEL_ID = "tunnel_id";
OnTunnelDeletedListener mCallback;
TunnelDetailListener mCallback;
private TunnelControllerGroup mGroup;
private TunnelEntry mTunnel;
@ -38,7 +41,8 @@ public class TunnelDetailFragment extends Fragment {
}
// Container Activity must implement this interface
public interface OnTunnelDeletedListener {
public interface TunnelDetailListener {
public void onEditTunnel(int tunnelId);
public void onTunnelDeleted(int tunnelId, int numTunnelsLeft);
}
@ -49,7 +53,7 @@ public class TunnelDetailFragment extends Fragment {
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnTunnelDeletedListener) activity;
mCallback = (TunnelDetailListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnTunnelDeletedListener");
@ -99,11 +103,36 @@ public class TunnelDetailFragment extends Fragment {
TextView details = (TextView) v.findViewById(R.id.tunnel_details);
details.setText(mTunnel.getDetails());
TextView targetIfacePort = (TextView) v.findViewById(R.id.tunnel_target_interface_port);
targetIfacePort.setText(mTunnel.getTunnelLink(false));
View accessIfacePortLabel = v.findViewById(R.id.tunnel_access_interface_port_label);
TextView accessIfacePort = (TextView) v.findViewById(R.id.tunnel_access_interface_port);
accessIfacePort.setText(mTunnel.getTunnelLink(false));
View targetIfacePortLabel = v.findViewById(R.id.tunnel_target_interface_port_label);
TextView targetIfacePort = (TextView) v.findViewById(R.id.tunnel_target_interface_port);
switch (mTunnel.getInternalType()) {
case "httpbidirserver":
accessIfacePort.setText(mTunnel.getClientLink(false));
targetIfacePort.setText(mTunnel.getServerLink(false));
break;
case "streamrserver":
accessIfacePort.setText(mTunnel.getServerLink(false));
targetIfacePortLabel.setVisibility(View.GONE);
targetIfacePort.setVisibility(View.GONE);
break;
case "streamrclient":
accessIfacePortLabel.setVisibility(View.GONE);
accessIfacePort.setVisibility(View.GONE);
targetIfacePort.setText(mTunnel.getClientLink(false));
break;
default:
if (mTunnel.isClient()) {
accessIfacePort.setText(mTunnel.getClientLink(false));
targetIfacePortLabel.setVisibility(View.GONE);
targetIfacePort.setVisibility(View.GONE);
} else {
accessIfacePortLabel.setVisibility(View.GONE);
accessIfacePort.setVisibility(View.GONE);
targetIfacePort.setText(mTunnel.getServerLink(false));
}
}
CheckBox autoStart = (CheckBox) v.findViewById(R.id.tunnel_autostart);
autoStart.setChecked(mTunnel.startAutomatically());
@ -115,7 +144,7 @@ public class TunnelDetailFragment extends Fragment {
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragment_i2ptunnel_detail_actions, menu);
// Hide the edit action until we have an edit UI
// Disable until ticket #815 is closed
menu.findItem(R.id.action_edit_tunnel).setVisible(false);
}
@ -143,6 +172,9 @@ public class TunnelDetailFragment extends Fragment {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mTunnel == null)
return false;
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_start_tunnel:
@ -162,9 +194,11 @@ public class TunnelDetailFragment extends Fragment {
getActivity().supportInvalidateOptionsMenu();
return true;
case R.id.action_edit_tunnel:
mCallback.onEditTunnel(mTunnel.getId());
return true;
case R.id.action_delete_tunnel:
DialogFragment dg = new DialogFragment() {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
@ -174,7 +208,8 @@ public class TunnelDetailFragment extends Fragment {
public void onClick(DialogInterface dialog, int which) {
List<String> msgs = TunnelUtil.deleteTunnel(
getActivity(), mGroup, mTunnel.getId());
I2PAppContext.getGlobalContext(),
mGroup, mTunnel.getId(), null);
dialog.dismiss();
Toast.makeText(getActivity().getApplicationContext(),
msgs.get(0), Toast.LENGTH_LONG).show();

View File

@ -1,17 +1,20 @@
package net.i2p.android.i2ptunnel;
import java.util.List;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.widget.Toast;
import net.i2p.android.i2ptunnel.util.TunnelConfig;
import net.i2p.I2PAppContext;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.router.R;
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.List;
public class TunnelEntry {
public static final int RUNNING = 1;
@ -29,7 +32,7 @@ public class TunnelEntry {
TunnelConfig cfg) {
int tunnelId = tcg.getControllers().size();
List<String> msgs = TunnelUtil.saveTunnel(
ctx, tcg, -1, cfg.getConfig());
I2PAppContext.getGlobalContext(), tcg, -1, cfg);
// TODO: Do something else with the other messages.
Toast.makeText(ctx.getApplicationContext(),
msgs.get(0), Toast.LENGTH_LONG).show();
@ -233,6 +236,17 @@ public class TunnelEntry {
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())

View File

@ -1,6 +1,9 @@
package net.i2p.android.i2ptunnel;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
@ -61,7 +64,27 @@ public class TunnelEntryAdapter extends ArrayAdapter<TunnelEntry> {
public void onClick(View view) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(tunnel.getTunnelLink(true)));
getContext().startActivity(i);
try {
getContext().startActivity(i);
} catch (ActivityNotFoundException e) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
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 = tunnel.getRecommendedAppForTunnel();
if (uri != null) {
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
getContext().startActivity(intent);
}
}
})
.setNegativeButton(net.i2p.android.lib.client.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.show();
}
}
});
}

View File

@ -1,15 +1,15 @@
package net.i2p.android.i2ptunnel;
import java.util.ArrayList;
import java.util.List;
import net.i2p.i2ptunnel.TunnelController;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import android.content.Context;
import android.os.Handler;
import android.support.v4.content.AsyncTaskLoader;
import net.i2p.i2ptunnel.TunnelController;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import java.util.ArrayList;
import java.util.List;
public class TunnelEntryLoader extends AsyncTaskLoader<List<TunnelEntry>> {
private TunnelControllerGroup mGroup;
private boolean mClientTunnels;
@ -26,7 +26,7 @@ public class TunnelEntryLoader extends AsyncTaskLoader<List<TunnelEntry>> {
@Override
public List<TunnelEntry> loadInBackground() {
List<TunnelEntry> ret = new ArrayList<TunnelEntry>();
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);

View File

@ -12,7 +12,7 @@ import net.i2p.android.router.R;
public class TunnelListActivity extends I2PActivityBase implements
TunnelListFragment.OnTunnelSelectedListener,
TunnelDetailFragment.OnTunnelDeletedListener {
TunnelDetailFragment.TunnelDetailListener {
/**
* Whether or not the activity is in two-pane mode, i.e. running on a tablet
* device.
@ -105,7 +105,16 @@ public class TunnelListActivity extends I2PActivityBase implements
}
}
// TunnelDetailFragment.OnTunnelDeletedListener
// TunnelDetailFragment.TunnelDetailListener
@Override
public void onEditTunnel(int tunnelId) {
EditTunnelFragment editFrag = EditTunnelFragment.newInstance(tunnelId);
getSupportFragmentManager().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:

View File

@ -18,11 +18,12 @@ import android.widget.ListView;
import android.widget.Toast;
import net.i2p.android.help.HelpActivity;
import net.i2p.android.i2ptunnel.util.TunnelConfig;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.router.I2PFragmentBase;
import net.i2p.android.router.I2PFragmentBase.RouterContextProvider;
import net.i2p.android.router.R;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.i2ptunnel.ui.TunnelConfig;
import net.i2p.router.RouterContext;
import java.util.List;
@ -231,7 +232,7 @@ public class TunnelListFragment extends ListFragment implements
if (requestCode == TUNNEL_WIZARD_REQUEST) {
if (resultCode == Activity.RESULT_OK) {
Bundle tunnelData = data.getExtras().getBundle(TUNNEL_WIZARD_DATA);
TunnelConfig cfg = TunnelConfig.createFromWizard(getActivity(), mGroup, tunnelData);
TunnelConfig cfg = TunnelUtil.createConfigFromWizard(getActivity(), mGroup, tunnelData);
TunnelEntry tunnel = TunnelEntry.createNewTunnel(getActivity(), mGroup, cfg);
mAdapter.add(tunnel);
}

View File

@ -1,16 +1,18 @@
package net.i2p.android.i2ptunnel;
import net.i2p.android.router.R;
import net.i2p.android.wizard.model.AbstractWizardModel;
import net.i2p.android.wizard.ui.AbstractWizardActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
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() {
@ -20,6 +22,7 @@ public class TunnelWizardActivity extends AbstractWizardActivity {
@Override
protected DialogFragment onGetFinishWizardDialog() {
return new DialogFragment() {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())

View File

@ -1,668 +0,0 @@
package net.i2p.android.i2ptunnel.util;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.concurrent.ConcurrentHashMap;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import net.i2p.I2PAppContext;
import net.i2p.android.router.R;
import net.i2p.android.wizard.model.Page;
import net.i2p.i2ptunnel.I2PTunnelConnectClient;
import net.i2p.i2ptunnel.I2PTunnelHTTPClient;
import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase;
import net.i2p.i2ptunnel.I2PTunnelIRCClient;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.util.ConcurrentHashSet;
import net.i2p.util.PasswordManager;
public class TunnelConfig {
protected final I2PAppContext _context;
private String _type;
private String _name;
private String _description;
private String _i2cpHost;
private String _i2cpPort;
private String _tunnelDepth;
private String _tunnelQuantity;
private String _tunnelVariance;
private String _tunnelBackupQuantity;
private boolean _connectDelay;
private String _customOptions;
private String _proxyList;
private String _port;
private String _reachableBy;
private String _targetDestination;
private String _targetHost;
private String _targetPort;
private String _spoofedHost;
private String _privKeyFile;
private String _profile;
private boolean _startOnLoad;
private boolean _sharedClient;
private final Set<String> _booleanOptions;
private final Map<String, String> _otherOptions;
private String _newProxyUser;
private String _newProxyPW;
static final String CLIENT_NICKNAME = "shared clients";
public static TunnelConfig createFromWizard(
Context ctx, TunnelControllerGroup tcg, Bundle data) {
// Get the Bundle keys
Resources res = ctx.getResources();
String kClientServer = res.getString(R.string.i2ptunnel_wizard_k_client_server);
String kType = res.getString(R.string.i2ptunnel_wizard_k_type);
String kName = res.getString(R.string.i2ptunnel_wizard_k_name);
String kDesc = res.getString(R.string.i2ptunnel_wizard_k_desc);
String kDest = res.getString(R.string.i2ptunnel_wizard_k_dest);
String kOutproxies = res.getString(R.string.i2ptunnel_wizard_k_outproxies);
String kTargetHost = res.getString(R.string.i2ptunnel_wizard_k_target_host);
String kTargetPort = res.getString(R.string.i2ptunnel_wizard_k_target_port);
String kReachableOn = res.getString(R.string.i2ptunnel_wizard_k_reachable_on);
String kBindingPort = res.getString(R.string.i2ptunnel_wizard_k_binding_port);
String kAutoStart = res.getString(R.string.i2ptunnel_wizard_k_auto_start);
// Create the TunnelConfig
TunnelConfig cfg = new TunnelConfig();
// Get/set the tunnel wizard settings
String clientServer = data.getBundle(kClientServer).getString(Page.SIMPLE_DATA_KEY);
String typeName = data.getBundle(clientServer + ":" + kType).getString(Page.SIMPLE_DATA_KEY);
String type = TunnelUtil.getTypeFromName(typeName, ctx);
cfg.setType(type);
String name = data.getBundle(kName).getString(Page.SIMPLE_DATA_KEY);
cfg.setName(name);
String desc = data.getBundle(kDesc).getString(Page.SIMPLE_DATA_KEY);
cfg.setDescription(desc);
String dest = null;
Bundle pageData = data.getBundle(kDest);
if (pageData != null) dest = pageData.getString(Page.SIMPLE_DATA_KEY);
cfg.setTargetDestination(dest);
String outproxies = null;
pageData = data.getBundle(kOutproxies);
if (pageData != null) outproxies = pageData.getString(Page.SIMPLE_DATA_KEY);
cfg.setProxyList(outproxies);
String targetHost = null;
pageData = data.getBundle(kTargetHost);
if (pageData != null) targetHost = pageData.getString(Page.SIMPLE_DATA_KEY);
cfg.setTargetHost(targetHost);
String targetPort = null;
pageData = data.getBundle(kTargetPort);
if (pageData != null) targetPort = pageData.getString(Page.SIMPLE_DATA_KEY);
cfg.setTargetPort(targetPort);
String reachableOn = null;
pageData = data.getBundle(kReachableOn);
if (pageData != null) reachableOn = pageData.getString(Page.SIMPLE_DATA_KEY);
cfg.setReachableBy(reachableOn);
String bindingPort = null;
pageData = data.getBundle(kBindingPort);
if (pageData != null) bindingPort = pageData.getString(Page.SIMPLE_DATA_KEY);
cfg.setPort(bindingPort);
boolean autoStart = data.getBundle(kAutoStart).getBoolean(Page.SIMPLE_DATA_KEY);
cfg.setStartOnLoad(autoStart);
// Set sensible defaults for a new tunnel
cfg.setTunnelDepth("3");
cfg.setTunnelVariance("0");
cfg.setTunnelQuantity("2");
cfg.setTunnelBackupQuantity("0");
cfg.setClientHost("internal");
cfg.setClientport("internal");
cfg.setCustomOptions("");
if (!"streamrclient".equals(type)) {
cfg.setProfile("bulk");
cfg.setReduceCount("1");
cfg.setReduceTime("20");
}
if (TunnelUtil.isClient(type)) { /* Client-only defaults */
if (!"streamrclient".equals(type)) {
cfg.setNewDest("0");
cfg.setCloseTime("30");
}
if ("httpclient".equals(type) ||
"connectclient".equals(type) ||
"sockstunnel".equals(type) |
"socksirctunnel".equals(type)) {
cfg.setProxyUsername("");
cfg.setProxyPassword("");
cfg.setOutproxyUsername("");
cfg.setOutproxyPassword("");
}
if ("httpclient".equals(type))
cfg.setJumpList("http://i2host.i2p/cgi-bin/i2hostjump?\nhttp://stats.i2p/cgi-bin/jump.cgi?a=");
} else { /* Server-only defaults */
cfg.setPrivKeyFile(TunnelUtil.getPrivateKeyFile(tcg, -1));
cfg.setEncrypt("");
cfg.setEncryptKey("");
cfg.setAccessMode("0");
cfg.setAccessList("");
cfg.setLimitMinute("0");
cfg.setLimitHour("0");
cfg.setLimitDay("0");
cfg.setTotalMinute("0");
cfg.setTotalHour("0");
cfg.setTotalDay("0");
cfg.setMaxStreams("0");
}
return cfg;
}
public TunnelConfig() {
_context = I2PAppContext.getGlobalContext();
_booleanOptions = new ConcurrentHashSet<String>(4);
_otherOptions = new ConcurrentHashMap<String,String>(4);
}
/**
* What type of tunnel (httpclient, ircclient, client, or server). This is
* required when adding a new tunnel.
*
*/
public void setType(String type) {
_type = (type != null ? type.trim() : null);
}
String getType() { return _type; }
/** Short name of the tunnel */
public void setName(String name) {
_name = (name != null ? name.trim() : null);
}
/** one line description */
public void setDescription(String description) {
_description = (description != null ? description.trim() : null);
}
/** I2CP host the router is on, ignored when in router context */
public void setClientHost(String host) {
_i2cpHost = (host != null ? host.trim() : null);
}
/** I2CP port the router is on, ignored when in router context */
public void setClientport(String port) {
_i2cpPort = (port != null ? port.trim() : null);
}
/** how many hops to use for inbound tunnels */
public void setTunnelDepth(String tunnelDepth) {
_tunnelDepth = (tunnelDepth != null ? tunnelDepth.trim() : null);
}
/** how many parallel inbound tunnels to use */
public void setTunnelQuantity(String tunnelQuantity) {
_tunnelQuantity = (tunnelQuantity != null ? tunnelQuantity.trim() : null);
}
/** how much randomisation to apply to the depth of tunnels */
public void setTunnelVariance(String tunnelVariance) {
_tunnelVariance = (tunnelVariance != null ? tunnelVariance.trim() : null);
}
/** how many tunnels to hold in reserve to guard against failures */
public void setTunnelBackupQuantity(String tunnelBackupQuantity) {
_tunnelBackupQuantity = (tunnelBackupQuantity != null ? tunnelBackupQuantity.trim() : null);
}
/** what I2P session overrides should be used */
public void setCustomOptions(String customOptions) {
_customOptions = (customOptions != null ? customOptions.trim() : null);
}
/** what HTTP outproxies should be used (httpclient specific) */
public void setProxyList(String proxyList) {
_proxyList = (proxyList != null ? proxyList.trim() : null);
}
/** what port should this client/httpclient/ircclient listen on */
public void setPort(String port) {
_port = (port != null ? port.trim() : null);
}
/**
* what interface should this client/httpclient/ircclient listen on
*/
public void setReachableBy(String reachableBy) {
_reachableBy = (reachableBy != null ? reachableBy.trim() : null);
}
/** What peer does this client tunnel point at */
public void setTargetDestination(String dest) {
_targetDestination = (dest != null ? dest.trim() : null);
}
/** What host does this server tunnel point at */
public void setTargetHost(String host) {
_targetHost = (host != null ? host.trim() : null);
}
/** What port does this server tunnel point at */
public void setTargetPort(String port) {
_targetPort = (port != null ? port.trim() : null);
}
/** What host does this http server tunnel spoof */
public void setSpoofedHost(String host) {
_spoofedHost = (host != null ? host.trim() : null);
}
/** What filename is this server tunnel's private keys stored in */
public void setPrivKeyFile(String file) {
_privKeyFile = (file != null ? file.trim() : null);
}
/**
* If called with true, we want this tunnel to start whenever it is
* loaded (aka right now and whenever the router is started up)
*/
public void setStartOnLoad(boolean val) {
_startOnLoad = val;
}
public void setShared(boolean val) {
_sharedClient=val;
}
public void setConnectDelay(String moo) {
_connectDelay = true;
}
public void setProfile(String profile) {
_profile = profile;
}
public void setReduce(String moo) {
_booleanOptions.add("i2cp.reduceOnIdle");
}
public void setClose(String moo) {
_booleanOptions.add("i2cp.closeOnIdle");
}
public void setEncrypt(String moo) {
_booleanOptions.add("i2cp.encryptLeaseSet");
}
/** @since 0.8.9 */
public void setDCC(String moo) {
_booleanOptions.add(I2PTunnelIRCClient.PROP_DCC);
}
protected static final String PROP_ENABLE_ACCESS_LIST = "i2cp.enableAccessList";
protected static final String PROP_ENABLE_BLACKLIST = "i2cp.enableBlackList";
public void setAccessMode(String val) {
if ("1".equals(val))
_booleanOptions.add(PROP_ENABLE_ACCESS_LIST);
else if ("2".equals(val))
_booleanOptions.add(PROP_ENABLE_BLACKLIST);
}
public void setDelayOpen(String moo) {
_booleanOptions.add("i2cp.delayOpen");
}
public void setNewDest(String val) {
if ("1".equals(val))
_booleanOptions.add("i2cp.newDestOnResume");
else if ("2".equals(val))
_booleanOptions.add("persistentClientKey");
}
public void setReduceTime(String val) {
if (val != null) {
try {
_otherOptions.put("i2cp.reduceIdleTime", "" + (Integer.parseInt(val.trim()) * 60*1000));
} catch (NumberFormatException nfe) {}
}
}
public void setReduceCount(String val) {
if (val != null)
_otherOptions.put("i2cp.reduceQuantity", val.trim());
}
public void setEncryptKey(String val) {
if (val != null)
_otherOptions.put("i2cp.leaseSetKey", val.trim());
}
public void setAccessList(String val) {
if (val != null)
_otherOptions.put("i2cp.accessList", val.trim().replace("\r\n", ",").replace("\n", ",").replace(" ", ","));
}
public void setJumpList(String val) {
if (val != null)
_otherOptions.put(I2PTunnelHTTPClient.PROP_JUMP_SERVERS, val.trim().replace("\r\n", ",").replace("\n", ",").replace(" ", ","));
}
public void setCloseTime(String val) {
if (val != null) {
try {
_otherOptions.put("i2cp.closeIdleTime", "" + (Integer.parseInt(val.trim()) * 60*1000));
} catch (NumberFormatException nfe) {}
}
}
/** all proxy auth @since 0.8.2 */
public void setProxyAuth(String s) {
if (s != null)
_otherOptions.put(I2PTunnelHTTPClientBase.PROP_AUTH, I2PTunnelHTTPClientBase.DIGEST_AUTH);
}
public void setProxyUsername(String s) {
if (s != null)
_newProxyUser = s.trim();
}
public void setProxyPassword(String s) {
if (s != null)
_newProxyPW = s.trim();
}
public void setOutproxyAuth(String s) {
_otherOptions.put(I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH, I2PTunnelHTTPClientBase.DIGEST_AUTH);
}
public void setOutproxyUsername(String s) {
if (s != null)
_otherOptions.put(I2PTunnelHTTPClientBase.PROP_OUTPROXY_USER, s.trim());
}
public void setOutproxyPassword(String s) {
if (s != null)
_otherOptions.put(I2PTunnelHTTPClientBase.PROP_OUTPROXY_PW, s.trim());
}
/** all of these are @since 0.8.3 */
protected static final String PROP_MAX_CONNS_MIN = "i2p.streaming.maxConnsPerMinute";
protected static final String PROP_MAX_CONNS_HOUR = "i2p.streaming.maxConnsPerHour";
protected static final String PROP_MAX_CONNS_DAY = "i2p.streaming.maxConnsPerDay";
protected static final String PROP_MAX_TOTAL_CONNS_MIN = "i2p.streaming.maxTotalConnsPerMinute";
protected static final String PROP_MAX_TOTAL_CONNS_HOUR = "i2p.streaming.maxTotalConnsPerHour";
protected static final String PROP_MAX_TOTAL_CONNS_DAY = "i2p.streaming.maxTotalConnsPerDay";
protected static final String PROP_MAX_STREAMS = "i2p.streaming.maxConcurrentStreams";
public void setLimitMinute(String s) {
if (s != null)
_otherOptions.put(PROP_MAX_CONNS_MIN, s.trim());
}
public void setLimitHour(String s) {
if (s != null)
_otherOptions.put(PROP_MAX_CONNS_HOUR, s.trim());
}
public void setLimitDay(String s) {
if (s != null)
_otherOptions.put(PROP_MAX_CONNS_DAY, s.trim());
}
public void setTotalMinute(String s) {
if (s != null)
_otherOptions.put(PROP_MAX_TOTAL_CONNS_MIN, s.trim());
}
public void setTotalHour(String s) {
if (s != null)
_otherOptions.put(PROP_MAX_TOTAL_CONNS_HOUR, s.trim());
}
public void setTotalDay(String s) {
if (s != null)
_otherOptions.put(PROP_MAX_TOTAL_CONNS_DAY, s.trim());
}
public void setMaxStreams(String s) {
if (s != null)
_otherOptions.put(PROP_MAX_STREAMS, s.trim());
}
/**
* Based on all provided data, create a set of configuration parameters
* suitable for use in a TunnelController. This will replace (not add to)
* any existing parameters, so this should return a comprehensive mapping.
*
*/
public Properties getConfig() {
Properties config = new Properties();
updateConfigGeneric(config);
if ((TunnelUtil.isClient(_type) && !"streamrclient".equals(_type)) || "streamrserver".equals(_type)) {
// streamrserver uses interface
if (_reachableBy != null)
config.setProperty("interface", _reachableBy);
else
config.setProperty("interface", "");
} else {
// streamrclient uses targetHost
if (_targetHost != null)
config.setProperty("targetHost", _targetHost);
}
if (TunnelUtil.isClient(_type)) {
// generic client stuff
if (_port != null)
config.setProperty("listenPort", _port);
config.setProperty("sharedClient", _sharedClient + "");
for (String p : _booleanClientOpts)
config.setProperty("option." + p, "" + _booleanOptions.contains(p));
for (String p : _otherClientOpts)
if (_otherOptions.containsKey(p))
config.setProperty("option." + p, _otherOptions.get(p));
} else {
// generic server stuff
if (_targetPort != null)
config.setProperty("targetPort", _targetPort);
for (String p : _booleanServerOpts)
config.setProperty("option." + p, "" + _booleanOptions.contains(p));
for (String p : _otherServerOpts)
if (_otherOptions.containsKey(p))
config.setProperty("option." + p, _otherOptions.get(p));
}
// generic proxy stuff
if ("httpclient".equals(_type) || "connectclient".equals(_type) ||
"sockstunnel".equals(_type) ||"socksirctunnel".equals(_type)) {
for (String p : _booleanProxyOpts)
config.setProperty("option." + p, "" + _booleanOptions.contains(p));
if (_proxyList != null)
config.setProperty("proxyList", _proxyList);
}
// Proxy auth including migration to MD5
if ("httpclient".equals(_type) || "connectclient".equals(_type)) {
// Migrate even if auth is disabled
// go get the old from custom options that updateConfigGeneric() put in there
String puser = "option." + I2PTunnelHTTPClientBase.PROP_USER;
String user = config.getProperty(puser);
String ppw = "option." + I2PTunnelHTTPClientBase.PROP_PW;
String pw = config.getProperty(ppw);
if (user != null && pw != null && user.length() > 0 && pw.length() > 0) {
String pmd5 = "option." + I2PTunnelHTTPClientBase.PROP_PROXY_DIGEST_PREFIX +
user + I2PTunnelHTTPClientBase.PROP_PROXY_DIGEST_SUFFIX;
if (config.getProperty(pmd5) == null) {
// not in there, migrate
String realm = _type.equals("httpclient") ? I2PTunnelHTTPClient.AUTH_REALM
: I2PTunnelConnectClient.AUTH_REALM;
String hex = PasswordManager.md5Hex(realm, user, pw);
if (hex != null) {
config.setProperty(pmd5, hex);
config.remove(puser);
config.remove(ppw);
}
}
}
// New user/password
String auth = _otherOptions.get(I2PTunnelHTTPClientBase.PROP_AUTH);
if (auth != null && !auth.equals("false")) {
if (_newProxyUser != null && _newProxyPW != null &&
_newProxyUser.length() > 0 && _newProxyPW.length() > 0) {
String pmd5 = "option." + I2PTunnelHTTPClientBase.PROP_PROXY_DIGEST_PREFIX +
_newProxyUser + I2PTunnelHTTPClientBase.PROP_PROXY_DIGEST_SUFFIX;
String realm = _type.equals("httpclient") ? I2PTunnelHTTPClient.AUTH_REALM
: I2PTunnelConnectClient.AUTH_REALM;
String hex = PasswordManager.md5Hex(realm, _newProxyUser, _newProxyPW);
if (hex != null)
config.setProperty(pmd5, hex);
}
}
}
if ("ircclient".equals(_type) || "client".equals(_type) || "streamrclient".equals(_type)) {
if (_targetDestination != null)
config.setProperty("targetDestination", _targetDestination);
} else if ("httpserver".equals(_type) || "httpbidirserver".equals(_type)) {
if (_spoofedHost != null)
config.setProperty("spoofedHost", _spoofedHost);
}
if ("httpbidirserver".equals(_type)) {
if (_port != null)
config.setProperty("listenPort", _port);
if (_reachableBy != null)
config.setProperty("interface", _reachableBy);
else if (_targetHost != null)
config.setProperty("interface", _targetHost);
else
config.setProperty("interface", "");
}
if ("ircclient".equals(_type)) {
boolean dcc = _booleanOptions.contains(I2PTunnelIRCClient.PROP_DCC);
config.setProperty("option." + I2PTunnelIRCClient.PROP_DCC,
"" + dcc);
// add some sane server options since they aren't in the GUI (yet)
if (dcc) {
config.setProperty("option." + PROP_MAX_CONNS_MIN, "3");
config.setProperty("option." + PROP_MAX_CONNS_HOUR, "10");
config.setProperty("option." + PROP_MAX_TOTAL_CONNS_MIN, "5");
config.setProperty("option." + PROP_MAX_TOTAL_CONNS_HOUR, "25");
}
}
return config;
}
private static final String _noShowOpts[] = {
"inbound.length", "outbound.length", "inbound.lengthVariance", "outbound.lengthVariance",
"inbound.backupQuantity", "outbound.backupQuantity", "inbound.quantity", "outbound.quantity",
"inbound.nickname", "outbound.nickname", "i2p.streaming.connectDelay", "i2p.streaming.maxWindowSize",
I2PTunnelIRCClient.PROP_DCC
};
private static final String _booleanClientOpts[] = {
"i2cp.reduceOnIdle", "i2cp.closeOnIdle", "i2cp.newDestOnResume", "persistentClientKey", "i2cp.delayOpen"
};
private static final String _booleanProxyOpts[] = {
I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH
};
private static final String _booleanServerOpts[] = {
"i2cp.reduceOnIdle", "i2cp.encryptLeaseSet", PROP_ENABLE_ACCESS_LIST, PROP_ENABLE_BLACKLIST
};
private static final String _otherClientOpts[] = {
"i2cp.reduceIdleTime", "i2cp.reduceQuantity", "i2cp.closeIdleTime",
"outproxyUsername", "outproxyPassword",
I2PTunnelHTTPClient.PROP_JUMP_SERVERS,
I2PTunnelHTTPClientBase.PROP_AUTH
};
private static final String _otherServerOpts[] = {
"i2cp.reduceIdleTime", "i2cp.reduceQuantity", "i2cp.leaseSetKey", "i2cp.accessList",
PROP_MAX_CONNS_MIN, PROP_MAX_CONNS_HOUR, PROP_MAX_CONNS_DAY,
PROP_MAX_TOTAL_CONNS_MIN, PROP_MAX_TOTAL_CONNS_HOUR, PROP_MAX_TOTAL_CONNS_DAY,
PROP_MAX_STREAMS
};
/**
* do NOT add these to noShoOpts, we must leave them in for HTTPClient and ConnectCLient
* so they will get migrated to MD5
* TODO migrate socks to MD5
*/
private static final String _otherProxyOpts[] = {
"proxyUsername", "proxyPassword"
};
protected static final Set<String> _noShowSet = new HashSet<String>(64);
protected static final Set<String> _nonProxyNoShowSet = new HashSet<String>(4);
static {
_noShowSet.addAll(Arrays.asList(_noShowOpts));
_noShowSet.addAll(Arrays.asList(_booleanClientOpts));
_noShowSet.addAll(Arrays.asList(_booleanProxyOpts));
_noShowSet.addAll(Arrays.asList(_booleanServerOpts));
_noShowSet.addAll(Arrays.asList(_otherClientOpts));
_noShowSet.addAll(Arrays.asList(_otherServerOpts));
_nonProxyNoShowSet.addAll(Arrays.asList(_otherProxyOpts));
}
private void updateConfigGeneric(Properties config) {
config.setProperty("type", _type);
if (_name != null)
config.setProperty("name", _name);
if (_description != null)
config.setProperty("description", _description);
if (!_context.isRouterContext()) {
if (_i2cpHost != null)
config.setProperty("i2cpHost", _i2cpHost);
if ( (_i2cpPort != null) && (_i2cpPort.trim().length() > 0) ) {
config.setProperty("i2cpPort", _i2cpPort);
} else {
config.setProperty("i2cpPort", "7654");
}
}
if (_privKeyFile != null)
config.setProperty("privKeyFile", _privKeyFile);
if (_customOptions != null) {
StringTokenizer tok = new StringTokenizer(_customOptions);
while (tok.hasMoreTokens()) {
String pair = tok.nextToken();
int eq = pair.indexOf('=');
if ( (eq <= 0) || (eq >= pair.length()) )
continue;
String key = pair.substring(0, eq);
if (_noShowSet.contains(key))
continue;
// leave in for HTTP and Connect so it can get migrated to MD5
// hide for SOCKS until migrated to MD5
if ((!"httpclient".equals(_type)) &&
(! "connectclient".equals(_type)) &&
_nonProxyNoShowSet.contains(key))
continue;
String val = pair.substring(eq+1);
config.setProperty("option." + key, val);
}
}
config.setProperty("startOnLoad", _startOnLoad + "");
if (_tunnelQuantity != null) {
config.setProperty("option.inbound.quantity", _tunnelQuantity);
config.setProperty("option.outbound.quantity", _tunnelQuantity);
}
if (_tunnelDepth != null) {
config.setProperty("option.inbound.length", _tunnelDepth);
config.setProperty("option.outbound.length", _tunnelDepth);
}
if (_tunnelVariance != null) {
config.setProperty("option.inbound.lengthVariance", _tunnelVariance);
config.setProperty("option.outbound.lengthVariance", _tunnelVariance);
}
if (_tunnelBackupQuantity != null) {
config.setProperty("option.inbound.backupQuantity", _tunnelBackupQuantity);
config.setProperty("option.outbound.backupQuantity", _tunnelBackupQuantity);
}
if (_connectDelay)
config.setProperty("option.i2p.streaming.connectDelay", "1000");
else
config.setProperty("option.i2p.streaming.connectDelay", "0");
if (TunnelUtil.isClient(_type) && _sharedClient) {
config.setProperty("option.inbound.nickname", CLIENT_NICKNAME);
config.setProperty("option.outbound.nickname", CLIENT_NICKNAME);
} else if (_name != null) {
config.setProperty("option.inbound.nickname", _name);
config.setProperty("option.outbound.nickname", _name);
}
if ("interactive".equals(_profile))
// This was 1 which doesn't make much sense
// The real way to make it interactive is to make the streaming lib
// MessageInputStream flush faster but there's no option for that yet,
// Setting it to 16 instead of the default but not sure what good that is either.
config.setProperty("option.i2p.streaming.maxWindowSize", "16");
else
config.remove("option.i2p.streaming.maxWindowSize");
}
}

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 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

@ -1,161 +1,27 @@
package net.i2p.android.i2ptunnel.util;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
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.util.FileUtil;
import net.i2p.util.SecureFile;
import net.i2p.i2ptunnel.ui.GeneralHelper;
import net.i2p.i2ptunnel.ui.TunnelConfig;
public abstract class TunnelUtil {
public static TunnelController getController(TunnelControllerGroup tcg, int tunnel) {
if (tunnel < 0) return null;
if (tcg == null) return null;
List<TunnelController> controllers = tcg.getControllers();
if (controllers.size() > tunnel)
return controllers.get(tunnel);
else
return null;
public class TunnelUtil extends GeneralHelper {
public static final String PREFERENCES_FILENAME_PREFIX = "tunnel.";
public TunnelUtil(I2PAppContext context, TunnelControllerGroup tcg) {
super(context, tcg);
}
public static List<String> saveTunnel(Context ctx,
TunnelControllerGroup tcg,
int tunnelId,
Properties config) {
// Get current tunnel controller
TunnelController cur = getController(tcg, tunnelId);
if (config == null) {
List<String> ret = new ArrayList<String>();
ret.add("Invalid params");
return ret;
}
if (cur == null) {
// creating new
cur = new TunnelController(config, "", true);
tcg.addController(cur);
if (cur.getStartOnLoad())
cur.startTunnelBackground();
} else {
cur.setConfig(config, "");
}
// Only modify other shared tunnels
// if the current tunnel is shared, and of supported type
if (Boolean.parseBoolean(cur.getSharedClient()) && isClient(cur.getType())) {
// all clients use the same I2CP session, and as such, use the same I2CP options
List<TunnelController> controllers = tcg.getControllers();
for (int i = 0; i < controllers.size(); i++) {
TunnelController c = controllers.get(i);
// Current tunnel modified by user, skip
if (c == cur) continue;
// Only modify this non-current tunnel
// if it belongs to a shared destination, and is of supported type
if (Boolean.parseBoolean(c.getSharedClient()) && isClient(c.getType())) {
Properties cOpt = c.getConfig("");
if (config.getProperty("option.inbound.quantity") != null)
cOpt.setProperty("option.inbound.quantity", config.getProperty("option.inbound.quantity"));
if (config.getProperty("option.outbound.quantity") != null)
cOpt.setProperty("option.outbound.quantity", config.getProperty("option.outbound.quantity"));
if (config.getProperty("option.inbound.length") != null)
cOpt.setProperty("option.inbound.length", config.getProperty("option.inbound.length"));
if (config.getProperty("option.outbound.length") != null)
cOpt.setProperty("option.outbound.length", config.getProperty("option.outbound.length"));
if (config.getProperty("option.inbound.lengthVariance") != null)
cOpt.setProperty("option.inbound.lengthVariance", config.getProperty("option.inbound.lengthVariance"));
if (config.getProperty("option.outbound.lengthVariance") != null)
cOpt.setProperty("option.outbound.lengthVariance", config.getProperty("option.outbound.lengthVariance"));
if (config.getProperty("option.inbound.backupQuantity") != null)
cOpt.setProperty("option.inbound.backupQuantity", config.getProperty("option.inbound.backupQuantity"));
if (config.getProperty("option.outbound.backupQuantity") != null)
cOpt.setProperty("option.outbound.backupQuantity", config.getProperty("option.outbound.backupQuantity"));
cOpt.setProperty("option.inbound.nickname", TunnelConfig.CLIENT_NICKNAME);
cOpt.setProperty("option.outbound.nickname", TunnelConfig.CLIENT_NICKNAME);
c.setConfig(cOpt, "");
}
}
}
return doSave(ctx, tcg);
}
/**
* Stop the tunnel, delete from config,
* rename the private key file if in the default directory
*/
public static List<String> deleteTunnel(Context ctx, TunnelControllerGroup tcg, int tunnelId) {
List<String> msgs;
TunnelController cur = getController(tcg, tunnelId);
if (cur == null) {
msgs = new ArrayList<String>();
msgs.add("Invalid tunnel number");
return msgs;
}
msgs = tcg.removeController(cur);
msgs.addAll(doSave(ctx, tcg));
// Rename private key file if it was a default name in
// the default directory, so it doesn't get reused when a new
// tunnel is created.
// Use configured file name if available, not the one from the form.
String pk = cur.getPrivKeyFile();
//if (pk == null)
// pk = _privKeyFile;
if (pk != null && pk.startsWith("i2ptunnel") && pk.endsWith("-privKeys.dat") &&
((!isClient(cur.getType())) || cur.getPersistentClientKey())) {
I2PAppContext context = I2PAppContext.getGlobalContext();
File pkf = new File(context.getConfigDir(), pk);
if (pkf.exists()) {
String name = cur.getName();
if (name == null) {
name = cur.getDescription();
if (name == null) {
name = cur.getType();
if (name == null)
name = Long.toString(context.clock().now());
}
}
name = "i2ptunnel-deleted-" + name.replace(' ', '_') + '-' + context.clock().now() + "-privkeys.dat";
File backupDir = new SecureFile(context.getConfigDir(), TunnelController.KEY_BACKUP_DIR);
File to;
if (backupDir.isDirectory() || backupDir.mkdir())
to = new File(backupDir, name);
else
to = new File(context.getConfigDir(), name);
boolean success = FileUtil.rename(pkf, to);
if (success)
msgs.add("Private key file " + pkf.getAbsolutePath() +
" renamed to " + to.getAbsolutePath());
}
}
return msgs;
}
private static List<String> doSave(Context ctx, TunnelControllerGroup tcg) {
List<String> rv = tcg.clearAllMessages();
try {
tcg.saveConfig();
rv.add(0, ctx.getResources().getString(R.string.i2ptunnel_msg_config_saved));
} catch (IOException ioe) {
Util.e("Failed to save config file", ioe);
rv.add(0, ctx.getResources().getString(R.string.i2ptunnel_msg_config_save_failed) + ": " + ioe.toString());
}
return rv;
public TunnelUtil(TunnelControllerGroup tcg) {
super(tcg);
}
/* General tunnel data for any type */
@ -192,50 +58,725 @@ public abstract class TunnelUtil {
public static String getTypeName(String type, Context context) {
Resources res = context.getResources();
if ("client".equals(type))
return res.getString(R.string.i2ptunnel_type_client);
else if ("httpclient".equals(type))
return res.getString(R.string.i2ptunnel_type_httpclient);
else if ("ircclient".equals(type))
return res.getString(R.string.i2ptunnel_type_ircclient);
else if ("server".equals(type))
return res.getString(R.string.i2ptunnel_type_server);
else if ("httpserver".equals(type))
return res.getString(R.string.i2ptunnel_type_httpserver);
else if ("sockstunnel".equals(type))
return res.getString(R.string.i2ptunnel_type_sockstunnel);
else if ("socksirctunnel".equals(type))
return res.getString(R.string.i2ptunnel_type_socksirctunnel);
else if ("connectclient".equals(type))
return res.getString(R.string.i2ptunnel_type_connectclient);
else if ("ircserver".equals(type))
return res.getString(R.string.i2ptunnel_type_ircserver);
else if ("streamrclient".equals(type))
return res.getString(R.string.i2ptunnel_type_streamrclient);
else if ("streamrserver".equals(type))
return res.getString(R.string.i2ptunnel_type_streamrserver);
else if ("httpbidirserver".equals(type))
return res.getString(R.string.i2ptunnel_type_httpbidirserver);
else
return type;
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 ( ("client".equals(type)) ||
("httpclient".equals(type)) ||
("sockstunnel".equals(type)) ||
("socksirctunnel".equals(type)) ||
("connectclient".equals(type)) ||
("streamrclient".equals(type)) ||
("ircclient".equals(type)));
return TunnelController.isClient(type);
}
public static String getPrivateKeyFile(TunnelControllerGroup tcg, int tunnel) {
TunnelController tun = getController(tcg, tunnel);
if (tun != null && tun.getPrivKeyFile() != null)
return tun.getPrivKeyFile();
if (tunnel < 0)
tunnel = tcg == null ? 999 : tcg.getControllers().size();
return "i2ptunnel" + tunnel + "-privKeys.dat";
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 {
SharedPreferences.Editor ed;
Resources res;
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) {
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));
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),
getTunnelQuantity(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 {
TunnelConfig cfg;
SharedPreferences prefs;
Resources res;
TunnelControllerGroup tcg;
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) {
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"));
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));
}
}
public static TunnelConfig createConfigFromWizard(
Context ctx, TunnelControllerGroup tcg, Bundle data) {
return new TunnelUtil(tcg).createConfigFromWizard(ctx, data);
}
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);
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();
return cfg;
}
class TunnelConfigFromWizard extends TunnelLogic {
TunnelConfig cfg;
Bundle data;
Resources res;
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

@ -52,7 +52,6 @@ public abstract class I2PActivityBase extends ActionBarActivity implements
/**
* Router variables
*/
protected String _myDir;
protected boolean _isBound;
protected boolean _triedBind;
protected ServiceConnection _connection;
@ -95,7 +94,6 @@ public abstract class I2PActivityBase extends ActionBarActivity implements
Util.d(this + " onCreate called");
super.onCreate(savedInstanceState);
_sharedPrefs = getSharedPreferences(SHARED_PREFS, 0);
_myDir = getFilesDir().getAbsolutePath();
// If the Activity wants to use a ViewPager, provide it.
// If the Activity can make use of two panes (if available),
@ -128,7 +126,7 @@ public abstract class I2PActivityBase extends ActionBarActivity implements
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
mDrawerList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
mDrawerList.setAdapter(new ArrayAdapter<>(this,
R.layout.listitem_navdrawer, activityTitles));
// Set the list's click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

View File

@ -0,0 +1,5 @@
package net.i2p.android.router;
public interface I2PConstants {
public static final String ANDROID_PREF_PREFIX = "i2pandroid.";
}

View File

@ -124,8 +124,7 @@ class InitActivities {
File certificates = new File(myDir, "certificates");
File[] allcertificates = certificates.listFiles();
if ( allcertificates != null) {
for (int i = 0; i < allcertificates.length; i++) {
File f = allcertificates[i];
for (File f : allcertificates) {
Util.d("Deleting old certificate file/dir " + f);
FileUtil.rmdir(f, false);
}
@ -233,7 +232,7 @@ class InitActivities {
* @param overrides local overrides or null
*/
private void mergeResourceToFile(int resID, String f, Properties overrides) {
Util.mergeResourceToFile(ctx, myDir, f, resID, overrides);
Util.mergeResourceToFile(ctx, myDir, f, resID, overrides, null);
}
/**

View File

@ -1,6 +1,5 @@
package net.i2p.android.router;
import net.i2p.android.router.R;
import android.os.Bundle;
public class LicenseActivity extends I2PActivityBase {

View File

@ -5,7 +5,7 @@ import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import net.i2p.android.router.R;
import net.i2p.android.router.dialog.TextResourceDialog;
public class LicenseFragment extends ListFragment {
@ -28,7 +28,7 @@ public class LicenseFragment extends ListFragment {
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, names));
setListAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, names));
}
@Override

View File

@ -1,23 +1,11 @@
package net.i2p.android.router;
import java.io.File;
import java.util.List;
import java.util.Properties;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.preference.PreferenceManager;
import android.support.v4.app.DialogFragment;
import android.support.v4.content.LocalBroadcastManager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@ -25,18 +13,15 @@ import android.view.MenuItem;
import net.i2p.android.help.HelpActivity;
import net.i2p.android.router.dialog.AboutDialog;
import net.i2p.android.router.dialog.TextResourceDialog;
import net.i2p.android.router.service.IRouterState;
import net.i2p.android.router.service.IRouterStateCallback;
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.router.RouterContext;
import net.i2p.util.OrderedProperties;
import java.io.File;
public class MainActivity extends I2PActivityBase implements
MainFragment.RouterControlListener {
IRouterState mStateService = null;
MainFragment mMainFragment = null;
private boolean mAutoStartFromIntent = false;
@ -103,24 +88,40 @@ public class MainActivity extends I2PActivityBase implements
}
@Override
public void onResume() {
super.onResume();
if (mStateService != null) {
try {
if (mStateService.isStarted()) {
// Update for the current state.
Util.d("Fetching state.");
State curState = mStateService.getState();
Message msg = mHandler.obtainMessage(STATE_MSG);
msg.getData().putParcelable(MSG_DATA, curState);
mHandler.sendMessage(msg);
} else {
Util.d("StateService not started yet");
}
} catch (RemoteException e) {}
}
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);
lbm.sendBroadcast(new Intent(RouterService.LOCAL_BROADCAST_REQUEST_STATE));
}
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) {
if (mMainFragment == null)
mMainFragment = (MainFragment) getSupportFragmentManager().findFragmentById(R.id.main_fragment);
if (mMainFragment != null) {
mMainFragment.updateState(state);
lastRouterState = state;
}
if (state == State.RUNNING && mAutoStartFromIntent) {
MainActivity.this.setResult(RESULT_OK);
finish();
}
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
@ -164,113 +165,11 @@ public class MainActivity extends I2PActivityBase implements
@Override
public void onStop() {
if (mStateService != null) {
try {
mStateService.unregisterCallback(mStateCallback);
} catch (RemoteException e) {}
}
if (mTriedBindState)
unbindService(mStateConnection);
mTriedBindState = false;
super.onStop();
LocalBroadcastManager.getInstance(this).unregisterReceiver(onStateChange);
}
@Override
protected void onRouterBind(RouterService svc) {
if (mStateService == null) {
// Try binding for state updates.
// Don't auto-create the RouterService.
Intent intent = new Intent(IRouterState.class.getName());
intent.setClassName(this, "net.i2p.android.router.service.RouterService");
mTriedBindState = bindService(intent,
mStateConnection, 0);
Util.d("Bind to IRouterState successful: " + mTriedBindState);
}
super.onRouterBind(svc);
}
private boolean mTriedBindState;
private ServiceConnection mStateConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
mStateService = IRouterState.Stub.asInterface(service);
Util.d("StateService bound");
try {
if (mStateService.isStarted()) {
mStateService.registerCallback(mStateCallback);
// Update for the current state.
Util.d("Fetching state.");
State curState = mStateService.getState();
Message msg = mHandler.obtainMessage(STATE_MSG);
msg.getData().putParcelable(MSG_DATA, curState);
mHandler.sendMessage(msg);
} else {
// Unbind
unbindService(mStateConnection);
mStateService = null;
mTriedBindState = false;
}
} catch (RemoteException e) {
// In this case the service has crashed before we could even
// do anything with it; we can count on soon being
// disconnected (and then reconnected if it can be restarted)
// so there is no need to do anything here.
}
}
public void onServiceDisconnected(ComponentName className) {
// This is called when the connection with the service has been
// unexpectedly disconnected -- that is, its process crashed.
mStateService = null;
}
};
private IRouterStateCallback mStateCallback = new IRouterStateCallback.Stub() {
/**
* This is called by the RouterService regularly to tell us about
* new states. Note that IPC calls are dispatched through a thread
* pool running in each process, so the code executing here will
* NOT be running in our main thread like most other things -- so,
* to update the UI, we need to use a Handler to hop over there.
*/
public void stateChanged(State newState) throws RemoteException {
Message msg = mHandler.obtainMessage(STATE_MSG);
msg.getData().putParcelable(MSG_DATA, newState);
mHandler.sendMessage(msg);
}
};
private static final int STATE_MSG = 1;
private static final String MSG_DATA = "state";
private Handler mHandler = new Handler() {
private State lastRouterState = null;
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case STATE_MSG:
State state = msg.getData().getParcelable(MSG_DATA);
if (lastRouterState == null || lastRouterState != state) {
if (mMainFragment == null)
mMainFragment = (MainFragment) getSupportFragmentManager().findFragmentById(R.id.main_fragment);
if (mMainFragment != null) {
mMainFragment.updateState(state);
lastRouterState = state;
}
if (state == State.RUNNING && mAutoStartFromIntent) {
setResult(RESULT_OK);
finish();
}
}
break;
default:
super.handleMessage(msg);
}
}
};
private boolean canStart() {
RouterService svc = _routerService;
return (svc == null) || (!_isBound) || svc.canManualStart();
@ -284,7 +183,7 @@ public class MainActivity extends I2PActivityBase implements
// MainFragment.RouterControlListener
public boolean shouldShowOnOff() {
return (canStart() && Connectivity.isConnected(this)) || canStop();
return (canStart() && Connectivity.isConnected(this)) || (canStop() && !isGracefulShutdownInProgress());
}
public boolean shouldBeOn() {
@ -299,7 +198,7 @@ public class MainActivity extends I2PActivityBase implements
setPref(PREF_AUTO_START, true);
svc.manualStart();
} else {
(new File(_myDir, "wrapper.log")).delete();
(new File(Util.getFileDir(this), "wrapper.log")).delete();
startRouter();
}
}
@ -313,4 +212,32 @@ public class MainActivity extends I2PActivityBase implements
}
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

@ -1,7 +1,6 @@
package net.i2p.android.router;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
@ -10,6 +9,7 @@ import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
@ -20,7 +20,6 @@ import android.widget.ToggleButton;
import net.i2p.android.router.dialog.ConfigureBrowserDialog;
import net.i2p.android.router.dialog.FirstStartDialog;
import net.i2p.android.router.dialog.VersionDialog;
import net.i2p.android.router.service.State;
import net.i2p.android.router.util.Connectivity;
import net.i2p.android.router.util.LongToggleButton;
@ -61,6 +60,12 @@ public class MainFragment extends I2PFragmentBase {
public boolean shouldBeOn();
public void onStartRouterClicked();
public boolean onStopRouterClicked();
/** @since 0.9.19 */
public boolean isGracefulShutdownInProgress();
/** @since 0.9.19 */
public boolean onGracefulShutdownClicked();
/** @since 0.9.19 */
public boolean onCancelGracefulShutdownClicked();
}
@Override
@ -117,11 +122,29 @@ public class MainFragment extends I2PFragmentBase {
mCallback.onStartRouterClicked();
updateOneShot();
checkFirstStart();
} else {
if(mCallback.onStopRouterClicked()) {
} else if(mCallback.onGracefulShutdownClicked())
updateOneShot();
return true;
}
});
Button gb = (Button) v.findViewById(R.id.button_shutdown_now);
gb.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
if (mCallback.isGracefulShutdownInProgress())
if(mCallback.onStopRouterClicked())
updateOneShot();
return true;
}
});
gb = (Button) v.findViewById(R.id.button_cancel_graceful);
gb.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
if (mCallback.isGracefulShutdownInProgress())
if(mCallback.onCancelGracefulShutdownClicked())
updateOneShot();
}
}
return true;
}
});
@ -193,11 +216,28 @@ public class MainFragment extends I2PFragmentBase {
private void updateVisibility() {
boolean showOnOff = mCallback.shouldShowOnOff();
ToggleButton b = (ToggleButton) getActivity().findViewById(R.id.router_onoff_button);
b.setVisibility(showOnOff ? View.VISIBLE : View.INVISIBLE);
b.setVisibility(showOnOff ? View.VISIBLE : View.GONE);
boolean isOn = mCallback.shouldBeOn();
b.setChecked(isOn);
boolean isGraceful = mCallback.isGracefulShutdownInProgress();
LinearLayout gv = (LinearLayout) getActivity().findViewById(R.id.router_graceful_buttons);
gv.setVisibility(isGraceful ? View.VISIBLE : View.GONE);
if (isOn && isGraceful) {
RouterContext ctx = getRouterContext();
if (ctx != null) {
TextView tv = (TextView) gv.findViewById(R.id.router_graceful_status);
long ms = ctx.router().getShutdownTimeRemaining();
if (ms > 1000) {
tv.setText(getActivity().getResources().getString(R.string.button_router_graceful,
DataHelper.formatDuration(ms)));
} else {
tv.setText("Stopping I2P");
}
}
}
if (showOnOff && !isOn) {
// Sometimes the final state message from the RouterService
// is not received. Ensure that the state image is correct.
@ -249,6 +289,7 @@ public class MainFragment extends I2PFragmentBase {
newState == State.NETWORK_STOPPED) {
lightImage.setImageResource(R.drawable.routerlogo_0);
} else if (newState == State.STARTING ||
newState == State.GRACEFUL_SHUTDOWN ||
newState == State.STOPPING ||
newState == State.MANUAL_STOPPING ||
newState == State.MANUAL_QUITTING ||

View File

@ -1,6 +1,5 @@
package net.i2p.android.router;
import net.i2p.android.router.R;
import android.os.Bundle;
public class NewsActivity extends I2PActivityBase {

View File

@ -2,12 +2,15 @@ package net.i2p.android.router;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
@ -17,6 +20,7 @@ import android.widget.Toast;
import net.i2p.I2PAppContext;
import net.i2p.android.router.service.StatSummarizer;
import net.i2p.android.router.util.PortPreference;
import net.i2p.android.router.util.Util;
import net.i2p.router.RouterContext;
import net.i2p.stat.FrequencyStat;
@ -28,6 +32,7 @@ import net.i2p.util.LogManager;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.SortedSet;
public class SettingsActivity extends PreferenceActivity {
@ -46,25 +51,61 @@ public class SettingsActivity extends PreferenceActivity {
String action = getIntent().getAction();
if (action != null) {
if (ACTION_PREFS_NET.equals(action)) {
addPreferencesFromResource(R.xml.settings_net);
} else if (ACTION_PREFS_GRAPHS.equals(action)){
addPreferencesFromResource(R.xml.settings_graphs);
setupGraphSettings(this, getPreferenceScreen(), Util.getRouterContext());
} else if (ACTION_PREFS_LOGGING.equals(action)) {
addPreferencesFromResource(R.xml.settings_logging);
setupLoggingSettings(this, getPreferenceScreen(), Util.getRouterContext());
} else if (ACTION_PREFS_ADVANCED.equals(action)) {
addPreferencesFromResource(R.xml.settings_advanced);
switch (action) {
case ACTION_PREFS_NET:
addPreferencesFromResource(R.xml.settings_net);
break;
case ACTION_PREFS_GRAPHS:
addPreferencesFromResource(R.xml.settings_graphs);
setupGraphSettings(this, getPreferenceScreen(), Util.getRouterContext());
break;
case ACTION_PREFS_LOGGING:
addPreferencesFromResource(R.xml.settings_logging);
setupLoggingSettings(this, getPreferenceScreen(), Util.getRouterContext());
break;
case ACTION_PREFS_ADVANCED:
addPreferencesFromResource(R.xml.settings_advanced);
setupAdvancedSettings(this, getPreferenceScreen());
break;
}
} else {
// Load any properties that the router might have changed on us.
setupPreferences(this, Util.getRouterContext());
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
// Load the legacy preferences headers
addPreferencesFromResource(R.xml.settings_headers_legacy);
}
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
// Load the legacy preferences headers
addPreferencesFromResource(R.xml.settings_headers_legacy);
}
mToolbar.setTitle(getTitle());
}
protected static void setupPreferences(Context context, RouterContext ctx) {
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 SettingsActivity loads its Preferences.
editor.commit();
}
}
}
protected static void setupGraphSettings(Context context, PreferenceScreen ps, RouterContext ctx) {
if (ctx == null) {
PreferenceCategory noRouter = new PreferenceCategory(context);
@ -153,6 +194,65 @@ public class SettingsActivity extends PreferenceActivity {
}
}
protected static void setupAdvancedSettings(final Context context, PreferenceScreen ps) {
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;
}
});
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onBuildHeaders(List<Header> target) {
@ -188,20 +288,23 @@ public class SettingsActivity extends PreferenceActivity {
protected void onPause() {
List<Properties> lProps = Util.getPropertiesFromPreferences(this);
Properties props = lProps.get(0);
Properties logSettings = lProps.get(1);
Properties propsToRemove = lProps.get(1);
Properties logSettings = lProps.get(2);
boolean restartRequired = Util.checkAndCorrectRouterConfig(this, props);
Set toRemove = propsToRemove.keySet();
boolean restartRequired = Util.checkAndCorrectRouterConfig(this, props, toRemove);
// Apply new config if we are running.
RouterContext rCtx = Util.getRouterContext();
if (rCtx != null) {
rCtx.router().saveConfig(props, 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(this, Util.getFileDir(this), "router.config", R.raw.router_config, props);
Util.mergeResourceToFile(this, Util.getFileDir(this), "router.config", R.raw.router_config, props, toRemove);
// Merge in new log settings
saveLoggingChanges(I2PAppContext.getGlobalContext(), logSettings);
@ -240,16 +343,22 @@ public class SettingsActivity extends PreferenceActivity {
super.onCreate(savedInstanceState);
String settings = getArguments().getString("settings");
if ("net".equals(settings)) {
addPreferencesFromResource(R.xml.settings_net);
} else if ("graphs".equals(settings)) {
addPreferencesFromResource(R.xml.settings_graphs);
setupGraphSettings(getActivity(), getPreferenceScreen(), Util.getRouterContext());
} else if ("logging".equals(settings)) {
addPreferencesFromResource(R.xml.settings_logging);
setupLoggingSettings(getActivity(), getPreferenceScreen(), Util.getRouterContext());
} else if ("advanced".equals(settings)) {
addPreferencesFromResource(R.xml.settings_advanced);
switch (settings) {
case "net":
addPreferencesFromResource(R.xml.settings_net);
break;
case "graphs":
addPreferencesFromResource(R.xml.settings_graphs);
setupGraphSettings(getActivity(), getPreferenceScreen(), Util.getRouterContext());
break;
case "logging":
addPreferencesFromResource(R.xml.settings_logging);
setupLoggingSettings(getActivity(), getPreferenceScreen(), Util.getRouterContext());
break;
case "advanced":
addPreferencesFromResource(R.xml.settings_advanced);
setupAdvancedSettings(getActivity(), getPreferenceScreen());
break;
}
}
}

View File

@ -1,42 +1,47 @@
package net.i2p.android.router.addressbook;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import net.i2p.android.router.I2PFragmentBase;
import net.i2p.android.router.util.NamingServiceUtil;
import net.i2p.android.router.util.Util;
import net.i2p.client.naming.NamingService;
import net.i2p.data.Destination;
import net.i2p.router.RouterContext;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
import net.i2p.android.router.util.NamingServiceUtil;
import net.i2p.android.router.util.Util;
import net.i2p.client.naming.NamingService;
import net.i2p.data.Destination;
import net.i2p.router.RouterContext;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
public class AddressEntryLoader extends AsyncTaskLoader<List<AddressEntry>> {
private RouterContext mRContext;
private I2PFragmentBase.RouterContextProvider mRContextProvider;
private String mBook;
private String mFilter;
private List<AddressEntry> mData;
public AddressEntryLoader(Context context, RouterContext rContext,
public AddressEntryLoader(Context context, I2PFragmentBase.RouterContextProvider rContextProvider,
String book, String filter) {
super(context);
mRContext = rContext;
mRContextProvider = rContextProvider;
mBook = book;
mFilter = filter;
}
@Override
public List<AddressEntry> loadInBackground() {
RouterContext routerContext = mRContextProvider.getRouterContext();
if (routerContext == null)
return null;
// get the names
NamingService ns = NamingServiceUtil.getNamingService(mRContext, mBook);
NamingService ns = NamingServiceUtil.getNamingService(routerContext, mBook);
Util.d("NamingService: " + ns.getName());
// After router shutdown we get nothing... why?
List<AddressEntry> ret = new ArrayList<AddressEntry>();
Map<String, Destination> names = new TreeMap<String, Destination>();
List<AddressEntry> ret = new ArrayList<>();
Map<String, Destination> names = new TreeMap<>();
Properties searchProps = new Properties();
// Needed for HostsTxtNamingService

View File

@ -6,6 +6,7 @@ import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import net.i2p.android.wizard.model.AbstractWizardModel;
import net.i2p.android.wizard.ui.AbstractWizardActivity;
@ -19,6 +20,7 @@ public class AddressbookAddWizardActivity extends AbstractWizardActivity {
@Override
protected DialogFragment onGetFinishWizardDialog() {
return new DialogFragment() {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())

View File

@ -173,15 +173,19 @@ public class AddressbookFragment extends ListFragment implements
inflater.inflate(R.menu.fragment_addressbook_actions, menu);
mSearchAddressbook = menu.findItem(R.id.action_search_addressbook);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
// Hide until needed
if (getRouterContext() == null) {
mSearchAddressbook.setVisible(false);
mAddToAddressbook.setVisibility(View.GONE);
if (mAddToAddressbook != null)
mAddToAddressbook.setVisibility(View.GONE);
}
// Only allow adding to private book
if (!PRIVATE_BOOK.equals(mBook)) {
if (!PRIVATE_BOOK.equals(mBook) && mAddToAddressbook != null) {
mAddToAddressbook.setVisibility(View.GONE);
mAddToAddressbook = null;
}
@ -245,27 +249,32 @@ public class AddressbookFragment extends ListFragment implements
public Loader<List<AddressEntry>> onCreateLoader(int id, Bundle args) {
return new AddressEntryLoader(getActivity(),
getRouterContext(), mBook, mCurFilter);
mRouterContextProvider, mBook, mCurFilter);
}
public void onLoadFinished(Loader<List<AddressEntry>> loader,
List<AddressEntry> data) {
if (loader.getId() == (PRIVATE_BOOK.equals(mBook) ?
PRIVATE_LOADER_ID : ROUTER_LOADER_ID)) {
mAdapter.setData(data);
if (data == null)
setEmptyText(getResources().getString(
R.string.router_not_running));
else {
mAdapter.setData(data);
TextView v = (TextView) getListView().findViewWithTag("addressbook_header");
if (mCurFilter != null)
v.setText(getActivity().getResources().getString(
R.string.addressbook_search_header,
data.size()));
else
v.setText("");
TextView v = (TextView) getListView().findViewWithTag("addressbook_header");
if (mCurFilter != null)
v.setText(getActivity().getResources().getString(
R.string.addressbook_search_header,
data.size()));
else
v.setText("");
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
}
}
}

View File

@ -1,21 +1,24 @@
package net.i2p.android.router.dialog;
import net.i2p.android.router.LicenseActivity;
import net.i2p.android.router.R;
import net.i2p.android.router.util.I2Patterns;
import net.i2p.android.router.util.Util;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.text.util.Linkify;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import net.i2p.android.router.LicenseActivity;
import net.i2p.android.router.R;
import net.i2p.android.router.util.I2Patterns;
import net.i2p.android.router.util.Util;
public class AboutDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle SavedInstanceState) {
LayoutInflater li = LayoutInflater.from(getActivity());

View File

@ -5,18 +5,14 @@ import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.text.util.Linkify;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import net.i2p.android.help.BrowserConfigActivity;
import net.i2p.android.help.HelpActivity;
import net.i2p.android.router.R;
import net.i2p.android.router.util.I2Patterns;
public class ConfigureBrowserDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder b = new AlertDialog.Builder(getActivity());

View File

@ -1,18 +1,20 @@
package net.i2p.android.router.dialog;
import net.i2p.android.router.R;
import net.i2p.android.router.util.I2Patterns;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.text.util.Linkify;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import net.i2p.android.router.R;
import net.i2p.android.router.util.I2Patterns;
public class FirstStartDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater li = LayoutInflater.from(getActivity());

View File

@ -54,10 +54,8 @@ public class TextResourceDialog extends DialogFragment {
while ( (read = in.read(buf)) != -1)
out.write(buf, 0, read);
} catch (IOException ioe) {
System.err.println("resource error " + ioe);
} catch (Resources.NotFoundException nfe) {
System.err.println("resource error " + nfe);
} catch (IOException | Resources.NotFoundException re) {
System.err.println("resource error " + re);
} finally {
if (in != null) try { in.close(); } catch (IOException ioe) {}
}

View File

@ -1,24 +1,27 @@
package net.i2p.android.router.dialog;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import net.i2p.android.router.I2PActivityBase;
import net.i2p.android.router.MainFragment;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
public class VersionDialog extends DialogFragment {
public static final String DIALOG_TYPE = "dialog_type";
public static final int DIALOG_NEW_INSTALL = 0;
public static final int DIALOG_NEW_VERSION = 1;
@NonNull
@Override
public Dialog onCreateDialog(Bundle SavedInstanceState) {
final String currentVersion = Util.getOurVersion(getActivity());
Dialog rv = null;
Dialog rv;
AlertDialog.Builder b = new AlertDialog.Builder(getActivity());
int id = getArguments().getInt(DIALOG_TYPE);
switch(id) {
@ -53,6 +56,7 @@ public class VersionDialog extends DialogFragment {
break;
case DIALOG_NEW_VERSION:
default:
b.setMessage(getResources().getString(R.string.welcome_new_version) +
" " + currentVersion)
.setCancelable(true)

View File

@ -15,11 +15,12 @@ import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import net.i2p.I2PAppContext;
import net.i2p.android.router.R;
import java.util.ArrayList;
import java.util.List;
public class LogFragment extends ListFragment implements
LoaderManager.LoaderCallbacks<List<String>> {
public static final String LOG_LEVEL = "log_level";
@ -33,7 +34,7 @@ public class LogFragment extends ListFragment implements
private static final int LEVEL_ALL = 2;
OnEntrySelectedListener mEntrySelectedCallback;
private final List<String> mLogEntries = new ArrayList<String>();
private final List<String> mLogEntries = new ArrayList<>();
private LogAdapter mAdapter;
private TextView mHeaderView;
private String mLogLevel;

View File

@ -1,18 +1,19 @@
package net.i2p.android.router.netdb;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import net.i2p.data.Destination;
import net.i2p.data.LeaseSet;
import net.i2p.data.router.RouterInfo;
import net.i2p.router.RouterContext;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import net.i2p.data.Destination;
import net.i2p.data.LeaseSet;
import net.i2p.data.router.RouterInfo;
import net.i2p.router.RouterContext;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
public class NetDbEntryLoader extends AsyncTaskLoader<List<NetDbEntry>> {
private RouterContext mRContext;
private boolean mRouters;
@ -44,17 +45,17 @@ public class NetDbEntryLoader extends AsyncTaskLoader<List<NetDbEntry>> {
@Override
public List<NetDbEntry> loadInBackground() {
List<NetDbEntry> ret = new ArrayList<NetDbEntry>();
List<NetDbEntry> ret = new ArrayList<>();
if (mRContext.netDb().isInitialized()) {
if (mRouters) {
Set<RouterInfo> routers = new TreeSet<RouterInfo>(new RouterInfoComparator());
Set<RouterInfo> routers = new TreeSet<>(new RouterInfoComparator());
routers.addAll(mRContext.netDb().getRouters());
for (RouterInfo ri : routers) {
NetDbEntry entry = NetDbEntry.fromRouterInfo(mRContext, ri);
ret.add(entry);
}
} else {
Set<LeaseSet> leases = new TreeSet<LeaseSet>(new LeaseSetComparator());
Set<LeaseSet> leases = new TreeSet<>(new LeaseSetComparator());
leases.addAll(mRContext.netDb().getLeases());
for (LeaseSet ls : leases) {
NetDbEntry entry = NetDbEntry.fromLeaseSet(mRContext, ls);

View File

@ -1,18 +1,19 @@
package net.i2p.android.router.netdb;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import net.i2p.data.Hash;
import net.i2p.data.router.RouterAddress;
import net.i2p.data.router.RouterInfo;
import net.i2p.router.RouterContext;
import net.i2p.util.ObjectCounter;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class NetDbStatsLoader extends AsyncTaskLoader<List<ObjectCounter<String>>> {
private RouterContext mRContext;
@ -31,16 +32,16 @@ public class NetDbStatsLoader extends AsyncTaskLoader<List<ObjectCounter<String>
@Override
public List<ObjectCounter<String>> loadInBackground() {
List<ObjectCounter<String>> ret = new ArrayList<ObjectCounter<String>>();
List<ObjectCounter<String>> ret = new ArrayList<>();
ObjectCounter<String> versions = new ObjectCounter<String>();
ObjectCounter<String> countries = new ObjectCounter<String>();
ObjectCounter<String> transports = new ObjectCounter<String>();
ObjectCounter<String> versions = new ObjectCounter<>();
ObjectCounter<String> countries = new ObjectCounter<>();
ObjectCounter<String> transports = new ObjectCounter<>();
if (mRContext.netDb().isInitialized()) {
if (mRContext != null && mRContext.netDb() != null && mRContext.netDb().isInitialized()) {
Hash us = mRContext.routerHash();
Set<RouterInfo> routers = new TreeSet<RouterInfo>(new RouterInfoComparator());
Set<RouterInfo> routers = new TreeSet<>(new RouterInfoComparator());
routers.addAll(mRContext.netDb().getRouters());
for (RouterInfo ri : routers) {
Hash key = ri.getHash();

View File

@ -1,12 +1,5 @@
package net.i2p.android.router.netdb;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.i2p.android.router.R;
import net.i2p.util.ObjectCounter;
import net.i2p.util.VersionComparator;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
@ -16,6 +9,14 @@ import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import net.i2p.android.router.R;
import net.i2p.util.ObjectCounter;
import net.i2p.util.VersionComparator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class NetDbSummaryTableFragment extends Fragment {
private static final String CATEGORY = "category";
private static final String COUNTS = "counts";
@ -44,7 +45,7 @@ public class NetDbSummaryTableFragment extends Fragment {
mTable = (TableLayout) v.findViewById(R.id.table);
List<String> objects = new ArrayList<String>(mCounts.objects());
List<String> objects = new ArrayList<>(mCounts.objects());
if (!objects.isEmpty()) {
createTableTitle();

View File

@ -6,6 +6,12 @@ import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import net.i2p.android.apps.EepGetFetcher;
import net.i2p.android.router.BuildConfig;
import net.i2p.android.router.util.AppCache;
import net.i2p.android.router.util.Util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@ -13,9 +19,6 @@ import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.i2p.android.apps.EepGetFetcher;
import net.i2p.android.router.util.AppCache;
import net.i2p.android.router.util.Util;
/**
* Usage: content://net.i2p.android.router/NONCE/ENCODED-SCHEME/ENCODED-AUTHORITY/ENCODED_PATH + QUERY_MARKER + ENCODED-QUERY
@ -45,7 +48,7 @@ public class CacheProvider extends ContentProvider {
//private static final String NONCE = Integer.toString(Math.abs((new java.util.Random()).nextInt()));
private static final String NONCE = "0";
private static final String SCHEME = "content";
public static final String AUTHORITY = "net.i2p.android";
public static final String AUTHORITY = BuildConfig.APPLICATION_ID + ".provider";
/** includes the nonce */
public static final Uri CONTENT_URI = Uri.parse(SCHEME + "://" + AUTHORITY + '/' + NONCE);
@ -140,7 +143,7 @@ public class CacheProvider extends ContentProvider {
*
* @param uri must contain a scheme, authority and path with nonce etc. as defined above
* @return non-null
* @throws FNFE on error
* @throws java.io.FileNotFoundException on error
*/
public static Uri getI2PUri(Uri uri) throws FileNotFoundException {
String resPath = uri.getEncodedPath();
@ -242,8 +245,7 @@ public class CacheProvider extends ContentProvider {
if (file.length() > 0) {
// this call will insert it back to us (don't set as current base)
Uri content = cache.addCacheFile(uri, false);
ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
return parcel;
return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
} else {
Util.d("CacheProvider Sucess but no data " + uri);
}
@ -275,7 +277,7 @@ public class CacheProvider extends ContentProvider {
put(uri, fileURI);
}
Boolean setAsCurrentBase = values.getAsBoolean(CURRENT_BASE);
if (setAsCurrentBase != null && setAsCurrentBase.booleanValue()) {
if (setAsCurrentBase != null && setAsCurrentBase) {
Util.d("CacheProvider set current base " + uri);
setCurrentBase(uri);
}
@ -302,7 +304,7 @@ public class CacheProvider extends ContentProvider {
private void cleanup() {
String pfx = CONTENT_URI.toString();
List<String> toDelete = new ArrayList<String>();
List<String> toDelete = new ArrayList<>();
Map<String, ?> map = _sharedPrefs.getAll();
for (Map.Entry<String, ?> e : map.entrySet()) {
String path = (String) e.getValue();

View File

@ -0,0 +1,25 @@
package net.i2p.android.router.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import net.i2p.android.router.I2PConstants;
import net.i2p.android.router.service.RouterService;
public class OnBootReceiver extends BroadcastReceiver implements I2PConstants {
public static final String PREF_START_ON_BOOT = ANDROID_PREF_PREFIX + "startOnBoot";
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean startOnBoot = prefs.getBoolean(PREF_START_ON_BOOT, false);
if (startOnBoot) {
Intent routerService = new Intent(context, RouterService.class);
context.startService(routerService);
}
}
}

View File

@ -1,10 +1,12 @@
package net.i2p.android.router.service;
import android.content.Context;
import java.io.File;
import net.i2p.android.router.util.Util;
import net.i2p.util.FileUtil;
import java.io.File;
class Init {
private final Context ctx;
@ -32,8 +34,7 @@ class Init {
File tmp = new File(myDir, "tmp");
File[] files = tmp.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
File f = files[i];
for (File f : files) {
Util.d("Deleting old file/dir " + f);
FileUtil.rmdir(f, false);
}

View File

@ -1,22 +1,17 @@
package net.i2p.android.router.service;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Properties;
import java.util.Random;
import android.support.v4.content.LocalBroadcastManager;
import net.i2p.android.router.R;
import net.i2p.android.router.receiver.I2PReceiver;
@ -28,13 +23,31 @@ import net.i2p.router.Job;
import net.i2p.router.Router;
import net.i2p.router.RouterContext;
import net.i2p.router.RouterLaunch;
import net.i2p.util.OrderedProperties;
import java.lang.ref.WeakReference;
import java.text.DecimalFormat;
/**
* Runs the router
*/
public class RouterService extends Service {
/**
* A request to this service for the current router state. Broadcasting
* this will trigger a state notification.
*/
public static final String LOCAL_BROADCAST_REQUEST_STATE = "net.i2p.android.LOCAL_BROADCAST_REQUEST_STATE";
/**
* A notification of the current state. This is informational; the state
* has not changed.
*/
public static final String LOCAL_BROADCAST_STATE_NOTIFICATION = "net.i2p.android.LOCAL_BROADCAST_STATE_NOTIFICATION";
/**
* The state has just changed.
*/
public static final String LOCAL_BROADCAST_STATE_CHANGED = "net.i2p.android.LOCAL_BROADCAST_STATE_CHANGED";
public static final String LOCAL_BROADCAST_EXTRA_STATE = "net.i2p.android.STATE";
private RouterContext _context;
private String _myDir;
//private String _apkPath;
@ -59,7 +72,7 @@ public class RouterService extends Service {
* that it can be accessed more efficiently from inner classes.
*/
final RemoteCallbackList<IRouterStateCallback> mStateCallbacks
= new RemoteCallbackList<IRouterStateCallback>();
= new RemoteCallbackList<>();
@Override
public void onCreate() {
@ -83,11 +96,13 @@ public class RouterService extends Service {
_binder = new RouterBinder(this);
_handler = new Handler();
_updater = new Updater();
LocalBroadcastManager.getInstance(this).registerReceiver(onStateRequested,
new IntentFilter(LOCAL_BROADCAST_REQUEST_STATE));
if(lastState == State.RUNNING || lastState == State.ACTIVE) {
Intent intent = new Intent(this, RouterService.class);
intent.putExtra(EXTRA_RESTART, true);
onStartCommand(intent, 12345, 67890);
} else if(lastState == State.MANUAL_QUITTING) {
} else if(lastState == State.MANUAL_QUITTING || lastState == State.GRACEFUL_SHUTDOWN) {
synchronized(_stateLock) {
setState(State.MANUAL_QUITTED);
stopSelf(); // Die.
@ -95,6 +110,16 @@ public class RouterService extends Service {
}
}
private BroadcastReceiver onStateRequested = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Broadcast the current state within this app.
Intent ni = new Intent(LOCAL_BROADCAST_STATE_NOTIFICATION);
ni.putExtra(LOCAL_BROADCAST_EXTRA_STATE, (android.os.Parcelable) _state);
LocalBroadcastManager.getInstance(RouterService.this).sendBroadcast(ni);
}
};
/**
* NOT called by system if it restarts us after a crash
*/
@ -176,147 +201,7 @@ public class RouterService extends Service {
//NativeBigInteger.main(null);
//Util.d(MARKER + this + " JBigI speed test finished, launching router");
// Before we launch, fix up any settings that need to be fixed here.
// This should be done in the core, but as of this writing it isn't!
// Step one. Load the propertites.
Properties props = new OrderedProperties();
Properties oldprops = new OrderedProperties();
String wrapName = _myDir + "/router.config";
try {
InputStream fin = new FileInputStream(new File(wrapName));
DataHelper.loadProps(props, fin);
} catch(IOException ioe) {
// shouldn't happen...
}
oldprops.putAll(props);
// Step two, check for any port settings, and copy for those that are missing.
int UDPinbound;
int UDPinlocal;
int TCPinbound;
int TCPinlocal;
UDPinbound = Integer.parseInt(props.getProperty("i2np.udp.port", "-1"));
UDPinlocal = Integer.parseInt(props.getProperty("i2np.udp.internalPort", "-1"));
TCPinbound = Integer.parseInt(props.getProperty("i2np.ntcp.port", "-1"));
TCPinlocal = Integer.parseInt(props.getProperty("i2np.ntcp.internalPort", "-1"));
boolean hasUDPinbound = UDPinbound != -1;
boolean hasUDPinlocal = UDPinlocal != -1;
boolean hasTCPinbound = TCPinbound != -1;
boolean hasTCPinlocal = TCPinlocal != -1;
// check and clear values based on these:
boolean udp = Boolean.parseBoolean(props.getProperty("i2np.udp.enable", "false"));
boolean tcp = Boolean.parseBoolean(props.getProperty("i2np.ntcp.enable", "false"));
// Fix if both are false.
if(!(udp || tcp)) {
// If both are not on, turn them both on.
props.setProperty("i2np.udp.enable", "true");
props.setProperty("i2np.ntcp.enable", "true");
}
// Fix if we have local but no inbound
if(!hasUDPinbound && hasUDPinlocal) {
// if we got a local port and no external port, set it
hasUDPinbound = true;
UDPinbound = UDPinlocal;
}
if(!hasTCPinbound && hasTCPinlocal) {
// if we got a local port and no external port, set it
hasTCPinbound = true;
TCPinbound = TCPinlocal;
}
boolean anyUDP = hasUDPinbound || hasUDPinlocal;
boolean anyTCP = hasTCPinbound || hasTCPinlocal;
boolean anyport = anyUDP || anyTCP;
if(!anyport) {
// generate one for UDPinbound, and fall thru.
// FIX ME: Possibly not the best but should be OK.
Random generator = new Random(System.currentTimeMillis());
UDPinbound = generator.nextInt(55500) + 10000;
anyUDP = true;
}
// Copy missing port numbers
if(anyUDP && !anyTCP) {
TCPinbound = UDPinbound;
TCPinlocal = UDPinlocal;
}
if(anyTCP && !anyUDP) {
UDPinbound = TCPinbound;
UDPinlocal = TCPinlocal;
}
// reset for a retest.
hasUDPinbound = UDPinbound != -1;
hasUDPinlocal = UDPinlocal != -1;
hasTCPinbound = TCPinbound != -1;
hasTCPinlocal = TCPinlocal != -1;
anyUDP = hasUDPinbound || hasUDPinlocal;
anyTCP = hasTCPinbound || hasTCPinlocal;
boolean checkAnyUDP = anyUDP && udp;
boolean checkAnyTCP = anyTCP && tcp;
// Enable things that need to be enabled.
// Disable anything that needs to be disabled.
if(!checkAnyUDP && !checkAnyTCP) {
// enable the one(s) with values.
if(anyUDP) {
udp = true;
}
if(anyTCP) {
tcp = true;
}
}
if(!udp) {
props.setProperty("i2np.udp.enable", "false");
props.remove("i2np.udp.port");
props.remove("i2np.udp.internalPort");
} else {
props.setProperty("i2np.udp.enable", "true");
if(hasUDPinbound) {
props.setProperty("i2np.udp.port", Integer.toString(UDPinbound));
} else {
props.remove("i2np.udp.port");
}
if(hasUDPinlocal) {
props.setProperty("i2np.udp.internalPort", Integer.toString(UDPinlocal));
} else {
props.remove("i2np.udp.internalPort");
}
}
if(!tcp) {
props.setProperty("i2np.ntcp.enable", "false");
props.remove("i2np.ntcp.port");
props.remove("i2np.ntcp.internalPort");
} else {
props.setProperty("i2np.ntcp.enable", "true");
if(hasTCPinbound) {
props.setProperty("i2np.ntcp.port", Integer.toString(TCPinbound));
} else {
props.remove("i2np.ntcp.port");
}
if(hasTCPinlocal) {
props.setProperty("i2np.ntcp.internalPort", Integer.toString(TCPinlocal));
} else {
props.remove("i2np.ntcp.internalPort");
}
}
// WHEW! Now test for any changes.
if(!props.equals(oldprops)) {
// save fixed properties.
try {
DataHelper.storeProps(props, new File(wrapName));
} catch(IOException ioe) {
// shouldn't happen...
}
}
// _NOW_ launch the router!
// Launch the router!
RouterLaunch.main(null);
synchronized(_stateLock) {
if(_state != State.STARTING) {
@ -343,7 +228,7 @@ public class RouterService extends Service {
public void run() {
RouterContext ctx = _context;
if(ctx != null && (_state == State.RUNNING || _state == State.ACTIVE)) {
if(ctx != null && (_state == State.RUNNING || _state == State.ACTIVE || _state == State.GRACEFUL_SHUTDOWN)) {
Router router = ctx.router();
if(router.isAlive()) {
updateStatus(ctx);
@ -390,7 +275,14 @@ public class RouterService extends Service {
inCl, outCl);
boolean haveTunnels = inCl > 0 && outCl > 0;
if(haveTunnels != _hadTunnels) {
if (isGracefulShutdownInProgress()) {
long ms = ctx.router().getShutdownTimeRemaining();
if (ms > 1000) {
_currTitle = "Stopping I2P in " + DataHelper.formatDuration(ms);
} else {
_currTitle = "Stopping I2P";
}
} else if (haveTunnels != _hadTunnels) {
if(haveTunnels) {
_currTitle = "Client tunnels are ready";
setState(State.ACTIVE);
@ -457,7 +349,7 @@ public class RouterService extends Service {
// ******** following methods may be accessed from Activities and Receivers ************
/**
* @returns null if router is not running
* @return null if router is not running
*/
public RouterContext getRouterContext() {
RouterContext rv = _context;
@ -472,7 +364,8 @@ public class RouterService extends Service {
&& _state != State.STOPPING
&& _state != State.MANUAL_STOPPING
&& _state != State.MANUAL_QUITTING
&& _state != State.NETWORK_STOPPING) {
&& _state != State.NETWORK_STOPPING
&& _state != State.GRACEFUL_SHUTDOWN) {
return null;
}
return rv;
@ -486,11 +379,15 @@ public class RouterService extends Service {
}
public boolean canManualStop() {
return _state == State.WAITING || _state == State.STARTING || _state == State.RUNNING || _state == State.ACTIVE;
return _state == State.WAITING || _state == State.STARTING ||
_state == State.RUNNING || _state == State.ACTIVE ||
_state == State.GRACEFUL_SHUTDOWN;
}
/**
* Stop and don't restart the router, but keep the service
*
* Apparently unused - see manualQuit()
*/
public void manualStop() {
Util.d("manualStop called"
@ -502,7 +399,8 @@ public class RouterService extends Service {
if(_state == State.STARTING) {
_starterThread.interrupt();
}
if(_state == State.STARTING || _state == State.RUNNING || _state == State.ACTIVE) {
if(_state == State.STARTING || _state == State.RUNNING ||
_state == State.ACTIVE || _state == State.GRACEFUL_SHUTDOWN) {
_statusBar.replace(StatusBar.ICON_STOPPING, "Stopping I2P");
Thread stopperThread = new Thread(new Stopper(State.MANUAL_STOPPING, State.MANUAL_STOPPED));
stopperThread.start();
@ -523,7 +421,8 @@ public class RouterService extends Service {
if(_state == State.STARTING) {
_starterThread.interrupt();
}
if(_state == State.STARTING || _state == State.RUNNING || _state == State.ACTIVE) {
if(_state == State.STARTING || _state == State.RUNNING ||
_state == State.ACTIVE || _state == State.GRACEFUL_SHUTDOWN) {
_statusBar.replace(StatusBar.ICON_STOPPING, "Stopping I2P");
Thread stopperThread = new Thread(new Stopper(State.MANUAL_QUITTING, State.MANUAL_QUITTED));
stopperThread.start();
@ -544,7 +443,8 @@ public class RouterService extends Service {
if(_state == State.STARTING) {
_starterThread.interrupt();
}
if(_state == State.STARTING || _state == State.RUNNING || _state == State.ACTIVE) {
if(_state == State.STARTING || _state == State.RUNNING ||
_state == State.ACTIVE || _state == State.GRACEFUL_SHUTDOWN) {
_statusBar.replace(StatusBar.ICON_STOPPING, "Network disconnected, stopping I2P");
// don't change state, let the shutdown hook do it
Thread stopperThread = new Thread(new Stopper(State.NETWORK_STOPPING, State.NETWORK_STOPPING));
@ -572,6 +472,87 @@ public class RouterService extends Service {
}
}
/**
* Graceful Shutdown
*
* @since 0.9.19
*/
public boolean isGracefulShutdownInProgress() {
if (_state == State.GRACEFUL_SHUTDOWN) {
RouterContext ctx = _context;
return ctx != null && ctx.router().gracefulShutdownInProgress();
}
return false;
}
private String _oldTitle;
/**
* Graceful Shutdown
*
* @since 0.9.19
*/
public void gracefulShutdown() {
Util.d("gracefulShutdown called"
+ " Current state is: " + _state);
synchronized(_stateLock) {
if(!canManualStop()) {
return;
}
if(_state == State.STARTING || _state == State.WAITING) {
manualQuit();
return;
}
if(_state == State.RUNNING || _state == State.ACTIVE) {
RouterContext ctx = _context;
if(ctx != null && ctx.router().isAlive()) {
int part = ctx.tunnelManager().getParticipatingCount();
if(part <= 0) {
manualQuit();
} else {
ctx.router().shutdownGracefully();
_oldTitle = _currTitle;
long ms = ctx.router().getShutdownTimeRemaining();
if (ms > 1000) {
_statusBar.replace(StatusBar.ICON_STOPPING, "Stopping I2P in " + DataHelper.formatDuration(ms));
} else {
_statusBar.replace(StatusBar.ICON_STOPPING, "Stopping I2P");
}
setState(State.GRACEFUL_SHUTDOWN);
}
}
}
}
}
/**
* Cancel Graceful Shutdown
*
* @since 0.9.19
*/
public void cancelGracefulShutdown() {
Util.d("cancelGracefulShutdown called"
+ " Current state is: " + _state);
synchronized(_stateLock) {
if(_state != State.GRACEFUL_SHUTDOWN) {
return;
}
RouterContext ctx = _context;
if(ctx != null && ctx.router().isAlive()) {
ctx.router().cancelGracefulShutdown();
_currTitle = _oldTitle;
if (_hadTunnels) {
setState(State.ACTIVE);
_statusBar.replace(StatusBar.ICON_ACTIVE, "Shutdown cancelled");
} else {
setState(State.RUNNING);
_statusBar.replace(StatusBar.ICON_RUNNING, "Shutdown cancelled");
}
}
}
}
// ******** end methods accessed from Activities and Receivers ************
private static final int STATE_MSG = 1;
@ -579,29 +560,40 @@ public class RouterService extends Service {
/**
* Our Handler used to execute operations on the main thread.
*/
private final Handler mHandler = new Handler() {
private final Handler mHandler = new StateHandler(new WeakReference<>(this));
private static class StateHandler extends Handler {
WeakReference<RouterService> mReference;
public StateHandler(WeakReference<RouterService> reference) {
mReference = reference;
}
@Override
public void handleMessage(Message msg) {
RouterService parent = mReference.get();
if (parent == null)
return;
switch (msg.what) {
case STATE_MSG:
final State state = _state;
final State state = parent._state;
// Broadcast to all clients the new state.
final int N = mStateCallbacks.beginBroadcast();
final int N = parent.mStateCallbacks.beginBroadcast();
for (int i = 0; i < N; i++) {
try {
mStateCallbacks.getBroadcastItem(i).stateChanged(state);
parent.mStateCallbacks.getBroadcastItem(i).stateChanged(state);
} catch (RemoteException e) {
// The RemoteCallbackList will take care of removing
// the dead object for us.
}
}
mStateCallbacks.finishBroadcast();
parent.mStateCallbacks.finishBroadcast();
break;
default:
super.handleMessage(msg);
}
}
};
}
/**
* Turn off the status bar. Unregister the receiver. If we were running,
@ -615,6 +607,8 @@ public class RouterService extends Service {
_handler.removeCallbacks(_updater);
_statusBar.remove();
LocalBroadcastManager.getInstance(this).unregisterReceiver(onStateRequested);
I2PReceiver rcvr = _receiver;
if(rcvr != null) {
synchronized(rcvr) {
@ -631,7 +625,8 @@ public class RouterService extends Service {
if(_state == State.STARTING) {
_starterThread.interrupt();
}
if(_state == State.STARTING || _state == State.RUNNING || _state == State.ACTIVE) {
if(_state == State.STARTING || _state == State.RUNNING ||
_state == State.ACTIVE || _state == State.GRACEFUL_SHUTDOWN) {
// should this be in a thread?
_statusBar.replace(StatusBar.ICON_SHUTTING_DOWN, "I2P is shutting down");
Thread stopperThread = new Thread(new Stopper(State.STOPPING, State.STOPPED));
@ -708,7 +703,8 @@ public class RouterService extends Service {
_starterThread.interrupt();
}
if(_state == State.WAITING || _state == State.STARTING
|| _state == State.RUNNING || _state == State.ACTIVE) {
|| _state == State.RUNNING || _state == State.ACTIVE
|| _state == State.GRACEFUL_SHUTDOWN) {
setState(State.STOPPING);
}
}
@ -750,7 +746,7 @@ public class RouterService extends Service {
mStateCallbacks.kill();
stopForeground(true);
stopSelf();
} else if(_state == State.MANUAL_QUITTING) {
} else if(_state == State.MANUAL_QUITTING || _state == State.GRACEFUL_SHUTDOWN) {
setState(State.MANUAL_QUITTED);
// Unregister all callbacks.
mStateCallbacks.kill();
@ -777,6 +773,13 @@ public class RouterService extends Service {
private void setState(State s) {
_state = s;
saveState();
// Broadcast the new state within this app.
Intent intent = new Intent(LOCAL_BROADCAST_STATE_CHANGED);
intent.putExtra(LOCAL_BROADCAST_EXTRA_STATE, (android.os.Parcelable) _state);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
// Notify other apps that the state has changed
mHandler.sendEmptyMessage(STATE_MSG);
}

View File

@ -1,15 +1,15 @@
package net.i2p.android.router.service;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.concurrent.CopyOnWriteArrayList;
import net.i2p.android.router.util.Util;
import net.i2p.router.RouterContext;
import net.i2p.stat.Rate;
import net.i2p.stat.RateStat;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.concurrent.CopyOnWriteArrayList;
public class StatSummarizer implements Runnable {
private final RouterContext _context;
private final List<SummaryListener> _listeners;
@ -20,7 +20,7 @@ public class StatSummarizer implements Runnable {
public StatSummarizer() {
_context = Util.getRouterContext();
_listeners = new CopyOnWriteArrayList<SummaryListener>();
_listeners = new CopyOnWriteArrayList<>();
_instance = this;
if (_context != null)
_context.addShutdownTask(new Shutdown());
@ -109,7 +109,7 @@ public class StatSummarizer implements Runnable {
*/
List<Rate> parseSpecs(String specs) {
StringTokenizer tok = new StringTokenizer(specs, ",");
List<Rate> rv = new ArrayList<Rate>();
List<Rate> rv = new ArrayList<>();
while (tok.hasMoreTokens()) {
String spec = tok.nextToken();
int split = spec.lastIndexOf('.');
@ -117,7 +117,7 @@ public class StatSummarizer implements Runnable {
continue;
String name = spec.substring(0, split);
String per = spec.substring(split+1);
long period = -1;
long period;
try {
period = Long.parseLong(per);
RateStat rs = _context.statManager().getRate(name);

View File

@ -6,6 +6,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.view.View;
import android.widget.AdapterView;
@ -40,7 +41,7 @@ public class RateGraphActivity extends I2PActivityBase {
if (StatSummarizer.instance() != null) {
// Get the rates currently being graphed
List<SummaryListener> listeners = StatSummarizer.instance().getListeners();
TreeSet<SummaryListener> ordered = new TreeSet<SummaryListener>(new AlphaComparator());
TreeSet<SummaryListener> ordered = new TreeSet<>(new AlphaComparator());
ordered.addAll(listeners);
if (ordered.size() > 0) {
@ -58,7 +59,7 @@ public class RateGraphActivity extends I2PActivityBase {
mSpinner = (Spinner) findViewById(R.id.main_spinner);
mSpinner.setVisibility(View.VISIBLE);
mSpinner.setAdapter(new ArrayAdapter<String>(this,
mSpinner.setAdapter(new ArrayAdapter<>(this,
android.R.layout.simple_spinner_dropdown_item, mRates));
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@ -79,6 +80,7 @@ public class RateGraphActivity extends I2PActivityBase {
selectRate(0);
} else {
DialogFragment df = new DialogFragment() {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
@ -112,6 +114,7 @@ public class RateGraphActivity extends I2PActivityBase {
}
} else {
DialogFragment df = new DialogFragment() {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

View File

@ -1,11 +1,13 @@
package net.i2p.android.router.stats;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;
import java.util.Observable;
import java.util.Observer;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.androidplot.Plot;
import com.androidplot.xy.BoundaryMode;
import com.androidplot.xy.LineAndPointFormatter;
@ -18,12 +20,13 @@ import net.i2p.android.router.R;
import net.i2p.android.router.service.StatSummarizer;
import net.i2p.android.router.service.SummaryListener;
import net.i2p.android.router.util.Util;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;
import java.util.Observable;
import java.util.Observer;
public class RateGraphFragment extends I2PFragmentBase {
// redraws a plot whenever an update is received:
@ -131,8 +134,8 @@ public class RateGraphFragment extends I2PFragmentBase {
_ratePlot.setRangeValueFormat(new Format() {
@Override
public StringBuffer format(Object obj, StringBuffer toAppendTo,
FieldPosition pos) {
public StringBuffer format(Object obj, @NonNull StringBuffer toAppendTo,
@NonNull FieldPosition pos) {
double val = ((Number) obj).doubleValue();
if (val >= 10 * 1000 * 1000)
return new DecimalFormat("0 M").format(val / (1000 * 1000), toAppendTo, pos);
@ -147,7 +150,7 @@ public class RateGraphFragment extends I2PFragmentBase {
}
@Override
public Object parseObject(String source, ParsePosition pos) {
public Object parseObject(String source, @NonNull ParsePosition pos) {
return null;
}

View File

@ -4,6 +4,9 @@ import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import net.i2p.android.router.provider.CacheProvider;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@ -14,7 +17,6 @@ import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import net.i2p.android.router.provider.CacheProvider;
/**
* A least recently used cache with a max number of entries
@ -32,7 +34,7 @@ public class AppCache {
/** the LRU cache */
private final Map<Integer, Object> _cache;
private static final Integer DUMMY = Integer.valueOf(0);
private static final Integer DUMMY = 0;
private static final String DIR_NAME = "appCache";
/** fragment into this many subdirectories */
private static final int NUM_DIRS = 32;
@ -89,7 +91,7 @@ public class AppCache {
public Uri addCacheFile(Uri key, boolean setAsCurrentBase) {
int hash = toHash(key);
synchronized(_cache) {
_cache.put(Integer.valueOf(hash), DUMMY);
_cache.put(hash, DUMMY);
}
// file:/// uri
//return Uri.fromFile(toFile(hash)).toString();
@ -104,7 +106,7 @@ public class AppCache {
public void removeCacheFile(Uri key) {
int hash = toHash(key);
synchronized(_cache) {
_cache.remove(Integer.valueOf(hash));
_cache.remove(hash);
}
deleteContent(key);
}
@ -121,7 +123,7 @@ public class AppCache {
// poke the LRU
Object present;
synchronized(_cache) {
present = _cache.get(Integer.valueOf(hash));
present = _cache.get(hash);
}
if (present != null)
setAsCurrentBase(key);
@ -173,17 +175,16 @@ public class AppCache {
File[] files = dir.listFiles();
if (files == null)
return 0;
for (int i = 0; i < files.length; i++) {
File f = files[i];
if (f.isDirectory()) {
rv += enumerate(f, fileList);
} else {
long len = f.length();
if (len > 0) {
fileList.add(f);
rv += len;
for (File f : files) {
if (f.isDirectory()) {
rv += enumerate(f, fileList);
} else {
long len = f.length();
if (len > 0) {
fileList.add(f);
rv += len;
} else {
f.delete();
f.delete();
}
}
}
@ -195,7 +196,7 @@ public class AppCache {
try {
int hash = toHash(f);
synchronized(_cache) {
_cache.put(Integer.valueOf(hash), DUMMY);
_cache.put(hash, DUMMY);
}
} catch (IllegalArgumentException iae) {
Util.d("Huh bad file?" + iae);
@ -294,7 +295,7 @@ public class AppCache {
@Override
public Object put(Integer key, Object value) {
Object rv = super.put(key, value);
File f = toFile(key.intValue());
File f = toFile(key);
if (f.exists()) {
_totalSize += f.length();
}
@ -306,7 +307,7 @@ public class AppCache {
public Object remove(Object key) {
Object rv = super.remove(key);
if ( /* rv != null && */ key instanceof Integer) {
File f = toFile(((Integer)key).intValue());
File f = toFile((Integer) key);
if (f.exists()) {
_totalSize -= f.length();
f.delete();

View File

@ -0,0 +1,75 @@
package net.i2p.android.router.util;
import android.content.Context;
import android.content.res.TypedArray;
import android.preference.EditTextPreference;
import android.text.InputType;
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) {
getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
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) {
return value != null && persistInt(Integer.valueOf(value));
}
}

View File

@ -0,0 +1,47 @@
package net.i2p.android.router.util;
import android.content.Context;
import android.preference.EditTextPreference;
import android.text.InputType;
import android.util.AttributeSet;
public class IntEditTextPreference extends EditTextPreference {
public IntEditTextPreference(Context context) {
super(context);
getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
}
public IntEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
}
public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
}
@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) {
return value != null && persistInt(Integer.valueOf(value));
}
}

View File

@ -0,0 +1,30 @@
package net.i2p.android.router.util;
import android.content.Context;
import android.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) {
return value != null && persistInt(Integer.valueOf(value));
}
@Override
protected String getPersistedString(String defaultReturnValue) {
if(getSharedPreferences().contains(getKey())) {
int intValue = getPersistedInt(0);
return String.valueOf(intValue);
} else {
return defaultReturnValue;
}
}
}

View File

@ -1,9 +1,5 @@
package net.i2p.android.router.util;
import java.net.IDN;
import java.util.List;
import java.util.Locale;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
@ -18,6 +14,10 @@ import net.i2p.data.DataFormatException;
import net.i2p.data.Destination;
import net.i2p.router.RouterContext;
import java.net.IDN;
import java.util.List;
import java.util.Locale;
public class NamingServiceUtil {
private static final String DEFAULT_NS = "BlockfileNamingService";
@ -106,7 +106,7 @@ public class NamingServiceUtil {
* Ref: java.net.IDN and RFC 3940
* @param host will be converted to lower case
* @return name converted to lower case and punycoded if necessary
* @throws IAE on various errors or if IDN is needed but not available
* @throws java.lang.IllegalArgumentException on various errors or if IDN is needed but not available
* @since 0.8.7
*/
@SuppressLint("NewApi")

View File

@ -0,0 +1,60 @@
package net.i2p.android.router.util;
import android.content.Context;
import android.preference.EditTextPreference;
import android.text.InputType;
import android.util.AttributeSet;
import net.i2p.android.router.R;
public class PortPreference extends EditTextPreference {
public PortPreference(Context context) {
super(context);
getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);
}
public PortPreference(Context context, AttributeSet attrs) {
super(context, attrs);
getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);
}
public PortPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);
}
@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);
}
}

View File

@ -0,0 +1,28 @@
package net.i2p.android.router.util;
import android.content.Context;
import android.preference.EditTextPreference;
import android.util.AttributeSet;
public class SummaryEditTextPreference extends EditTextPreference {
public SummaryEditTextPreference(Context context) {
super(context);
}
public SummaryEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SummaryEditTextPreference(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());
}
}

View File

@ -8,10 +8,12 @@ import android.content.res.Resources;
import android.preference.PreferenceManager;
import net.i2p.I2PAppContext;
import net.i2p.android.router.I2PConstants;
import net.i2p.data.DataHelper;
import net.i2p.router.Router;
import net.i2p.router.RouterContext;
import net.i2p.router.transport.TransportManager;
import net.i2p.router.transport.udp.UDPTransport;
import net.i2p.util.OrderedProperties;
import java.io.File;
@ -19,13 +21,14 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public abstract class Util {
public abstract class Util implements I2PConstants {
public static String getOurVersion(Context ctx) {
PackageManager pm = ctx.getPackageManager();
String us = ctx.getPackageName();
@ -123,44 +126,46 @@ public abstract class Util {
}
}
/** copied from various private components */
final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port";
final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport";
public static List<Properties> getPropertiesFromPreferences(Context context) {
List<Properties> pList = new ArrayList<Properties>();
List<Properties> pList = new ArrayList<>();
// Copy prefs
Properties routerProps = new OrderedProperties();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
// List to store stats for graphing
List<String> statSummaries = new ArrayList<String>();
List<String> statSummaries = new ArrayList<>();
// Properties to remove
Properties toRemove = new OrderedProperties();
// List to store Log settings
Properties logSettings = new OrderedProperties();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Map<String, ?> all = preferences.getAll();
Iterator<String> iterator = all.keySet().iterator();
// get values from the Map and make them strings.
// This loop avoids needing to convert each one, or even know it's type, or if it exists yet.
while (iterator.hasNext()) {
String x = iterator.next();
if ( x.startsWith("i2pandroid.")) // Skip over UI-related I2P Android settings
continue;
else if ( x.startsWith("stat.summaries.")) {
for (String x : all.keySet()) {
if (x.startsWith("stat.summaries.")) {
String stat = x.substring("stat.summaries.".length());
String checked = all.get(x).toString();
if (checked.equals("true")) {
statSummaries.add(stat);
}
} else if ( x.startsWith("logger.")) {
} else if (x.startsWith("logger.")) {
logSettings.put(x, all.get(x).toString());
} else if (
x.equals("router.hiddenMode") ||
x.equals("i2cp.disableInterface")) {
x.equals("i2cp.disableInterface")) {
// special exception, we must invert the bool for these properties only.
String string = all.get(x).toString();
String inverted = Boolean.toString(!Boolean.parseBoolean(string));
routerProps.setProperty(x, inverted);
} else {
} else if (!x.startsWith(ANDROID_PREF_PREFIX)) { // Skip over UI-related I2P Android settings
String string = all.get(x).toString();
routerProps.setProperty(x, string);
}
@ -176,24 +181,41 @@ public abstract class Util {
routerProps.setProperty("stat.summaries", buf.toString());
}
// See net.i2p.router.web.ConfigNetHandler.saveChanges()
int udpPort = Integer.parseInt(routerProps.getProperty(UDPTransport.PROP_INTERNAL_PORT, "-1"));
if (udpPort <= 0)
routerProps.remove(UDPTransport.PROP_INTERNAL_PORT);
int ntcpPort = Integer.parseInt(routerProps.getProperty(PROP_I2NP_NTCP_PORT, "-1"));
boolean ntcpAutoPort = Boolean.parseBoolean(
routerProps.getProperty(PROP_I2NP_NTCP_AUTO_PORT, "true"));
if (ntcpPort <= 0 || ntcpAutoPort) {
routerProps.remove(PROP_I2NP_NTCP_PORT);
toRemove.setProperty(PROP_I2NP_NTCP_PORT, "");
}
pList.add(routerProps);
pList.add(toRemove);
pList.add(logSettings);
return pList;
}
// propName -> defaultValue
private static HashMap<String, Boolean> booleanOptionsRequiringRestart = new HashMap<String, Boolean>();
private static HashMap<String, String> stringOptionsRequiringRestart = new HashMap<String, String>();
private static HashMap<String, Boolean> booleanOptionsRequiringRestart = new HashMap<>();
private static HashMap<String, String> stringOptionsRequiringRestart = new HashMap<>();
static {
HashMap<String, Boolean> boolToAdd = new HashMap<String, Boolean>();
HashMap<String, String> strToAdd = new HashMap<String, String>();
HashMap<String, Boolean> boolToAdd = new HashMap<>();
HashMap<String, String> strToAdd = new HashMap<>();
boolToAdd.put(TransportManager.PROP_ENABLE_UPNP, true);
boolToAdd.put(TransportManager.PROP_ENABLE_NTCP, true);
boolToAdd.put(TransportManager.PROP_ENABLE_UDP, true);
boolToAdd.put(PROP_I2NP_NTCP_AUTO_PORT, true);
boolToAdd.put(Router.PROP_HIDDEN, false);
strToAdd.put(UDPTransport.PROP_INTERNAL_PORT, "-1");
strToAdd.put(PROP_I2NP_NTCP_PORT, "-1");
booleanOptionsRequiringRestart.putAll(boolToAdd);
stringOptionsRequiringRestart.putAll(strToAdd);
}
@ -209,9 +231,10 @@ public abstract class Util {
* </li></ul>
*
* @param props a Properties object containing the router.config
* @param toRemove a Collection of properties that will be removed
* @return true if the router needs to be restarted.
*/
public static boolean checkAndCorrectRouterConfig(Context context, Properties props) {
public static boolean checkAndCorrectRouterConfig(Context context, Properties props, Collection<String> toRemove) {
// Disable UPnP on mobile networks, ignoring user's configuration
// TODO disabled until changes elsewhere are finished
//if (Connectivity.isConnectedMobile(context)) {
@ -225,17 +248,17 @@ public abstract class Util {
for (Map.Entry<String, Boolean> option : booleanOptionsRequiringRestart.entrySet()) {
String propName = option.getKey();
boolean defaultValue = option.getValue();
restartRequired |= (
Boolean.parseBoolean(props.getProperty(propName, Boolean.toString(defaultValue))) !=
(defaultValue ? rCtx.getBooleanPropertyDefaultTrue(propName) : rCtx.getBooleanProperty(propName))
);
boolean currentValue = defaultValue ? rCtx.getBooleanPropertyDefaultTrue(propName) : rCtx.getBooleanProperty(propName);
boolean newValue = Boolean.parseBoolean(props.getProperty(propName, Boolean.toString(defaultValue)));
restartRequired |= (currentValue != newValue);
}
if (!restartRequired) { // Cut out now if we already know the answer
for (Map.Entry<String, String> option : stringOptionsRequiringRestart.entrySet()) {
String propName = option.getKey();
String defaultValue = option.getValue();
restartRequired |= props.getProperty(propName, defaultValue).equals(
rCtx.getProperty(propName, defaultValue));
String currentValue = rCtx.getProperty(propName, defaultValue);
String newValue = props.getProperty(propName, defaultValue);
restartRequired |= !currentValue.equals(newValue);
}
}
}
@ -256,7 +279,7 @@ public abstract class Util {
* @param props properties to set
*/
public static void writePropertiesToFile(Context ctx, String dir, String file, Properties props) {
mergeResourceToFile(ctx, dir, file, 0, props);
mergeResourceToFile(ctx, dir, file, 0, props, null);
}
/**
@ -267,8 +290,10 @@ public abstract class Util {
* @param file relative to dir
* @param resID the ID of the default resource, or 0
* @param userProps local properties or null
* @param toRemove properties to remove, or null
*/
public static void mergeResourceToFile(Context ctx, String dir, String file, int resID, Properties userProps) {
public static void mergeResourceToFile(Context ctx, String dir, String file, int resID,
Properties userProps, Collection<String> toRemove) {
InputStream fin = null;
InputStream in = null;
@ -297,6 +322,11 @@ public abstract class Util {
// override with user settings
if (userProps != null)
props.putAll(userProps);
if (toRemove != null) {
for (String key : toRemove) {
props.remove(key);
}
}
File path = new File(dir, file);
DataHelper.storeProps(props, path);

View File

@ -194,8 +194,7 @@ public class I2PWebViewClient extends WebViewClient {
/**
* This should always be a content url
*/
void deleteCurrentPageCache(WebView view) {
String url = view.getUrl();
void deleteCurrentPageCache(WebView view, String url) {
Uri uri = Uri.parse(url);
if (CONTENT.equals(uri.getScheme())) {
try {

View File

@ -22,6 +22,7 @@ import net.i2p.android.router.R;
public class WebFragment extends I2PFragmentBase {
private I2PWebViewClient _wvClient;
private String _uriStr;
public final static String HTML_URI = "html_url";
public final static String HTML_RESOURCE_ID = "html_resource_id";
@ -48,9 +49,9 @@ public class WebFragment extends I2PFragmentBase {
wv.getSettings().setBuiltInZoomControls(true);
// http://stackoverflow.com/questions/2369310/webview-double-tap-zoom-not-working-on-a-motorola-droid-a855
wv.getSettings().setUseWideViewPort(true);
String uriStr = getArguments().getString(HTML_URI);
if (uriStr != null) {
Uri uri = Uri.parse(uriStr);
_uriStr = getArguments().getString(HTML_URI);
if (_uriStr != null) {
Uri uri = Uri.parse(_uriStr);
//wv.getSettings().setLoadsImagesAutomatically(true);
//wv.loadUrl(uri.toString());
// go thru the client so .i2p will work too
@ -115,14 +116,18 @@ public class WebFragment extends I2PFragmentBase {
_wvClient.cancelAll();
wv.stopLoading();
String url = wv.getUrl();
Uri uri = Uri.parse(url);
// If a resource, _uriStr == null but url != null (resource loads don't fail)
// If a URL, _uriStr != null and url might be null (if pageload failed)
if (url != null && (!url.equals(_uriStr)))
_uriStr = url;
Uri uri = Uri.parse(_uriStr);
if ("data".equals(uri.getScheme())) {
// welcome page... or just do nothing ?
wv.reload();
} else {
// wv.reload() doesn't call shouldOverrideUrlLoading(), so do it this way
_wvClient.deleteCurrentPageCache(wv);
_wvClient.shouldOverrideUrlLoading(wv, url);
_wvClient.deleteCurrentPageCache(wv, _uriStr);
_wvClient.shouldOverrideUrlLoading(wv, _uriStr);
}
return true;

View File

@ -1,9 +0,0 @@
package net.i2p.i2ptunnel;
/**
* Stub since no AWT in Android
*/
public class I2PTunnelGUI {
public I2PTunnelGUI(I2PTunnel t) {}
}

View File

@ -17,9 +17,6 @@
package org.sufficientlysecure.htmltextview;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
@ -27,6 +24,9 @@ import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
/**
* <p/>
* A {@link android.widget.TextView} that insert spaces around its text spans where needed to prevent
@ -157,10 +157,7 @@ public class JellyBeanSpanFixTextView extends TextView {
}
private boolean isNotSpace(CharSequence text, int where) {
if (where < 0) {
return true;
}
return text.charAt(where) != ' ';
return where < 0 || text.charAt(where) != ' ';
}
private void setTextAndMeasure(CharSequence text, int widthMeasureSpec, int heightMeasureSpec) {

View File

@ -75,7 +75,7 @@ public class UrlImageGetter implements ImageGetter {
@Override
protected void onPostExecute(Drawable result) {
// set the correct bound according to the result from HTTP call
urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0 + result.getIntrinsicHeight());
urlDrawable.setBounds(0, 0, result.getIntrinsicWidth(), result.getIntrinsicHeight());
// change the reference of the current drawable to the result from the HTTP call
urlDrawable.drawable = result;
@ -94,7 +94,7 @@ public class UrlImageGetter implements ImageGetter {
try {
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0 + drawable.getIntrinsicHeight());
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
} catch (Exception e) {
return null;

View File

@ -2,26 +2,26 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:baselineAligned="false"
android:orientation="horizontal"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" >
android:paddingTop="@dimen/activity_vertical_margin">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
android:orientation="vertical">
<ImageView
android:id="@+id/main_lights"
android:src="@drawable/routerled_r"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:contentDescription="@string/desc_i2p_logo"
android:scaleType="centerInside"
android:contentDescription="@string/desc_i2p_logo" />
android:src="@drawable/routerled_r" />
<net.i2p.android.router.util.LongToggleButton
android:id="@+id/router_onoff_button"
@ -29,6 +29,39 @@
android:layout_height="68dp"
android:textOff="@string/button_router_off"
android:textOn="@string/button_router_on" />
<LinearLayout
android:id="@+id/router_graceful_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/router_graceful_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/button_shutdown_now"
android:layout_width="0dp"
android:layout_height="68dp"
android:layout_weight="1"
android:text="@string/button_shutdown_now" />
<Button
android:id="@+id/button_cancel_graceful"
android:layout_width="0dp"
android:layout_height="68dp"
android:layout_weight="1"
android:text="@string/button_cancel_graceful" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<ScrollView
@ -38,12 +71,12 @@
android:layout_weight="2"
android:fillViewport="true"
android:paddingLeft="@dimen/activity_vertical_margin"
android:scrollbarStyle="outsideInset" >
android:scrollbarStyle="outsideInset">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
@ -60,7 +93,7 @@
android:id="@+id/main_status"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"

View File

@ -55,7 +55,7 @@
android:text="Tunnel type" />
<TextView
android:id="@+id/textView3"
android:id="@+id/tunnel_target_interface_port_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
@ -63,19 +63,19 @@
android:text="@string/i2ptunnel_view_target" />
<TextView
android:id="@+id/textView4"
android:id="@+id/tunnel_access_interface_port_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView3"
android:layout_below="@+id/tunnel_target_interface_port_label"
android:text="@string/i2ptunnel_view_access_point" />
<TextView
android:id="@+id/tunnel_access_interface_port"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView4"
android:layout_alignBottom="@+id/textView4"
android:layout_alignBaseline="@+id/tunnel_access_interface_port_label"
android:layout_alignBottom="@+id/tunnel_access_interface_port_label"
android:layout_alignParentRight="true"
android:gravity="right"
android:text="Interface:port" />

View File

@ -3,10 +3,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" >
android:paddingTop="@dimen/activity_vertical_margin">
<ImageView
android:id="@+id/main_lights"
@ -23,18 +23,51 @@
android:textOff="@string/button_router_off"
android:textOn="@string/button_router_on" />
<LinearLayout
android:id="@+id/router_graceful_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/router_graceful_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/button_shutdown_now"
android:layout_width="0dp"
android:layout_height="68dp"
android:layout_weight="1"
android:text="@string/button_shutdown_now" />
<Button
android:id="@+id/button_cancel_graceful"
android:layout_width="0dp"
android:layout_height="68dp"
android:layout_weight="1"
android:text="@string/button_cancel_graceful" />
</LinearLayout>
</LinearLayout>
<ScrollView
android:id="@+id/main_scrollview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:paddingTop="@dimen/activity_vertical_margin"
android:scrollbarStyle="outsideInset" >
android:scrollbarStyle="outsideInset">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
@ -51,7 +84,7 @@
android:id="@+id/main_status"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"

View File

@ -9,7 +9,7 @@
android:id="@+id/browser_status"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/label_news_status"
android:text=""
/>
<WebView
android:id="@+id/browser_webview"

View File

@ -1,9 +1,9 @@
<html>
<head></head>
<body>
<h2>What is I2PTunnel?</h2>
<h2>What are tunnels?</h2>
<p>Tunnels are the heart of I2P. All data inside the I2P network is sent through tunnels that hide the location of users. If an app has native I2P support, it will create its own tunnels.</p>
<p>I2PTunnel lets you create your own tunnels manually. This is useful for when you want to use an app that doesn't have native I2P support, like:</p>
<p>The Hidden Services Manager lets you create your own tunnels manually. This is useful for when you want to use an app that doesn't have native I2P support, like:</p>
<ul>
<li>A browser.</li>
<li>An IRC client.</li>
@ -11,14 +11,7 @@
</ul>
<h2>Using clients with pre-configured tunnels</h2>
<p>The app starts an HTTP proxy at localhost port 4444 and IRC client tunnels at localhost ports 6668 - 6672. The IRC clients are "shared clients" on the same tunnels. Once you see the tunnel icon turn green on the main console (several minutes after startup), you should be able to connect.</p>
<p>The IRC proxy is tested with the "Android IRC Free" app. The IRC proxy destinations are:</p>
<ol>
<li>Port 6668: IRC2P - irc.postman.i2p, irc.freshcoffee.i2p, and irc.echelon.i2p</li>
<li>Port 6669: irc.welterde.i2p</li>
<li>Port 6670: irc.killyourtv.i2p</li>
</ol>
<p>The app starts an HTTP proxy tunnel at localhost port 4444 and IRC client tunnels at localhost ports 6668 - 6672. The IRC clients are "shared clients" on the same tunnels. Once you see the tunnel icon turn green on the main console (several minutes after startup), you should be able to connect.</p>
<h2>What does the clock icon on a yellow background mean?</h2>
<p>When a tunnel's indicator is yellow with a clock icon, the tunnel is in standby mode. This means that I2P has not built the tunnel yet, but will do so automatically when you start using it. This helps to minimize resource use and conserve battery life.</p>

View File

@ -3,9 +3,14 @@
<body>
<h2>How to configure Orfox:</h2>
<ol>
<li>Type <code>about:config</code> into the URL bar.</li>
<li>Search for <code>network.proxy.http</code>.</li>
<li>Change the value of <code>network.proxy.http_port</code> to <code>4444</code>.</li>
<li>Install the ProxyMob add-on. Click <a
href="https://guardianproject.info/downloads/proxymob.xpi">HERE</a>, and choose to open
the URL in Firefox.
</li>
<li>In the main Firefox menu, click "Tools", then "Add-ons".</li>
<li>Click on "Proxy Mobile".</li>
<li>Change the value of "HTTP Proxy Port" to <code>4444</code>.</li>
<li>You can now browse I2P eepsites!</li>
</ol>
</body>
</html>

View File

@ -3,10 +3,14 @@
<body>
<h2>How to configure Firefox:</h2>
<ol>
<li>Type <code>about:config</code> into the URL bar.</li>
<li>Search for <code>network.proxy.http</code>.</li>
<li>Change the value of <code>network.proxy.http</code> to <code>localhost</code>.</li>
<li>Change the value of <code>network.proxy.http_port</code> to <code>4444</code>.</li>
<li>Install the ProxyMob add-on. Click <a
href="https://guardianproject.info/downloads/proxymob.xpi">HERE</a>, and choose to open
the URL in Firefox.
</li>
<li>In the main Firefox menu, click "Tools", then "Add-ons".</li>
<li>Click on "Proxy Mobile".</li>
<li>Change the value of "HTTP Proxy Port" to <code>4444</code>.</li>
<li>You can now browse I2P eepsites!</li>
</ol>
</body>
</html>

View File

@ -50,14 +50,14 @@ tunnel.1.option.outbound.lengthVariance=0
tunnel.1.option.outbound.priority=15
tunnel.1.startOnLoad=true
# irc
tunnel.2.name=IRC welterde
tunnel.2.description=IRC tunnel to welterde's network
tunnel.2.type=ircclient
# postman's SMTP server - see hq.postman.i2p
tunnel.2.name=smtp.postman.i2p
tunnel.2.description=smtp server
tunnel.2.type=client
tunnel.2.sharedClient=true
tunnel.2.interface=127.0.0.1
tunnel.2.listenPort=6669
tunnel.2.targetDestination=irc.welterde.i2p
tunnel.2.listenPort=7659
tunnel.2.targetDestination=smtp.postman.i2p:25
tunnel.2.i2cpHost=127.0.0.1
tunnel.2.i2cpPort=7654
tunnel.2.option.inbound.nickname=shared clients
@ -67,20 +67,22 @@ tunnel.2.option.i2cp.reduceIdleTime=600000
tunnel.2.option.i2cp.reduceOnIdle=true
tunnel.2.option.i2cp.reduceQuantity=1
tunnel.2.option.i2p.streaming.connectDelay=1000
tunnel.2.option.i2p.streaming.maxWindowSize=16
tunnel.2.option.inbound.length=2
tunnel.2.option.inbound.lengthVariance=0
tunnel.2.option.outbound.length=2
tunnel.2.option.outbound.lengthVariance=0
tunnel.2.option.outbound.priority=15
tunnel.2.startOnLoad=true
# irc irc.killyourtv.i2p
tunnel.3.name=KYTV IRC
tunnel.3.description=IRC tunnel to KillYourTV's network
tunnel.3.type=ircclient
# postman's POP3 server - see hq.postman.i2p
tunnel.3.name=pop3.postman.i2p
tunnel.3.description=pop3 server
tunnel.3.type=client
tunnel.3.sharedClient=true
tunnel.3.interface=127.0.0.1
tunnel.3.listenPort=6670
tunnel.3.targetDestination=irc.killyourtv.i2p
tunnel.3.listenPort=7660
tunnel.3.targetDestination=pop.postman.i2p:110
tunnel.3.i2cpHost=127.0.0.1
tunnel.3.i2cpPort=7654
tunnel.3.option.inbound.nickname=shared clients
@ -90,8 +92,60 @@ tunnel.3.option.i2cp.reduceIdleTime=600000
tunnel.3.option.i2cp.reduceOnIdle=true
tunnel.3.option.i2cp.reduceQuantity=1
tunnel.3.option.i2p.streaming.connectDelay=1000
tunnel.3.option.i2p.streaming.maxWindowSize=16
tunnel.3.option.inbound.length=2
tunnel.3.option.inbound.lengthVariance=0
tunnel.3.option.outbound.length=2
tunnel.3.option.outbound.lengthVariance=0
tunnel.3.startOnLoad=true
tunnel.3.option.outbound.priority=15
tunnel.3.startOnLoad=true
# irc
tunnel.4.name=IRC welterde
tunnel.4.description=IRC tunnel to welterde's network
tunnel.4.type=ircclient
tunnel.4.sharedClient=true
tunnel.4.interface=127.0.0.1
tunnel.4.listenPort=6669
tunnel.4.targetDestination=irc.welterde.i2p
tunnel.4.i2cpHost=127.0.0.1
tunnel.4.i2cpPort=7654
tunnel.4.option.inbound.nickname=shared clients
tunnel.4.option.outbound.nickname=shared clients
tunnel.4.option.i2cp.delayOpen=true
tunnel.4.option.i2cp.reduceIdleTime=600000
tunnel.4.option.i2cp.reduceOnIdle=true
tunnel.4.option.i2cp.reduceQuantity=1
tunnel.4.option.i2p.streaming.connectDelay=1000
tunnel.4.option.i2p.streaming.maxWindowSize=16
tunnel.4.option.inbound.length=2
tunnel.4.option.inbound.lengthVariance=0
tunnel.4.option.outbound.length=2
tunnel.4.option.outbound.lengthVariance=0
tunnel.4.option.outbound.priority=15
tunnel.4.startOnLoad=true
# irc irc.killyourtv.i2p
tunnel.5.name=KYTV IRC
tunnel.5.description=IRC tunnel to KillYourTV's network
tunnel.5.type=ircclient
tunnel.5.sharedClient=true
tunnel.5.interface=127.0.0.1
tunnel.5.listenPort=6670
tunnel.5.targetDestination=irc.killyourtv.i2p
tunnel.5.i2cpHost=127.0.0.1
tunnel.5.i2cpPort=7654
tunnel.5.option.inbound.nickname=shared clients
tunnel.5.option.outbound.nickname=shared clients
tunnel.5.option.i2cp.delayOpen=true
tunnel.5.option.i2cp.reduceIdleTime=600000
tunnel.5.option.i2cp.reduceOnIdle=true
tunnel.5.option.i2cp.reduceQuantity=1
tunnel.5.option.i2p.streaming.connectDelay=1000
tunnel.5.option.i2p.streaming.maxWindowSize=16
tunnel.5.option.inbound.length=2
tunnel.5.option.inbound.lengthVariance=0
tunnel.5.option.outbound.length=2
tunnel.5.option.outbound.lengthVariance=0
tunnel.5.option.outbound.priority=15
tunnel.5.startOnLoad=true

View File

@ -8,7 +8,6 @@
<string name="label_info_and_pages">Informació i pàgines</string>
<string name="label_welcome_page">Pàgina de benvinguda</string>
<string name="label_news">Notícies</string>
<string name="label_news_status">Darreres notícies I2P</string>
<string name="label_peers_status">Nodes</string>
<string name="label_release_notes">Notes de la versió</string>
<string name="label_licenses">Llicències</string>

View File

@ -2,41 +2,43 @@
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">I2P-Logo</string>
<string name="welcome_new_install">Willkommen bei I2P! Diese App ist Alpha-Software und bietet keine starke Anonymität. Bitte lies die Veröffentlichungshinweise und die Lizenzeninformationen.</string>
<string name="welcome_new_version">Eine neue Version wurde installiert. Bitte lies die Veröffentlichungshinweise. Version:</string>
<string name="welcome_new_install">Willkommen bei I2P! Diese App ist Alpha-Software und bietet keine starke Anonymität. Bitte lesen Sie die Veröffentlichungshinweise und die Lizenzinformationen.</string>
<string name="welcome_new_version">Eine neue Version wurde installiert. Bitte lesen Sie die Veröffentlichungshinweise. Version:</string>
<string name="label_home">Einstellungen und Status</string>
<string name="label_tunnels">Tunnel</string>
<string name="label_status">Status</string>
<string name="label_addressbook">Adressbuch</string>
<string name="label_i2ptunnel">I2PTunnel</string>
<string name="label_i2ptunnel_client">Kliententunnel</string>
<string name="label_i2ptunnel_server">Servertunnel</string>
<string name="label_logs">Statusberichte</string>
<string name="label_error_logs">Fehler-Protokolle</string>
<string name="label_error_logs">Fehlerprotokolle</string>
<string name="label_info_and_pages">Informationen und Seiten</string>
<string name="label_welcome_page">Begrüßungsseite</string>
<string name="label_news">Neuigkeiten</string>
<string name="label_peers_status">Teilnehmer</string>
<string name="label_release_notes">Veröffentlichungshinweise</string>
<string name="label_licenses">Lizenzen</string>
<string name="label_nonanon_info">Nichtanonyme Informationen</string>
<string name="label_nonanon_info">Nicht-anonyme Informationen</string>
<string name="label_browse">Surfen</string>
<string name="label_graphs">Graphen</string>
<string name="button_router_off">Lange drücken, um I2P zu starten</string>
<string name="button_router_on">I2P läuft (lange drücken, um zu stoppen)</string>
<string name="button_router_graceful">I2P wird in %s abgeschaltet</string>
<string name="button_shutdown_now">Lange drücken, um jetzt zu stoppen</string>
<string name="button_cancel_graceful">Lange drücken, um das Herunterfahren abzubrechen</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="no_client_tunnels_running">Keine Kliententunnel laufen noch.</string>
<string name="configure_browser_title">Browser konfigurieren?</string>
<string name="configure_browser_for_i2p">Möchten Sie einen Browser zum Betrachten von I2P Seiten einrichten ? (Sie können dieses auch später noch im Hilfe Menu erledigen).</string>
<string name="first_start_title">Herzlichen Glückwunsch, du hast I2P installiert!</string>
<string name="first_start_welcome"><b>Willkommen im I2P</b> Bitte <b>hab Geduld</b>, während I2P startet und Teilnehmer findet.</string>
<string name="first_start_read">Während du wartest, lies bitte die Veröffentlichungshinweise und die Startseite.</string>
<string name="first_start_faq">Sobald du Kliententunnels hast, <b>lies</b> bitte unsere FAQs:</string>
<string name="first_start_faq_nonanon">Oder benutze unsere nicht-anonymen Links, wenn du nicht auf die Tunnel warten willst.</string>
<string name="first_start_irc">Verbinde dich mit deinem IRC-Klienten zu <b>localhost:6668</b> und schau bei uns vorbei:</string>
<string name="configure_browser_for_i2p">Möchten Sie einen Browser zum Betrachten von I2P-Seiten einrichten? (Sie können dieses auch später noch im Hilfe-Menü erledigen).</string>
<string name="first_start_title">Herzlichen Glückwunsch, Sie haben I2P installiert!</string>
<string name="first_start_welcome"><b>Willkommen im I2P</b> Bitte <b>haben Sie Geduld</b>, während I2P startet und Teilnehmer findet.</string>
<string name="first_start_read">Lesen Sie bitte die Veröffentlichungshinweise und die Startseite während Sie warten.</string>
<string name="first_start_faq">Sobald Sie Kliententunnels haben, <b>lesen</b> Sie bitte unsere FAQ:</string>
<string name="first_start_faq_nonanon">Oder verwenden Sie unsere nicht-anonymen Links, wenn Sie nicht auf die Tunnel warten wollen.</string>
<string name="first_start_irc">Verbinden Sie Ihren IRC-Klienten mit <b>localhost:6668</b> und schauen Sie bei uns vorbei:</string>
<string name="drawer_open">Navigation öffnen</string>
<string name="drawer_close">Navigation schließen</string>
<string name="action_search">Suche</string>
@ -45,22 +47,22 @@
<string name="action_delete">Löschen</string>
<string name="action_router_start">Router starten</string>
<string name="action_router_stop">Router stoppen</string>
<string name="action_i2ptunnel_start">Starte den Tunnel</string>
<string name="action_i2ptunnel_stop">Stoppe den Tunnel</string>
<string name="action_i2ptunnel_start">Tunnel starten</string>
<string name="action_i2ptunnel_stop">Tunnel stoppen</string>
<string name="action_i2ptunnel_start_all">Alle Tunnel starten</string>
<string name="action_i2ptunnel_stop_all">Alle Tunnel anhalten</string>
<string name="action_i2ptunnel_restart_all">Alle Tunnel neu starten</string>
<string name="action_reload">Neu laden</string>
<string name="action_refresh">Auffrischen</string>
<string name="hint_search_addressbook">Durchsuche das Adressbuch</string>
<string name="hint_search_addressbook">Adressbuch durchsuchen</string>
<string name="action_reload_subscriptions">Abonnements neu laden</string>
<string name="router_not_running">Der Router läuft nicht.</string>
<string name="stats_not_ready">Der Statistikmanager ist noch nicht bereit. Versuch es später erneut.</string>
<string name="stats_not_ready">Der Statistikmanager ist noch nicht bereit. Versuchen Sie es später noch einmal.</string>
<string name="no_graphs_configured">Keine Graphen konfiguriert. Sie können die Statistiken zum Erstellen der Graphen im Einstellungsmenu auswählen. Jede Änderung wird nach 60 Sekunden aktiv gesetzt.</string>
<string name="configure_graphs">Graphen konfigurieren</string>
<string name="graphs_not_ready">Die Graphen sind noch nicht bereit oder der Router läuft nicht. Probiere es später nochmal.</string>
<string name="netdb_routers_empty">Keine Router in deiner NetDB.</string>
<string name="netdb_leases_empty">Keine LeaseSets in deiner NetDB</string>
<string name="graphs_not_ready">Die Graphen sind noch nicht bereit oder der Router läuft nicht. Versuchen Sie es später noch einmal.</string>
<string name="netdb_routers_empty">Keine Router in Ihrer NetDB.</string>
<string name="netdb_leases_empty">Keine LeaseSets in Ihrer NetDB.</string>
<string name="notification_status_bw">Bandbreite: %1$s KB/s eingehend / %2$s KB/s ausgehend</string>
<string name="notification_status_peers">Teilnehmer: %1$d aktiv, %2$d bekannt</string>
<string name="notification_status_expl">Erkundungstunnel: %1$d/%2$d</string>
@ -69,11 +71,13 @@
<string name="settings_enable">Erlauben</string>
<string name="settings_desc_subscriptions">Abonnements-URLs</string>
<string name="settings_label_bandwidth_net">Bandbreite und Netzwerk</string>
<string name="settings_label_startOnBoot">Beim booten I2P starten</string>
<string name="settings_desc_startOnBoot">Automatisch zu I2P verbinden wenn dieses Android Gerät startet</string>
<string name="settings_label_bandwidth">Bandbreite</string>
<string name="settings_label_bw_inbound">maximal eingehend</string>
<string name="settings_desc_bw_inbound">maximal ausgehend</string>
<string name="settings_label_bw_outbound">ausgehende Übertragungsgeschwindigkeit</string>
<string name="settings_desc_bw_outbound">maximale ausgehende Übertragungsgeschwindigkeit</string>
<string name="settings_label_bw_inbound">Eingehende Übertragungsgeschwindigkeit</string>
<string name="settings_desc_bw_inbound">Maximale eingehende Übertragungsgeschwindigkeit</string>
<string name="settings_label_bw_outbound">Ausgehende Übertragungsgeschwindigkeit</string>
<string name="settings_desc_bw_outbound">Maximale ausgehende Übertragungsgeschwindigkeit</string>
<string name="settings_label_network">Netzwerk</string>
<string name="settings_label_hiddenMode">Beteiligung</string>
<string name="settings_desc_hiddenMode">Tarnmodus ausschalten</string>
@ -88,11 +92,11 @@
<string name="settings_label_default_log_level">Standard-Detailtiefe der Statusberichte</string>
<string name="settings_label_advanced">Erweitert</string>
<string name="settings_label_showStats">Routerstatistiken</string>
<string name="settings_summ_showStats">Zeige ausführliche Statistiken in der Hauptkonsole.</string>
<string name="settings_summ_showStats">Ausführliche Statistiken in der Hauptkonsole anzeigen.</string>
<string name="settings_label_transports">Transporte</string>
<string name="settings_label_maxConns">max. Verbindungen</string>
<string name="settings_label_maxConns">Max. Verbindungen</string>
<string name="settings_label_i2cp">I2CP-Benutzeroberfläche</string>
<string name="settings_desc_i2cp">lausche auf Port 7654</string>
<string name="settings_desc_i2cp">Auf Port 7654 lauschen</string>
<string name="settings_label_exploratory_pool">Satz an Erkundungstunneln</string>
<string name="settings_desc_exploratory_pool">Tunnelparameter</string>
<string name="settings_label_expl_inbound">Eingehende Tunnel</string>
@ -109,21 +113,22 @@
<string name="settings_label_expl_backupQuantity">Anzahl der Reservetunnel</string>
<string name="settings_summ_expl_backupQuantity">%s Tunnel</string>
<string name="settings_desc_expl_backupQuantity">Wie viele Reservertunnel</string>
<string name="settings_need_transport_enabled">Sie müssen mindestens einen Transport aktivieren</string>
<string name="settings_router_restart_required">Bitte starten Sie I2P neu, um die Änderungen anzuwenden</string>
<string name="menu_about">Über uns</string>
<string name="about_version">Version:</string>
<string name="about_project">Projektseite:</string>
<string name="about_bugs">Fehlermeldungen und Unterstützung:</string>
<string name="about_helpwanted">Unterstützer gesucht!!</string>
<string name="about_volunteer">Du willst mithelfen, die App besser zu machen? Dann schau in das Android forum:</string>
<string name="about_donate">Wenn du Geld oder Bitcoins spenden wilst, damit wir mehr Android-Geräte zum Testen kaufen können, dann schau auf:</string>
<string name="about_volunteer">Sie wollen mithelfen, die App besser zu machen? Dann schauen Sie in das Android-Forum:</string>
<string name="about_donate">Sie wollen Geld oder Bitcoins spenden, damit wir mehr Android-Geräte zum Entwickeln und Testen kaufen können? Gehen Sie auf:</string>
<string name="menu_help">Hilfe</string>
<string name="general">Allgemein</string>
<string name="addressbook_search_header">%s gefunden</string>
<string name="addressbook_add_wizard_k_name">Name</string>
<string name="addressbook_add_wizard_k_destination">Ziel</string>
<string name="addressbook_add_wizard_desc_name">Der Name</string>
<string name="addressbook_add_wizard_desc_destination">Kopiere den B64-Code des Ziels hier her. Falls du einen Dateimanager installiert hast, kannst du die Textdatei auswählen, welche den B64-Code enthält.</string>
<string name="addressbook_add_wizard_desc_destination">Kopieren Sie den B64-Code des Ziels hier her. Falls Sie einen Dateimanager installiert haben, können Sie die Textdatei auswählen, welche den B64-Code enthält.</string>
<string name="nsu_iae_illegal_char">Hostname \"%1$s\" beinhaltet ein unzulässiges Zeichen %2$s</string>
<string name="nsu_iae_cannot_start_with">Hostnamen dürfen nicht mit \"%s\" beginnen</string>
<string name="nsu_iae_cannot_end_with">Hostnamen dürfen nicht auf \"%s\" enden</string>
@ -141,12 +146,14 @@
<string name="i2ptunnel_type_streamrclient">Streamr-Klient</string>
<string name="i2ptunnel_type_streamrserver">Streamr-Server</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidirektional</string>
<string name="i2ptunnel_not_initialized">Tunnel sind noch nicht initialisiert. Bitte lade die Seite in zwei Minuten erneut.</string>
<string name="install_recommended_app">Empfohlene App installieren?</string>
<string name="app_needed_for_this_tunnel_type">Sie müssen eine App installieren, um diesen Tunnel nutzen zu können. Möchten Sie die empfohlene App installieren?</string>
<string name="i2ptunnel_not_initialized">Tunnel sind noch nicht initialisiert. Bitte laden Sie die Seite in zwei Minuten erneut.</string>
<string name="i2ptunnel_new_tunnel">Neuer Tunnel</string>
<string name="i2ptunnel_msg_config_saved">Änderungen gespeichert</string>
<string name="i2ptunnel_msg_config_save_failed">Speichern der Änderungen fehlgeschlagen</string>
<string name="i2ptunnel_msg_tunnel_starting">Starte den Tunnel</string>
<string name="i2ptunnel_msg_tunnel_stopping">Stoppe den Tunnel</string>
<string name="i2ptunnel_msg_tunnel_starting">Tunnel wird gestartet</string>
<string name="i2ptunnel_msg_tunnel_stopping">Tunnel wird gestoppt</string>
<string name="i2ptunnel_delete_confirm_message">Tunnel löschen?</string>
<string name="i2ptunnel_delete_confirm_button">Tunnel löschen</string>
<string name="i2ptunnel_wizard_k_client_server">Klient oder Server</string>
@ -159,19 +166,18 @@
<string name="i2ptunnel_wizard_k_outproxies">Outproxys</string>
<string name="i2ptunnel_wizard_k_target_host">Zielhost</string>
<string name="i2ptunnel_wizard_k_target_port">Zielport</string>
<string name="i2ptunnel_wizard_k_reachable_on">erreichbar unter</string>
<string name="i2ptunnel_wizard_k_binding_port">zu benutzender Port</string>
<string name="i2ptunnel_wizard_k_reachable_on">Erreichbar unter</string>
<string name="i2ptunnel_wizard_k_binding_port">Zu benutzender Port</string>
<string name="i2ptunnel_wizard_k_auto_start">Autostart</string>
<string name="next">Nächste</string>
<string name="prev">Vorherige</string>
<string name="finish">Absenden</string>
<string name="review">Überprüfen</string>
<string name="enabled">Aktiviert</string>
<string name="i2ptunnel_wizard_desc_name">Der Name des Tunnels - zur Unterscheidung in der Tunnelliste.</string>
<string name="i2ptunnel_wizard_desc_desc">Eine optionale aber für dich aussagekräftige Beschreibung des Tunnels.</string>
<string name="i2ptunnel_wizard_desc_dest">Bitte gib hier das I2P-Ziel des Dienstes ein, zu dem dieser Tunnel führen soll. Dies kann im Basis64-Format (langer Schlüssel) geschehen, oder eine I2P URL aus dem Adressbuch sein.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Falls du Outproxys für diese Tunnel-Art kennst (HTTP oder SOCKS), gib sie hier kommagetrennt ein.</string>
<string name="i2ptunnel_wizard_desc_target_host">Das ist die IP unter der der Dienst erreichbar ist - meistens die 127.0.0.1</string>
<string name="i2ptunnel_wizard_desc_name">Der Name des Tunnels zur Erkennung in der Tunnelliste.</string>
<string name="i2ptunnel_wizard_desc_desc">Eine optionale, aber für Sie aussagekräftige Beschreibung des Tunnels.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Falls Sie Outproxys für diese Tunnelart kennen (entweder HTTP oder SOCKS), geben Sie sie hier ein. Trennen Sie mehrere Proxies mit Kommas.</string>
<string name="i2ptunnel_wizard_desc_target_host">Das ist die IP, unter der der Dienst erreichbar ist. Normalerweise ist er auf der gleichen Maschine, also wird 127.0.0.1 automatisch ausgefüllt.</string>
<string name="i2ptunnel_wizard_desc_target_port">Dies ist der Port, unter dem der Dienst erreichbar ist.</string>
<string name="i2ptunnel_wizard_desc_reachable_on">Dies legt fest, welche Computer oder Smartphones den Tunnel erreichen können.</string>
<string name="i2ptunnel_wizard_desc_binding_port">Dies ist der Port, über den der Klient den Tunnel lokal erreichen kann. Das ist auch der Klient-Port des bidirektionalen HTTP-Server-Tunnels.</string>
@ -183,10 +189,71 @@
<string name="i2ptunnel_view_target">Ziel:</string>
<string name="i2ptunnel_view_access_point">Zugangspunkt:</string>
<string name="i2ptunnel_view_autostart">Autostart</string>
<string name="edit_tunnel">Tunnel bearbeiten</string>
<string name="name">Name</string>
<string name="description">Beschreibung</string>
<string name="auto_start">Automatischer Start</string>
<string name="tunnel_summ_auto_start">Tunnel mit dem Router starten.</string>
<string name="tunnel_cat_ports">Lokale Ports</string>
<string name="shared_client">Gemeinsamer Klient</string>
<string name="target_destination">Zielort</string>
<string name="persistent_key">Persistenter Schlüssel</string>
<string name="reachable_on">Erreichbarkeit ein</string>
<string name="listen_port">Lauschport</string>
<string name="client_ssl">Klient-SSL</string>
<string name="tunnel_summ_client_ssl">Klienten müssen SSL zum Verbinden verwenden</string>
<string name="irc">IRC</string>
<string name="enable_dcc">DCC aktivieren</string>
<string name="tunnel_summ_enable_dcc">IRC-Klienten die Verwendung von DCC erlauben</string>
<string name="website_domain_name">Webseiten-Domainname</string>
<string name="target_host">Zielhost</string>
<string name="target_port">Zielport</string>
<string name="use_ssl">SSL verwenden</string>
<string name="tunnel_summ_use_ssl">SSL verwenden, um mit dem Ziel zu verbinden</string>
<string name="tunnel_parameters">Tunnelparameter</string>
<string name="profile">Profil</string>
<string name="delay_connect">Verbinden verzögern</string>
<string name="access_control">Zugangskontrolle</string>
<string name="restricted_access">Eingeschränkter Zugang</string>
<string name="access_list">Zugangsliste</string>
<string name="tunnel_summ_reject_inproxies">Nur I2P-Nutzern eine Verbindung erlauben</string>
<string name="client_connection_limits">Klient-Verbindungsbegrenzungen</string>
<string name="connections_per_minute">Verbindungen pro Minute</string>
<string name="connections_per_hour">Verbindungen pro Stunde</string>
<string name="connections_per_day">Verbindungen pro Tag</string>
<string name="total_connection_limits">Verbindungsbegrenzungen insgesamt</string>
<string name="total_connections_per_minute">Gesamtverbindungen pro Minute</string>
<string name="total_connections_per_hour">Gesamtverbindungen pro Stunde</string>
<string name="total_connections_per_day">Gesamtverbindungen pro Tag</string>
<string name="max_active_connections">Maximal aktive Verbindungen</string>
<string name="num_per_minute">%s pro Minute</string>
<string name="num_per_hour">%s pro Stunde</string>
<string name="num_per_day">%s pro Tag</string>
<string name="unlimited">Unbegrenzt</string>
<string name="set_zero_for_unlimited">0 für unbegrenzt festlegen</string>
<string name="post_limits">POST-Begrenzungen</string>
<string name="limit_period">Zeitabschnitt begrenzen</string>
<string name="client_posts_per_period">Client-POSTs pro Zeitabschnitt</string>
<string name="total_posts_per_period">Gesamte POSTs pro Zeitabschnitt</string>
<string name="power_saving">Energie sparen</string>
<string name="delay_open">Öffnen verzögern</string>
<string name="idle_time">Leerlaufzeit</string>
<string name="num_minutes">%s Minuten</string>
<string name="close_tunnels">Tunnel bei Leerlauf schließen</string>
<string name="new_keys_on_reopen">Neue Schlüssel beim erneuten Öffnen</string>
<string name="http_client">HTTP-Klient</string>
<string name="tunnel_summ_allow_ssl">SSL für I2P-Adressen erlauben</string>
<string name="proxy_auth">Proxy-Autorisierung</string>
<string name="username">Benutzername</string>
<string name="password">Passwort</string>
<string name="other">Weitere</string>
<string name="signature_type">Signaturtyp</string>
<string name="custom_options">Benutzerdefinierte Optionen</string>
<string name="copy_logs">Protokolle kopieren</string>
<string name="i2p_android_error_logs">I2P Android-Fehlerprotokolle</string>
<string name="i2p_android_logs">I2P Android-Protokolle</string>
<string name="error_logs_copied_to_clipboard">Fehlerprotokolle in die Zwischenablage kopiert</string>
<string name="logs_copied_to_clipboard">Protokolle in die Zwischenablage kopiert</string>
<string name="label_browser_configuration">Browserkonfiguration</string>
<string name="unset">Deaktivieren</string>
</resources>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">Túneles</string>
<string name="label_status">Estado</string>
<string name="label_addressbook">Libreta de direcciones</string>
<string name="label_i2ptunnel">I2PTunnel</string>
<string name="label_i2ptunnel_client">Túneles de cliente</string>
<string name="label_i2ptunnel_server">Túneles de servidor</string>
<string name="label_logs">Registros</string>
@ -24,6 +23,9 @@
<string name="label_graphs">Gráficas</string>
<string name="button_router_off">Mantenga pulsado para iniciar I2P</string>
<string name="button_router_on">I2P está ejecutándose (mantenga pulsado para detenerlo)</string>
<string name="button_router_graceful">I2P se cerrará en %s</string>
<string name="button_shutdown_now">Mantenga pulsado para detener ahora</string>
<string name="button_cancel_graceful">Mantenga pulsado para cancelar cierre</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
@ -69,6 +71,8 @@
<string name="settings_enable">Activar</string>
<string name="settings_desc_subscriptions">URLs de subscripción</string>
<string name="settings_label_bandwidth_net">Ancho de banda y red</string>
<string name="settings_label_startOnBoot">Iniciar I2P al arrancar</string>
<string name="settings_desc_startOnBoot">Conectar automáticamente a I2P cuando arranque su dispositivo Android</string>
<string name="settings_label_bandwidth">Ancho de banda</string>
<string name="settings_label_bw_inbound">Velocidad de descarga</string>
<string name="settings_desc_bw_inbound">Velocidad máxima de descarga</string>
@ -109,6 +113,7 @@
<string name="settings_label_expl_backupQuantity">Cantidad de respaldos</string>
<string name="settings_summ_expl_backupQuantity">%s túneles</string>
<string name="settings_desc_expl_backupQuantity">Cuantos túneles de respaldo</string>
<string name="settings_need_transport_enabled">Debe tener al menos un transporte habilitado</string>
<string name="settings_router_restart_required">Por favor reinicie I2P para aplicar los cambios</string>
<string name="menu_about">Acerca de</string>
<string name="about_version">Versión:</string>
@ -141,6 +146,8 @@
<string name="i2ptunnel_type_streamrclient">Cliente Streamr</string>
<string name="i2ptunnel_type_streamrserver">Servidor Streamr</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidireccional</string>
<string name="install_recommended_app">¿Instalar aplicación recomendada?</string>
<string name="app_needed_for_this_tunnel_type">Tiene que instalar una aplicación para usar este túnel. ¿Desea instalar la aplicación recomendada?</string>
<string name="i2ptunnel_not_initialized">Los túneles no están inicializados aún, por favor vuelva a cargar en dos minutos.</string>
<string name="i2ptunnel_new_tunnel">Nuevo túnel</string>
<string name="i2ptunnel_msg_config_saved">Se guardaron los cambios en la configuración </string>
@ -169,7 +176,7 @@
<string name="enabled">Habilitado</string>
<string name="i2ptunnel_wizard_desc_name">El nombre del túnel, para su identificación el la lista de túneles.</string>
<string name="i2ptunnel_wizard_desc_desc">Una descripción del túnel. Esto es opcional y puramente informativo.</string>
<string name="i2ptunnel_wizard_desc_dest">Introduzca el destino I2P del servicio al que este túnel de cliente debe conectarse. Este podría ser la clave del destino base 64 completa, o una URL I2P de su libreta de direcciones.</string>
<string name="i2ptunnel_wizard_desc_dest">Escriba el destino I2P del servicio al que este túnel de cliente debe conectarse. Este podría ser la clave de destino I2P base 64 completa, o un nombre de servidor I2P de su libreta de direcciones.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Si sabe de algunos proxys de salida para este tipo de túnel (bien HTTP o SOCKS), introdúzcalos. Separe múltiples proxys con comas.</string>
<string name="i2ptunnel_wizard_desc_target_host">Esta es la IP sobre la que su servicio está ejecutándose, este normalmente está en la misma máquina, así que se autorellena con 127.0.0.1</string>
<string name="i2ptunnel_wizard_desc_target_port">Este es el puerto sobre el que el servicio está aceptando conexiones.</string>
@ -183,10 +190,94 @@
<string name="i2ptunnel_view_target">Objetivo:</string>
<string name="i2ptunnel_view_access_point">Punto de acceso:</string>
<string name="i2ptunnel_view_autostart">Auto-iniciar</string>
<string name="edit_tunnel">Editar túnel</string>
<string name="name">Nombre</string>
<string name="description">Descripción</string>
<string name="auto_start">Auto-iniciar</string>
<string name="tunnel_summ_auto_start">Iniciar el túnel cuando se inicie el router I2P.</string>
<string name="tunnel_cat_ports">Puertos locales</string>
<string name="shared_client">Cliente compartido</string>
<string name="tunnel_summ_shared_client">Usar el mismo destino I2P y túneles que otros clientes compartidos</string>
<string name="target_destination">Destino I2P objetivo</string>
<string name="persistent_key">Clave persistente</string>
<string name="tunnel_summ_persistent_key">Mantener este destino I2P del túnel cuando se reinicie</string>
<string name="reachable_on">Alcanzable en</string>
<string name="listen_port">Escuchar puerto</string>
<string name="client_ssl">SSL de cliente</string>
<string name="tunnel_summ_client_ssl">Los clientes deben usar SSL para conectar</string>
<string name="outproxies">Proxys de salida</string>
<string name="ssl_outproxies">Proxys SSL de salida</string>
<string name="irc">IRC</string>
<string name="enable_dcc">Habilitar DCC</string>
<string name="tunnel_summ_enable_dcc">Permitir usar DCC (conexión directa) a los clientes de IRC</string>
<string name="website_domain_name">Nombre de dominio del sitio web</string>
<string name="target_host">Equipo objetivo</string>
<string name="target_port">Puerto objetivo</string>
<string name="use_ssl">Usar SSL</string>
<string name="tunnel_summ_use_ssl">Usar SSL para conectar al objetivo</string>
<string name="tunnel_parameters">Parámetros de túnel</string>
<string name="profile">Perfil</string>
<string name="delay_connect">Retrasar conexión</string>
<string name="tunnel_summ_delay_connect">Habilitar para conexiones de petición/respuesta</string>
<string name="access_control">Control de acceso</string>
<string name="restricted_access">Acceso restringido</string>
<string name="access_list">Lista de acceso</string>
<string name="reject_inproxies">Rechazar proxys de entrada</string>
<string name="tunnel_summ_reject_inproxies">Permitir conectar sólo a usuarios de I2P</string>
<string name="unique_local">Dirección local única</string>
<string name="tunnel_summ_unique_local">Usar IPs de equipo local (localhost) únicas para cada cliente</string>
<string name="multihome">Multihospedaje</string>
<string name="tunnel_summ_multihome">Habilitar optimizaciones de multihospedaje (multihoming)</string>
<string name="client_connection_limits">Límites de conexión de cliente</string>
<string name="connections_per_minute">Conexiones por minuto</string>
<string name="connections_per_hour">Conexiones por hora</string>
<string name="connections_per_day">Conexiones por día</string>
<string name="total_connection_limits">Límites totales de conexión</string>
<string name="total_connections_per_minute">Conexiones totales por minuto</string>
<string name="total_connections_per_hour">Conexiones totales por hora</string>
<string name="total_connections_per_day">Conexiones totales por día</string>
<string name="max_active_connections">Máximo de conexiones activas</string>
<string name="num_per_minute">%s por minuto</string>
<string name="num_per_hour">%s por hora</string>
<string name="num_per_day">%s por día</string>
<string name="unlimited">Ilimitado</string>
<string name="set_zero_for_unlimited">Establezca 0 para ilimitado</string>
<string name="post_limits">Límites de POST (HTTP)</string>
<string name="limit_period">Limitar periodo</string>
<string name="client_posts_per_period">POSTs de cliente por periodo</string>
<string name="client_ban_length">Duración de la exclusión de cliente</string>
<string name="total_posts_per_period">POSTs totales por periodo</string>
<string name="total_ban_length">Duración total de la exclusión </string>
<string name="power_saving">Ahorro de energía</string>
<string name="delay_open">Retrasar apertura</string>
<string name="tunnel_summ_delay_open">Retrasar apertura de túnel hasta que sea requerida</string>
<string name="reduce_quantity">Reducir cantidad</string>
<string name="tunnel_summ_reduce_quantity">Reducir número de túneles cuando esté desocupado</string>
<string name="idle_time">Tiempo desocupado</string>
<string name="num_minutes">%s minutos</string>
<string name="reduced_tunnel_quantity">Cantidad de túneles reducida</string>
<string name="close_tunnels">Cerrar túneles cuando esté desocupado</string>
<string name="new_keys_on_reopen">Nuevas claves en la reapertura</string>
<string name="http_client">Cliente HTTP</string>
<string name="tunnel_summ_user_agent">Pasar a través la cabecera \'User-Agent\' (agente de usuario)</string>
<string name="tunnel_summ_referer">Pasar a través la cabecera \'Referer\' (procedencia)</string>
<string name="tunnel_summ_accept">Pasar a través las cabeceras \'Accept-*\' (aceptar)</string>
<string name="tunnel_summ_allow_ssl">Permitir SSL para direcciones I2P</string>
<string name="jump_url_list">Lista de URLs de servicios de salto (jump)</string>
<string name="proxy_auth">Autorización de proxy</string>
<string name="tunnel_summ_proxy_auth">Requerir un inicio de sesión para usar este proxy</string>
<string name="username">Nombre de usuario</string>
<string name="password">Contraseña</string>
<string name="outproxy_auth">Autorización de proxy de salida</string>
<string name="tunnel_summ_outproxy_auth">El inicio de sesión requerido para el proxy de salida</string>
<string name="other">Otro</string>
<string name="signature_type">Tipo de firma</string>
<string name="custom_options">Opciones personalizadas</string>
<string name="copy_logs">Copiar registros (logs)</string>
<string name="i2p_android_error_logs">Registros (logs) de errores de I2P Android</string>
<string name="i2p_android_logs">Registros (logs) de I2P Android</string>
<string name="error_logs_copied_to_clipboard">Los registros (logs) de errores se copiaron al portapapeles</string>
<string name="logs_copied_to_clipboard">Los registros (logs) se copiaron al portapapeles</string>
<string name="label_browser_configuration">Configuración del navegador</string>
<string name="unset">No configurado</string>
</resources>

View File

@ -0,0 +1,120 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">I2P-logo</string>
<string name="welcome_new_install">Tervetuloa I2P-sovellukseen! Täsmä sovellus on ALFA-ohjelmisto ja se ei tarjoa vahvaa nimettömyyttä. Lue julkaisutiedot ja linsessitiedot.</string>
<string name="welcome_new_version">Uusi versio asennettu. Lue julkaisutiedot. Versio:</string>
<string name="label_tunnels">Tunnelit</string>
<string name="label_status">Tila</string>
<string name="label_addressbook">Osoitekirja</string>
<string name="label_i2ptunnel_client">Asiakastunnelit</string>
<string name="label_i2ptunnel_server">Palvelintunnelit</string>
<string name="label_logs">Lokitiedostot</string>
<string name="label_error_logs">Virhelokitiedostot</string>
<string name="label_info_and_pages">Tietoja ja sivut</string>
<string name="label_welcome_page">Tervetuloa-sivu</string>
<string name="label_news">Uutiset</string>
<string name="label_release_notes">Julkaisutiedot</string>
<string name="label_licenses">Lisenssit</string>
<string name="label_nonanon_info">Ei-anonyymit tiedot</string>
<string name="label_browse">Selaa</string>
<string name="label_graphs">Kuvaajat</string>
<string name="button_router_off">Pitkä painallus käynnistää I2P-sovelluksen</string>
<string name="button_router_on">I2P on käynnissä (paina pitkään pysäyttääksesi)</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">A</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">P</string>
<string name="no_client_tunnels_running">Yhtään asiakastunneli ei ole vielä käynnissä.</string>
<string name="configure_browser_title">Asetetaanko selain?</string>
<string name="configure_browser_for_i2p">Haluaisitko asettaa selaimesi katsomaan I2P-sivustoja? (Voit myös tehdä tämän myöhemmin opaste-valikosta).</string>
<string name="first_start_title">Onnittelut I2P:n asentamisesta!</string>
<string name="first_start_welcome"><b>Tervetuloa I2P-sovellukseen!</b> <b>Ole kärsivällinen</b> kun I2P käynnistyy ja löytää vertaisverkkovastaanottajia.</string>
<string name="first_start_read">Odottaessa lue julkaisutiedot ja tervetuloa-sivu.</string>
<string name="first_start_faq">Kun asiakastunnelit ovat valmiit, <b>tarkista</b> UKK-kysymykset:</string>
<string name="first_start_faq_nonanon">Tai käytä ei-anonyymeja linkkejä, jos et halua odottaa tunneleita:</string>
<string name="action_search">Haku</string>
<string name="action_add">Lisää</string>
<string name="action_edit">Muokkaa</string>
<string name="action_delete">Poista</string>
<string name="action_router_start">Käynnistä reititin</string>
<string name="action_router_stop">Pysäytä reititin</string>
<string name="action_i2ptunnel_start">Käynnistä tunneli</string>
<string name="action_i2ptunnel_stop">Pysäytä tunneli</string>
<string name="action_i2ptunnel_start_all">Käynnistä kaikki tunnelit</string>
<string name="action_i2ptunnel_stop_all">Pysäytä kaikki tunnelit</string>
<string name="action_i2ptunnel_restart_all">Käynnistä kaikki tunnelit uudelleen</string>
<string name="action_reload">Lataa uudelleen</string>
<string name="action_refresh">Virkistä</string>
<string name="hint_search_addressbook">Etsi osoitekirja</string>
<string name="router_not_running">Reititin ei ole käynnissä.</string>
<string name="notification_status_bw">Kaistanleveys: %1$s kilotavua/s alaspäin / %2$s kilotavua/s ylöspäin</string>
<string name="notification_status_peers">Vertaisverkkovastaanottajaa: %1$d aktiivista, %2$d tunnettua</string>
<string name="notification_status_client">Asiakastunnelit: %1$d/%2$d</string>
<string name="menu_settings">Asetukset</string>
<string name="settings_enable">Ota käyttöön</string>
<string name="settings_label_bandwidth_net">Kaistanleveys ja verkko</string>
<string name="settings_label_bandwidth">Kaistanleveys</string>
<string name="settings_label_bw_inbound">Tulonopeus</string>
<string name="settings_desc_bw_inbound">Enimmäistulonopeus</string>
<string name="settings_label_bw_outbound">Lähtönopeus</string>
<string name="settings_desc_bw_outbound">Enimmäislähtönopeus</string>
<string name="settings_label_network">Verkko</string>
<string name="settings_desc_hiddenMode">Käännä piilotila pois päältä</string>
<string name="settings_label_showStats">Reititintilastot</string>
<string name="settings_label_maxConns">Yhteyksien enimmäismäärä</string>
<string name="settings_label_i2cp">I2CP-käyttöliittymä</string>
<string name="settings_desc_i2cp">Kuuntele portissa 7654</string>
<string name="settings_desc_exploratory_pool">Tunneliparametrit</string>
<string name="settings_label_expl_inbound">Tulotunnelit</string>
<string name="settings_label_expl_outbound">Lähtötunnelit</string>
<string name="settings_label_expl_length">Pituus</string>
<string name="settings_summ_expl_lengthVariance">%s</string>
<string name="settings_summ_expl_quantity">%s tunnelia</string>
<string name="settings_desc_expl_quantity">Kuinka monta tunnelia</string>
<string name="settings_summ_expl_backupQuantity">%s tunnelia</string>
<string name="menu_about">Ohjelmasta</string>
<string name="about_version">Versio:</string>
<string name="about_project">Hankekoti:</string>
<string name="about_helpwanted">Etsitään apua!</string>
<string name="menu_help">Opaste</string>
<string name="general">Yleistä</string>
<string name="addressbook_add_wizard_k_name">Nimi</string>
<string name="addressbook_add_wizard_k_destination">Kohde</string>
<string name="addressbook_add_wizard_desc_name">Nimi</string>
<string name="i2ptunnel_type_httpclient">HTTP-asiakas</string>
<string name="i2ptunnel_type_ircclient">IRC-asiakas</string>
<string name="i2ptunnel_type_server">Vakiopalvelin</string>
<string name="i2ptunnel_type_httpserver">HTTP-palvelin</string>
<string name="i2ptunnel_type_ircserver">IRC-palvelin</string>
<string name="i2ptunnel_new_tunnel">Uusi tunneli</string>
<string name="i2ptunnel_msg_tunnel_starting">Käynnistetään tunneli</string>
<string name="i2ptunnel_msg_tunnel_stopping">Pysäytetään tunneli</string>
<string name="i2ptunnel_delete_confirm_message">Poistetaanko tunneli?</string>
<string name="i2ptunnel_delete_confirm_button">Poista tunneli</string>
<string name="i2ptunnel_wizard_k_client_server">Asiakas tai palvelin</string>
<string name="i2ptunnel_wizard_v_client">Asiakastunneli</string>
<string name="i2ptunnel_wizard_v_server">Palvelintunneli</string>
<string name="i2ptunnel_wizard_k_type">Tunnelityyppi</string>
<string name="i2ptunnel_wizard_k_name">Nimi</string>
<string name="i2ptunnel_wizard_k_desc">Kuvaus</string>
<string name="i2ptunnel_wizard_k_dest">Kohde</string>
<string name="i2ptunnel_wizard_k_target_host">Kohdetietokone</string>
<string name="i2ptunnel_wizard_k_target_port">Kohdeportti</string>
<string name="next">Seuraava</string>
<string name="prev">Edellinen</string>
<string name="finish">Lähetä</string>
<string name="review">Katselmoi</string>
<string name="enabled">Otettu käyttöön</string>
<string name="i2ptunnel_wizard_submit_confirm_message">Luodaanko tunneli?</string>
<string name="i2ptunnel_wizard_submit_confirm_button">Luo tunneli</string>
<string name="i2ptunnel_view_type">Tyyppi:</string>
<string name="i2ptunnel_view_desc">Kuvaus:</string>
<string name="i2ptunnel_view_target">Kohde:</string>
<string name="copy_logs">Kopioi lokitiedostot</string>
<string name="i2p_android_error_logs">I2P Android-virhelokitiedostot</string>
<string name="i2p_android_logs">I2P Android-lokitiedostot</string>
<string name="error_logs_copied_to_clipboard">Virhelokitiedostot kopoitu leikepöydälle</string>
<string name="logs_copied_to_clipboard">Lokitiedostot kopioitu leikepöydälle</string>
<string name="label_browser_configuration">Selainasetukset</string>
</resources>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">Tunnels</string>
<string name="label_status">Statut</string>
<string name="label_addressbook">Carnet d\'adresses</string>
<string name="label_i2ptunnel">I2PTunnel</string>
<string name="label_i2ptunnel_client">Tunnels client</string>
<string name="label_i2ptunnel_server">Tunnels serveur</string>
<string name="label_logs">Logs</string>
@ -24,6 +23,9 @@
<string name="label_graphs">Graphiques</string>
<string name="button_router_off">Presser longtemps pour démarrer I2P</string>
<string name="button_router_on">I2P est en marche (presser longtemps pour arrêter)</string>
<string name="button_router_graceful">I2P s\'arrêtera dans %s</string>
<string name="button_shutdown_now">Pressez longtemps pour arrêter maintenant</string>
<string name="button_cancel_graceful">Pressez longtemps pour annuler l\'arrêt</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
@ -69,6 +71,8 @@
<string name="settings_enable">Activer</string>
<string name="settings_desc_subscriptions">URLs d\'abonnement</string>
<string name="settings_label_bandwidth_net">Bande passante et réseau</string>
<string name="settings_label_startOnBoot">Démarrer I2P lors du boot</string>
<string name="settings_desc_startOnBoot">Se connecter automatiquement à I2P lorsque votre dispositif Android démarre</string>
<string name="settings_label_bandwidth">Bande passante</string>
<string name="settings_label_bw_inbound">Vitesse entrante</string>
<string name="settings_desc_bw_inbound">Vitesse entrante maximum</string>
@ -109,6 +113,7 @@
<string name="settings_label_expl_backupQuantity">Quantité secours</string>
<string name="settings_summ_expl_backupQuantity">%s tunnels</string>
<string name="settings_desc_expl_backupQuantity">Combien de tunnels de secours</string>
<string name="settings_need_transport_enabled">Vous devez avoir au moins un transport d\'activé</string>
<string name="settings_router_restart_required">Veuillez redémarrer I2P afin d\'appliquer les changements</string>
<string name="menu_about">À propos</string>
<string name="about_version">Version :</string>
@ -141,6 +146,8 @@
<string name="i2ptunnel_type_streamrclient">Client Streamr</string>
<string name="i2ptunnel_type_streamrserver">Serveur Streamr</string>
<string name="i2ptunnel_type_httpbidirserver">Bidir HTTP</string>
<string name="install_recommended_app">Installer l\'app recommandée ?</string>
<string name="app_needed_for_this_tunnel_type">Vous devez installer une app pour utiliser ce tunnel. Voudriez-vous installer l\'app recommandée ?</string>
<string name="i2ptunnel_not_initialized">Les tunnels ne sont pas encore initialisés, veuillez recharger dans deux minutes.</string>
<string name="i2ptunnel_new_tunnel">Nouveau tunnel</string>
<string name="i2ptunnel_msg_config_saved">Changements de configuration sauvegardés</string>
@ -169,7 +176,7 @@
<string name="enabled">Activé</string>
<string name="i2ptunnel_wizard_desc_name">Le nom du tunnel, pour son identification dans la liste des tunnels.</string>
<string name="i2ptunnel_wizard_desc_desc">Une description du tunnel. Ceci est facultatif et purement informatif.</string>
<string name="i2ptunnel_wizard_desc_dest">Tapez la destination I2P du service auquel ce tunnel client devrait se connecter. Ce peut être la clé de destination de la base 64 complète ou une URL I2P de votre carnet d\'adresses.</string>
<string name="i2ptunnel_wizard_desc_dest">Tapez la destination I2P du service auquel ce tunnel de client devrait se connecter. Ceci pourrait être une clé de destination en base 64 pleine, ou un nom d\'hôte I2P contenu dans votre carnet d\'adresses.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Si vous connaissez des proxy sortants pour ce type de tunnel (soit HTTP ou SOCKS), ajoutez-les en les séparant par une virgule.</string>
<string name="i2ptunnel_wizard_desc_target_host">Ceci est l\'adresse IP sur laquelle votre service est connecté. Comme c\'est habituellement sur la machine locale, l\'adresse 127.0.0.1 est pré-remplie. </string>
<string name="i2ptunnel_wizard_desc_target_port">Ceci est le port sur lequel le service accepte des connexions.</string>
@ -183,10 +190,94 @@
<string name="i2ptunnel_view_target">Cible :</string>
<string name="i2ptunnel_view_access_point">Point d\'accès :</string>
<string name="i2ptunnel_view_autostart">Démarrage automatique</string>
<string name="edit_tunnel">Éditer tunnel</string>
<string name="name">Nom</string>
<string name="description">Description</string>
<string name="auto_start">Démarrage automatique</string>
<string name="tunnel_summ_auto_start">Démarrer le tunnel lorsque le routeur démarre</string>
<string name="tunnel_cat_ports">Ports locaux</string>
<string name="shared_client">Client partagé</string>
<string name="tunnel_summ_shared_client">Utiliser la même Destination et mêmes tunnels que les autres clients partagés</string>
<string name="target_destination">Destination cible</string>
<string name="persistent_key">Clé persistante</string>
<string name="tunnel_summ_persistent_key">Garder la Destination de ce tunnel lorsqu\'il redémarre</string>
<string name="reachable_on">Accessible sur</string>
<string name="listen_port">Port d\'écoute</string>
<string name="client_ssl">Client SSL</string>
<string name="tunnel_summ_client_ssl">Les clients doivent utiliser SSL pour se connecter</string>
<string name="outproxies">Proxys sortants</string>
<string name="ssl_outproxies">Proxies SSL</string>
<string name="irc">IRC</string>
<string name="enable_dcc">Permettre DCC</string>
<string name="tunnel_summ_enable_dcc">Permettre aux clients IRC d\'utiliser DCC</string>
<string name="website_domain_name">Nom de domaine du site web</string>
<string name="target_host">Hôte cible</string>
<string name="target_port">Port cible</string>
<string name="use_ssl">Utiliser SSL</string>
<string name="tunnel_summ_use_ssl">Utiliser SSL pour se connecter à la cible</string>
<string name="tunnel_parameters">Paramètres tunnel</string>
<string name="profile">Profil</string>
<string name="delay_connect">Retarder connexion</string>
<string name="tunnel_summ_delay_connect">Permettre pour les connexions de demande/réponse</string>
<string name="access_control">Contrôle des accès</string>
<string name="restricted_access">Accès restreint</string>
<string name="access_list">Liste des accès</string>
<string name="reject_inproxies">Rejeter inproxies</string>
<string name="tunnel_summ_reject_inproxies">Permettre seulement aux utilisateurs I2P de se connecter</string>
<string name="unique_local">Local unique</string>
<string name="tunnel_summ_unique_local">Utiliser des IPs localhost uniques pour chaque client</string>
<string name="multihome">Multi domicile</string>
<string name="tunnel_summ_multihome">Permettre les optimisations multi domiciles</string>
<string name="client_connection_limits">Limites de connexions du client</string>
<string name="connections_per_minute">Connexions par minute</string>
<string name="connections_per_hour">Connexions par heures</string>
<string name="connections_per_day">Connexions par jour</string>
<string name="total_connection_limits">Limite totale de connexions</string>
<string name="total_connections_per_minute">Connexions totales par minute</string>
<string name="total_connections_per_hour">Connexions totales par heures</string>
<string name="total_connections_per_day">Connexions totales par jour</string>
<string name="max_active_connections">Connexions actives maximales</string>
<string name="num_per_minute">%s par minutes</string>
<string name="num_per_hour">%s par heure</string>
<string name="num_per_day">%s par jour</string>
<string name="unlimited">Illimité</string>
<string name="set_zero_for_unlimited">Mettre 0 pour illimité</string>
<string name="post_limits">Limites de POSTS</string>
<string name="limit_period">Période limite</string>
<string name="client_posts_per_period">POSTs de clients par période</string>
<string name="client_ban_length">Longueur d\'interdiction de client</string>
<string name="total_posts_per_period">Total de POSTs par période</string>
<string name="total_ban_length">Longueur totale d\'interdiction</string>
<string name="power_saving">Économie d\'énergie</string>
<string name="delay_open">Retard d\'ouverture</string>
<string name="tunnel_summ_delay_open">Retarder l\'ouverture du tunnel ouvert jusqu\'à ce que ce soit nécessaire</string>
<string name="reduce_quantity">Réduire quantité</string>
<string name="tunnel_summ_reduce_quantity">Réduire la quantité de tunnels quand inoccupé</string>
<string name="idle_time">Temps inoccupé</string>
<string name="num_minutes">%s minutes</string>
<string name="reduced_tunnel_quantity">Quantité de tunnels réduits</string>
<string name="close_tunnels">Tunnels fermés quand inoccupé</string>
<string name="new_keys_on_reopen">Nouvelles clés sur réouverture</string>
<string name="http_client">Client HTTP</string>
<string name="tunnel_summ_user_agent">Passer l\'en-tête \'User-Agent\' à travers</string>
<string name="tunnel_summ_referer">Passer l\'en-tête \'Referer\' à travers</string>
<string name="tunnel_summ_accept">Passer l\'en-tête \'Accept-*\' à travers</string>
<string name="tunnel_summ_allow_ssl">Permettre SSL aux adresses I2P</string>
<string name="jump_url_list">Liste d\'URL de saut</string>
<string name="proxy_auth">Autorisation Proxy</string>
<string name="tunnel_summ_proxy_auth">Login nécessaire pour utiliser ce proxy</string>
<string name="username">Utilisateur</string>
<string name="password">Mot de passe</string>
<string name="outproxy_auth">Autorisation outproxy</string>
<string name="tunnel_summ_outproxy_auth">Le login requis pour l\'outproxy</string>
<string name="other">Autre</string>
<string name="signature_type">Type de signature</string>
<string name="custom_options">Options personnalisées</string>
<string name="copy_logs">Copier les historiques (logs)</string>
<string name="i2p_android_error_logs">Historiques des erreurs d\'I2P Android</string>
<string name="i2p_android_logs">Historiques d\'I2P Android</string>
<string name="error_logs_copied_to_clipboard">Les historiques des erreurs ont été copiés dans le presse-papier</string>
<string name="logs_copied_to_clipboard">Les historiques ont été copiés dans le presse-papier</string>
<string name="label_browser_configuration">Configuration du navigateur</string>
<string name="unset">Démettre</string>
</resources>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">Saluran</string>
<string name="label_status">Status</string>
<string name="label_addressbook">Buku alamat</string>
<string name="label_i2ptunnel">I2PTunnel</string>
<string name="label_i2ptunnel_client">Saluran klien</string>
<string name="label_i2ptunnel_server">Saluran server</string>
<string name="label_logs">Log</string>
@ -162,7 +161,6 @@
<string name="enabled">Diaktifkan</string>
<string name="i2ptunnel_wizard_desc_name">Nama saluran, untuk identifikasi dalam daftar saluran.</string>
<string name="i2ptunnel_wizard_desc_desc">Deskripsi saluran. Ini opsional dan murni informatif.</string>
<string name="i2ptunnel_wizard_desc_dest">Jenis dalam tujuan layanan I2P yang saluran klien ini harus hubungkan. Hal ini bisa menjadi kunci tujuan basis 64 penuh, atau sebuah URL I2P dari buku alamat Anda.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Jika Anda tahu berbagai outproxy untuk jenis saluran ini (baik HTTP ataupun SOCKS), isikan mereka. Pisahkan proxy ganda dengan koma.</string>
<string name="i2ptunnel_wizard_desc_target_host">Ini adalah IP yang padanya berjalan layanan Anda, ini umumnya pada mesin yang sama, jadi 127.0.0.1 diisikan secara otomatis.</string>
<string name="i2ptunnel_wizard_desc_target_port">Ini adalah port yang padanya menerima koneksi layanan.</string>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">Tunnel</string>
<string name="label_status">Stato</string>
<string name="label_addressbook">Rubrica</string>
<string name="label_i2ptunnel">I2PTunnel</string>
<string name="label_i2ptunnel_client">I tunnel del client</string>
<string name="label_i2ptunnel_server">I tunnel del server</string>
<string name="label_logs">Logs</string>
@ -25,7 +24,11 @@
<string name="button_router_off">Tieni premuto per avviare I2P</string>
<string name="button_router_on">I2P è in funzione (tieni premuto per fermare)</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="configure_browser_title">Configurare il browser?</string>
<string name="configure_browser_for_i2p">Vuoi configurare il tuo browser per visualizzare siti I2P? (Puoi anche farlo in seguito dal menù di aiuto)</string>
<string name="first_start_title">Congratulazioni per aver installato I2P!</string>
<string name="first_start_welcome"><b>Benvenuto su I2P!</b> <b>Sii paziente</b> mentre I2P si avvia e trova i peer.</string>
<string name="first_start_read">Mentre aspetti, puoi leggere le note di rilascio e la pagina di benvenuto.</string>
@ -64,6 +67,8 @@
<string name="settings_enable">Attiva</string>
<string name="settings_desc_subscriptions">URL sottoscrizioni</string>
<string name="settings_label_bandwidth_net">Ampiezza di banda e rete.</string>
<string name="settings_label_startOnBoot">Fai partire I2P all\'avvio</string>
<string name="settings_desc_startOnBoot">Connettiti automaticamente ad I2P all\'accensione del dispositivo</string>
<string name="settings_label_bandwidth">Larghezza di banda</string>
<string name="settings_label_bw_inbound">Velocità in entrata</string>
<string name="settings_desc_bw_inbound">Velocità massima in entrata</string>
@ -104,6 +109,7 @@
<string name="settings_label_expl_backupQuantity">Quantità di backup</string>
<string name="settings_summ_expl_backupQuantity">%s tunnel</string>
<string name="settings_desc_expl_backupQuantity">Quantità di backup di tunnel</string>
<string name="settings_router_restart_required">Per favore, riavvia I2P per applicare le modifiche</string>
<string name="menu_about">Informazioni su</string>
<string name="about_version">Versione:</string>
<string name="about_project">Pagina principale del progetto:</string>
@ -134,6 +140,8 @@
<string name="i2ptunnel_type_streamrclient">Client di Streamr</string>
<string name="i2ptunnel_type_streamrserver">Server streamr </string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidirezionale</string>
<string name="install_recommended_app">Vuoi installare l\'applicazione raccomandata?</string>
<string name="app_needed_for_this_tunnel_type">Hai bisogno di installare una applicazione per utilizzare questo tunnel. Vuoi installare l\'applicazione raccomandata?</string>
<string name="i2ptunnel_not_initialized">I tunnel non sono ancora stati inizializzati, prova a ricaricare tra un paio di minuti.</string>
<string name="i2ptunnel_new_tunnel">Nuovo tunnel</string>
<string name="i2ptunnel_msg_config_saved">Modifiche alla configurazione salvate.</string>
@ -162,7 +170,6 @@
<string name="enabled">Abilita</string>
<string name="i2ptunnel_wizard_desc_name">Il nome del tunnel, per identificarlo nell\'elenco dei tunnel.</string>
<string name="i2ptunnel_wizard_desc_desc">Una descrizione del tunnel. È un attributo opzionale a puro titolo informativo.</string>
<string name="i2ptunnel_wizard_desc_dest">Tipologia nella destinazione I2P del servizio a cui il tunnel di questo client può connettersi. Può essere l\'intera chiave di destinazione in base 64, oppure un URL di I2P prelevato dalla tua rubrica.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Se conosci qualche proxy di uscita per questo tipo di tunnel (HTTP oppure SOCKS), inseriscilo. Per inserire più proxy, separa i valori usando le virgole.</string>
<string name="i2ptunnel_wizard_desc_target_host">Questo è l\'indirizzo IP sul quale è in funzione il servizio, che generalmente risiede sulla stessa macchina: pertanto si assume il valore 127.0.0.1.</string>
<string name="i2ptunnel_wizard_desc_target_port">Questa è la porta per la quale il servizio accetta connessioni.</string>
@ -176,4 +183,5 @@
<string name="i2ptunnel_view_target">Destinazione:</string>
<string name="i2ptunnel_view_access_point">Punto di accesso:</string>
<string name="i2ptunnel_view_autostart">Avvio automatico</string>
<string name="label_browser_configuration">Configurazione del browser</string>
</resources>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">トンネル</string>
<string name="label_status">ステータス</string>
<string name="label_addressbook">アドレス帳</string>
<string name="label_i2ptunnel">I2P トンネル</string>
<string name="label_i2ptunnel_client">クライアントトンネル</string>
<string name="label_i2ptunnel_server">サーバートンネル</string>
<string name="label_logs">ログ</string>
@ -25,7 +24,12 @@
<string name="button_router_off">長押しして I2P を起動</string>
<string name="button_router_on">I2P を起動中 (長押しで中止)</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="no_client_tunnels_running">まだクライアントトンネルは起動していません。</string>
<string name="configure_browser_title">ブラウザの設定をしますか?</string>
<string name="configure_browser_for_i2p">I2Pサイトを見るためにブラウザを設定しますか(あとでヘルプメニューからも設定できます)</string>
<string name="first_start_title">I2P のインストールおめでとうございます!</string>
<string name="first_start_welcome"><b>I2P へようこそ!</b> I2P が立ち上がり、ピアを見つけるまで<b>我慢してください</b></string>
<string name="first_start_read">待っている間、リリースノートとウェルカムページをお読みください。</string>
@ -51,6 +55,8 @@
<string name="action_reload_subscriptions">購読を再読込</string>
<string name="router_not_running">ルーターが起動していません。</string>
<string name="stats_not_ready">統計マネージャーはまだ準備出来ていません。後でやり直してください。</string>
<string name="no_graphs_configured">グラフは設定されていません。設定でどの統計をグラフにするか選択できます。すべての変更は60秒後に有効になります</string>
<string name="configure_graphs">グラフ設定</string>
<string name="graphs_not_ready">グラフが準備出来ていない、あるいはルーターが起動していません。後でもう一度やり直してください。</string>
<string name="netdb_routers_empty">NetDB にルーターがありません。</string>
<string name="netdb_leases_empty">NetDB にリースセットがありません。</string>
@ -62,6 +68,8 @@
<string name="settings_enable">有効</string>
<string name="settings_desc_subscriptions">URL を登録</string>
<string name="settings_label_bandwidth_net">帯域幅とネットワーク</string>
<string name="settings_label_startOnBoot">デバイスの起動時ににI2Pも起動</string>
<string name="settings_desc_startOnBoot">デバイスの起動時に自動でI2Pに接続</string>
<string name="settings_label_bandwidth">帯域幅</string>
<string name="settings_label_bw_inbound">受信速度</string>
<string name="settings_desc_bw_inbound">最大受信速度</string>
@ -102,6 +110,8 @@
<string name="settings_label_expl_backupQuantity">バックアップの数量</string>
<string name="settings_summ_expl_backupQuantity">%s トンネル</string>
<string name="settings_desc_expl_backupQuantity">トンネルバックアップの数</string>
<string name="settings_need_transport_enabled">あなたは少なくともひとつの転送を有効にする必要があります</string>
<string name="settings_router_restart_required">設定を適用するためにI2Pを再起動してください</string>
<string name="menu_about">アバウト</string>
<string name="about_version">バージョン:</string>
<string name="about_project">プロジェクトホーム:</string>
@ -110,6 +120,7 @@
<string name="about_volunteer">アプリの改善を手伝いたいですか? Android フォーラム上でボランティア:</string>
<string name="about_donate">開発や試験用にさらに Android デバイスを購入するために、お金や Bitcoin を寄付していただけますか? こちらです:</string>
<string name="menu_help">ヘルプ</string>
<string name="general">一般</string>
<string name="addressbook_search_header">%s 検出</string>
<string name="addressbook_add_wizard_k_name">名前</string>
<string name="addressbook_add_wizard_k_destination">宛先</string>
@ -132,6 +143,8 @@
<string name="i2ptunnel_type_streamrclient">Streamr クライアント</string>
<string name="i2ptunnel_type_streamrserver">Streamr サーバー</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP 双方向</string>
<string name="install_recommended_app">推奨アプリをインストールしますか?</string>
<string name="app_needed_for_this_tunnel_type">このトンネルを使用するには推奨アプリをインストールする必要があります。インストールしますか?</string>
<string name="i2ptunnel_not_initialized">トンネルはまだ初期化されていません、2分後に再読み込みしてください。</string>
<string name="i2ptunnel_new_tunnel">新規トンネル</string>
<string name="i2ptunnel_msg_config_saved">構成の変更が保存されました</string>
@ -160,7 +173,6 @@
<string name="enabled">有効</string>
<string name="i2ptunnel_wizard_desc_name">トンネルリストでの識別用に、トンネルの名前。</string>
<string name="i2ptunnel_wizard_desc_desc">トンネルの説明。これは任意であり、単なる参考です。</string>
<string name="i2ptunnel_wizard_desc_dest">このクライアントトンネルが接続する I2P のサービスの宛先でのタイプ。これは完全な Base 64 の宛先キーか、アドレスブックからの I2P URL にできます。</string>
<string name="i2ptunnel_wizard_desc_outproxies">このタイプのトンネル用 HTTP か SOCKS のいずれか) のアウトプロキシを知っているなら、それらを入力してください。カンマで複数のプロキシを分割できます。</string>
<string name="i2ptunnel_wizard_desc_target_host">これは、サービスが起動している IPです。通常同一のマシン上なので、 127.0.0.1 が自動で入力されます。</string>
<string name="i2ptunnel_wizard_desc_target_port">これはサービスが接続を受け入れているポートです。</string>
@ -174,4 +186,71 @@
<string name="i2ptunnel_view_target">ターゲット:</string>
<string name="i2ptunnel_view_access_point">アクセスポイント:</string>
<string name="i2ptunnel_view_autostart">自動開始</string>
<string name="edit_tunnel">トンネルを編集</string>
<string name="name">名前</string>
<string name="description">説明</string>
<string name="auto_start">自動開始</string>
<string name="tunnel_summ_auto_start">ルーター起動時にトンネルを開始</string>
<string name="tunnel_cat_ports">ローカルポート</string>
<string name="shared_client">共有クライアント</string>
<string name="target_destination">範囲</string>
<string name="persistent_key">永続的なキー</string>
<string name="reachable_on">到達可能</string>
<string name="listen_port">着信ポート</string>
<string name="client_ssl">クライアントSSL</string>
<string name="tunnel_summ_client_ssl">クライアントは接続するのにSSLを使用しなければいけません</string>
<string name="outproxies">外部プロキシ</string>
<string name="ssl_outproxies">SSL外部プロキシ</string>
<string name="irc">IRC</string>
<string name="enable_dcc">DCC有効</string>
<string name="tunnel_summ_enable_dcc">DCCを使用しているクライアントにIRCを許可</string>
<string name="website_domain_name">ウェブサイトドメイン・ネーム</string>
<string name="target_host">ターゲットホスト</string>
<string name="target_port">ターゲットポート</string>
<string name="use_ssl">SSLを使用</string>
<string name="tunnel_summ_use_ssl">ターゲットに接続するためにSSLを使用</string>
<string name="tunnel_parameters">トンネル調節</string>
<string name="profile">プロファイル</string>
<string name="delay_connect">接続延滞</string>
<string name="access_control">アクセスコントロール</string>
<string name="restricted_access">許可されたアクセス</string>
<string name="access_list">アクセスリスト</string>
<string name="tunnel_summ_reject_inproxies">I2Pユーザー飲みに接続を許可</string>
<string name="unique_local">ユニークローカル</string>
<string name="multihome">マルチホーム</string>
<string name="tunnel_summ_multihome">マルチホーム最適化を有効</string>
<string name="client_connection_limits">接続数制限</string>
<string name="connections_per_minute">毎分の接続数</string>
<string name="connections_per_hour">毎時の接続数</string>
<string name="connections_per_day">日ごとの接続数</string>
<string name="total_connection_limits">総接続数制限</string>
<string name="total_connections_per_minute">毎分の総接続数制限</string>
<string name="total_connections_per_hour">毎時の総接続数制限</string>
<string name="total_connections_per_day">一日の総接続数制限</string>
<string name="max_active_connections">最大の有効な接続</string>
<string name="num_per_minute">%s /分</string>
<string name="num_per_hour">%s /時</string>
<string name="num_per_day">%s /日</string>
<string name="unlimited">無制限</string>
<string name="set_zero_for_unlimited">0=無制限</string>
<string name="post_limits">投稿制限</string>
<string name="power_saving">パワーセーブ</string>
<string name="num_minutes">%s /分</string>
<string name="http_client">HTTPクライアント</string>
<string name="jump_url_list">ジャンプURLリスト</string>
<string name="proxy_auth">プロキシ認証</string>
<string name="tunnel_summ_proxy_auth">このプロキシを使用するにはログインが必要です</string>
<string name="username">ユーザーネーム</string>
<string name="password">パスワード</string>
<string name="outproxy_auth">外部プロキシ認証</string>
<string name="other">その他</string>
<string name="signature_type">署名形式</string>
<string name="custom_options">カスタムオプション</string>
<string name="copy_logs">ログをコピー</string>
<string name="i2p_android_error_logs">I2PAndroidエラーログ</string>
<string name="i2p_android_logs">I2PAndroidログ</string>
<string name="error_logs_copied_to_clipboard">エラーログはクリップボードにコピーされました</string>
<string name="logs_copied_to_clipboard">ログはクリップボードにコピーされました</string>
<string name="label_browser_configuration">ブラウザ設定</string>
<string name="unset">解除</string>
</resources>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">터널들</string>
<string name="label_status">상태</string>
<string name="label_addressbook">주소록</string>
<string name="label_i2ptunnel">I2P터널</string>
<string name="label_i2ptunnel_client">클라이언트 터널들</string>
<string name="label_i2ptunnel_server">서버 터널들</string>
<string name="label_logs">로그</string>
@ -69,6 +68,8 @@
<string name="settings_enable">활성화</string>
<string name="settings_desc_subscriptions">구독 URL들</string>
<string name="settings_label_bandwidth_net">대역폭과 네트워크</string>
<string name="settings_label_startOnBoot">부트시 I2P 실행</string>
<string name="settings_desc_startOnBoot">안드로이드 기기가 시작될 때 I2P에 자동으로 연결</string>
<string name="settings_label_bandwidth">대역폭</string>
<string name="settings_label_bw_inbound">수신 속도</string>
<string name="settings_desc_bw_inbound">최대 수신 속도</string>
@ -141,6 +142,8 @@
<string name="i2ptunnel_type_streamrclient">Streamr 클라이언트</string>
<string name="i2ptunnel_type_streamrserver">Streamr 서버</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="install_recommended_app">권장 앱을 설치할까요?</string>
<string name="app_needed_for_this_tunnel_type">이 터널을 이용하기 위해서는 앱을 설치해야 합니다. 권장 앱을 설치할까요?</string>
<string name="i2ptunnel_not_initialized">터널이 아직 시작되지 않았습니다. 2분 후에 다시 로드하세요.</string>
<string name="i2ptunnel_new_tunnel">새 터널</string>
<string name="i2ptunnel_msg_config_saved">설정 변경 저장됨</string>
@ -169,7 +172,6 @@
<string name="enabled">활성화됨</string>
<string name="i2ptunnel_wizard_desc_name">터널 리스트에서 구별하기 위한 터널의 이름</string>
<string name="i2ptunnel_wizard_desc_desc">터널의 설명. 선택적이고 단순 정보용.</string>
<string name="i2ptunnel_wizard_desc_dest">클라이언트 터널이 접속하야 하는 I2P 서비스 도착점 입력. 전체 Base 64 도착점 키나 사용자의 주소록에 있는 I2P URL 사용 가능.</string>
<string name="i2ptunnel_wizard_desc_outproxies">만약 이 터널 종류의 나가는 프록시를 안다면 (HTTP 또는 SOCKS), 입력. 여러 프록시들을 콤마로 구별.</string>
<string name="i2ptunnel_wizard_desc_target_host">서비스가 작동중인 IP, 대부분의 경우 같은 기기이기 때문에 127.0.0.1이 자동 입력됨.</string>
<string name="i2ptunnel_wizard_desc_target_port">서비스가 접속을 받아들일 포트.</string>
@ -189,4 +191,5 @@
<string name="error_logs_copied_to_clipboard">클립보드에 오류 로그 복사됨</string>
<string name="logs_copied_to_clipboard">클립보드에 로그 복사됨</string>
<string name="label_browser_configuration">브라우저 설정</string>
<string name="unset">미설정</string>
</resources>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">Tunneler</string>
<string name="label_status">Status</string>
<string name="label_addressbook">Adressebok</string>
<string name="label_i2ptunnel">I2P-Tunnel</string>
<string name="label_i2ptunnel_client">Klient-tunneler</string>
<string name="label_i2ptunnel_server">Tjener-tunneler</string>
<string name="label_logs">Logger</string>
@ -69,6 +68,8 @@
<string name="settings_enable">Slå på</string>
<string name="settings_desc_subscriptions">Abonnements-URL-er </string>
<string name="settings_label_bandwidth_net">Båndbredde og nettverk</string>
<string name="settings_label_startOnBoot">Start I2P ved oppstart</string>
<string name="settings_desc_startOnBoot">Automatisk tilkobling til I2P etter at din Android-enhet har startet opp</string>
<string name="settings_label_bandwidth">Båndbredde</string>
<string name="settings_label_bw_inbound">Nedlastingshastighet</string>
<string name="settings_desc_bw_inbound">Maksimal nedlastingshastighet</string>
@ -109,6 +110,7 @@
<string name="settings_label_expl_backupQuantity">Sikkerhetskopi-mengde</string>
<string name="settings_summ_expl_backupQuantity">%s tunneler</string>
<string name="settings_desc_expl_backupQuantity">Hvor mange reservetunneler</string>
<string name="settings_need_transport_enabled">Du må ha ihvertfall én overføring påskrudd</string>
<string name="settings_router_restart_required">Gjør en omstart av I2P for å utføre endringer</string>
<string name="menu_about">Om</string>
<string name="about_version">Versjon:</string>
@ -141,6 +143,8 @@
<string name="i2ptunnel_type_streamrclient">Streamr-klient</string>
<string name="i2ptunnel_type_streamrserver">Streamr-tjener</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="install_recommended_app">Installere anbefalt app?</string>
<string name="app_needed_for_this_tunnel_type">Du trenger å installere en app for å bruke denne tunnelen. Vil du installere den anbefalte appen?</string>
<string name="i2ptunnel_not_initialized">Tunneler er ikke klargjort enda, vennligst last inn på nytt om to minutter.</string>
<string name="i2ptunnel_new_tunnel">Ny Tunnel</string>
<string name="i2ptunnel_msg_config_saved">Konfigurasjonsendringer lagret</string>
@ -169,7 +173,6 @@
<string name="enabled">Påskrudd</string>
<string name="i2ptunnel_wizard_desc_name">Tunnel-navn, for identifikasjon i tunnel-listen.</string>
<string name="i2ptunnel_wizard_desc_desc">Beskrivelse av tunnelen. Dette er valgfritt, og bare til informasjon.</string>
<string name="i2ptunnel_wizard_desc_dest">Skriv inn I2P-målet til tjenesten som denne klienten skal koble til. Det være seg enten full base64 mål-nøkkel, eller en I2P-URL fra adresselisten.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Hvis du vet om noen utgående mellomtjenere for denne typen tunnel (enten HTTP eller SOCKS), fyll dem inn. Oppgis flere mellomtjenere må de deles med komma.</string>
<string name="i2ptunnel_wizard_desc_target_host">Dette er IP-en din tjeneste kjører på, dette er vanligvis den samme maskinen, så 127.0.0.1 er ferdigutfylt. </string>
<string name="i2ptunnel_wizard_desc_target_port">Dette er porten tjenesten godtar tilkoblinger på.</string>
@ -189,4 +192,5 @@
<string name="error_logs_copied_to_clipboard">Utklippstavle for feil-logg</string>
<string name="logs_copied_to_clipboard">Utklippstavle for loggføringer</string>
<string name="label_browser_configuration">Oppsett av nettleser</string>
<string name="unset">Fravelg</string>
</resources>

View File

@ -4,10 +4,10 @@
<string name="desc_i2p_logo">I2P logo</string>
<string name="welcome_new_install">Welkom op I2P! Deze app heeft de ALPHA status en het biedt geen sterke anonimiteit. Lees de releaseopmerkingen en licentie-informatie.</string>
<string name="welcome_new_version">Nieuwe versie geïnstalleerd. Lees de releaseopmerkingen. Versie:</string>
<string name="label_home">Instellingen en Status</string>
<string name="label_tunnels">Tunnels</string>
<string name="label_status">Status</string>
<string name="label_addressbook">Adresboek</string>
<string name="label_i2ptunnel">I2PTunnel</string>
<string name="label_i2ptunnel_client">Cliënt tunnels</string>
<string name="label_i2ptunnel_server">Server tunnels</string>
<string name="label_logs">Logboeken</string>
@ -24,7 +24,12 @@
<string name="button_router_off">Lang drukken om I2P te starten</string>
<string name="button_router_on">I2P is actief (lang drukken om te stoppen)</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="no_client_tunnels_running">Er draaien nog geen client tunnels.</string>
<string name="configure_browser_title">Browser instellen?</string>
<string name="configure_browser_for_i2p">Wil je een browser instellen om I2P-sites te kunnen bekijken? (Je kan dit ook later doen vanuit het help-menu.)</string>
<string name="first_start_title">Gefeliciteerd met de installatie van I2P!</string>
<string name="first_start_welcome"><b>Welkom bij I2P! Heb geduld alstublieft</b> terwijl I2P opstart en peers zoekt.</string>
<string name="first_start_read">Terwijl je wacht, lees alstublieft de release aantekeningen en welkom pagina.</string>
@ -49,15 +54,22 @@
<string name="hint_search_addressbook">Zoeken in adresboek</string>
<string name="action_reload_subscriptions">Vernieuw abonnementen</string>
<string name="router_not_running">De router is uit.</string>
<string name="stats_not_ready">De statistiekenbeheerder is nog niet klaar. Probeer het later opnieuw.</string>
<string name="no_graphs_configured">Geen grafieken ingesteld. Je kan de statistieken om in grafieken weer te geven instellen in het instellingenmenu. Alle wijzigingen vinden plaats na 60 seconden.</string>
<string name="configure_graphs">Grafieken instellen</string>
<string name="graphs_not_ready">Grafieken zijn niet klaar, of de router staat uit. Probeer het later opnieuw.</string>
<string name="netdb_routers_empty">Geen routers in je NetDB.</string>
<string name="netdb_leases_empty">Geen LeaseSets in je NetDB.</string>
<string name="notification_status_bw">Bandbreedte: %1$s KBps down / %2$s KBps up</string>
<string name="notification_status_peers">Peers: %1$d actief, %2$d bekend</string>
<string name="notification_status_expl">Verkennende tunnels: %1$d/%2$d</string>
<string name="notification_status_client">Cliënt tunnels: %1$d/%2$d</string>
<string name="menu_settings">Instellingen</string>
<string name="settings_enable">Inschakelen</string>
<string name="settings_desc_subscriptions">URL\'s van abbonementen</string>
<string name="settings_label_bandwidth_net">Bandbreedte en netwerk</string>
<string name="settings_label_startOnBoot">I2P starten bij opstarten van toestel</string>
<string name="settings_desc_startOnBoot">Automatisch verbinden met I2P wanneer je Android-toestel opstart</string>
<string name="settings_label_bandwidth">Bandbreedte</string>
<string name="settings_label_bw_inbound">Binnenkomende snelheid</string>
<string name="settings_desc_bw_inbound">Maximale binnenkomende snelheid</string>
@ -87,8 +99,10 @@
<string name="settings_label_expl_inbound">Inkomende tunnels</string>
<string name="settings_label_expl_outbound">Uitgaande tunnels</string>
<string name="settings_label_expl_length">Lengte</string>
<string name="settings_summ_expl_length">%s hops</string>
<string name="settings_desc_expl_length">Hoeveel \'hops\' te gebruiken</string>
<string name="settings_label_expl_lengthVariance">\'Hop\'-variantie</string>
<string name="settings_summ_expl_lengthVariance">%s</string>
<string name="settings_desc_expl_lengthVariance">Hoeveel willekeurig toe te voegen \'hops\'</string>
<string name="settings_label_expl_quantity">Hoeveelheid</string>
<string name="settings_summ_expl_quantity">%s tunnels</string>
@ -96,17 +110,27 @@
<string name="settings_label_expl_backupQuantity">Back-up hoeveelheid</string>
<string name="settings_summ_expl_backupQuantity">%s tunnels</string>
<string name="settings_desc_expl_backupQuantity">Hoeveel tunnel back-ups</string>
<string name="settings_need_transport_enabled">Er moet minstens een transport aangezet zijn</string>
<string name="settings_router_restart_required">Herstart I2P om de instellingen toe te passen</string>
<string name="menu_about">Over</string>
<string name="about_version">Versie:</string>
<string name="about_project">Project Home:</string>
<string name="about_bugs">Bugs en Ondersteuning:</string>
<string name="about_helpwanted">Hulp Gezocht!</string>
<string name="about_volunteer">Wil je vrijwillig helpen de app beter te maken? Kijk op het Android forum:</string>
<string name="about_donate">Wil je geld of bitcoins doneren zodat we op meer Android telefoons kunnen ontwikkelen en testen? Ga naar:</string>
<string name="menu_help">Help</string>
<string name="general">Algemeen</string>
<string name="addressbook_search_header">%s gevonden</string>
<string name="addressbook_add_wizard_k_name">Naam</string>
<string name="addressbook_add_wizard_k_destination">Bestemming</string>
<string name="addressbook_add_wizard_desc_name">De naam</string>
<string name="addressbook_add_wizard_desc_destination">Plak de B64 van de bestemming hier. Als je een bestand manager geïnstalleerd hebt, kan je het tekst bestand met de B64 zoeken.</string>
<string name="nsu_iae_illegal_char">Hostnaam \"%1$s\" bevat een illegaal karakter %2$s</string>
<string name="nsu_iae_cannot_start_with">Hostnaam kan niet beginnen met \"%s\"</string>
<string name="nsu_iae_cannot_end_with">Hostnaam kan niet eindigen met \"%s\"</string>
<string name="nsu_iae_cannot_contain">Hostnaam kan \"%s\" niet bevatten</string>
<string name="nsu_iae_requires_conversion">Hostnaam \"%s\" vereist conversie naar ASCII, maar de conversie-bibliotheek is niet beschikbaar in deze Android-versie</string>
<string name="i2ptunnel_type_client">Standaard cliënt</string>
<string name="i2ptunnel_type_httpclient">HTTP cliënt</string>
<string name="i2ptunnel_type_ircclient">IRC cliënt</string>
@ -119,6 +143,8 @@
<string name="i2ptunnel_type_streamrclient">Streamr cliënt</string>
<string name="i2ptunnel_type_streamrserver">Streamr server</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="install_recommended_app">Aanbevolen applicatie installeren?</string>
<string name="app_needed_for_this_tunnel_type">Je moet een applicatie installeren om deze tunnel te gebruiken. Wil je de aanbevolen applicatie installeren?</string>
<string name="i2ptunnel_not_initialized">Tunnels zijn nog niet klaar, ververs in twee minuten aub.</string>
<string name="i2ptunnel_new_tunnel">Nieuwe tunnel</string>
<string name="i2ptunnel_msg_config_saved">Cofiguratie veranderingen opgeslagen</string>
@ -135,7 +161,11 @@
<string name="i2ptunnel_wizard_k_desc">Beschrijving</string>
<string name="i2ptunnel_wizard_k_dest">Bestemming</string>
<string name="i2ptunnel_wizard_k_outproxies">Outproxies</string>
<string name="i2ptunnel_wizard_k_target_host">Doelhost</string>
<string name="i2ptunnel_wizard_k_target_port">Doelpoort</string>
<string name="i2ptunnel_wizard_k_reachable_on">Bereikbaar op</string>
<string name="i2ptunnel_wizard_k_binding_port">Bindende poort</string>
<string name="i2ptunnel_wizard_k_auto_start">Automatisch starten</string>
<string name="next">Volgende</string>
<string name="prev">Vorige</string>
<string name="finish">Indienen</string>
@ -143,12 +173,24 @@
<string name="enabled">Staat aan</string>
<string name="i2ptunnel_wizard_desc_name">De naam van de tunnel, voor het identificeren in de tunnel lijst.</string>
<string name="i2ptunnel_wizard_desc_desc">Een beschrijving van de tunnel. Dit is niet verplicht maar wel informatief.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Als u outproxies kent voor dit type tunnel (HTTP of SOCKS), vul ze dan in. Scheid meerdere proxies door middel van komma\'s.</string>
<string name="i2ptunnel_wizard_desc_target_host">Dit is het IP adres waarop je service runt, dit is meestal op dezelfde machine, dus 127.0.0.1 is standaard ingevuld.</string>
<string name="i2ptunnel_wizard_desc_target_port">Dit is de poort waar de service verbindingen op ontvangt.</string>
<string name="i2ptunnel_wizard_desc_reachable_on">Dit limiteert welke computers of smartphones de tunnel kunnen bereiken.</string>
<string name="i2ptunnel_wizard_desc_binding_port">Dit is de poort vanwaar de cliënt-tunnel lokaal zal bereikt worden. Dit is ook de cliënt-poort voor de HTTP bidir server tunnel.</string>
<string name="i2ptunnel_wizard_desc_auto_start">Moet de tunnel automatisch gestart worden als de router start?</string>
<string name="i2ptunnel_wizard_submit_confirm_message">Tunnel aanmaken?</string>
<string name="i2ptunnel_wizard_submit_confirm_button">Tunnel aanmaken</string>
<string name="i2ptunnel_view_type">Type:</string>
<string name="i2ptunnel_view_desc">Beschrijving:</string>
<string name="i2ptunnel_view_target">Doel:</string>
<string name="i2ptunnel_view_access_point">Toegangspunt:</string>
<string name="i2ptunnel_view_autostart">Automatisch starten</string>
<string name="copy_logs">Kopieer logs</string>
<string name="i2p_android_error_logs">I2P Android Error Logs</string>
<string name="i2p_android_logs">I2P Android Logs</string>
<string name="error_logs_copied_to_clipboard">Error logs naar het klembord gekopieerd</string>
<string name="logs_copied_to_clipboard">Logs naar het klembord gekopieerd</string>
<string name="label_browser_configuration">Browserconfiguratie</string>
<string name="unset">Niet ingesteld</string>
</resources>

View File

@ -2,17 +2,16 @@
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">Logo I2P</string>
<string name="welcome_new_install">Witamy w I2P! Ta aplikacja jest w fazie ALPHA i nie zapewnia mocnej anonimowości. Zalecamy zapoznanie się z listą zmian i licencją. </string>
<string name="welcome_new_install">Witamy w I2P! Aplikacja jest w fazie ALPHA i nie zapewnia mocnej anonimowości. Zalecamy zapoznanie się z listą zmian i licencją. </string>
<string name="welcome_new_version">Nowa wersja zainstalowana. Przeczytaj listę zmian. Wersja:</string>
<string name="label_home">Kontrola i Status</string>
<string name="label_tunnels">Tunele</string>
<string name="label_status">Status</string>
<string name="label_addressbook">Książka adresowa</string>
<string name="label_i2ptunnel">Tunel I2P</string>
<string name="label_i2ptunnel_client">Tunele klienta</string>
<string name="label_i2ptunnel_server">Tunele serwerów</string>
<string name="label_logs">Logi</string>
<string name="label_error_logs">Rejestr błędów</string>
<string name="label_error_logs">Logi błędów</string>
<string name="label_info_and_pages">Informacje i strony</string>
<string name="label_welcome_page">Strona Powitalna</string>
<string name="label_news">Wiadomości</string>
@ -22,15 +21,20 @@
<string name="label_nonanon_info">Nie Anonimowe Informacje</string>
<string name="label_browse">Przeglądaj</string>
<string name="label_graphs">Wykresy</string>
<string name="button_router_off">Dotknij na dłużej aby uruchomić I2P</string>
<string name="button_router_off">Przytrzymaj dłużej, aby uruchomić I2P</string>
<string name="button_router_on">I2P jest włączone (dotknij na dłużej aby zatrzymać)</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="first_start_title">Gratulacje w zainstalowaniu I2P!</string>
<string name="char_server_tunnel">S</string>
<string name="no_client_tunnels_running">Jeszcze żadne tunele klienta nie są uruchomione.</string>
<string name="configure_browser_title">Konfigurować przeglądarkę?</string>
<string name="configure_browser_for_i2p">Czy chciałbyś skonfigurować przeglądarkę, aby przeglądać strony I2P? (Możesz to zrobić później w wybierająć pomoc z menu.)</string>
<string name="first_start_title">Gratulacje, zainstalowałeś I2P!</string>
<string name="first_start_welcome"><b>Witamy w I2P!</b> Proszę <b>bądz cierpliwy</b> bo I2P właśnie się uruchamia i szuka peerów.</string>
<string name="first_start_read">W międzyczasie, prosimy o zapoznanie się z notatkami tego wydania oraz stroną powitalną.</string>
<string name="first_start_faq">Kiedy będziesz miał tunele klienta proszę <b>sprawdź</b> nasze FAQ:</string>
<string name="first_start_faq_nonanon">Also użyj tych nie-anonimowych linków jeśli nie chcesz czekać na tunele:</string>
<string name="first_start_faq">Kiedy już będziesz miał tunele klienta proszę <b>sprawdź</b> nasze FAQ:</string>
<string name="first_start_faq_nonanon">Also użyj tego nie-anonimowego linka jeśli nie chcesz czekać na tunele:</string>
<string name="first_start_irc">Skieruj swojego klienta IRC do <b>localhost:6668</b> i przywitaj się z nami na.</string>
<string name="drawer_open">Otwórz nawigację</string>
<string name="drawer_close">Zamknij nawigację</string>
@ -40,8 +44,8 @@
<string name="action_delete">Usuń</string>
<string name="action_router_start">Uruchom Router</string>
<string name="action_router_stop">Zatrzymaj Router</string>
<string name="action_i2ptunnel_start">Włącz tunel</string>
<string name="action_i2ptunnel_stop">Wyłącz tunel</string>
<string name="action_i2ptunnel_start">Uruchom tunel</string>
<string name="action_i2ptunnel_stop">Zatrzymaj tunel</string>
<string name="action_i2ptunnel_start_all">Uruchom wszystkie tunele</string>
<string name="action_i2ptunnel_stop_all">Zatrzymaj wszystkie tunele</string>
<string name="action_i2ptunnel_restart_all">Zrestartuj wszystkie tunele</string>
@ -64,6 +68,8 @@
<string name="settings_enable">Włącz</string>
<string name="settings_desc_subscriptions">Adresy URL subskrypcji</string>
<string name="settings_label_bandwidth_net">Przepustowość i sieć</string>
<string name="settings_label_startOnBoot">Uruchom I2P przy starcie systemu</string>
<string name="settings_desc_startOnBoot">Automatycznie połącz z I2P kiedy Twój Android włączy się.</string>
<string name="settings_label_bandwidth">Przepustowość</string>
<string name="settings_label_bw_inbound">Prędkość przychodząca</string>
<string name="settings_desc_bw_inbound">Maksymalna prędkość przychodząca</string>
@ -73,10 +79,10 @@
<string name="settings_label_hiddenMode">Uczestnictwo</string>
<string name="settings_desc_hiddenMode">Wyłącz tryp ukryty</string>
<string name="settings_label_maxPartTunnels">Maksymalna liczba uczestniczących tuneli</string>
<string name="settings_desc_maxPartTunnels">Maksaymalna liczba tuneli uczestniczących w (domyślne=20)</string>
<string name="settings_dialog_maxPartTunnels">Maksymalna liczba tuneli uczestniczących w</string>
<string name="settings_label_sharePercent">Udział procentowy</string>
<string name="settings_desc_sharePercent">Udział procentowy przepustowości do podziału (domyślne=80)</string>
<string name="settings_desc_maxPartTunnels">Maksaymalna liczba tuneli uczestniczących (domyślnie=20)</string>
<string name="settings_dialog_maxPartTunnels">Maksymalna liczba tuneli uczestniczących</string>
<string name="settings_label_sharePercent">Procent podziału</string>
<string name="settings_desc_sharePercent">Procent przepustowości do podziału (domyślnie=80)</string>
<string name="settings_dialog_sharePercent">Procent przepustowości do podziału</string>
<string name="settings_desc_upnp">Otwórz porty firewall\'a automatycznie</string>
<string name="settings_label_logging">Logowanie</string>
@ -97,29 +103,32 @@
<string name="settings_desc_expl_length">Ile użyć skoków</string>
<string name="settings_label_expl_lengthVariance">Wariancje skoków</string>
<string name="settings_summ_expl_lengthVariance">%s</string>
<string name="settings_desc_expl_lengthVariance">Ile skoków losowych dodać</string>
<string name="settings_desc_expl_lengthVariance">Ile dodać losowych skoków</string>
<string name="settings_label_expl_quantity">Ilość</string>
<string name="settings_summ_expl_quantity">%s tunelów</string>
<string name="settings_desc_expl_quantity">Ile tunelów</string>
<string name="settings_label_expl_backupQuantity">Ilość kopii zapasowych</string>
<string name="settings_summ_expl_backupQuantity">%s tunelów</string>
<string name="settings_desc_expl_backupQuantity">Ilość kopii zapasowych tuneli</string>
<string name="settings_need_transport_enabled">Musisz mieć przynajmniej jeden transport włączony</string>
<string name="settings_router_restart_required">Proszę zrestartuj I2P, aby zmiany weszły w życie.</string>
<string name="menu_about">O programie</string>
<string name="about_version">Wersja:</string>
<string name="about_project">Strona Projektu:</string>
<string name="about_bugs">Błędy i wsparcie:</string>
<string name="about_helpwanted">Potrzebna pomoc!</string>
<string name="about_volunteer">Chcesz pomóc w ulepszeniu tej aplikacji? Zgłoś się na ochotnika na forum Android:</string>
<string name="about_donate">Chcesz przesłać pieniądze lub bitcoiny aby zakupić więcej Androidów dla rozwoju i testowania? Idź do:</string>
<string name="about_donate">Chcesz przesłać pieniądze lub bitcoiny, aby zakupić więcej Androidów dla rozwoju i testowania? Idź do:</string>
<string name="menu_help">Pomoc</string>
<string name="general">Ogólne</string>
<string name="addressbook_search_header">%s znaleziono</string>
<string name="addressbook_add_wizard_k_name">Nazwa</string>
<string name="addressbook_add_wizard_k_destination">Miejsce przeznaczenia</string>
<string name="addressbook_add_wizard_k_destination">Przeznaczenie</string>
<string name="addressbook_add_wizard_desc_name">Nazwa</string>
<string name="addressbook_add_wizard_desc_destination">Wklej B64 miejsca przeznaczenia tutaj. Jeśli masz menadżer plików zainstalowany, to możesz przegladać pliki tekstowe zawierające B64.</string>
<string name="addressbook_add_wizard_desc_destination">Wklej B64 przeznaczenia tutaj. Jeśli masz zainstalowany menadżer plików to możesz przegladać pliki tekstowe zawierające B64.</string>
<string name="nsu_iae_illegal_char">Nazwa hosta \"%1$s\" zawiera niedozwolony znak %2$s</string>
<string name="nsu_iae_cannot_start_with">Nazwa hosta nie może zaczynać się od \"%s\"</string>
<string name="nsu_iae_cannot_end_with">Nazwa hosta nie może kończyć się \"%s\"</string>
<string name="nsu_iae_cannot_end_with">Nazwa hosta nie może kończyć się na \"%s\"</string>
<string name="nsu_iae_cannot_contain">Nazwa hosta nie może zawierać \"%s\"</string>
<string name="nsu_iae_requires_conversion">Nazwa hosta \"%s\" wymaga konwersji do ASCII, ale biblioteka konwersji jest niedostępna w tej wersji Android. </string>
<string name="i2ptunnel_type_client">Standardowy klient</string>
@ -134,9 +143,11 @@
<string name="i2ptunnel_type_streamrclient">Klient Streamr</string>
<string name="i2ptunnel_type_streamrserver">Serwer Streamr</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="install_recommended_app">Zainstalować polecone aplikacje?</string>
<string name="app_needed_for_this_tunnel_type">Musisz zainstalować aplikację, aby użyć tego tunelu. Czy chcesz zainstalować tą aplikację?</string>
<string name="i2ptunnel_not_initialized">Tunele nie są jeszcze zainicjowane, proszę odświeżyć za dwie minuty.</string>
<string name="i2ptunnel_new_tunnel">Nowy tunel</string>
<string name="i2ptunnel_msg_config_saved">Zapisano zmiany konfiguracji</string>
<string name="i2ptunnel_msg_config_saved">Zmiany konfiguracji zostały zapisane</string>
<string name="i2ptunnel_msg_config_save_failed">Nie udało zapisać się konfiguracji</string>
<string name="i2ptunnel_msg_tunnel_starting">Uruchamianie tunelu</string>
<string name="i2ptunnel_msg_tunnel_stopping">Zatrzymanie tunelu</string>
@ -161,14 +172,13 @@
<string name="review">Przegląd</string>
<string name="enabled">Włączony</string>
<string name="i2ptunnel_wizard_desc_name">Nazwa tunelu dla identyfikacji w liście tuneli.</string>
<string name="i2ptunnel_wizard_desc_desc">Opis tunelu. Ta opcja jest nieobowiązkowa i wyłącznie służąca do celów informacyjnych.</string>
<string name="i2ptunnel_wizard_desc_dest">Wpisz przeznaczenie serwisu I2P z którym klient tunelu ma się połączyć. To może być pełna baza 64 przeznaczenia klucza, lub URL I2P z Twojej książki adresowej.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Jeśli znasz jakieś wychodzące proxy dla tego typu tunelów (HTTP lub SOCKS), to wpisz je. Oddziel proxy przecinkami.</string>
<string name="i2ptunnel_wizard_desc_target_host">To jest IP z którego Twój serwis jest uruchomiony, zazwyczaj jest to te same urządzenie więc 127.0.0.1 jest wpisane automatycznie.</string>
<string name="i2ptunnel_wizard_desc_desc">Opis tunelu. Ta opcja jest nieobowiązkowa i służąca wyłącznie do celów informacyjnych.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Jeśli znasz jakieś wychodzące proxy dla tego typu tunelów (HTTP lub SOCKS), to je wpisz. Serwery proxy oddziel przecinkami.</string>
<string name="i2ptunnel_wizard_desc_target_host">To jest IP na którym Twój serwis jest uruchomiony, zazwyczaj jest to te same urządzenie więc 127.0.0.1 jest wpisane automatycznie.</string>
<string name="i2ptunnel_wizard_desc_target_port">To jest port na którym Twój serwis akceptuje połączenia.</string>
<string name="i2ptunnel_wizard_desc_reachable_on">To limituje do czego komputery lub telefony mogą mięć dostęp w tunelu.</string>
<string name="i2ptunnel_wizard_desc_binding_port">To jest port z którego klient tunelu będzie miał dostęp lokalny. To jest także port klienta dla HTTP bidir serwera tunelu.</string>
<string name="i2ptunnel_wizard_desc_auto_start">Czy tunel powinien włączyć się automatycznie kiedy włączy się router?</string>
<string name="i2ptunnel_wizard_desc_reachable_on">To limituje do czego komputery lub telefony mogą mięć dostęp w tym tunelu.</string>
<string name="i2ptunnel_wizard_desc_binding_port">To jest port z którego klient tunelu będzie miał dostęp lokalnie. To jest także port klienta dla HTTP bidir serwera tunelu.</string>
<string name="i2ptunnel_wizard_desc_auto_start">Czy chcesz, aby tunel włączył się automatycznie kiedy uruchomi się router?</string>
<string name="i2ptunnel_wizard_submit_confirm_message">Utworzyć tunel?</string>
<string name="i2ptunnel_wizard_submit_confirm_button">Utwórz tunel</string>
<string name="i2ptunnel_view_type">Typ:</string>
@ -176,4 +186,11 @@
<string name="i2ptunnel_view_target">Cel:</string>
<string name="i2ptunnel_view_access_point">Punkt dostępu:</string>
<string name="i2ptunnel_view_autostart">Auto-start</string>
<string name="copy_logs">Kopiuj logi</string>
<string name="i2p_android_error_logs">Logi Błędów I2P Android</string>
<string name="i2p_android_logs">Logi Błędów I2P Android</string>
<string name="error_logs_copied_to_clipboard">Logi błędów zostały skopiowane do schowka</string>
<string name="logs_copied_to_clipboard">Logi zostały skopiowane do schowka</string>
<string name="label_browser_configuration">Konfiguracja przeglądarki</string>
<string name="unset">Odpisz</string>
</resources>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">Tuneis</string>
<string name="label_status">Estado</string>
<string name="label_addressbook">Livro de endereços</string>
<string name="label_i2ptunnel">TunelI2P</string>
<string name="label_i2ptunnel_client">Túneis clientes</string>
<string name="label_i2ptunnel_server">Túneis servidor</string>
<string name="label_logs">Registros</string>
@ -16,7 +15,7 @@
<string name="label_info_and_pages">Informações e paginas</string>
<string name="label_welcome_page">Página de boas-vindas</string>
<string name="label_news">Novidades</string>
<string name="label_peers_status">s</string>
<string name="label_peers_status">Pares</string>
<string name="label_release_notes">Comunicados de lançamento</string>
<string name="label_licenses">Licenças</string>
<string name="label_nonanon_info">Informação não-anônima</string>
@ -30,7 +29,7 @@
<string name="configure_browser_title">Configurar o navegador?</string>
<string name="configure_browser_for_i2p">Gostaria de configurar um navegador para visualizar sites da I2P? (Você pode também fazer isso depois a partir do menu ajuda.)</string>
<string name="first_start_title">Parabéns em instalar o I2P!</string>
<string name="first_start_welcome"><b>Bem-Vindo ao I2P!</b> Por favor <b> tenha paciência </b> enquanto o I2P inicia e procura por peers.</string>
<string name="first_start_welcome">&lt;b&gt;Seja bem-vindo!&lt;/b&gt; Por favor&lt;b&gt;, tenha paciência enquanto o roteador I2P inicia e procura por pares.</string>
<string name="first_start_read">Enquanto você está esperando, por favor leia as notas de lançamento e a página de boas vindas.</string>
<string name="first_start_faq">Uma vez que você tenha túneis clientes, por favor <b>verifique</b> nosso FAQ:</string>
<string name="first_start_faq_nonanon">Ou use esse link não-anonimo se você não deseja esperar por túneis:</string>
@ -54,7 +53,7 @@
<string name="stats_not_ready">O configurador de estatística não está pronto. Tente de novo mais tarde.</string>
<string name="netdb_routers_empty">Sem roteadores em seu NetDB.</string>
<string name="notification_status_bw">Largura de banda: %1$s KBps Down/ %2$s KBps up</string>
<string name="notification_status_peers">Peers: %1$d ativos, %2$d conhecidos</string>
<string name="notification_status_peers">Pares: %1$d ativos, %2$d conhecidos</string>
<string name="notification_status_expl">Túneis exploratórios: %1$d/%2$d</string>
<string name="notification_status_client">Túneis cliente: %1$d/%2$d</string>
<string name="menu_settings">Especificações</string>

View File

@ -1,46 +1,87 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">I2P</string>
<string name="welcome_new_install">Bem-vindo ao I2P! Este aplicativo é um software ALPHA e não proporciona um forte anonimato. Por favor, leia as notas de lançamento e informações de licença.</string>
<string name="desc_i2p_logo">Logótipo I2P</string>
<string name="welcome_new_install">Bem-vindo à I2P! Esta app é um programa ALPHA e não proporciona um anonimato forte. Por favor, leia as notas de lançamento e a informação da licença.</string>
<string name="welcome_new_version">Nova versão instalada. Por favor, leias as notas de lançamento. Versão:</string>
<string name="label_home">Início I2P</string>
<string name="label_addressbook">Endereços</string>
<string name="label_logs">Registros</string>
<string name="label_error_logs">Registros de Erros</string>
<string name="label_info_and_pages">Informação e páginas</string>
<string name="label_welcome_page">Página de boas vindas</string>
<string name="label_home">Controlos e Estado</string>
<string name="label_tunnels">Tuneis</string>
<string name="label_status">Estado</string>
<string name="label_addressbook">Livro de Endereços</string>
<string name="label_i2ptunnel_client">Tuneis cliente</string>
<string name="label_i2ptunnel_server">Tuneis servidor</string>
<string name="label_logs">Registos</string>
<string name="label_error_logs">Registos de Erros</string>
<string name="label_info_and_pages">Informação e Páginas</string>
<string name="label_welcome_page">Página de Boas-vindas</string>
<string name="label_news">Notícias</string>
<string name="label_news_status">Últimas Notícias do I2P</string>
<string name="label_peers_status">Pares</string>
<string name="label_release_notes">Notas da Versão</string>
<string name="label_release_notes">Notas de Lançamento</string>
<string name="label_licenses">Licenças</string>
<string name="label_nonanon_info">Informação não anônima</string>
<string name="label_nonanon_info">Informação Não Anónima</string>
<string name="label_browse">Explorar</string>
<string name="label_graphs">Gráficos</string>
<string name="button_router_off">Pressionar longo para iniciar I2P</string>
<string name="button_router_on">I2P está em execução (pressionar longo para para)</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="no_client_tunnels_running">Ainda nao estão a correr tenis de cliente</string>
<string name="configure_browser_title">Configurar navegador?</string>
<string name="configure_browser_for_i2p">Gostaria de configurar um browser para ver sites i2p? (podes fazer isso mais tarde através do menu de ajuda) </string>
<string name="first_start_title">Parabéns por ter instalado i2p!</string>
<string name="first_start_welcome"><b>Bem vindo ao i2p!</b> Por favor <b>Tenha paciencia</b> enquanto o I2P arranca e encontra peers.</string>
<string name="first_start_read">Enquanto espera, pode ler as notas de release e a pagina de boas vindas.</string>
<string name="drawer_open">Abrir navegador</string>
<string name="drawer_close">Fechar navegador</string>
<string name="action_search">Procurar</string>
<string name="action_add">Adicionar</string>
<string name="action_router_start">Iniciar Roteador</string>
<string name="action_router_stop">Parar Roteador</string>
<string name="action_edit">Editar</string>
<string name="action_delete">Apagar</string>
<string name="action_router_start">Iniciar Router</string>
<string name="action_router_stop">Parar Router</string>
<string name="action_i2ptunnel_start">começar túneis</string>
<string name="action_i2ptunnel_stop">Parar túneis </string>
<string name="action_i2ptunnel_start_all">Começar todos os túneis </string>
<string name="action_i2ptunnel_stop_all">Parar todos os túneis</string>
<string name="action_i2ptunnel_restart_all">Recomeçar todos os túneis </string>
<string name="action_reload">Recarregar</string>
<string name="action_refresh">Atualizar</string>
<string name="hint_search_addressbook">Procurar livro de endereços</string>
<string name="action_reload_subscriptions">Recarregar subscrições</string>
<string name="router_not_running">O router não está em execução.</string>
<string name="stats_not_ready">O gestor de estatísticas ainda não está pronto. Tente de novo mais tarde.</string>
<string name="configure_graphs">Configurar gráficos</string>
<string name="graphs_not_ready">Os gráficos não estão prontos, ou o router não está em execução. Tente de novo mais tarde.</string>
<string name="menu_settings">Configurações</string>
<string name="settings_enable">Habilitar</string>
<string name="settings_desc_subscriptions">Subscrição de URLs</string>
<string name="settings_label_bandwidth">Largura de banda e rede</string>
<string name="settings_enable">Ativar</string>
<string name="settings_desc_subscriptions">URLs de Subscrição</string>
<string name="settings_label_startOnBoot">Iniciar I2P no Arranque</string>
<string name="settings_label_bandwidth">Largura de Banda</string>
<string name="settings_label_bw_inbound">Velocidade de entrada</string>
<string name="settings_desc_bw_inbound">Máxima velocidade de entrada</string>
<string name="settings_desc_bw_inbound">Velocidade de entrada máxima</string>
<string name="settings_label_bw_outbound">Velocidade de saída</string>
<string name="settings_desc_bw_outbound">Máxima velocidade de saída</string>
<string name="settings_desc_bw_outbound">Velocidade de saída máxima</string>
<string name="settings_label_network">Rede</string>
<string name="settings_label_hiddenMode">Participação</string>
<string name="settings_desc_hiddenMode">Desligar modo escondido</string>
<string name="settings_label_maxPartTunnels">Nº máximo de túneis participantes</string>
<string name="settings_desc_maxPartTunnels">Máximo de túneis para participar (padrão=20)</string>
<string name="settings_dialog_maxPartTunnels">Máximo de túneis para participar</string>
<string name="settings_label_sharePercent">Percentagem de compartilhamento</string>
<string name="settings_desc_sharePercent">Percentagem de largura de banda para compartilhar (padrão=80)</string>
<string name="settings_dialog_sharePercent">Percentagem de largura de banda compartilhada</string>
<string name="settings_desc_upnp">Abrir portas do firewall automaticamente</string>
<string name="settings_desc_hiddenMode">Desative o modo de ocultar</string>
<string name="settings_label_maxPartTunnels">Nr. máximo de túneis participantes</string>
<string name="settings_desc_maxPartTunnels">Nr. máximo de túneis para participar (predefinição=20)</string>
<string name="settings_dialog_maxPartTunnels">Nr. máximo de túneis para participar em</string>
<string name="settings_label_sharePercent">Percentagem de Partilhar</string>
<string name="settings_desc_sharePercent">Percentagem da largura de banda para partilhar (predefinição=80)</string>
<string name="settings_dialog_sharePercent">Percentagem da largura de banda para partilhar</string>
<string name="settings_desc_upnp">Abrir automaticamente as portas da firewall</string>
<string name="settings_label_logging">Registo de Eventos</string>
<string name="settings_label_default_log_level">Nível de registo predefinido</string>
<string name="settings_label_advanced">Avançado</string>
<string name="settings_label_showStats">Estatísticas do Router</string>
<string name="settings_summ_showStats">Mostrar estatísticas avançadas na consola principal </string>
<string name="settings_label_transports">Transportes</string>
<string name="settings_label_maxConns">Máx. nº de conexões</string>
<string name="settings_label_maxConns">Nr. máx. de ligações</string>
<string name="settings_label_i2cp">Interface I2CP</string>
<string name="settings_desc_i2cp">Escutando na porta 7654</string>
<string name="settings_desc_i2cp">Escutar na porta 7654</string>
<string name="settings_label_exploratory_pool">Poço exploratório</string>
<string name="settings_desc_exploratory_pool">Parâmetros dos túneis</string>
<string name="settings_label_expl_inbound">Túneis de entrada</string>
@ -48,9 +89,70 @@
<string name="settings_label_expl_length">Duração</string>
<string name="settings_desc_expl_length">Quantos saltos usar</string>
<string name="settings_label_expl_lengthVariance">Variação de saltos</string>
<string name="settings_summ_expl_lengthVariance">%s</string>
<string name="settings_desc_expl_lengthVariance">Quantos saltos adicionar aleatoriamente</string>
<string name="settings_label_expl_quantity">Quantidade</string>
<string name="settings_desc_expl_quantity">Quantos túneis</string>
<string name="settings_label_expl_backupQuantity">Quantidade tuneis de reserva</string>
<string name="settings_desc_expl_backupQuantity">Quantos túneis de reserva</string>
<string name="settings_router_restart_required">Por favor reiniciar I2p para aplicar as mudanças </string>
<string name="menu_about">Sobre</string>
<string name="about_version">Versão:</string>
<string name="about_project">Página do Projeto:</string>
<string name="about_bugs">Erros e Suporte</string>
<string name="about_helpwanted">Preciso de Ajuda!</string>
<string name="about_volunteer">Queres tornar a aplicação melhor? Voluntariar-te no fórum do Android </string>
<string name="menu_help">Ajuda</string>
<string name="general">Geral</string>
<string name="addressbook_add_wizard_k_name">Nome</string>
<string name="addressbook_add_wizard_k_destination">Destino</string>
<string name="addressbook_add_wizard_desc_name">O nome</string>
<string name="i2ptunnel_type_client">Cliente Padrão</string>
<string name="i2ptunnel_type_httpclient">Cliente HTTP</string>
<string name="i2ptunnel_type_ircclient">Cliente IRC</string>
<string name="i2ptunnel_type_server">Servidor Padrão</string>
<string name="i2ptunnel_type_httpserver">Servidor HTTP</string>
<string name="i2ptunnel_type_ircserver">Servidor IRC</string>
<string name="install_recommended_app">Instalar a app recomendada?</string>
<string name="i2ptunnel_new_tunnel">Novo túnel </string>
<string name="i2ptunnel_msg_config_saved">Alterações das configurações salvadas</string>
<string name="i2ptunnel_msg_config_save_failed">Falhou gravação da configuração</string>
<string name="i2ptunnel_msg_tunnel_starting">Começando túnel </string>
<string name="i2ptunnel_msg_tunnel_stopping">Parar túnel</string>
<string name="i2ptunnel_delete_confirm_message">Apagar túnel?</string>
<string name="i2ptunnel_delete_confirm_button">Apagar túnel </string>
<string name="i2ptunnel_wizard_k_client_server">Cliente ou Servidor</string>
<string name="i2ptunnel_wizard_v_client">Túnel de cliente </string>
<string name="i2ptunnel_wizard_v_server">Túnel de servidor </string>
<string name="i2ptunnel_wizard_k_type">Tipo de túnel </string>
<string name="i2ptunnel_wizard_k_name">Nome</string>
<string name="i2ptunnel_wizard_k_desc">Descrição</string>
<string name="i2ptunnel_wizard_k_dest">Destino</string>
<string name="i2ptunnel_wizard_k_outproxies">Proxys de saída </string>
<string name="i2ptunnel_wizard_k_target_host">Hospedeiro de Destino</string>
<string name="i2ptunnel_wizard_k_target_port">Porta de Destino</string>
<string name="i2ptunnel_wizard_k_auto_start">Iniciar Automático</string>
<string name="next">Seguinte</string>
<string name="prev">Anterior</string>
<string name="finish">Submeter</string>
<string name="review">Rever</string>
<string name="enabled">Ativado</string>
<string name="i2ptunnel_view_type">Tipo:</string>
<string name="i2ptunnel_view_desc">Descrição:</string>
<string name="i2ptunnel_view_target">Destino:</string>
<string name="i2ptunnel_view_access_point">Ponto de acesso:</string>
<string name="i2ptunnel_view_autostart">Iniciar-Automático</string>
<string name="edit_tunnel">Alterar túnel </string>
<string name="name">Nome</string>
<string name="description">Descrição </string>
<string name="auto_start">Começar automaticamente </string>
<string name="tunnel_summ_auto_start">Começar o túnel quando o router começar </string>
<string name="tunnel_cat_ports">Portas locais</string>
<string name="shared_client">Clientes partilhados </string>
<string name="copy_logs">Copiar registos</string>
<string name="i2p_android_error_logs">Registos de Erro I2P Android</string>
<string name="i2p_android_logs">Registos I2P Android</string>
<string name="error_logs_copied_to_clipboard">Registos de erro copiados para a área de transferência</string>
<string name="logs_copied_to_clipboard">Registos copiados para a área de transferência</string>
<string name="label_browser_configuration">Configuração do Navegador</string>
</resources>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">Tuneluri</string>
<string name="label_status">Stare</string>
<string name="label_addressbook">Agendă</string>
<string name="label_i2ptunnel">Tunel I2P</string>
<string name="label_i2ptunnel_client">Tuneluri clienti</string>
<string name="label_i2ptunnel_server">Tuneluri server</string>
<string name="label_logs">Jurnale</string>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">Туннели</string>
<string name="label_status">Статус</string>
<string name="label_addressbook">Адресная книга</string>
<string name="label_i2ptunnel">I2PTunnel</string>
<string name="label_i2ptunnel_client">Туннели клиента</string>
<string name="label_i2ptunnel_server">Туннели сервера</string>
<string name="label_logs">Журналы</string>
@ -69,6 +68,8 @@
<string name="settings_enable">Включить</string>
<string name="settings_desc_subscriptions">Подписки на URL</string>
<string name="settings_label_bandwidth_net">Пропускная способность и сеть</string>
<string name="settings_label_startOnBoot">Автозапуск I2P </string>
<string name="settings_desc_startOnBoot">Автоматически соединяться с I2P при старте Android</string>
<string name="settings_label_bandwidth">Пропускная способность</string>
<string name="settings_label_bw_inbound">Входящая скорость</string>
<string name="settings_desc_bw_inbound">Максимальная входящая скорость</string>
@ -109,6 +110,7 @@
<string name="settings_label_expl_backupQuantity">Резервное количество</string>
<string name="settings_summ_expl_backupQuantity">%s туннелей</string>
<string name="settings_desc_expl_backupQuantity"> Сколько туннелей резервировать</string>
<string name="settings_need_transport_enabled">Необходимо разрешить хотя бы один транспортный протокол</string>
<string name="settings_router_restart_required">Пожалуйста, перезапустите I2P, чтобы изменения вступили в силу</string>
<string name="menu_about">О приложении</string>
<string name="about_version">Версия:</string>
@ -141,6 +143,8 @@
<string name="i2ptunnel_type_streamrclient">Streamr клиент</string>
<string name="i2ptunnel_type_streamrserver">Streamr сервер</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="install_recommended_app">Установить рекомендованное приложение?</string>
<string name="app_needed_for_this_tunnel_type">Требуется установить приложение для использования этого туннеля. Хотите установить рекомендованное приложение?</string>
<string name="i2ptunnel_not_initialized">Туннели еще не инициализированы, пожалуйста, обновите через пару минут</string>
<string name="i2ptunnel_new_tunnel">Создать туннель</string>
<string name="i2ptunnel_msg_config_saved">Изменения конфигурации сохранены</string>
@ -169,7 +173,6 @@
<string name="enabled">Включить</string>
<string name="i2ptunnel_wizard_desc_name">Имя туннеля для идентификации в списке туннелей.</string>
<string name="i2ptunnel_wizard_desc_desc">Описание туннеля. Заполнять не обязательно.</string>
<string name="i2ptunnel_wizard_desc_dest">Впишите пункт назначения I2P сервиса, к которому должен подключаться этот туннель. Это может быть base 64 ключ назначения или I2P URL из вашей адресной книги.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Если вам известны любые внешние прокси для этого типа туннеля (как HTTP, так и SOCKS), впишите их. Несколько прокси перечисляются через запятую.</string>
<string name="i2ptunnel_wizard_desc_target_host">Это IP, на котором запущен ваш сервис, обычно он находится на том же устройстве, так что 127.0.0.1 заполняется автоматически.</string>
<string name="i2ptunnel_wizard_desc_target_port">Это порт, на котором сервис принимает подключения.</string>
@ -189,4 +192,5 @@
<string name="error_logs_copied_to_clipboard">Журнал ошибок скопирован в буфер</string>
<string name="logs_copied_to_clipboard">Журналы скопированы в буфер</string>
<string name="label_browser_configuration">Настройки браузера</string>
<string name="unset">Отменить</string>
</resources>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">Tunely</string>
<string name="label_status">Stav</string>
<string name="label_addressbook">Adresár</string>
<string name="label_i2ptunnel">I2PTunnel</string>
<string name="label_i2ptunnel_client">Klientské tunely</string>
<string name="label_i2ptunnel_server">Serverové tunely</string>
<string name="label_logs">Logy</string>
@ -160,7 +159,6 @@
<string name="enabled">Povolené</string>
<string name="i2ptunnel_wizard_desc_name">Názov tunela, pre identifikáciu v zozname tunelov.</string>
<string name="i2ptunnel_wizard_desc_desc">Popis tunela. Toto je voliteľné a čisto len informatívne.</string>
<string name="i2ptunnel_wizard_desc_dest">Typ služby na I2P cieli, ku ktorej by sa tento klientský tunel mal pripojiť. Môže to byť plný základný cieľový kľúč 64 alebo I2P URL z vášho adresára.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Ak poznáte nejaké východzie proxy pre tento typ tunela (buď HTTP alebo SOCKS), zadajte ich sem. Viacero proxy oddeľte čiarkami.</string>
<string name="i2ptunnel_wizard_desc_target_host">Toto je IP, na ktorej je spustená vaša služba, zväčša to býva na rovnakom zariadení, takže je automaticky vyplnená 127.0.0.1.</string>
<string name="i2ptunnel_wizard_desc_target_port">Toto je na port, na ktorom služba prijíma pripojenia.</string>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">Tunelet</string>
<string name="label_status">Statusi</string>
<string name="label_addressbook">Libri i adresave. </string>
<string name="label_i2ptunnel">Tuneli i I2P\'së</string>
<string name="label_i2ptunnel_client">Tunelet e klientëve</string>
<string name="label_i2ptunnel_server">Tunelet e Serverave. </string>
<string name="label_logs">Logot</string>
@ -162,7 +161,6 @@
<string name="enabled">I/e mundësuar</string>
<string name="i2ptunnel_wizard_desc_name">Emri i tunelit, për identifikim në listën e tuneleve.</string>
<string name="i2ptunnel_wizard_desc_desc">Një përshkrim i tunelit. Kjo është opcionale dhe vetëm informative.</string>
<string name="i2ptunnel_wizard_desc_dest">Shtype destinacionin e shërbimit të I2P\'së ku ky tunel i klientëve duhet të lidhet. Kjo mund të jetë baza e plotë 64 e qelësit së destinacionit, ose një URL i I2P\'së nga libri i adresave. </string>
<string name="i2ptunnel_wizard_desc_outproxies">Nëse keni njohuri për ndonjë outproksë për këtë lloj tuneli (ja HTTP ose SOCKS), plotësoni. Proksa të veqantë dhe shumëfishtë med presje.</string>
<string name="i2ptunnel_wizard_desc_target_host">Kjo është IP\'ja ku shërbimi juaj është duke punuar, kjo është në të njëjtin kompjuter kështu që 127.0.0.1 është vetëmbushur. </string>
<string name="i2ptunnel_wizard_desc_target_port">Kjo është portalja ku shërbimi pranon lidhjet. </string>

View File

@ -10,7 +10,6 @@
<string name="label_info_and_pages">Information och sidor</string>
<string name="label_welcome_page">Välkomstsida</string>
<string name="label_news">Nyheter</string>
<string name="label_news_status">Senaste I2P nyheterna</string>
<string name="label_peers_status">Peers</string>
<string name="label_release_notes">Releasekommentarer</string>
<string name="label_licenses">Licenser</string>

View File

@ -10,7 +10,6 @@
<string name="label_info_and_pages">Bilgiler ve sayfalar</string>
<string name="label_welcome_page">Karşılama Sayfası</string>
<string name="label_news">Haberler</string>
<string name="label_news_status">Son I2P Haberleri</string>
<string name="label_peers_status">Eşler</string>
<string name="label_release_notes">Yayım Notları</string>
<string name="label_licenses">Lisanslar</string>

View File

@ -0,0 +1,184 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">Логотип I2P</string>
<string name="welcome_new_install">Ласкаво просимо до I2P! Ця програма є альфа версією і вона не забезпечує анонімність. Будь ласка, прочитайте примітки до випуску та інформацію про ліцензії.</string>
<string name="welcome_new_version">Встановлено нову версія. Будь ласка, прочитайте примітки до випуску. Версія:</string>
<string name="label_home">Управління і Статус</string>
<string name="label_tunnels">Тунелі</string>
<string name="label_status">Статус</string>
<string name="label_addressbook">Адресна книга</string>
<string name="label_i2ptunnel_client">Клієнтські тунелі</string>
<string name="label_i2ptunnel_server">Серверні тунелі</string>
<string name="label_logs">Журнали</string>
<string name="label_error_logs">Журнали помилок</string>
<string name="label_info_and_pages">Інформація і сторінки</string>
<string name="label_welcome_page">Початкова сторінка</string>
<string name="label_news">Новини</string>
<string name="label_peers_status">Піри</string>
<string name="label_release_notes">Примітки до випуску</string>
<string name="label_licenses">Ліцензії</string>
<string name="label_nonanon_info">Не анонімна інформація</string>
<string name="label_graphs">Графіки</string>
<string name="button_router_off">Утримуйте щоб запустити I2P</string>
<string name="button_router_on">I2P працює (утримуйте, щоб зупинити)</string>
<string name="button_shutdown_now">Утримуйте, щоб зупинити</string>
<string name="button_cancel_graceful">Утримуйте, щоб скасувати зупинку</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="no_client_tunnels_running">Клієнтських тунелів ще немає.</string>
<string name="configure_browser_title">Налаштувати браузер?</string>
<string name="configure_browser_for_i2p">Бажаєте налаштувати браузер для перегляду I2P-сайтів? (Ви також можете зробити це пізніше через меню).</string>
<string name="first_start_title">Вітаємо! I2P встановлено.</string>
<string name="first_start_welcome"><b>Ласкаво просимо до I2P!</b> Будь ласка, <b>зачекайте,</b> так як I2P запускається і шукає піри.</string>
<string name="first_start_read">Поки чекаєте, прочитайте, будь ласка, нотатки до релізу і вітальну сторінку.</string>
<string name="first_start_faq">Як тільки будуть клієнтські тунелі, будь ласка, <b>прочитайте</b> наш FAQ:</string>
<string name="first_start_faq_nonanon">Або використайте це не-анонімне посилання, якщо не бажаєте чекати на тунелі:</string>
<string name="first_start_irc">Налаштуйте ваш IRC клієнт на <b>localhost:6668</b> і скажіть нам \"hello world\":</string>
<string name="action_search">Пошук</string>
<string name="action_add">Додати</string>
<string name="action_edit">Правка</string>
<string name="action_delete">Видалити</string>
<string name="action_router_start">Запустити роутер</string>
<string name="action_router_stop">Зупинити роутер</string>
<string name="action_i2ptunnel_start">Запустити тунель</string>
<string name="action_i2ptunnel_stop">Зупинити тунель</string>
<string name="action_i2ptunnel_start_all">Запустити всі тунелі</string>
<string name="action_i2ptunnel_stop_all">Зупинити всі тунелі</string>
<string name="action_i2ptunnel_restart_all">Перезапустити всі тунелі</string>
<string name="action_reload">Перезавантажити</string>
<string name="action_refresh">Оновити</string>
<string name="hint_search_addressbook">Пошук по адресній книзі</string>
<string name="router_not_running">Роутер не запущено</string>
<string name="netdb_routers_empty">Немає роутерів у вашій NetDB.</string>
<string name="notification_status_peers">Піри: %1$d активно, %2$d відомо</string>
<string name="notification_status_client">Клієнтські тунелі: %1$d/%2$d</string>
<string name="menu_settings">Налаштування</string>
<string name="settings_enable">Увімкнути</string>
<string name="settings_desc_subscriptions">Підписка на URL-и</string>
<string name="settings_label_startOnBoot">Запускати I2P при завантаженні пристрою</string>
<string name="settings_desc_startOnBoot">Автоматично запускати роутер, коли ваш пристрій Android вмикається</string>
<string name="settings_label_bandwidth">Ширина смуги пропускання</string>
<string name="settings_label_bw_inbound">Вхідна швидкість</string>
<string name="settings_desc_bw_inbound">Максимальна вхідна швидкість</string>
<string name="settings_label_bw_outbound">Вихідна швидкість</string>
<string name="settings_desc_bw_outbound">Максимальна вихідна швидкість</string>
<string name="settings_label_network">Мережа</string>
<string name="settings_desc_hiddenMode">Вимкнути прихований режим</string>
<string name="settings_label_default_log_level">Стандартний рівень логування</string>
<string name="settings_label_advanced">Розширені</string>
<string name="settings_label_showStats">Статистика роутера</string>
<string name="settings_summ_showStats">Показувати розширену статистику в головній консолі</string>
<string name="settings_label_maxConns">Максимально з’єднань</string>
<string name="settings_label_i2cp">Інтерфейс I2CP</string>
<string name="settings_desc_exploratory_pool">Параметри тунелів</string>
<string name="settings_label_expl_inbound">Вхідні тунелі</string>
<string name="settings_label_expl_outbound">Вихідні тунелі</string>
<string name="settings_label_expl_length">Довжина</string>
<string name="settings_summ_expl_length">%s хопів</string>
<string name="settings_desc_expl_length">Скільки хопів використовувати</string>
<string name="settings_summ_expl_lengthVariance">%s</string>
<string name="settings_desc_expl_lengthVariance">Скільки хопів випадково додавати</string>
<string name="settings_summ_expl_quantity">%s тунелів</string>
<string name="settings_desc_expl_quantity">Скільки тунелів</string>
<string name="settings_summ_expl_backupQuantity">%s тунелів</string>
<string name="menu_about">Про</string>
<string name="about_version">Версія:</string>
<string name="about_bugs">Неполадки і підтримка:</string>
<string name="menu_help">Допомога</string>
<string name="general">Головне</string>
<string name="addressbook_search_header">%s знайдено</string>
<string name="addressbook_add_wizard_k_name">Назва</string>
<string name="addressbook_add_wizard_k_destination">Призначення</string>
<string name="addressbook_add_wizard_desc_name">Назва</string>
<string name="nsu_iae_cannot_start_with">Назва хосту не може починатися з \"%s\"</string>
<string name="nsu_iae_cannot_end_with">Назва хосту не поже закінчуватися на \"%s\"</string>
<string name="nsu_iae_cannot_contain">Назва хосту не може містити \"%s\"</string>
<string name="i2ptunnel_type_client">Стандартний клієнт</string>
<string name="i2ptunnel_type_httpclient">Клієнт HTTP</string>
<string name="i2ptunnel_type_ircclient">Клієнт IRC</string>
<string name="i2ptunnel_type_server">Стандартний серер</string>
<string name="i2ptunnel_type_httpserver">HTTP сервер</string>
<string name="i2ptunnel_type_sockstunnel">SOCKS 4/4a/5 проксі</string>
<string name="i2ptunnel_type_socksirctunnel">SOCKS IRC проксі</string>
<string name="i2ptunnel_type_connectclient">CONNECT/SSL/HTTPS проксі</string>
<string name="i2ptunnel_type_ircserver">IRC сервер</string>
<string name="i2ptunnel_type_streamrclient">Streamr клієнт</string>
<string name="i2ptunnel_type_streamrserver">Streamr сервер</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="install_recommended_app">Встановити рекомендований додаток?</string>
<string name="i2ptunnel_not_initialized">Тунелі ще неініціалізовані, будь ласка, перезавантажте через дві хвилини.</string>
<string name="i2ptunnel_new_tunnel">Новий тунель</string>
<string name="i2ptunnel_msg_config_saved">Зміни конфігурації збережені</string>
<string name="i2ptunnel_msg_config_save_failed">Не вдалося зберегти конфігурацію</string>
<string name="i2ptunnel_msg_tunnel_starting">Запуск тунелю</string>
<string name="i2ptunnel_msg_tunnel_stopping">Зупинка тунель</string>
<string name="i2ptunnel_delete_confirm_message">Видалити тунель?</string>
<string name="i2ptunnel_delete_confirm_button">Видалити тунель</string>
<string name="i2ptunnel_wizard_k_client_server">Клієнт або Сервер</string>
<string name="i2ptunnel_wizard_v_client">Клієнтський тунель</string>
<string name="i2ptunnel_wizard_v_server">Серверний тунель</string>
<string name="i2ptunnel_wizard_k_type">Тип тунель</string>
<string name="i2ptunnel_wizard_k_name">Назва</string>
<string name="i2ptunnel_wizard_k_desc">Опис</string>
<string name="i2ptunnel_wizard_k_dest">Призначення</string>
<string name="i2ptunnel_wizard_k_outproxies">Вихідні проксі</string>
<string name="i2ptunnel_wizard_k_target_host">Цільовий хост</string>
<string name="i2ptunnel_wizard_k_target_port">Цільовий порт</string>
<string name="i2ptunnel_wizard_k_auto_start">Запускати автоматично</string>
<string name="next">Наступний</string>
<string name="prev">Попередній</string>
<string name="review">Переглянути</string>
<string name="enabled">Увімкнено</string>
<string name="i2ptunnel_wizard_desc_target_host">Це IP-адреса, на якій сервіс працює. Зазвичай така сама, як у машини, тому 127.0.0.1 введено автоматично.</string>
<string name="i2ptunnel_wizard_desc_target_port">Це порт, на який сервіс приймає з’єднання.</string>
<string name="i2ptunnel_wizard_submit_confirm_message">Створити тунель?</string>
<string name="i2ptunnel_wizard_submit_confirm_button">Створити тунель</string>
<string name="i2ptunnel_view_type">Тип:</string>
<string name="i2ptunnel_view_desc">Опис:</string>
<string name="i2ptunnel_view_target">Ціль:</string>
<string name="i2ptunnel_view_access_point">Точка доступу:</string>
<string name="i2ptunnel_view_autostart">Автозапуск</string>
<string name="edit_tunnel">Редагувати тунель</string>
<string name="name">Назва</string>
<string name="description">Опис</string>
<string name="auto_start">Автозапуск</string>
<string name="tunnel_summ_auto_start">Запускати тунель, коли запускається роутер.</string>
<string name="tunnel_cat_ports">Локальні порти</string>
<string name="outproxies">Вихідні проксі</string>
<string name="ssl_outproxies">Вихідні проксі SSL</string>
<string name="irc">IRC</string>
<string name="target_host">Цільовий хост</string>
<string name="target_port">Цільовий порт</string>
<string name="tunnel_parameters">Параметри тунелю</string>
<string name="delay_connect">Затримка з’єднання</string>
<string name="connections_per_minute">З’єднань за хвилину</string>
<string name="connections_per_hour">З’єднань за годину</string>
<string name="connections_per_day">З’єднань за день</string>
<string name="num_per_minute">%s за хвилину</string>
<string name="num_per_hour">%s за годину</string>
<string name="num_per_day">%s за день</string>
<string name="unlimited">Необмежено</string>
<string name="set_zero_for_unlimited">Встановіть 0 для необмеженого</string>
<string name="power_saving">Енергозбереження</string>
<string name="reduce_quantity">Зменшувати кількість</string>
<string name="num_minutes">%s хвилин</string>
<string name="close_tunnels">Закривати тунелі при бездіяльності</string>
<string name="new_keys_on_reopen">Нові ключі при перевідкритті</string>
<string name="http_client">HTTP клієнт</string>
<string name="tunnel_summ_user_agent">Пропускати заголовок User-Agent</string>
<string name="tunnel_summ_referer">Пропускати заголовок Referer</string>
<string name="tunnel_summ_accept">Пропускати заголовок Accept</string>
<string name="proxy_auth">Авторизація в проксі</string>
<string name="tunnel_summ_proxy_auth">Потрібен вхід для використання цього проксі</string>
<string name="username">Ім’я користувача</string>
<string name="password">Пароль</string>
<string name="outproxy_auth">Авторизація у вихідному проксі</string>
<string name="other">Інше</string>
<string name="signature_type">Тип підпису</string>
<string name="copy_logs">Скопіювати логи</string>
<string name="i2p_android_logs">Логи Android I2P</string>
<string name="error_logs_copied_to_clipboard">Логи з помилками скопійовані у буфер обміну</string>
<string name="logs_copied_to_clipboard">Логи скопійовані у буфер обміну</string>
<string name="label_browser_configuration">Налаштування браузера</string>
</resources>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="WizardPageTitle" parent="WizardPageTitleBase">
<item name="android:paddingLeft">?android:attr/listPreferredItemPaddingLeft</item>
</style>
</resources>

View File

@ -10,7 +10,6 @@
<string name="label_info_and_pages">Tin tức và trang tin</string>
<string name="label_welcome_page">Trang chào mừng</string>
<string name="label_news">Tin tức</string>
<string name="label_news_status">Thông tin mới nhất về I2P</string>
<string name="label_peers_status">Mạng ngang hàng</string>
<string name="label_release_notes">Ghi chú phát hành</string>
<string name="label_licenses">Giấy phép</string>

View File

@ -8,7 +8,6 @@
<string name="label_tunnels">隧道</string>
<string name="label_status">状态</string>
<string name="label_addressbook">地址簿</string>
<string name="label_i2ptunnel">I2PTunnel</string>
<string name="label_i2ptunnel_client">客户隧道</string>
<string name="label_i2ptunnel_server">服务隧道</string>
<string name="label_logs">日志</string>
@ -24,6 +23,9 @@
<string name="label_graphs"></string>
<string name="button_router_off">长按启动I2P</string>
<string name="button_router_on">I2P 正在运行(长按停止)</string>
<string name="button_router_graceful">I2P 将在 %s 后关闭</string>
<string name="button_shutdown_now">长按停止</string>
<string name="button_cancel_graceful">长按取消关闭</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
@ -69,6 +71,8 @@
<string name="settings_enable">启用</string>
<string name="settings_desc_subscriptions">订阅链接</string>
<string name="settings_label_bandwidth_net">带宽和网络</string>
<string name="settings_label_startOnBoot">启动时启动 I2P</string>
<string name="settings_desc_startOnBoot">在您的 Android 设备启动时自动连接到 I2P</string>
<string name="settings_label_bandwidth">带宽</string>
<string name="settings_label_bw_inbound">入站速度</string>
<string name="settings_desc_bw_inbound">最大入站速度</string>
@ -109,6 +113,7 @@
<string name="settings_label_expl_backupQuantity">备用数量</string>
<string name="settings_summ_expl_backupQuantity">%s 隧道</string>
<string name="settings_desc_expl_backupQuantity">备用隧道数量</string>
<string name="settings_need_transport_enabled">您必须启用至少一个传输</string>
<string name="settings_router_restart_required">请重新启动 I2P 以应用此更改</string>
<string name="menu_about">关于</string>
<string name="about_version">版本:</string>
@ -141,6 +146,8 @@
<string name="i2ptunnel_type_streamrclient">Streamr 客戶端</string>
<string name="i2ptunnel_type_streamrserver">Streamr 服务器</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="install_recommended_app">安装推荐的应用?</string>
<string name="app_needed_for_this_tunnel_type">您需要安装一个应用以使用此隧道。您想安装推荐的应用吗?</string>
<string name="i2ptunnel_not_initialized">隧道未初始化完成, 请在两分钟后重新加载.</string>
<string name="i2ptunnel_new_tunnel">新隧道</string>
<string name="i2ptunnel_msg_config_saved">配置更改已保存</string>
@ -169,7 +176,7 @@
<string name="enabled">已启用</string>
<string name="i2ptunnel_wizard_desc_name">隧道的名称,是隧道列表中标识.</string>
<string name="i2ptunnel_wizard_desc_desc">隧道的描述。这是可选的,纯粹提供信息的.</string>
<string name="i2ptunnel_wizard_desc_dest">入这个客户端隧道应该连接到该服务的 I2P 目的地. 这可是完整的 base 64 目的地密钥您地址簿中的 I2P URL .</string>
<string name="i2ptunnel_wizard_desc_dest">入这个客户端隧道应该连接到该服务的 I2P 目的地这可是完整的 base 64 目的地密钥,或者您地址簿中的 I2P 主机名。</string>
<string name="i2ptunnel_wizard_desc_outproxies">如果你知道任何这种类型隧道(HTTP或SOCKS)的outproxies,填入它们.用逗号分隔多个代理服务器.</string>
<string name="i2ptunnel_wizard_desc_target_host">这是您正在运行的服务所在的IP这通常是在同一台机器上所以127.0.0.1 是自动填写的.</string>
<string name="i2ptunnel_wizard_desc_target_port">这是这项服务接受连接的端口.</string>
@ -183,10 +190,94 @@
<string name="i2ptunnel_view_target">目标:</string>
<string name="i2ptunnel_view_access_point">接入点:</string>
<string name="i2ptunnel_view_autostart">自动启动</string>
<string name="edit_tunnel">编辑隧道</string>
<string name="name">名称</string>
<string name="description">描述</string>
<string name="auto_start">自动启动</string>
<string name="tunnel_summ_auto_start">路由器启动时自动启动此隧道。</string>
<string name="tunnel_cat_ports">本地端口</string>
<string name="shared_client">共享客户端</string>
<string name="tunnel_summ_shared_client">使用相同的目的地和隧道为其他客户端共享</string>
<string name="target_destination">目标目的地</string>
<string name="persistent_key">持久密钥</string>
<string name="tunnel_summ_persistent_key">它重启时保持此隧道的目的地</string>
<string name="reachable_on">可访问到在</string>
<string name="listen_port">监听端口</string>
<string name="client_ssl">客户端 SSL</string>
<string name="tunnel_summ_client_ssl">客户端必须使用 SSL 连接</string>
<string name="outproxies">代理出口</string>
<string name="ssl_outproxies">SSL 出口代理</string>
<string name="irc">IRC</string>
<string name="enable_dcc">启用 DCC</string>
<string name="tunnel_summ_enable_dcc">允许 IRC 客户端使用 DCC</string>
<string name="website_domain_name">网站域名</string>
<string name="target_host">目标主机</string>
<string name="target_port">目标端口</string>
<string name="use_ssl">使用 SSL</string>
<string name="tunnel_summ_use_ssl">使用 SSL 连接目标</string>
<string name="tunnel_parameters">隧道参数</string>
<string name="profile">配置文件</string>
<string name="delay_connect">延迟连接</string>
<string name="tunnel_summ_delay_connect">对请求/响应连接启用</string>
<string name="access_control">访问控制</string>
<string name="restricted_access">访问受限</string>
<string name="access_list">访问列表</string>
<string name="reject_inproxies">拒绝代理访问</string>
<string name="tunnel_summ_reject_inproxies">只允许 I2P 用户连接</string>
<string name="unique_local">唯一本地</string>
<string name="tunnel_summ_unique_local">使用唯一的本地 IP 对每个客户端</string>
<string name="multihome">多宿主</string>
<string name="tunnel_summ_multihome">启用多宿主优化</string>
<string name="client_connection_limits">客户端连接数限制</string>
<string name="connections_per_minute">每分钟连接数</string>
<string name="connections_per_hour">每小时连接数</string>
<string name="connections_per_day">每天连接数</string>
<string name="total_connection_limits">总连接数限制</string>
<string name="total_connections_per_minute">总连接数每分钟</string>
<string name="total_connections_per_hour">总连接数每小时</string>
<string name="total_connections_per_day">总连接数每天</string>
<string name="max_active_connections">最大活动连接数</string>
<string name="num_per_minute">%s 每分钟</string>
<string name="num_per_hour">%s 每小时</string>
<string name="num_per_day">%s 每天</string>
<string name="unlimited">无限制</string>
<string name="set_zero_for_unlimited">设置 0 表示无限制</string>
<string name="post_limits">POST 限制</string>
<string name="limit_period">限制周期</string>
<string name="client_posts_per_period">客户端 POST 数量每个周期</string>
<string name="client_ban_length">客户端封禁长度</string>
<string name="total_posts_per_period">POST 总数每个周期</string>
<string name="total_ban_length">总计封禁长度</string>
<string name="power_saving">省电</string>
<string name="delay_open">延迟打开</string>
<string name="tunnel_summ_delay_open">延迟隧道打开,直到请求</string>
<string name="reduce_quantity">减少数量</string>
<string name="tunnel_summ_reduce_quantity">减少隧道数量在空闲时</string>
<string name="idle_time">闲置时间</string>
<string name="num_minutes">%s 分钟</string>
<string name="reduced_tunnel_quantity">减少隧道数量</string>
<string name="close_tunnels">关闭隧道在闲置时</string>
<string name="new_keys_on_reopen">新建密钥在重新打开时</string>
<string name="http_client">HTTP 客户端</string>
<string name="tunnel_summ_user_agent">传递 \'User-Agent\' 头通过</string>
<string name="tunnel_summ_referer">传递 \'Referer\' 头通过</string>
<string name="tunnel_summ_accept">传递 \'Accept-*\' 头通过</string>
<string name="tunnel_summ_allow_ssl">允许 SSL 到 I2P 地址簿</string>
<string name="jump_url_list">跳到 URL 列表</string>
<string name="proxy_auth">代理身份验证</string>
<string name="tunnel_summ_proxy_auth">需要登录才能使用此代理</string>
<string name="username">用户名</string>
<string name="password">密码</string>
<string name="outproxy_auth">出口代理身份验证</string>
<string name="tunnel_summ_outproxy_auth">该出口代理需要登录</string>
<string name="other">其他</string>
<string name="signature_type">签名类型</string>
<string name="custom_options">自定义选项</string>
<string name="copy_logs">复制日志</string>
<string name="i2p_android_error_logs">I2P Android 错误日志</string>
<string name="i2p_android_logs">I2P Android 日志</string>
<string name="error_logs_copied_to_clipboard">错误日志已复制到剪贴板</string>
<string name="logs_copied_to_clipboard">日志已复制到剪贴板</string>
<string name="label_browser_configuration">浏览器配置</string>
<string name="unset">未设置</string>
</resources>

View File

@ -76,4 +76,36 @@
<item>mobi.mgeek.TunnyBrowser</item>
<item>com.lastpass.lpandroid</item>
</string-array>
<string-array name="tunnel_profiles">
<item>bulk</item>
<item>interactive</item>
</string-array>
<string-array name="tunnel_profile_names">
<item>Bulk connection (downloads/websites/BT)</item>
<item>Interactive connection</item>
</string-array>
<string-array name="access_modes">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
<string-array name="access_mode_names">
<item>Disabled</item>
<item>Whitelist</item>
<item>Blacklist</item>
</string-array>
<string-array name="sigtypes">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>7</item>
</string-array>
<string-array name="sigtype_names">
<item>DSA-SHA1</item>
<item>ECDSA-P256</item>
<item>ECDSA-P384</item>
<item>ECDSA-P521</item>
<item>Ed25519-SHA-512</item>
</string-array>
</resources>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ConnectionLimitPreference">
<attr name="clp_valueInTitle" format="boolean" />
</declare-styleable>
</resources>

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