Compare commits
66 Commits
android-cl
...
android-cl
Author | SHA1 | Date | |
---|---|---|---|
c32bda66b5 | |||
6d726df1dc | |||
5b5a99f512 | |||
a11dd1e4e6 | |||
2190c59d73 | |||
c6e06e25a8 | |||
a559eb4fab | |||
d1110aefc4 | |||
9a5c63f620 | |||
d4e9195a6c | |||
e9d2b9f53c | |||
40f3d91ebb | |||
fae4b7e42d | |||
eb700e34ba | |||
6828d985d2 | |||
05a2132295 | |||
dbee390bba | |||
0b5ae4edf8 | |||
bd741cd500 | |||
4d7bc0f92b | |||
d2959ddc3f | |||
ecb071ee88 | |||
624aa27e31 | |||
2407e9be46 | |||
50973b5c06 | |||
8165e49300 | |||
77749dd7f9 | |||
ef7e4cf610 | |||
a7b2bf148b | |||
a2278179f9 | |||
3b3bcb30da | |||
d78b68d285 | |||
00de9e98d2 | |||
a543280a56 | |||
f036544744 | |||
8aa9ce9303 | |||
1c605c16cf | |||
fc7f703658 | |||
163ef0512b | |||
6709bebc6f | |||
c7fad6940a | |||
4b1ee639b7 | |||
d2fa17fa66 | |||
87e12846b3 | |||
97d1367180 | |||
a0419c9eb7 | |||
5191118b87 | |||
f5214e4b99 | |||
9564855cce | |||
17ab043a4b | |||
32b2b0ce75 | |||
b77e2ebbe5 | |||
9eeab68cdb | |||
96257015a9 | |||
d7f6e3688c | |||
5ef434e29f | |||
852d695dac | |||
96cb8ab410 | |||
cd158cca84 | |||
b71a0a27d3 | |||
64268c7af8 | |||
95749f032e | |||
0ac1ae56b0 | |||
bae8c7ec00 | |||
80c8069769 | |||
5b4b151079 |
@ -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
|
||||
|
10
CHANGELOG
10
CHANGELOG
@ -1,11 +1,17 @@
|
||||
0.9.18
|
||||
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
|
||||
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
|
||||
|
@ -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
|
||||
|
||||
|
52
TODO
52
TODO
@ -4,22 +4,14 @@
|
||||
<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> in the tunnel create wizard:
|
||||
<zzz> 'this could be the full base 64 destination key, or an i2p url from your address book"
|
||||
<zzz> 'host name' better than 'URL'. Technically speaking, a host name is not a URL
|
||||
<zzz> hmm would be nice if they could be shared-client or have an option
|
||||
<zzz> was setting up email tunnels
|
||||
- I2PTunnel details
|
||||
<zzz> on the i2ptunnel details, it lists both a 'target' and 'access point' for clients, with the same info
|
||||
<zzz> generally we use 'target' for servers and 'access point' for clients, never both
|
||||
- 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
|
||||
|
||||
- Graceful shutdown option
|
||||
<zzzccc> Request: graceful shutdown
|
||||
- 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
|
||||
@ -51,6 +43,50 @@
|
||||
- Think about pan/zoom
|
||||
- How to persist data across restarts?
|
||||
|
||||
# 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
|
||||
|
||||
- Remote router support
|
||||
|
@ -5,10 +5,13 @@ android {
|
||||
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)
|
||||
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
|
||||
defaultConfig {
|
||||
versionCode 4745225
|
||||
versionName '0.9.17.1'
|
||||
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
|
||||
@ -31,6 +34,9 @@ android {
|
||||
lintOptions {
|
||||
abortOnError false
|
||||
}
|
||||
packagingOptions {
|
||||
exclude 'LICENSE.txt'
|
||||
}
|
||||
productFlavors {
|
||||
free {
|
||||
applicationId 'net.i2p.android'
|
||||
@ -45,13 +51,26 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Local dependencies
|
||||
compile project(':routerjars')
|
||||
compile project(':client')
|
||||
|
||||
// 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 {
|
||||
@ -60,6 +79,7 @@ dependencyVerification {
|
||||
'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',
|
||||
]
|
||||
}
|
||||
|
||||
|
@ -45,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"
|
||||
@ -53,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"
|
||||
@ -61,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"
|
||||
@ -69,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"
|
||||
@ -94,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"
|
||||
@ -111,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" />
|
||||
@ -135,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
|
||||
@ -148,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"
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -1,18 +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;
|
||||
@ -30,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();
|
||||
|
@ -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);
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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())
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -126,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());
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package net.i2p.android.router;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
import android.os.Bundle;
|
||||
|
||||
public class LicenseActivity extends I2PActivityBase {
|
||||
|
@ -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
|
||||
|
@ -1,13 +1,11 @@
|
||||
package net.i2p.android.router;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
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.support.v4.content.LocalBroadcastManager;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
@ -15,19 +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 java.io.File;
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
public class MainActivity extends I2PActivityBase implements
|
||||
MainFragment.RouterControlListener {
|
||||
IRouterState mStateService = null;
|
||||
MainFragment mMainFragment = null;
|
||||
private boolean mAutoStartFromIntent = false;
|
||||
|
||||
@ -94,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();
|
||||
@ -155,122 +165,9 @@ 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();
|
||||
}
|
||||
|
||||
@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 StateHandler(new WeakReference<>(this));
|
||||
private static class StateHandler extends Handler {
|
||||
WeakReference<MainActivity> mReference;
|
||||
|
||||
public StateHandler(WeakReference<MainActivity> reference) {
|
||||
mReference = reference;
|
||||
}
|
||||
|
||||
private State lastRouterState = null;
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
MainActivity parent = mReference.get();
|
||||
if (parent == null)
|
||||
return;
|
||||
|
||||
switch (msg.what) {
|
||||
case STATE_MSG:
|
||||
State state = msg.getData().getParcelable(MSG_DATA);
|
||||
if (lastRouterState == null || lastRouterState != state) {
|
||||
if (parent.mMainFragment == null)
|
||||
parent.mMainFragment = (MainFragment) parent.getSupportFragmentManager().findFragmentById(R.id.main_fragment);
|
||||
if (parent.mMainFragment != null) {
|
||||
parent.mMainFragment.updateState(state);
|
||||
lastRouterState = state;
|
||||
}
|
||||
|
||||
if (state == State.RUNNING && parent.mAutoStartFromIntent) {
|
||||
parent.setResult(RESULT_OK);
|
||||
parent.finish();
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
super.handleMessage(msg);
|
||||
}
|
||||
}
|
||||
LocalBroadcastManager.getInstance(this).unregisterReceiver(onStateChange);
|
||||
}
|
||||
|
||||
private boolean canStart() {
|
||||
@ -286,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() {
|
||||
@ -315,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;
|
||||
}
|
||||
}
|
||||
|
@ -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 ||
|
||||
|
@ -1,6 +1,5 @@
|
||||
package net.i2p.android.router;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
import android.os.Bundle;
|
||||
|
||||
public class NewsActivity extends I2PActivityBase {
|
||||
|
@ -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,7 +20,7 @@ import android.widget.Toast;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.android.router.service.StatSummarizer;
|
||||
import net.i2p.android.router.util.IntEditTextPreference;
|
||||
import net.i2p.android.router.util.PortPreference;
|
||||
import net.i2p.android.router.util.Util;
|
||||
import net.i2p.router.RouterContext;
|
||||
import net.i2p.stat.FrequencyStat;
|
||||
@ -48,26 +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);
|
||||
setupAdvancedSettings(this, getPreferenceScreen(), Util.getRouterContext());
|
||||
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);
|
||||
@ -156,22 +194,63 @@ public class SettingsActivity extends PreferenceActivity {
|
||||
}
|
||||
}
|
||||
|
||||
protected static void setupAdvancedSettings(Context context, PreferenceScreen ps, 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);
|
||||
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);
|
||||
|
||||
IntEditTextPreference udpPort = (IntEditTextPreference) ps.findPreference(udpPortKey);
|
||||
IntEditTextPreference ntcpPort = (IntEditTextPreference) ps.findPreference(ntcpPortKey);
|
||||
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);
|
||||
|
||||
String udpCurrentPort = ctx.getProperty(udpPortKey, "0");
|
||||
udpPort.setText(udpCurrentPort);
|
||||
String ntcpCurrentPort = ctx.getProperty(ntcpPortKey);
|
||||
if (ntcpCurrentPort != null && ntcpCurrentPort.length() > 0)
|
||||
ntcpPort.setText(ntcpCurrentPort);
|
||||
else
|
||||
ntcpPort.setText(udpCurrentPort);
|
||||
}
|
||||
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)
|
||||
@ -264,17 +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);
|
||||
setupAdvancedSettings(getActivity(), getPreferenceScreen(), Util.getRouterContext());
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -40,8 +40,8 @@ public class AddressEntryLoader extends AsyncTaskLoader<List<AddressEntry>> {
|
||||
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
|
||||
|
@ -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())
|
||||
|
@ -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());
|
||||
|
@ -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());
|
||||
|
@ -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());
|
||||
|
@ -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) {}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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 != 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();
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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,10 +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.BuildConfig;
|
||||
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
|
||||
@ -141,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();
|
||||
@ -243,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);
|
||||
}
|
||||
@ -276,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);
|
||||
}
|
||||
@ -303,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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
@ -24,16 +24,24 @@ public class IntEditTextPreference extends EditTextPreference {
|
||||
|
||||
@Override
|
||||
public CharSequence getSummary() {
|
||||
return String.format((String) super.getSummary(), getText());
|
||||
String summary = (String) super.getSummary();
|
||||
if (summary == null)
|
||||
summary = "%s";
|
||||
return String.format(summary, getText());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getPersistedString(String defaultReturnValue) {
|
||||
return String.valueOf(getPersistedInt(-1));
|
||||
if(getSharedPreferences().contains(getKey())) {
|
||||
int intValue = getPersistedInt(0);
|
||||
return String.valueOf(intValue);
|
||||
} else {
|
||||
return defaultReturnValue;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean persistString(String value) {
|
||||
return persistInt(Integer.valueOf(value));
|
||||
return value != null && persistInt(Integer.valueOf(value));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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")
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
@ -131,13 +131,13 @@ public abstract class Util implements I2PConstants {
|
||||
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();
|
||||
|
||||
// List to store stats for graphing
|
||||
List<String> statSummaries = new ArrayList<String>();
|
||||
List<String> statSummaries = new ArrayList<>();
|
||||
|
||||
// Properties to remove
|
||||
Properties toRemove = new OrderedProperties();
|
||||
@ -147,27 +147,25 @@ public abstract class Util implements I2PConstants {
|
||||
|
||||
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("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 if ( !x.startsWith(ANDROID_PREF_PREFIX)) { // Skip over UI-related I2P Android settings
|
||||
} else if (!x.startsWith(ANDROID_PREF_PREFIX)) { // Skip over UI-related I2P Android settings
|
||||
String string = all.get(x).toString();
|
||||
routerProps.setProperty(x, string);
|
||||
}
|
||||
@ -185,11 +183,9 @@ public abstract class Util implements I2PConstants {
|
||||
|
||||
// See net.i2p.router.web.ConfigNetHandler.saveChanges()
|
||||
int udpPort = Integer.parseInt(routerProps.getProperty(UDPTransport.PROP_INTERNAL_PORT, "-1"));
|
||||
System.out.println("UDP port: " + udpPort);
|
||||
if (udpPort <= 0)
|
||||
routerProps.remove(UDPTransport.PROP_INTERNAL_PORT);
|
||||
int ntcpPort = Integer.parseInt(routerProps.getProperty(PROP_I2NP_NTCP_PORT, "-1"));
|
||||
System.out.println("NTCP port: " + ntcpPort);
|
||||
boolean ntcpAutoPort = Boolean.parseBoolean(
|
||||
routerProps.getProperty(PROP_I2NP_NTCP_AUTO_PORT, "true"));
|
||||
if (ntcpPort <= 0 || ntcpAutoPort) {
|
||||
@ -205,11 +201,11 @@ public abstract class Util implements I2PConstants {
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
@ -1,9 +0,0 @@
|
||||
package net.i2p.i2ptunnel;
|
||||
|
||||
/**
|
||||
* Stub since no AWT in Android
|
||||
*/
|
||||
public class I2PTunnelGUI {
|
||||
|
||||
public I2PTunnelGUI(I2PTunnel t) {}
|
||||
}
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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"
|
||||
|
@ -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" />
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -8,7 +8,6 @@
|
||||
<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>
|
||||
@ -24,6 +23,9 @@
|
||||
<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".-->
|
||||
@ -69,6 +71,8 @@
|
||||
<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">Eingehende Übertragungsgeschwindigkeit</string>
|
||||
<string name="settings_desc_bw_inbound">Maximale eingehende Übertragungsgeschwindigkeit</string>
|
||||
@ -109,6 +113,7 @@
|
||||
<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>
|
||||
@ -171,7 +176,6 @@
|
||||
<string name="enabled">Aktiviert</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_dest">Bitte geben Sie hier das I2P-Ziel des Dienstes ein, zu dem dieser Tunnel führen soll. Dies kann ein voller Basis64-Zielschlüssel oder eine I2P URL aus dem Adressbuch sein.</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>
|
||||
@ -185,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>
|
||||
|
@ -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".-->
|
||||
@ -111,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>
|
||||
@ -173,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>
|
||||
@ -187,6 +190,89 @@
|
||||
<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>
|
||||
|
@ -7,7 +7,6 @@
|
||||
<string name="label_tunnels">Tunnelit</string>
|
||||
<string name="label_status">Tila</string>
|
||||
<string name="label_addressbook">Osoitekirja</string>
|
||||
<string name="label_i2ptunnel">I2PTunnel</string>
|
||||
<string name="label_i2ptunnel_client">Asiakastunnelit</string>
|
||||
<string name="label_i2ptunnel_server">Palvelintunnelit</string>
|
||||
<string name="label_logs">Lokitiedostot</string>
|
||||
|
@ -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>
|
||||
@ -171,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>
|
||||
@ -185,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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
@ -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>
|
||||
@ -171,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>
|
||||
@ -185,10 +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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
@ -171,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>
|
||||
@ -191,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>
|
||||
|
@ -8,7 +8,6 @@
|
||||
<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>
|
||||
@ -111,6 +110,7 @@
|
||||
<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>
|
||||
@ -173,7 +173,6 @@
|
||||
<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_dest">Typ de I2P-bestemming van de dienst in waar deze cliënt-tunnel mee moet verbinden. Dit kan de volledige base-64 bestemmingssleutel zijn, of een I2P-URL van je adresboek.</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>
|
||||
|
@ -8,7 +8,6 @@
|
||||
<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>
|
||||
@ -69,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>
|
||||
@ -109,6 +110,7 @@
|
||||
<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>
|
||||
@ -171,7 +173,6 @@
|
||||
<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 służąca wyłącznie 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łny klucz base 64 przeznaczenia, 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 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>
|
||||
@ -191,4 +192,5 @@
|
||||
<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>
|
||||
|
@ -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">Nó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"><b>Seja bem-vindo!</b> Por favor<b>, 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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
@ -171,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>
|
||||
@ -191,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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -1,13 +1,13 @@
|
||||
<?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">I2PTunnel</string>
|
||||
<string name="label_i2ptunnel_client">Клієнтські тунелі</string>
|
||||
<string name="label_i2ptunnel_server">Серверні тунелі</string>
|
||||
<string name="label_logs">Журнали</string>
|
||||
@ -22,10 +22,18 @@
|
||||
<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>
|
||||
@ -41,16 +49,26 @@
|
||||
<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>
|
||||
@ -68,6 +86,7 @@
|
||||
<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>
|
||||
@ -87,6 +106,7 @@
|
||||
<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>
|
||||
@ -108,6 +128,7 @@
|
||||
<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>
|
||||
@ -115,8 +136,46 @@
|
||||
<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>
|
@ -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>
|
||||
|
@ -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".-->
|
||||
@ -111,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>
|
||||
@ -173,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>
|
||||
@ -187,6 +190,89 @@
|
||||
<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>
|
||||
|
@ -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>
|
||||
|
6
app/src/main/res/values/attrs.xml
Normal file
6
app/src/main/res/values/attrs.xml
Normal 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>
|
28
app/src/main/res/values/defaults.xml
Normal file
28
app/src/main/res/values/defaults.xml
Normal file
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- General -->
|
||||
<bool name="DEFAULT_START_ON_LOAD">true</bool>
|
||||
|
||||
<!-- Client -->
|
||||
<bool name="DEFAULT_SHARED_CLIENTS">true</bool>
|
||||
<bool name="DEFAULT_PERSISTENT_KEY">false</bool>
|
||||
|
||||
<!-- General advanced -->
|
||||
<integer name="DEFAULT_TUNNEL_LENGTH">3</integer>
|
||||
<integer name="DEFAULT_TUNNEL_VARIANCE">0</integer>
|
||||
<integer name="DEFAULT_TUNNEL_QUANTITY">2</integer>
|
||||
<integer name="DEFAULT_TUNNEL_BACKUP_QUANTITY">0</integer>
|
||||
<bool name="DEFAULT_REDUCE_ON_IDLE">true</bool>
|
||||
<integer name="DEFAULT_REDUCE_COUNT">1</integer>
|
||||
<integer name="DEFAULT_REDUCE_TIME">20</integer>
|
||||
<!-- We bundle SpongyCastle, so this is guaranteed to be available. -->
|
||||
<integer name="DEFAULT_SIGTYPE">1</integer>
|
||||
|
||||
<!-- Client advanced -->
|
||||
<bool name="DEFAULT_DELAY_OPEN">true</bool>
|
||||
<bool name="DEFAULT_CLOSE_ON_IDLE">true</bool>
|
||||
<integer name="DEFAULT_CLOSE_TIME">30</integer>
|
||||
<bool name="DEFAULT_NEW_KEYS">false</bool>
|
||||
<string name="DEFAULT_JUMP_LIST">http://i2host.i2p/cgi-bin/i2hostjump?
|
||||
http://stats.i2p/cgi-bin/jump.cgi?a=</string>
|
||||
</resources>
|
@ -10,7 +10,7 @@
|
||||
<string name="label_tunnels">Tunnels</string>
|
||||
<string name="label_status">Status</string>
|
||||
<string name="label_addressbook">Addressbook</string>
|
||||
<string name="label_i2ptunnel">I2PTunnel</string>
|
||||
<string name="label_i2ptunnel" translatable="false">@string/label_tunnels</string>
|
||||
<string name="label_i2ptunnel_client">Client tunnels</string>
|
||||
<string name="label_i2ptunnel_server">Server tunnels</string>
|
||||
<string name="label_logs">Logs</string>
|
||||
@ -27,6 +27,9 @@
|
||||
|
||||
<string name="button_router_off">Long press to start I2P</string>
|
||||
<string name="button_router_on">I2P is running (long press to stop)</string>
|
||||
<string name="button_router_graceful">I2P will shut down in %s</string>
|
||||
<string name="button_shutdown_now">Long press to stop now</string>
|
||||
<string name="button_cancel_graceful">Long press to cancel shutdown</string>
|
||||
|
||||
<!-- Character to indicate a client tunnel. Usually first letter of the word "client". -->
|
||||
<string name="char_client_tunnel">C</string>
|
||||
@ -126,6 +129,7 @@
|
||||
<string name="settings_summ_expl_backupQuantity">%s tunnels</string>
|
||||
<string name="settings_desc_expl_backupQuantity">How many tunnel backups</string>
|
||||
|
||||
<string name="settings_need_transport_enabled">You must have at least one transport enabled</string>
|
||||
<string name="settings_router_restart_required">Please restart I2P to apply the changes</string>
|
||||
|
||||
<string name="menu_about">About</string>
|
||||
@ -204,7 +208,7 @@
|
||||
|
||||
<string name="i2ptunnel_wizard_desc_name">The name of the tunnel, for identification in the tunnel list.</string>
|
||||
<string name="i2ptunnel_wizard_desc_desc">A description of the tunnel. This is optional and purely informative.</string>
|
||||
<string name="i2ptunnel_wizard_desc_dest">Type in the I2P destination of the service that this client tunnel should connect to. This could be the full base 64 destination key, or an I2P URL from your address book.</string>
|
||||
<string name="i2ptunnel_wizard_desc_dest">Type in the I2P destination of the service that this client tunnel should connect to. This could be the full base 64 destination key, or an I2P host name from your address book.</string>
|
||||
<string name="i2ptunnel_wizard_desc_outproxies">If you know of any outproxies for this type of tunnel (either HTTP or SOCKS), fill them in. Separate multiple proxies with commas.</string>
|
||||
<string name="i2ptunnel_wizard_desc_target_host">This is the IP that your service is running on, this is usually on the same machine so 127.0.0.1 is autofilled.</string>
|
||||
<string name="i2ptunnel_wizard_desc_target_port">This is the port that the service is accepting connections on.</string>
|
||||
@ -220,6 +224,90 @@
|
||||
<string name="i2ptunnel_view_access_point">Access point:</string>
|
||||
<string name="i2ptunnel_view_autostart">Auto-start</string>
|
||||
|
||||
<string name="edit_tunnel">Edit tunnel</string>
|
||||
<string name="name">Name</string>
|
||||
<string name="description">Description</string>
|
||||
<string name="auto_start">Auto-start</string>
|
||||
<string name="tunnel_summ_auto_start">Start the tunnel when the router starts.</string>
|
||||
<string name="tunnel_cat_ports">Local ports</string>
|
||||
<string name="shared_client">Shared client</string>
|
||||
<string name="tunnel_summ_shared_client">Use the same Destination and tunnels as other shared clients</string>
|
||||
<string name="target_destination">Target destination</string>
|
||||
<string name="persistent_key">Persistent key</string>
|
||||
<string name="tunnel_summ_persistent_key">Keep this tunnel\'s Destination when it restarts</string>
|
||||
<string name="reachable_on">Reachable on</string>
|
||||
<string name="listen_port">Listen port</string>
|
||||
<string name="client_ssl">Client SSL</string>
|
||||
<string name="tunnel_summ_client_ssl">Clients must use SSL to connect</string>
|
||||
<string name="outproxies">Outproxies</string>
|
||||
<string name="ssl_outproxies">SSL outproxies</string>
|
||||
<string name="irc">IRC</string>
|
||||
<string name="enable_dcc">Enable DCC</string>
|
||||
<string name="tunnel_summ_enable_dcc">Allow IRC clients to use DCC</string>
|
||||
<string name="website_domain_name">Website domain name</string>
|
||||
<string name="target_host">Target host</string>
|
||||
<string name="target_port">Target port</string>
|
||||
<string name="use_ssl">Use SSL</string>
|
||||
<string name="tunnel_summ_use_ssl">Use SSL to connect to target</string>
|
||||
<string name="tunnel_parameters">Tunnel parameters</string>
|
||||
<string name="profile">Profile</string>
|
||||
<string name="delay_connect">Delay connect</string>
|
||||
<string name="tunnel_summ_delay_connect">Enable for request/response connections</string>
|
||||
<string name="access_control">Access control</string>
|
||||
<string name="restricted_access">Restricted access</string>
|
||||
<string name="access_list">Access list</string>
|
||||
<string name="reject_inproxies">Reject inproxies</string>
|
||||
<string name="tunnel_summ_reject_inproxies">Only allow I2P users to connect</string>
|
||||
<string name="unique_local">Unique local</string>
|
||||
<string name="tunnel_summ_unique_local">Use unique localhost IPs for each client</string>
|
||||
<string name="multihome">Multihome</string>
|
||||
<string name="tunnel_summ_multihome">Enable multihoming optimizations</string>
|
||||
<string name="client_connection_limits">Client connection limits</string>
|
||||
<string name="connections_per_minute">Connections per minute</string>
|
||||
<string name="connections_per_hour">Connections per hour</string>
|
||||
<string name="connections_per_day">Connections per day</string>
|
||||
<string name="total_connection_limits">Total connection limits</string>
|
||||
<string name="total_connections_per_minute">Total connections per minute</string>
|
||||
<string name="total_connections_per_hour">Total connections per hour</string>
|
||||
<string name="total_connections_per_day">Total connections per day</string>
|
||||
<string name="max_active_connections">Max active connections</string>
|
||||
<string name="num_per_minute">%s per minute</string>
|
||||
<string name="num_per_hour">%s per hour</string>
|
||||
<string name="num_per_day">%s per day</string>
|
||||
<string name="unlimited">Unlimited</string>
|
||||
<string name="set_zero_for_unlimited">Set 0 for unlimited</string>
|
||||
<string name="post_limits">POST limits</string>
|
||||
<string name="limit_period">Limit period</string>
|
||||
<string name="client_posts_per_period">Client POSTs per period</string>
|
||||
<string name="client_ban_length">Client ban length</string>
|
||||
<string name="total_posts_per_period">Total POSTs per period</string>
|
||||
<string name="total_ban_length">Total ban length</string>
|
||||
<string name="power_saving">Power saving</string>
|
||||
<string name="delay_open">Delay open</string>
|
||||
<string name="tunnel_summ_delay_open">Delay tunnel open until required</string>
|
||||
<string name="reduce_quantity">Reduce quantity</string>
|
||||
<string name="tunnel_summ_reduce_quantity">Reduce tunnel quantity when idle</string>
|
||||
<string name="idle_time">Idle time</string>
|
||||
<string name="num_minutes">%s minutes</string>
|
||||
<string name="reduced_tunnel_quantity">Reduced tunnel quantity</string>
|
||||
<string name="close_tunnels">Close tunnels when idle</string>
|
||||
<string name="new_keys_on_reopen">New keys on reopen</string>
|
||||
<string name="http_client">HTTP client</string>
|
||||
<string name="tunnel_summ_user_agent">Pass \'User-Agent\' header through</string>
|
||||
<string name="tunnel_summ_referer">Pass \'Referer\' header through</string>
|
||||
<string name="tunnel_summ_accept">Pass \'Accept-*\' headers through</string>
|
||||
<string name="tunnel_summ_allow_ssl">Allow SSL to I2P addresses</string>
|
||||
<string name="jump_url_list">Jump URL list</string>
|
||||
<string name="proxy_auth">Proxy authorization</string>
|
||||
<string name="tunnel_summ_proxy_auth">Require a login to use this proxy</string>
|
||||
<string name="username">Username</string>
|
||||
<string name="password">Password</string>
|
||||
<string name="outproxy_auth">Outproxy authorization</string>
|
||||
<string name="tunnel_summ_outproxy_auth">The login required for the outproxy</string>
|
||||
<string name="other">Other</string>
|
||||
<string name="signature_type">Signature type</string>
|
||||
<string name="custom_options">Custom options</string>
|
||||
|
||||
<string name="copy_logs">Copy logs</string>
|
||||
<string name="i2p_android_error_logs">I2P Android Error Logs</string>
|
||||
<string name="i2p_android_logs">I2P Android Logs</string>
|
||||
@ -229,4 +317,4 @@
|
||||
<string name="label_browser_configuration">Browser configuration</string>
|
||||
|
||||
<string name="unset">Unset</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
84
app/src/main/res/values/tunnel_properties.xml
Normal file
84
app/src/main/res/values/tunnel_properties.xml
Normal file
@ -0,0 +1,84 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- General -->
|
||||
<string name="TUNNEL_TYPE">type</string>
|
||||
<string name="TUNNEL_NAME">name</string>
|
||||
<string name="TUNNEL_DESCRIPTION">description</string>
|
||||
<string name="TUNNEL_USE_SSL">useSSL</string>
|
||||
<string name="TUNNEL_START_ON_LOAD">startOnLoad</string>
|
||||
<string name="TUNNEL_PRIV_KEY_FILE">privKeyFile</string>
|
||||
|
||||
<!-- Client -->
|
||||
<string name="TUNNEL_SHARED_CLIENT">sharedClient</string>
|
||||
<string name="TUNNEL_OPT_PERSISTENT_KEY">persistentKey</string>
|
||||
<string name="TUNNEL_INTERFACE">interface</string>
|
||||
<string name="TUNNEL_LISTEN_PORT">listenPort</string>
|
||||
<string name="TUNNEL_DEST">targetDestination</string>
|
||||
<string name="TUNNEL_PROXIES">proxyList</string>
|
||||
<string name="TUNNEL_HTTPCLIENT_SSL_OUTPROXIES">i2ptunnel.httpclient.SSLOutproxies</string>
|
||||
<string name="TUNNEL_IRCCLIENT_ENABLE_DCC">i2ptunnel.ircclient.enableDCC</string>
|
||||
|
||||
<!-- Server -->
|
||||
<string name="TUNNEL_TARGET_HOST">targetHost</string>
|
||||
<string name="TUNNEL_TARGET_PORT">targetPort</string>
|
||||
<string name="TUNNEL_SPOOFED_HOST">spoofedHost</string>
|
||||
|
||||
<!-- General advanced -->
|
||||
<string name="TUNNEL_OPT_LENGTH">tunnelPool.length</string>
|
||||
<string name="TUNNEL_OPT_VARIANCE">tunnelPool.lengthVariance</string>
|
||||
<string name="TUNNEL_OPT_QUANTITY">tunnelPool.quantity</string>
|
||||
<string name="TUNNEL_OPT_BACKUP_QUANTITY">tunnelPool.backupQuantity</string>
|
||||
<string name="TUNNEL_OPT_PROFILE">profile</string>
|
||||
<string name="TUNNEL_OPT_REDUCE_IDLE">i2cp.reduceOnIdle</string>
|
||||
<string name="TUNNEL_OPT_REDUCE_QUANTITY">i2cp.reduceQuantity</string>
|
||||
<string name="TUNNEL_OPT_REDUCE_TIME">i2cp.reduceIdleTime</string>
|
||||
<string name="TUNNEL_OPT_SIGTYPE">sigType</string>
|
||||
<string name="TUNNEL_OPT_CUSTOM_OPTIONS">customOptions</string>
|
||||
|
||||
<!-- Client advanced -->
|
||||
<string name="TUNNEL_OPT_DELAY_CONNECT">delayConnect</string>
|
||||
<string name="TUNNEL_OPT_DELAY_OPEN">i2cp.delayOpen</string>
|
||||
<string name="TUNNEL_OPT_CLOSE_IDLE">i2cp.closeOnIdle</string>
|
||||
<string name="TUNNEL_OPT_CLOSE_TIME">i2cp.closeIdleTime</string>
|
||||
<string name="TUNNEL_OTP_NEW_KEYS">newKeys</string>
|
||||
<string name="TUNNEL_OPT_HTTPCLIENT_PASS_UA">i2ptunnel.httpclient.sendUserAgent</string>
|
||||
<string name="TUNNEL_OPT_HTTPCLIENT_PASS_REFERER">i2ptunnel.httpclient.sendReferer</string>
|
||||
<string name="TUNNEL_OPT_HTTPCLIENT_PASS_ACCEPT">i2ptunnel.httpclient.sendAccept</string>
|
||||
<string name="TUNNEL_OPT_HTTPCLIENT_ALLOW_SSL">i2ptunnel.httpclient.allowInternalSSL</string>
|
||||
<string name="TUNNEL_OPT_LOCAL_AUTH">proxyAuth</string>
|
||||
<string name="TUNNEL_OPT_LOCAL_USERNAME">proxyUsername</string>
|
||||
<string name="TUNNEL_OPT_LOCAL_PASSWORD">proxyPassword</string>
|
||||
<string name="TUNNEL_OPT_OUTPROXY_AUTH">outproxyAuth</string>
|
||||
<string name="TUNNEL_OPT_OUTPROXY_USERNAME">outproxyUsername</string>
|
||||
<string name="TUNNEL_OPT_OUTPROXY_PASSWORD">outproxyPassword</string>
|
||||
<string name="TUNNEL_OPT_JUMP_LIST">jumpList</string>
|
||||
|
||||
<!-- Server advanced -->
|
||||
<string name="TUNNEL_OPT_ENCRYPT">i2cp.encryptLeaseSet</string>
|
||||
<string name="TUNNEL_OPT_ENCRYPT_KEY">i2cp.leaseSetKey</string>
|
||||
<string name="TUNNEL_OPT_ACCESS_MODE">accessMode</string>
|
||||
<string name="TUNNEL_OPT_ACCESS_LIST">i2cp.accessList</string>
|
||||
<string name="TUNNEL_OPT_REJECT_INPROXY">rejectInproxy</string>
|
||||
<string name="TUNNEL_OPT_UNIQUE_LOCAL">enableUniqueLocal</string>
|
||||
<string name="TUNNEL_OPT_MULTIHOME">multihome</string>
|
||||
<string name="TUNNEL_OPT_LIMIT_MINUTE">i2p.streaming.maxConnsPerMinute</string>
|
||||
<string name="TUNNEL_OPT_LIMIT_HOUR">i2p.streaming.maxConnsPerHour</string>
|
||||
<string name="TUNNEL_OPT_LIMIT_DAY">i2p.streaming.maxConnsPerDay</string>
|
||||
<string name="TUNNEL_OPT_TOTAL_MINUTE">i2p.streaming.maxTotalConnsPerMinute</string>
|
||||
<string name="TUNNEL_OPT_TOTAL_HOUR">i2p.streaming.maxTotalConnsPerHour</string>
|
||||
<string name="TUNNEL_OPT_TOTAL_DAY">i2p.streaming.maxTotalConnsPerDay</string>
|
||||
<string name="TUNNEL_OPT_MAX_STREAMS">i2p.streaming.maxConcurrentStreams</string>
|
||||
<string name="TUNNEL_OPT_POST_MAX">maxPosts</string>
|
||||
<string name="TUNNEL_OPT_POST_BAN_TIME">postBanTime</string>
|
||||
<string name="TUNNEL_OPT_POST_TOTAL_MAX">maxTotalPosts</string>
|
||||
<string name="TUNNEL_OPT_POST_TOTAL_BAN_TIME">postTotalBanTime</string>
|
||||
<string name="TUNNEL_OPT_POST_CHECK_TIME">postCheckTime</string>
|
||||
|
||||
<!-- Categories -->
|
||||
<string name="TUNNEL_CAT_GENERAL">generalCategory</string>
|
||||
<string name="TUNNEL_CAT_PORT">portCategory</string>
|
||||
<string name="TUNNEL_CAT_ADVANCED">advanced</string>
|
||||
<string name="TUNNEL_CAT_TUNNEL_PARAMS">tunnelParamsCategory</string>
|
||||
<string name="TUNNEL_CAT_ACCESS_CONTROL">accessControlCategory</string>
|
||||
<string name="TUNNEL_CAT_IDLE">idleCategory</string>
|
||||
</resources>
|
@ -107,7 +107,7 @@
|
||||
<!--
|
||||
router.inboundPool.length=1
|
||||
-->
|
||||
<ListPreference
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:key="@string/PROP_INBOUND_EXPLORATORY_LENGTH"
|
||||
android:entries="@array/setting0to3"
|
||||
android:entryValues="@array/setting0to3"
|
||||
@ -120,7 +120,7 @@
|
||||
<!--
|
||||
router.inboundPool.lengthVariance=1
|
||||
-->
|
||||
<ListPreference
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:key="@string/PROP_INBOUND_EXPLORATORY_LENGTH_VARIANCE"
|
||||
android:entries="@array/setting2to2"
|
||||
android:entryValues="@array/setting2to2"
|
||||
@ -134,7 +134,7 @@
|
||||
<!--
|
||||
router.inboundPool.quantity=2
|
||||
-->
|
||||
<ListPreference
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:key="@string/PROP_INBOUND_EXPLORATORY_QUANTITY"
|
||||
android:entries="@array/setting0to3"
|
||||
android:entryValues="@array/setting0to3"
|
||||
@ -147,7 +147,7 @@
|
||||
<!--
|
||||
router.inboundPool.backupQuantity=0
|
||||
-->
|
||||
<ListPreference
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:key="@string/PROP_INBOUND_EXPLORATORY_BACKUP_QUANTITY"
|
||||
android:entries="@array/setting0to3"
|
||||
android:entryValues="@array/setting0to3"
|
||||
@ -164,7 +164,7 @@
|
||||
<!--
|
||||
router.outboundPool.length=1
|
||||
-->
|
||||
<ListPreference
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:key="@string/PROP_OUTBOUND_EXPLORATORY_LENGTH"
|
||||
android:entries="@array/setting0to3"
|
||||
android:entryValues="@array/setting0to3"
|
||||
@ -177,7 +177,7 @@
|
||||
<!--
|
||||
router.outboundPool.lengthVariance=1
|
||||
-->
|
||||
<ListPreference
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:key="@string/PROP_OUTBOUND_EXPLORATORY_LENGTH_VARIANCE"
|
||||
android:entries="@array/setting2to2"
|
||||
android:entryValues="@array/setting2to2"
|
||||
@ -190,7 +190,7 @@
|
||||
<!--
|
||||
router.outboundPool.quantity=2
|
||||
-->
|
||||
<ListPreference
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:key="@string/PROP_OUTBOUND_EXPLORATORY_QUANTITY"
|
||||
android:entries="@array/setting0to3"
|
||||
android:entryValues="@array/setting0to3"
|
||||
@ -203,7 +203,7 @@
|
||||
<!--
|
||||
router.outboundPool.backupQuantity=0
|
||||
-->
|
||||
<ListPreference
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:key="@string/PROP_OUTBOUND_EXPLORATORY_BACKUP_QUANTITY"
|
||||
android:entries="@array/setting0to3"
|
||||
android:entryValues="@array/setting0to3"
|
||||
|
63
app/src/main/res/xml/tunnel_adv.xml
Normal file
63
app/src/main/res/xml/tunnel_adv.xml
Normal file
@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<PreferenceScreen
|
||||
android:key="@string/TUNNEL_CAT_ADVANCED"
|
||||
android:title="@string/settings_label_advanced">
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="@string/TUNNEL_CAT_TUNNEL_PARAMS"
|
||||
android:title="@string/tunnel_parameters">
|
||||
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:defaultValue="@integer/DEFAULT_TUNNEL_LENGTH"
|
||||
android:dialogTitle="@string/settings_desc_expl_length"
|
||||
android:entries="@array/setting0to3"
|
||||
android:entryValues="@array/setting0to3"
|
||||
android:key="@string/TUNNEL_OPT_LENGTH"
|
||||
android:summary="@string/settings_summ_expl_length"
|
||||
android:title="@string/settings_label_expl_length" />
|
||||
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:defaultValue="@integer/DEFAULT_TUNNEL_VARIANCE"
|
||||
android:dialogTitle="@string/settings_desc_expl_lengthVariance"
|
||||
android:entries="@array/setting2to2"
|
||||
android:entryValues="@array/setting2to2"
|
||||
android:key="@string/TUNNEL_OPT_VARIANCE"
|
||||
android:summary="@string/settings_summ_expl_lengthVariance"
|
||||
android:title="@string/settings_label_expl_lengthVariance" />
|
||||
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:defaultValue="@integer/DEFAULT_TUNNEL_QUANTITY"
|
||||
android:dialogTitle="@string/settings_desc_expl_quantity"
|
||||
android:entries="@array/setting0to3"
|
||||
android:entryValues="@array/setting0to3"
|
||||
android:key="@string/TUNNEL_OPT_QUANTITY"
|
||||
android:summary="@string/settings_summ_expl_quantity"
|
||||
android:title="@string/settings_label_expl_quantity" />
|
||||
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:defaultValue="@integer/DEFAULT_TUNNEL_BACKUP_QUANTITY"
|
||||
android:dialogTitle="@string/settings_desc_expl_backupQuantity"
|
||||
android:entries="@array/setting0to3"
|
||||
android:entryValues="@array/setting0to3"
|
||||
android:key="@string/TUNNEL_OPT_BACKUP_QUANTITY"
|
||||
android:summary="@string/settings_summ_expl_backupQuantity"
|
||||
android:title="@string/settings_label_expl_backupQuantity" />
|
||||
|
||||
<ListPreference
|
||||
android:entries="@array/tunnel_profile_names"
|
||||
android:entryValues="@array/tunnel_profiles"
|
||||
android:key="@string/TUNNEL_OPT_PROFILE"
|
||||
android:title="@string/profile" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="@string/TUNNEL_OPT_DELAY_CONNECT"
|
||||
android:summary="@string/tunnel_summ_delay_connect"
|
||||
android:title="@string/delay_connect" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
|
||||
</PreferenceScreen>
|
33
app/src/main/res/xml/tunnel_adv_client_http.xml
Normal file
33
app/src/main/res/xml/tunnel_adv_client_http.xml
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<PreferenceCategory android:title="@string/http_client">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="@string/TUNNEL_OPT_HTTPCLIENT_PASS_UA"
|
||||
android:summary="@string/tunnel_summ_user_agent"
|
||||
android:title="User-Agent" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="@string/TUNNEL_OPT_HTTPCLIENT_PASS_REFERER"
|
||||
android:summary="@string/tunnel_summ_referer"
|
||||
android:title="Referer" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="@string/TUNNEL_OPT_HTTPCLIENT_PASS_ACCEPT"
|
||||
android:summary="@string/tunnel_summ_accept"
|
||||
android:title="Accept" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="@string/TUNNEL_OPT_HTTPCLIENT_ALLOW_SSL"
|
||||
android:summary="@string/tunnel_summ_allow_ssl"
|
||||
android:title="SSL" />
|
||||
|
||||
<EditTextPreference
|
||||
android:defaultValue="@string/DEFAULT_JUMP_LIST"
|
||||
android:inputType="textMultiLine"
|
||||
android:key="@string/TUNNEL_OPT_JUMP_LIST"
|
||||
android:title="@string/jump_url_list" />
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
42
app/src/main/res/xml/tunnel_adv_client_proxy.xml
Normal file
42
app/src/main/res/xml/tunnel_adv_client_proxy.xml
Normal file
@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<PreferenceCategory android:title="@string/proxy_auth">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="@string/TUNNEL_OPT_LOCAL_AUTH"
|
||||
android:summary="@string/tunnel_summ_proxy_auth"
|
||||
android:title="@string/settings_enable" />
|
||||
|
||||
<net.i2p.android.router.util.SummaryEditTextPreference
|
||||
android:dependency="@string/TUNNEL_OPT_LOCAL_AUTH"
|
||||
android:key="@string/TUNNEL_OPT_LOCAL_USERNAME"
|
||||
android:title="@string/username" />
|
||||
|
||||
<EditTextPreference
|
||||
android:dependency="@string/TUNNEL_OPT_LOCAL_AUTH"
|
||||
android:inputType="textPassword"
|
||||
android:key="@string/TUNNEL_OPT_LOCAL_PASSWORD"
|
||||
android:title="@string/password" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:title="@string/outproxy_auth">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="@string/TUNNEL_OPT_OUTPROXY_AUTH"
|
||||
android:summary="@string/tunnel_summ_outproxy_auth"
|
||||
android:title="@string/settings_enable" />
|
||||
|
||||
<net.i2p.android.router.util.SummaryEditTextPreference
|
||||
android:dependency="@string/TUNNEL_OPT_OUTPROXY_AUTH"
|
||||
android:key="@string/TUNNEL_OPT_OUTPROXY_USERNAME"
|
||||
android:title="@string/username" />
|
||||
|
||||
<EditTextPreference
|
||||
android:dependency="@string/TUNNEL_OPT_OUTPROXY_AUTH"
|
||||
android:inputType="textPassword"
|
||||
android:key="@string/TUNNEL_OPT_OUTPROXY_PASSWORD"
|
||||
android:title="@string/password" />
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
35
app/src/main/res/xml/tunnel_adv_idle.xml
Normal file
35
app/src/main/res/xml/tunnel_adv_idle.xml
Normal file
@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="@string/TUNNEL_CAT_IDLE"
|
||||
android:title="@string/power_saving">
|
||||
|
||||
<!-- Client-only (but not Streamr client) -->
|
||||
<CheckBoxPreference
|
||||
android:defaultValue="@bool/DEFAULT_DELAY_OPEN"
|
||||
android:key="@string/TUNNEL_OPT_DELAY_OPEN"
|
||||
android:summary="@string/tunnel_summ_delay_open"
|
||||
android:title="@string/delay_open" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:defaultValue="@bool/DEFAULT_REDUCE_ON_IDLE"
|
||||
android:key="@string/TUNNEL_OPT_REDUCE_IDLE"
|
||||
android:summary="@string/tunnel_summ_reduce_quantity"
|
||||
android:title="@string/reduce_quantity" />
|
||||
|
||||
<net.i2p.android.router.util.IntEditTextPreference
|
||||
android:defaultValue="@integer/DEFAULT_REDUCE_TIME"
|
||||
android:dependency="@string/TUNNEL_OPT_REDUCE_IDLE"
|
||||
android:key="@string/TUNNEL_OPT_REDUCE_TIME"
|
||||
android:summary="@string/num_minutes"
|
||||
android:title="@string/idle_time" />
|
||||
|
||||
<net.i2p.android.router.util.IntEditTextPreference
|
||||
android:defaultValue="@integer/DEFAULT_REDUCE_COUNT"
|
||||
android:dependency="@string/TUNNEL_OPT_REDUCE_IDLE"
|
||||
android:key="@string/TUNNEL_OPT_REDUCE_QUANTITY"
|
||||
android:title="@string/reduced_tunnel_quantity" />
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
21
app/src/main/res/xml/tunnel_adv_idle_client.xml
Normal file
21
app/src/main/res/xml/tunnel_adv_idle_client.xml
Normal file
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:defaultValue="@bool/DEFAULT_CLOSE_ON_IDLE"
|
||||
android:key="@string/TUNNEL_OPT_CLOSE_IDLE"
|
||||
android:title="@string/close_tunnels" />
|
||||
|
||||
<net.i2p.android.router.util.IntEditTextPreference
|
||||
android:defaultValue="@integer/DEFAULT_CLOSE_TIME"
|
||||
android:dependency="@string/TUNNEL_OPT_CLOSE_IDLE"
|
||||
android:key="@string/TUNNEL_OPT_CLOSE_TIME"
|
||||
android:summary="@string/num_minutes"
|
||||
android:title="@string/idle_time" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:dependency="@string/TUNNEL_OPT_CLOSE_IDLE"
|
||||
android:key="@string/TUNNEL_OTP_NEW_KEYS"
|
||||
android:title="@string/new_keys_on_reopen" />
|
||||
|
||||
</PreferenceScreen>
|
18
app/src/main/res/xml/tunnel_adv_other.xml
Normal file
18
app/src/main/res/xml/tunnel_adv_other.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<PreferenceCategory android:title="@string/other">
|
||||
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:entries="@array/sigtype_names"
|
||||
android:entryValues="@array/sigtypes"
|
||||
android:key="@string/TUNNEL_OPT_SIGTYPE"
|
||||
android:title="@string/signature_type" />
|
||||
|
||||
<EditTextPreference
|
||||
android:inputType="textMultiLine"
|
||||
android:key="@string/TUNNEL_OPT_CUSTOM_OPTIONS"
|
||||
android:title="@string/custom_options" />
|
||||
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
90
app/src/main/res/xml/tunnel_adv_server.xml
Normal file
90
app/src/main/res/xml/tunnel_adv_server.xml
Normal file
@ -0,0 +1,90 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="@string/TUNNEL_CAT_ACCESS_CONTROL"
|
||||
android:title="@string/access_control">
|
||||
|
||||
<net.i2p.android.router.util.IntListPreference
|
||||
android:entries="@array/access_mode_names"
|
||||
android:entryValues="@array/access_modes"
|
||||
android:key="@string/TUNNEL_OPT_ACCESS_MODE"
|
||||
android:title="@string/restricted_access" />
|
||||
|
||||
<EditTextPreference
|
||||
android:inputType="textMultiLine"
|
||||
android:key="@string/TUNNEL_OPT_ACCESS_LIST"
|
||||
android:title="@string/access_list" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="@string/TUNNEL_OPT_REJECT_INPROXY"
|
||||
android:summary="@string/tunnel_summ_reject_inproxies"
|
||||
android:title="@string/reject_inproxies" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="@string/TUNNEL_OPT_UNIQUE_LOCAL"
|
||||
android:summary="@string/tunnel_summ_unique_local"
|
||||
android:title="@string/unique_local" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="@string/TUNNEL_OPT_MULTIHOME"
|
||||
android:summary="@string/tunnel_summ_multihome"
|
||||
android:title="@string/multihome" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:title="@string/client_connection_limits">
|
||||
|
||||
<net.i2p.android.router.util.ConnectionLimitPreference
|
||||
android:dialogMessage="@string/set_zero_for_unlimited"
|
||||
android:dialogTitle="@string/connections_per_minute"
|
||||
android:key="@string/TUNNEL_OPT_LIMIT_MINUTE"
|
||||
android:title="@string/num_per_minute"
|
||||
app:clp_valueInTitle="true" />
|
||||
|
||||
<net.i2p.android.router.util.ConnectionLimitPreference
|
||||
android:dialogMessage="@string/set_zero_for_unlimited"
|
||||
android:dialogTitle="@string/connections_per_hour"
|
||||
android:key="@string/TUNNEL_OPT_LIMIT_HOUR"
|
||||
android:title="@string/num_per_hour"
|
||||
app:clp_valueInTitle="true" />
|
||||
|
||||
<net.i2p.android.router.util.ConnectionLimitPreference
|
||||
android:dialogMessage="@string/set_zero_for_unlimited"
|
||||
android:dialogTitle="@string/connections_per_day"
|
||||
android:key="@string/TUNNEL_OPT_LIMIT_DAY"
|
||||
android:title="@string/num_per_day"
|
||||
app:clp_valueInTitle="true" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:title="@string/total_connection_limits">
|
||||
|
||||
<net.i2p.android.router.util.ConnectionLimitPreference
|
||||
android:dialogMessage="@string/set_zero_for_unlimited"
|
||||
android:dialogTitle="@string/total_connections_per_minute"
|
||||
android:key="@string/TUNNEL_OPT_TOTAL_MINUTE"
|
||||
android:title="@string/num_per_minute"
|
||||
app:clp_valueInTitle="true" />
|
||||
|
||||
<net.i2p.android.router.util.ConnectionLimitPreference
|
||||
android:dialogMessage="@string/set_zero_for_unlimited"
|
||||
android:dialogTitle="@string/total_connections_per_hour"
|
||||
android:key="@string/TUNNEL_OPT_TOTAL_HOUR"
|
||||
android:title="@string/num_per_hour"
|
||||
app:clp_valueInTitle="true" />
|
||||
|
||||
<net.i2p.android.router.util.ConnectionLimitPreference
|
||||
android:dialogMessage="@string/set_zero_for_unlimited"
|
||||
android:dialogTitle="@string/total_connections_per_day"
|
||||
android:key="@string/TUNNEL_OPT_TOTAL_DAY"
|
||||
android:title="@string/num_per_day"
|
||||
app:clp_valueInTitle="true" />
|
||||
|
||||
<net.i2p.android.router.util.ConnectionLimitPreference
|
||||
android:dialogMessage="@string/set_zero_for_unlimited"
|
||||
android:key="@string/TUNNEL_OPT_MAX_STREAMS"
|
||||
android:title="@string/max_active_connections" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
31
app/src/main/res/xml/tunnel_adv_server_http.xml
Normal file
31
app/src/main/res/xml/tunnel_adv_server_http.xml
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<PreferenceCategory android:title="@string/post_limits">
|
||||
|
||||
<net.i2p.android.router.util.IntEditTextPreference
|
||||
android:key="@string/TUNNEL_OPT_POST_CHECK_TIME"
|
||||
android:summary="%s minutes"
|
||||
android:title="@string/limit_period" />
|
||||
|
||||
<net.i2p.android.router.util.ConnectionLimitPreference
|
||||
android:key="@string/TUNNEL_OPT_POST_MAX"
|
||||
android:title="@string/client_posts_per_period" />
|
||||
|
||||
<net.i2p.android.router.util.IntEditTextPreference
|
||||
android:key="@string/TUNNEL_OPT_POST_BAN_TIME"
|
||||
android:summary="%s minutes"
|
||||
android:title="@string/client_ban_length" />
|
||||
|
||||
<net.i2p.android.router.util.ConnectionLimitPreference
|
||||
android:key="@string/TUNNEL_OPT_POST_TOTAL_MAX"
|
||||
android:title="@string/total_posts_per_period" />
|
||||
|
||||
<net.i2p.android.router.util.IntEditTextPreference
|
||||
android:key="@string/TUNNEL_OPT_POST_TOTAL_BAN_TIME"
|
||||
android:summary="%s minutes"
|
||||
android:title="@string/total_ban_length" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
26
app/src/main/res/xml/tunnel_gen.xml
Normal file
26
app/src/main/res/xml/tunnel_gen.xml
Normal file
@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<net.i2p.android.router.util.SummaryEditTextPreference
|
||||
android:key="@string/TUNNEL_NAME"
|
||||
android:title="@string/name" />
|
||||
|
||||
<net.i2p.android.router.util.SummaryEditTextPreference
|
||||
android:key="@string/TUNNEL_DESCRIPTION"
|
||||
android:title="@string/description" />
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="@string/TUNNEL_CAT_GENERAL"
|
||||
android:title="@string/general">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:defaultValue="@bool/DEFAULT_START_ON_LOAD"
|
||||
android:key="@string/TUNNEL_START_ON_LOAD"
|
||||
android:summary="@string/tunnel_summ_auto_start"
|
||||
android:title="@string/auto_start" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="@string/TUNNEL_CAT_PORT"
|
||||
android:title="@string/tunnel_cat_ports" />
|
||||
</PreferenceScreen>
|
20
app/src/main/res/xml/tunnel_gen_client.xml
Normal file
20
app/src/main/res/xml/tunnel_gen_client.xml
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:defaultValue="@bool/DEFAULT_SHARED_CLIENTS"
|
||||
android:key="@string/TUNNEL_SHARED_CLIENT"
|
||||
android:summary="@string/tunnel_summ_shared_client"
|
||||
android:title="@string/shared_client" />
|
||||
|
||||
<net.i2p.android.router.util.SummaryEditTextPreference
|
||||
android:key="@string/TUNNEL_DEST"
|
||||
android:title="@string/target_destination" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:defaultValue="@bool/DEFAULT_PERSISTENT_KEY"
|
||||
android:key="@string/TUNNEL_OPT_PERSISTENT_KEY"
|
||||
android:summary="@string/tunnel_summ_persistent_key"
|
||||
android:title="@string/persistent_key" />
|
||||
|
||||
</PreferenceScreen>
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user