mirror of
https://github.com/PurpleI2P/i2pd-android.git
synced 2024-12-06 19:27:28 +01:00
Compare commits
53 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ca3ef80981 | |||
| 8f56a56927 | |||
| cf5fe2e948 | |||
| 938a85bc3c | |||
| 226c7e20e3 | |||
| 57f255cde2 | |||
| f3d71465d7 | |||
| 0ec2f1ae51 | |||
| 96e217c1ee | |||
| e2f7391c5a | |||
| 64696efbb6 | |||
| 94b784564e | |||
| 65b615ad45 | |||
| 5d1fa20733 | |||
| 8f4b462a83 | |||
| be0d652875 | |||
| c7bdaac061 | |||
| 3b7f9b511f | |||
| 9bf0a7b787 | |||
| 2d2662fe63 | |||
| 97abcc661f | |||
| 8a791c45c2 | |||
| 4334fd4bdb | |||
| f0132e9847 | |||
| 06b567d910 | |||
| dd17608af9 | |||
| 2e10678278 | |||
| 8132dbde08 | |||
| f2ee4e5ea0 | |||
| 57fef00c48 | |||
| b003a07f1b | |||
| 3b328d7f7c | |||
| f2b7ae1ada | |||
| fce1dc98d0 | |||
| 5d86c53204 | |||
| a88037692f | |||
| 67a98991d0 | |||
| a3cddc954d | |||
| a36131b1bc | |||
| e0a2d6f015 | |||
| a411f9132f | |||
| e2dfde17bf | |||
| 447407483d | |||
| e925b58239 | |||
| 1a4e0c02de | |||
| b0f8bf87ba | |||
| 99fc0992f2 | |||
| e27534dbbe | |||
| 8abfd1f5fb | |||
| 6c162bc689 | |||
| a61012f72d | |||
| 2bdb97db0f | |||
| d72e3aeea6 |
@@ -6,30 +6,20 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: 'recursive'
|
||||
- name: Install GNU C++ compiler
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y g++
|
||||
- name: Setup JDK 1.11
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 1.11
|
||||
- name: Setup Android SDK
|
||||
uses: maxim-lobanov/setup-android-tools@v1
|
||||
with:
|
||||
packages: |
|
||||
build-tools;31.0.0
|
||||
platforms;android-31
|
||||
ndk;21.4.7075529
|
||||
cmake;3.18.1
|
||||
cache: true
|
||||
- name: Switch to JDK 11
|
||||
run: export JAVA_HOME=$JAVA_HOME_11_X64
|
||||
- name: Install required Android SDK packages
|
||||
run: $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "cmake;3.22.1" "ndk;23.2.8568313"
|
||||
- name: Build required modules
|
||||
run: |
|
||||
export ANDROID_SDK_ROOT=$ANDROID_HOME
|
||||
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/21.4.7075529
|
||||
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/23.2.8568313
|
||||
pushd app/jni
|
||||
./build_boost.sh
|
||||
./build_openssl.sh
|
||||
@@ -38,36 +28,28 @@ jobs:
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew --no-daemon assembleDebug
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: android-apks.zip
|
||||
name: android-apks
|
||||
path: app/build/outputs/apk/debug/*.apk
|
||||
|
||||
build-binary:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: 'recursive'
|
||||
- name: Install GNU C++ compiler
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y g++
|
||||
- name: Setup JDK 1.11
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 1.11
|
||||
- name: Setup Android SDK
|
||||
uses: maxim-lobanov/setup-android-tools@v1
|
||||
with:
|
||||
packages: |
|
||||
ndk;21.4.7075529
|
||||
cmake;3.18.1
|
||||
cache: true
|
||||
- name: Switch to JDK 11
|
||||
run: export JAVA_HOME=$JAVA_HOME_11_X64
|
||||
- name: Install required Android SDK packages
|
||||
run: $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "cmake;3.22.1" "ndk;23.2.8568313"
|
||||
- name: Build required modules
|
||||
run: |
|
||||
export ANDROID_SDK_ROOT=$ANDROID_HOME
|
||||
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/21.4.7075529
|
||||
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/23.2.8568313
|
||||
pushd binary/jni
|
||||
./build_boost.sh
|
||||
./build_openssl.sh
|
||||
@@ -84,12 +66,12 @@ jobs:
|
||||
./build-archive
|
||||
popd
|
||||
- name: Upload binaries archive
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: android-binaries.zip
|
||||
name: android-binaries
|
||||
path: binary/libs/*
|
||||
- name: Upload binaries package
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: android-binaries-pack.zip
|
||||
name: android-binaries-pack
|
||||
path: contrib/binary_pack/i2pd_*_android_binary.zip
|
||||
|
||||
@@ -35,7 +35,7 @@ cd /tmp/android-sdk
|
||||
wget https://dl.google.com/android/repository/commandlinetools-linux-8092744_latest.zip
|
||||
unzip commandlinetools-linux-8092744_latest.zip
|
||||
# install required tools
|
||||
./cmdline-tools/bin/sdkmanager --sdk_root=/opt/android-sdk "build-tools;31.0.0" "cmake;3.18.1" "ndk;21.4.7075529"
|
||||
./cmdline-tools/bin/sdkmanager --sdk_root=/opt/android-sdk "build-tools;33.0.1" "cmake;3.22.1" "ndk;23.2.8568313"
|
||||
```
|
||||
|
||||
### Clone repository with submodules
|
||||
@@ -47,8 +47,11 @@ git clone --recurse-submodules https://github.com/PurpleI2P/i2pd-android.git
|
||||
### Compile application
|
||||
|
||||
```bash
|
||||
export ANDROID_SDK_ROOT=/opt/android-sdk
|
||||
export ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk/21.4.7075529
|
||||
# if you are not using Java 11 by default:
|
||||
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
|
||||
|
||||
export ANDROID_HOME=/opt/android-sdk
|
||||
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/23.2.8568313
|
||||
|
||||
pushd app/jni
|
||||
./build_boost.sh
|
||||
@@ -69,6 +72,12 @@ Java 11 can be downloaded from [jdk.java.com](https://jdk.java.net/java-se-ri/11
|
||||
|
||||
Download Android SDK command line tools for Windows, unpack and install it replacing `--sdk_root=` path.
|
||||
|
||||
`ANDROID_SDK_ROOT` variable must point to SDK using linux-way path, like `/c/dev/android-sdk` when SDK installed to `C:\dev\android-sdk`.
|
||||
`ANDROID_HOME` variable must point to SDK using linux-way path, like `/c/dev/android-sdk` when SDK installed to `C:\dev\android-sdk`.
|
||||
|
||||
Gradle can be called with `./gradlew` command inside project root, or you can install it using `pacman` and call `gradle` like on linux.
|
||||
Gradle can be called with `./gradlew` command inside project root, or you can install it using `pacman` and call `gradle` like on linux.
|
||||
|
||||
## Release signing
|
||||
|
||||
Current releases signed with certificate fingerprint (SHA-256):
|
||||
|
||||
`FC:C3:C7:34:9E:22:6A:77:B3:70:46:BB:00:FD:04:BB:A5:30:32:21:01:F8:62:F3:6D:8C:3D:B0:EB:B6:35:20`
|
||||
|
||||
+25
-9
@@ -3,21 +3,36 @@ plugins {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'androidx.core:core:1.6.0'
|
||||
implementation 'androidx.core:core:1.9.0'
|
||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
|
||||
// implementation 'org.ini4j:ini4j:0.5.4'
|
||||
implementation 'org.apache.commons:commons-configuration2:2.9.0'
|
||||
}
|
||||
configurations {
|
||||
all{
|
||||
//exclude group: 'commons-logging', module: 'commons-logging'
|
||||
//exclude group: 'org.apache.httpcomponents'
|
||||
exclude module: 'httpclient'
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 29
|
||||
lintOptions {
|
||||
// Not so a good way
|
||||
disable 'DuplicatePlatformClasses'
|
||||
}
|
||||
|
||||
compileSdkVersion 33
|
||||
|
||||
defaultConfig {
|
||||
applicationId "org.purplei2p.i2pd"
|
||||
targetSdkVersion 29
|
||||
targetSdkVersion 33
|
||||
// TODO: 24?
|
||||
minSdkVersion 16
|
||||
versionCode 2420000
|
||||
versionName "2.42.0"
|
||||
versionCode 2510000
|
||||
versionName "2.51.0"
|
||||
archivesBaseName += "-$versionName"
|
||||
ndkVersion "21.4.7075529"
|
||||
ndkVersion "23.2.8568313"
|
||||
|
||||
ndk {
|
||||
abiFilters "armeabi-v7a"
|
||||
@@ -70,9 +85,10 @@ android {
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = "1.8"
|
||||
targetCompatibility = "1.8"
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
namespace 'org.purplei2p.i2pd'
|
||||
}
|
||||
|
||||
ext.abiCodes = ['armeabi-v7a': 1, 'x86': 2, 'arm64-v8a': 3, 'x86_64': 4]
|
||||
@@ -83,7 +99,7 @@ android.applicationVariants.all { variant ->
|
||||
def baseAbiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
|
||||
|
||||
if (baseAbiVersionCode != null) {
|
||||
output.versionCodeOverride = baseAbiVersionCode * 10 + variant.versionCode
|
||||
output.versionCodeOverride = baseAbiVersionCode + variant.versionCode
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -24,7 +24,8 @@ LOCAL_SRC_FILES := \
|
||||
$(DAEMON_SRC_PATH)/Daemon.cpp \
|
||||
$(DAEMON_SRC_PATH)/UPnP.cpp \
|
||||
$(DAEMON_SRC_PATH)/HTTPServer.cpp \
|
||||
$(DAEMON_SRC_PATH)/I2PControl.cpp
|
||||
$(DAEMON_SRC_PATH)/I2PControl.cpp \
|
||||
$(DAEMON_SRC_PATH)/I2PControlHandlers.cpp
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ APP_STL := c++_static
|
||||
# Enable c++17 extensions in source code
|
||||
APP_CPPFLAGS += -std=c++17 -fexceptions -frtti
|
||||
|
||||
APP_CPPFLAGS += -DANDROID -D__ANDROID__ -DUSE_UPNP -Wno-deprecated-declarations -fstack-protector
|
||||
APP_CPPFLAGS += -DANDROID -D__ANDROID__ -DUSE_UPNP -Wno-deprecated-declarations
|
||||
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
||||
APP_CPPFLAGS += -DANDROID_ARM7A
|
||||
endif
|
||||
|
||||
+1
-1
Submodule app/jni/boost updated: 0e12fbd30c...53e6c16ea8
@@ -2,12 +2,10 @@
|
||||
|
||||
set -e
|
||||
|
||||
BOOST_VERSION=1.74.0
|
||||
BOOST_VERSION=1.78.0
|
||||
BOOST_LIBS=date_time,filesystem,program_options,system
|
||||
|
||||
function build_one {
|
||||
mkdir out
|
||||
|
||||
echo "Configuring and building..."
|
||||
CXXFLAGS="-std=c++14" \
|
||||
NCPU=$(nproc) \
|
||||
@@ -70,10 +68,10 @@ function build {
|
||||
checkPreRequisites
|
||||
|
||||
cd boost
|
||||
rm -rf out
|
||||
|
||||
# disable verbose output
|
||||
sed -i -e 's/d+2/d+0/' build-android.sh
|
||||
sed -i -E -e 's/d\+2/d\+0/' build-android.sh
|
||||
sed -i -E -e 's/\"23\.1\"\|\"25\.0\"/\"23\.1\"\|\"23\.2\"\|\"25\.0\"/' build-android.sh
|
||||
|
||||
if (( $# == 0 )); then
|
||||
build all
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
set -e
|
||||
|
||||
CMAKE_VERSION=3.18.1
|
||||
CMAKE_VERSION=3.22.1
|
||||
|
||||
function build_one {
|
||||
mkdir -p build out/$CPU
|
||||
@@ -37,8 +37,8 @@ function checkPreRequisites {
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ -z "$ANDROID_SDK_ROOT" -a "$ANDROID_SDK_ROOT" == "" ]; then
|
||||
echo -e "\033[31mFailed! ANDROID_SDK_ROOT is empty. Run 'export ANDROID_SDK_ROOT=[PATH_TO_NDK]'\033[0m"
|
||||
if [ -z "$ANDROID_HOME" -a "$ANDROID_HOME" == "" ]; then
|
||||
echo -e "\033[31mFailed! ANDROID_HOME is empty. Run 'export ANDROID_HOME=[PATH_TO_NDK]'\033[0m"
|
||||
exit
|
||||
fi
|
||||
|
||||
@@ -83,7 +83,7 @@ cd miniupnp/miniupnpc
|
||||
rm -rf build out
|
||||
|
||||
# add cmake from Android SDK to PATH
|
||||
PATH=$ANDROID_SDK_ROOT/cmake/$CMAKE_VERSION/bin:$PATH
|
||||
PATH=$ANDROID_HOME/cmake/$CMAKE_VERSION/bin:$PATH
|
||||
|
||||
if (( $# == 0 )); then
|
||||
build x86_64 arm64 arm x86
|
||||
|
||||
+1
-1
Submodule app/jni/i2pd updated: fd7b889a0f...1b5f67e185
+1
-1
Submodule app/jni/openssl updated: ca2e0784d2...e04bd3433f
@@ -1,13 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.purplei2p.i2pd"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:installLocation="auto">
|
||||
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="29" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="29" />
|
||||
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
|
||||
tools:ignore="ScopedStorage" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
@@ -20,6 +23,17 @@
|
||||
android:theme="@android:style/Theme.DeviceDefault"
|
||||
android:usesCleartextTraffic="true">
|
||||
|
||||
<service
|
||||
android:name=".I2PdQSTileService"
|
||||
android:exported="true"
|
||||
android:label="I2Pd"
|
||||
android:icon="@drawable/ic_logo"
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<receiver
|
||||
android:enabled="true"
|
||||
android:name="org.purplei2p.i2pd.receivers.BootUpReceiver"
|
||||
@@ -39,14 +53,17 @@
|
||||
|
||||
<receiver
|
||||
android:name=".NetworkStateChangeReceiver"
|
||||
android:label="NetworkChangeReceiver" >
|
||||
android:label="NetworkChangeReceiver"
|
||||
android:exported="true" >
|
||||
<intent-filter>
|
||||
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
|
||||
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"
|
||||
tools:ignore="BatteryLife" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<activity
|
||||
android:name=".I2PDPermsAskerActivity">
|
||||
android:name=".I2PDPermsAskerActivity"
|
||||
android:exported="true" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
@@ -58,6 +75,8 @@
|
||||
|
||||
<service
|
||||
android:name=".ForegroundService"
|
||||
android:exported="false"
|
||||
android:stopWithTask="false"
|
||||
android:enabled="true" />
|
||||
|
||||
<activity
|
||||
@@ -68,5 +87,11 @@
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="org.purplei2p.i2pd.I2PDPermsAskerActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".MainPreferenceActivity"
|
||||
android:label="Settings"
|
||||
>
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
</manifest>
|
||||
|
||||
@@ -12,7 +12,7 @@ loglevel = none
|
||||
ipv4 = true
|
||||
ipv6 = false
|
||||
|
||||
# ssu = true
|
||||
ssu = false
|
||||
|
||||
bandwidth = L
|
||||
# share = 100
|
||||
@@ -23,6 +23,10 @@ bandwidth = L
|
||||
[ntcp2]
|
||||
enabled = true
|
||||
|
||||
[ssu2]
|
||||
enabled = true
|
||||
published = true
|
||||
|
||||
[http]
|
||||
enabled = true
|
||||
address = 127.0.0.1
|
||||
@@ -63,7 +67,7 @@ enabled = false
|
||||
# port = 7656
|
||||
|
||||
[precomputation]
|
||||
elgamal = true
|
||||
elgamal = false
|
||||
|
||||
[upnp]
|
||||
enabled = true
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package org.purplei2p.i2pd;
|
||||
|
||||
import static android.app.PendingIntent.FLAG_IMMUTABLE;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
@@ -139,19 +141,19 @@ public class ForegroundService extends Service {
|
||||
|
||||
// The PendingIntent to launch our activity if the user selects this notification
|
||||
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
|
||||
new Intent(this, I2PDActivity.class), 0);
|
||||
new Intent(this, I2PDActivity.class),
|
||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? FLAG_IMMUTABLE : 0);
|
||||
|
||||
// If earlier version channel ID is not used
|
||||
// https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)
|
||||
String channelId = Build.VERSION.SDK_INT >= 26 ? createNotificationChannel() : "";
|
||||
String channelId = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? createNotificationChannel() : "";
|
||||
|
||||
// Set the info for the views that show in the notification panel.
|
||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
|
||||
.setOngoing(true)
|
||||
.setSmallIcon(R.drawable.ic_notification_icon); // the status icon
|
||||
if (Build.VERSION.SDK_INT >= 16)
|
||||
builder = builder.setPriority(Notification.PRIORITY_DEFAULT);
|
||||
if (Build.VERSION.SDK_INT >= 21)
|
||||
builder = builder.setPriority(Notification.PRIORITY_DEFAULT);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
||||
builder = builder.setCategory(Notification.CATEGORY_SERVICE);
|
||||
Notification notification = builder
|
||||
.setTicker(text) // the status text
|
||||
|
||||
@@ -20,6 +20,7 @@ import android.net.ConnectivityManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Build;
|
||||
import android.os.Environment;
|
||||
import android.os.IBinder;
|
||||
import android.os.PowerManager;
|
||||
import android.preference.PreferenceManager;
|
||||
@@ -110,7 +111,7 @@ public class I2PDActivity extends Activity {
|
||||
Log.d(TAG, "onCreate");
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
startService(new Intent(this, ForegroundService.class));
|
||||
textView = (TextView) findViewById(R.id.appStatusText);
|
||||
HTTPProxyState = (CheckBox) findViewById(R.id.service_httpproxy_box);
|
||||
SOCKSProxyState = (CheckBox) findViewById(R.id.service_socksproxy_box);
|
||||
@@ -126,11 +127,17 @@ public class I2PDActivity extends Activity {
|
||||
|
||||
daemon.addStateChangeListener(daemonStateUpdatedListener);
|
||||
daemonStateUpdatedListener.daemonStateUpdate(DaemonWrapper.State.uninitialized, daemon.getState());
|
||||
|
||||
// request permissions
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
if(!Environment.isExternalStorageManager()) {
|
||||
Log.e(TAG, "MANAGE_EXTERNAL_STORAGE perm declined, stopping i2pd");
|
||||
i2pdStop();
|
||||
}
|
||||
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
||||
ActivityCompat.requestPermissions(this,
|
||||
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
|
||||
new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
|
||||
MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,11 @@ import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.provider.Settings;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
@@ -16,6 +20,7 @@ import java.lang.reflect.Method;
|
||||
public class I2PDPermsAskerActivity extends Activity {
|
||||
|
||||
private static final int PERMISSION_WRITE_EXTERNAL_STORAGE = 0;
|
||||
private static final int PERMISSION_MANAGE_EXTERNAL_STORAGE = 0;
|
||||
|
||||
private Button button_request_write_ext_storage_perms;
|
||||
private TextView textview_retry;
|
||||
@@ -24,7 +29,7 @@ public class I2PDPermsAskerActivity extends Activity {
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
//if less than Android 6, no runtime perms req system present
|
||||
if (android.os.Build.VERSION.SDK_INT < 23) {
|
||||
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||
startMainActivity();
|
||||
return;
|
||||
}
|
||||
@@ -48,57 +53,66 @@ public class I2PDPermsAskerActivity extends Activity {
|
||||
textview_retry.setVisibility(TextView.GONE);
|
||||
button_request_write_ext_storage_perms.setVisibility(Button.GONE);
|
||||
|
||||
Method methodCheckPermission;
|
||||
Method method_shouldShowRequestPermissionRationale;
|
||||
Method method_requestPermissions;
|
||||
try {
|
||||
methodCheckPermission = getClass().getMethod("checkSelfPermission", String.class);
|
||||
method_shouldShowRequestPermissionRationale =
|
||||
getClass().getMethod("shouldShowRequestPermissionRationale", String.class);
|
||||
method_requestPermissions =
|
||||
getClass().getMethod("requestPermissions", String[].class, int.class);
|
||||
} catch (NoSuchMethodException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
Integer resultObj;
|
||||
try {
|
||||
resultObj = (Integer) methodCheckPermission.invoke(
|
||||
this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
if(!Environment.isExternalStorageManager()) {
|
||||
showExplanation();
|
||||
} else {
|
||||
startMainActivity();
|
||||
}
|
||||
} else {
|
||||
Method methodCheckPermission;
|
||||
Method method_shouldShowRequestPermissionRationale;
|
||||
Method method_requestPermissions;
|
||||
|
||||
if (resultObj != PackageManager.PERMISSION_GRANTED) {
|
||||
|
||||
// Should we show an explanation?
|
||||
Boolean aBoolean;
|
||||
try {
|
||||
aBoolean = (Boolean) method_shouldShowRequestPermissionRationale.invoke(this,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||
} catch (Exception e) {
|
||||
methodCheckPermission = getClass().getMethod("checkSelfPermission", String.class);
|
||||
method_shouldShowRequestPermissionRationale =
|
||||
getClass().getMethod("shouldShowRequestPermissionRationale", String.class);
|
||||
method_requestPermissions =
|
||||
getClass().getMethod("requestPermissions", String[].class, int.class);
|
||||
} catch (NoSuchMethodException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
if (aBoolean) {
|
||||
|
||||
// Show an explanation to the user *asynchronously* -- don't block
|
||||
// this thread waiting for the user's response! After the user
|
||||
// sees the explanation, try again to request the permission.
|
||||
Integer resultObj;
|
||||
|
||||
showExplanation();
|
||||
|
||||
} else {
|
||||
|
||||
// No explanation needed, we can request the permission.
|
||||
try {
|
||||
resultObj = (Integer) methodCheckPermission.invoke(
|
||||
this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
if (resultObj != PackageManager.PERMISSION_GRANTED) {
|
||||
// Should we show an explanation?
|
||||
Boolean aBoolean;
|
||||
try {
|
||||
method_requestPermissions.invoke(this,
|
||||
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
|
||||
PERMISSION_WRITE_EXTERNAL_STORAGE);
|
||||
aBoolean = (Boolean) method_shouldShowRequestPermissionRationale.invoke(this,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
} else startMainActivity();
|
||||
|
||||
if (aBoolean) {
|
||||
|
||||
// Show an explanation to the user *asynchronously* -- don't block
|
||||
// this thread waiting for the user's response! After the user
|
||||
// sees the explanation, try again to request the permission.
|
||||
|
||||
showExplanation();
|
||||
|
||||
} else {
|
||||
// No explanation needed, we can request the permission.
|
||||
try {
|
||||
method_requestPermissions.invoke(this,
|
||||
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
|
||||
PERMISSION_WRITE_EXTERNAL_STORAGE);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
} else startMainActivity();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -136,6 +150,7 @@ public class I2PDPermsAskerActivity extends Activity {
|
||||
}
|
||||
|
||||
private static final int SHOW_EXPLANATION_REQUEST = 1; // The request code
|
||||
private static final int APP_STORAGE_ACCESS_REQUEST_CODE = 2;
|
||||
|
||||
private void showExplanation() {
|
||||
Intent intent = new Intent(this, I2PDPermsExplanationActivity.class);
|
||||
@@ -144,11 +159,14 @@ public class I2PDPermsAskerActivity extends Activity {
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
// Check which request we're responding to
|
||||
if (requestCode == SHOW_EXPLANATION_REQUEST) {
|
||||
// Make sure the request was successful
|
||||
if (resultCode == RESULT_OK) {
|
||||
// Request the permission
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
// Check which request we're responding to and make sure the request was successful
|
||||
if (requestCode == SHOW_EXPLANATION_REQUEST && resultCode == RESULT_OK) {
|
||||
// Request the permission
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
Intent intentManageAccess = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
|
||||
startActivityForResult(intentManageAccess, APP_STORAGE_ACCESS_REQUEST_CODE);
|
||||
} else {
|
||||
Method method_requestPermissions;
|
||||
try {
|
||||
method_requestPermissions =
|
||||
@@ -163,9 +181,21 @@ public class I2PDPermsAskerActivity extends Activity {
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
} else {
|
||||
finish(); //close the app
|
||||
}
|
||||
} else if (requestCode == APP_STORAGE_ACCESS_REQUEST_CODE && resultCode == RESULT_OK) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
if (Environment.isExternalStorageManager()) {
|
||||
startMainActivity();
|
||||
} else {
|
||||
textview_retry.setText(R.string.permDenied);
|
||||
textview_retry.setVisibility(TextView.VISIBLE);
|
||||
button_request_write_ext_storage_perms.setVisibility(Button.VISIBLE);
|
||||
|
||||
finish();
|
||||
}
|
||||
} else {
|
||||
finish(); // close the app
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
package org.purplei2p.i2pd;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.service.quicksettings.Tile;
|
||||
import android.service.quicksettings.TileService;
|
||||
import android.util.Log;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.os.Build;
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
public class I2PdQSTileService extends TileService {
|
||||
|
||||
private static final String TAG = "MyQSTileService";
|
||||
@Override
|
||||
public void onClick() {
|
||||
super.onClick();
|
||||
Log.d(TAG, "Tile clicked.");
|
||||
|
||||
try {
|
||||
// Add the FLAG_ACTIVITY_NEW_TASK flag
|
||||
Intent intent = new Intent(this, I2PDActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
||||
startActivityAndCollapse(intent);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error starting ForegroundService", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void onStartListening() {
|
||||
super.onStartListening();
|
||||
Log.d(TAG, "Tile started listening.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopListening() {
|
||||
super.onStopListening();
|
||||
Log.d(TAG, "Tile stopped listening.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTileAdded() {
|
||||
super.onTileAdded();
|
||||
Log.d(TAG, "Tile added.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTileRemoved() {
|
||||
super.onTileRemoved();
|
||||
Log.d(TAG, "Tile removed.");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,459 @@
|
||||
package org.purplei2p.i2pd;
|
||||
import android.os.Build;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.preference.CheckBoxPreference;
|
||||
import android.preference.EditTextPreference;
|
||||
import android.preference.ListPreference;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import android.util.Log;
|
||||
import java.io.File;
|
||||
import org.apache.commons.configuration2.INIConfiguration;
|
||||
import java.io.StringWriter;
|
||||
import java.io.Writer;
|
||||
import java.nio.file.*;
|
||||
|
||||
public class MainPreferenceActivity extends PreferenceActivity {
|
||||
private Boolean isOldConfigExists = false;
|
||||
public static final String CONFIG_FILE_PATH = "/sdcard/i2pd/i2pd.conf";
|
||||
private static final String OLD_FILE_PREFIX= "__old";
|
||||
|
||||
boolean isOldConfigExists()
|
||||
{
|
||||
try {
|
||||
return new File(CONFIG_FILE_PATH + OLD_FILE_PREFIX).exists();
|
||||
}catch(Exception e) { return false; }
|
||||
}
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
addPreferencesFromResource(R.xml.preferences_i2pd);
|
||||
INIConfiguration properties = readConfiguration();
|
||||
// backup old configuration.
|
||||
if (!isOldConfigExists)
|
||||
{
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
if (Files.exists(Paths.get(CONFIG_FILE_PATH))) {
|
||||
Files.copy(Paths.get(CONFIG_FILE_PATH), Paths.get(CONFIG_FILE_PATH + OLD_FILE_PREFIX));
|
||||
}
|
||||
} // if build ...
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
// delete empty sections
|
||||
{
|
||||
writeConfiguration(properties);
|
||||
}
|
||||
// Main Categoryре
|
||||
ListPreference logLevel = (ListPreference) findPreference("logLevelPreference");
|
||||
logLevel.setValue(properties.getString("log", "info"));
|
||||
logLevel.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
// Modify properties
|
||||
//properties.setProperty("log", (String) newValue);
|
||||
// Save modified properties
|
||||
//writeConfiguration(properties);
|
||||
writeConfiguration(properties, "log", (String) newValue);
|
||||
return true;
|
||||
});
|
||||
|
||||
CheckBoxPreference ipv4Enable = (CheckBoxPreference) findPreference("ipv4EnablePreference");
|
||||
boolean ipv4Enabled = Boolean.parseBoolean(properties.getString("ipv4", "true")); // "true" - значение по умолчанию, если ключ отсутствует
|
||||
ipv4Enable.setChecked(ipv4Enabled);
|
||||
ipv4Enable.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
// Modify properties
|
||||
// Convert Object to boolean
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
//properties.setProperty("ipv4", String.valueOf(newValueBoolean)); // assuming "ipv4" is the key
|
||||
// Save modified properties
|
||||
writeConfiguration(properties, "ipv4", String.valueOf(newValueBoolean));
|
||||
return true;
|
||||
});
|
||||
CheckBoxPreference ipv6Enable = (CheckBoxPreference) findPreference("ipv6EnablePreference");
|
||||
boolean ipv6Enabled = Boolean.parseBoolean(properties.getString("ipv6", "false"));
|
||||
ipv6Enable.setChecked(ipv6Enabled);
|
||||
ipv6Enable.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
// Modify properties
|
||||
// Convert Object to boolean
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
//properties.setProperty("ipv6", String.valueOf(newValueBoolean)); // assuming "ipv4" is the key
|
||||
// Save modified properties
|
||||
writeConfiguration(properties, "ipv6", String.valueOf(newValueBoolean));
|
||||
return true;
|
||||
});
|
||||
// Example for portPreference (EditTextPreference)
|
||||
EditTextPreference portPreference = (EditTextPreference) findPreference("portPreference");
|
||||
String portValue = properties.getString("port", "auto");
|
||||
portPreference.setText(portValue);
|
||||
portPreference.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
// Modify properties
|
||||
/*Properties properties = readProperties();
|
||||
// Convert Object to String (assuming "port" is the key)
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("port", newValueString);
|
||||
// Save modified properties
|
||||
writeProperties(properties);*/
|
||||
Toast.makeText(MainPreferenceActivity.this, "For security reasons, changes are not allowed. If you really want this, open the config.", Toast.LENGTH_SHORT).show();
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
// Example for bandwidthPreference (ListPreference)
|
||||
ListPreference bandwidthPreference = (ListPreference) findPreference("bandwidthPreference");
|
||||
String bandwidthValue = properties.getString("bandwidth", "L");
|
||||
bandwidthPreference.setValue(bandwidthValue);
|
||||
bandwidthPreference.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
//properties.setProperty("bandwidth", newValueString);
|
||||
writeConfiguration(properties, "bandwidth", newValueString);
|
||||
return true;
|
||||
});
|
||||
// Example for noTransitPreference (CheckBoxPreference)
|
||||
CheckBoxPreference noTransitPreference = (CheckBoxPreference) findPreference("noTransitPreference");
|
||||
boolean noTransitPreferenceEnabled = Boolean.parseBoolean(properties.getString("notransit", "false"));
|
||||
noTransitPreference.setChecked(noTransitPreferenceEnabled);
|
||||
|
||||
noTransitPreference.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
//properties.setProperty("notransit", String.valueOf(newValueBoolean));
|
||||
writeConfiguration(properties, "notransit", String.valueOf(newValueBoolean));
|
||||
return true;
|
||||
});
|
||||
CheckBoxPreference floodfillPreference = (CheckBoxPreference) findPreference("floodfillPreference");
|
||||
boolean floodfillPreferenceEnabled = Boolean.parseBoolean(properties.getString("floodfill", "false"));
|
||||
floodfillPreference.setChecked(floodfillPreferenceEnabled);
|
||||
floodfillPreference.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
//properties.setProperty("floodfill", String.valueOf(newValueBoolean));
|
||||
writeConfiguration(properties, "floodfill", String.valueOf(newValueBoolean));
|
||||
return true;
|
||||
});
|
||||
// ^^^ general
|
||||
// vvv not general (sections name)
|
||||
CheckBoxPreference ssuPreference = (CheckBoxPreference) findPreference("ssuPreference");
|
||||
boolean ssuPreferenceEnabled = Boolean.parseBoolean(properties.getString("ssu2.enabled", "true"));
|
||||
ssuPreference.setChecked(ssuPreferenceEnabled);
|
||||
ssuPreference.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
|
||||
properties.setProperty("ssu2.enabled", String.valueOf(newValueBoolean));
|
||||
writeConfiguration(properties);
|
||||
|
||||
return true; // Allow the change
|
||||
});
|
||||
// NTCP2 Category
|
||||
CheckBoxPreference ntcp2Enable = (CheckBoxPreference) findPreference("ntcp2EnablePreference");
|
||||
|
||||
boolean ntcp2EnabledPreference = Boolean.parseBoolean(properties.getString("ntcp2.enabled", "true"));
|
||||
ntcp2Enable.setChecked(ntcp2EnabledPreference);
|
||||
|
||||
|
||||
ntcp2Enable.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
|
||||
properties.setProperty("ntcp2.enabled", String.valueOf(newValueBoolean));
|
||||
writeConfiguration(properties);
|
||||
|
||||
return true; // Allow the change
|
||||
});
|
||||
CheckBoxPreference ntcp2Publish = (CheckBoxPreference) findPreference("ntcp2PublishPreference");
|
||||
|
||||
boolean ntcp2PublishEnabledPreference = Boolean.parseBoolean(properties.getString("ntcp2.published", "true"));
|
||||
ntcp2Publish.setChecked(ntcp2EnabledPreference);
|
||||
|
||||
|
||||
ntcp2Publish.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
|
||||
properties.setProperty("ntcp2.published", String.valueOf(newValueBoolean));
|
||||
writeConfiguration(properties);
|
||||
|
||||
return true; // Allow the change
|
||||
});
|
||||
// Web Console Category
|
||||
CheckBoxPreference webConsoleEnable = (CheckBoxPreference) findPreference("webConsoleEnablePreference");
|
||||
boolean webConsoleEnableValue = Boolean.parseBoolean(properties.getString("http.enabled", "false"));
|
||||
webConsoleEnable.setChecked(webConsoleEnableValue);
|
||||
|
||||
webConsoleEnable.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
properties.setProperty("http.enabled", String.valueOf(newValueBoolean));
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference webConsoleAddress = (EditTextPreference) findPreference("webConsoleAddressPreference");
|
||||
String webConsoleAddressValue = properties.getString("http.address", "127.0.0.1");
|
||||
webConsoleAddress.setText(webConsoleAddressValue);
|
||||
webConsoleAddress.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("http.address", newValueString);
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference webConsolePort = (EditTextPreference) findPreference("webConsolePortPreference");
|
||||
String webConsolePortValue = properties.getString("http.port", "7070");
|
||||
webConsolePort.setText(webConsolePortValue);
|
||||
webConsolePort.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("http.port", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
CheckBoxPreference webConsoleAuth = (CheckBoxPreference) findPreference("webConsoleAuthPreference");
|
||||
boolean webConsoleAuthValue = Boolean.parseBoolean(properties.getString("http.auth", "false"));
|
||||
webConsoleAuth.setChecked(webConsoleAuthValue);
|
||||
webConsoleAuth.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
properties.setProperty("http.auth", String.valueOf(newValueBoolean));
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference webConsoleUser = (EditTextPreference) findPreference("webConsoleUserPreference");
|
||||
String webConsoleUserValue = properties.getString("http.user", "user");
|
||||
webConsoleUser.setText(webConsoleUserValue);
|
||||
webConsoleUser.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("http.user", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference webConsolePassword = (EditTextPreference) findPreference("webConsolePasswordPreference");
|
||||
String webConsolePasswordValue = properties.getString("http.pass", "pass");
|
||||
webConsolePassword.setText(webConsolePasswordValue);
|
||||
|
||||
webConsolePassword.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("http.pass", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
// HTTP Proxy Category
|
||||
CheckBoxPreference httpProxyEnable = (CheckBoxPreference) findPreference("httpProxyEnablePreference");
|
||||
boolean httpProxyEnabled = Boolean.parseBoolean(properties.getString("httpproxy.enabled", "true"));
|
||||
httpProxyEnable.setChecked(httpProxyEnabled);
|
||||
httpProxyEnable.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
properties.setProperty("httpproxy.enabled", String.valueOf(newValueBoolean));
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference httpProxyAddress = (EditTextPreference) findPreference("httpProxyAddressPreference");
|
||||
String httpProxyAddressValue = properties.getString("httpproxy.address", "127.0.0.1");
|
||||
httpProxyAddress.setText(httpProxyAddressValue);
|
||||
|
||||
httpProxyAddress.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("httpproxy.address", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference httpProxyPort = (EditTextPreference) findPreference("httpProxyPortPreference");
|
||||
String httpProxyPortValue = properties.getString("httpproxy.port", "4444");
|
||||
httpProxyPort.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("httpproxy.port", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference httpProxyKeys = (EditTextPreference) findPreference("httpProxyKeysPreference");
|
||||
String httpProxyKeyValue = properties.getString("httpproxy.keys", "transient");
|
||||
httpProxyKeys.setText(httpProxyKeyValue);
|
||||
httpProxyKeys.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("httpproxy.keys", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
|
||||
// SOCKS Proxy Category
|
||||
CheckBoxPreference socksProxyEnable = (CheckBoxPreference) findPreference("socksProxyEnablePreference");
|
||||
boolean socksProxyEnabled = Boolean.parseBoolean(properties.getString("socksproxy.enabled", "true"));
|
||||
socksProxyEnable.setChecked(socksProxyEnabled);
|
||||
socksProxyEnable.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
properties.setProperty("socksproxy.enabled", String.valueOf(newValueBoolean));
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference socksProxyAddress = (EditTextPreference) findPreference("socksProxyAddressPreference");
|
||||
String socksProxyAddressValue = properties.getString("socksproxy.address", "127.0.0.1");
|
||||
socksProxyAddress.setText(socksProxyAddressValue);
|
||||
socksProxyAddress.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("socksproxy.address", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference socksProxyPort = (EditTextPreference) findPreference("socksProxyPortPreference");
|
||||
String socksProxyPortValue = properties.getString("socksproxy.port", "4447");
|
||||
socksProxyPort.setText(socksProxyPortValue);
|
||||
socksProxyPort.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("socksproxy.port", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference socksProxyKeys = (EditTextPreference) findPreference("socksProxyKeysPreference");
|
||||
String socksProxyKeysValue = properties.getString("socksproxy.keys", "transient");
|
||||
socksProxyKeys.setText(socksProxyKeysValue);
|
||||
socksProxyKeys.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("socksproxy.keys", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
// SAM Category
|
||||
CheckBoxPreference samEnable = (CheckBoxPreference) findPreference("samEnablePreference");
|
||||
boolean samEnableValue = Boolean.parseBoolean(properties.getString("sam.enabled", "true"));
|
||||
samEnable.setChecked(samEnableValue);
|
||||
samEnable.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
properties.setProperty("sam.enabled", String.valueOf(newValueBoolean));
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference samAddress = (EditTextPreference) findPreference("samAddressPreference");
|
||||
String samAddressValue = properties.getString("sam.address", "127.0.0.1");
|
||||
samAddress.setText(samAddressValue);
|
||||
samAddress.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("sam.address", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference samPort = (EditTextPreference) findPreference("samPortPreference");
|
||||
String samPortValue = properties.getString("sam.port", "7656");
|
||||
samPort.setText(samPortValue);
|
||||
samPort.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("sam.port", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
// UPnP Category
|
||||
CheckBoxPreference upnpEnable = (CheckBoxPreference) findPreference("upnpEnablePreference");
|
||||
boolean upnpEnableValue = Boolean.parseBoolean(properties.getString("upnp.enabled", "true"));
|
||||
upnpEnable.setChecked(upnpEnableValue);
|
||||
upnpEnable.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
boolean newValueBoolean = (boolean) newValue;
|
||||
properties.setProperty("upnp.enabled", String.valueOf(newValueBoolean));
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
EditTextPreference upnpForwardName = (EditTextPreference) findPreference("upnpForwardNamePreference");
|
||||
String upnpForwardNameValue = properties.getString("upnp.name", "I2Pd");
|
||||
upnpForwardName.setText(upnpForwardNameValue);
|
||||
upnpForwardName.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("upnp.name", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
// Limits Category
|
||||
EditTextPreference transitTunnelEdit = (EditTextPreference) findPreference("transitTunnelPreference");
|
||||
String transitTunnelValue = properties.getString("limits.transittunnels", "3000");
|
||||
transitTunnelEdit.setText(transitTunnelValue);
|
||||
transitTunnelEdit.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String newValueString = newValue.toString();
|
||||
properties.setProperty("limits.transittunnels", newValueString);
|
||||
// Save modified properties
|
||||
writeConfiguration(properties);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
/*
|
||||
private Properties readProperties() {
|
||||
if (isOldConfigExists) {
|
||||
Toast.makeText(this, oldConfigErrMsg, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
Properties properties = new Properties();
|
||||
try (FileReader reader = new FileReader(CONFIG_FILE_PATH)) {
|
||||
properties.load(reader);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
private void writeProperties(Properties properties) {
|
||||
if (isOldConfigExists) {
|
||||
Toast.makeText(this, oldConfigErrMsg, Toast.LENGTH_SHORT).show();
|
||||
} else {
|
||||
try (FileWriter writer = new FileWriter(CONFIG_FILE_PATH)) {
|
||||
properties.store(writer, "Updated properties");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
private INIConfiguration readConfiguration() {
|
||||
INIConfiguration iniConfiguration = new INIConfiguration();
|
||||
try (FileReader reader = new FileReader(CONFIG_FILE_PATH)) {
|
||||
iniConfiguration.read(reader);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return iniConfiguration;
|
||||
}
|
||||
private void writeConfiguration(INIConfiguration iniConfiguration)
|
||||
{
|
||||
writeConfiguration(iniConfiguration, "", "");
|
||||
}
|
||||
private void writeConfiguration(INIConfiguration iniConfiguration, String option, String value) {
|
||||
try (FileWriter writer = new FileWriter(CONFIG_FILE_PATH)) {
|
||||
StringWriter stringWriter = new StringWriter();
|
||||
iniConfiguration.write(stringWriter);
|
||||
String configFileContent = stringWriter.toString();
|
||||
|
||||
// Удаление пустых секций из строки конфигурации
|
||||
String regexEmptySections = "(\\[\\w+\\]\\n(\\n|$)|\\[\\w+\\](\\z|\\Z))";
|
||||
configFileContent = configFileContent.replaceAll(regexEmptySections, "");
|
||||
|
||||
// Если указана опция для перемещения
|
||||
if (!option.isEmpty()) {
|
||||
Log.d("configFileContent","option is not empty");
|
||||
String optionPattern = option + "\\s+?=\\s+?\\w+"; // Паттерн для поиска опции с присваиванием в начале строки
|
||||
Log.d("confiFileContent","config File contains option");
|
||||
if (configFileContent.contains(option)) configFileContent = configFileContent.replaceAll(optionPattern, ""); // Удаляем первое вхождение
|
||||
Log.d("confiFileContent", option);
|
||||
Log.d("confiFileContent", value);
|
||||
Log.d("confiFileContent","Add on start line");
|
||||
configFileContent = option + "=" + value + "\n" + configFileContent;
|
||||
|
||||
}
|
||||
Log.d("configFileContent", configFileContent);
|
||||
writer.write(configFileContent);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,8 +11,12 @@ import android.os.Bundle;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.Switch;
|
||||
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@@ -21,7 +25,6 @@ import java.util.Objects;
|
||||
//import org.purplei2p.i2pd.iniedotr.IniEditor;
|
||||
|
||||
public class SettingsActivity extends Activity {
|
||||
//protected IniEditor iniedit = new IniEditor();
|
||||
private String TAG = "i2pdSrvcSettings";
|
||||
private File cacheDir;
|
||||
public static String onBootFileName = "/onBoot"; // just file, empty, if exist the do autostart, if not then no.
|
||||
@@ -83,9 +86,16 @@ public class SettingsActivity extends Activity {
|
||||
setContentView(R.layout.activity_settings);
|
||||
Objects.requireNonNull(getActionBar()).setDisplayHomeAsUpEnabled(true);
|
||||
Switch autostart_switch = findViewById(R.id.autostart_enable);
|
||||
|
||||
Button openPreferences = findViewById(R.id.OpenPreferences);
|
||||
cacheDir = getApplicationContext().getCacheDir();
|
||||
File onBoot = new File(cacheDir.getAbsolutePath() + onBootFileName);
|
||||
openPreferences.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Intent intent = new Intent(SettingsActivity.this, MainPreferenceActivity.class);
|
||||
startActivity(intent);
|
||||
}
|
||||
});
|
||||
autostart_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
// do something, the isChecked will be
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -52,7 +52,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:textAppearance="@android:style/TextAppearance.Material.Large"
|
||||
android:textAppearance="@android:style/TextAppearance.Large"
|
||||
android:textColor="#DFDFDF" />
|
||||
|
||||
<Space
|
||||
@@ -65,7 +65,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="@string/services"
|
||||
android:textAppearance="@android:style/TextAppearance.Material.Medium"
|
||||
android:textAppearance="@android:style/TextAppearance.Medium"
|
||||
android:textColor="#DFDFDF" />
|
||||
|
||||
<TableLayout
|
||||
@@ -84,7 +84,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="false"
|
||||
android:text="@string/services_http_proxy"
|
||||
android:textAppearance="@android:style/TextAppearance.Material.Small"
|
||||
android:textAppearance="@android:style/TextAppearance.Small"
|
||||
android:textColor="#DFDFDF" />
|
||||
|
||||
</TableRow>
|
||||
@@ -100,7 +100,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="false"
|
||||
android:text="@string/services_socks_proxy"
|
||||
android:textAppearance="@android:style/TextAppearance.Material.Small"
|
||||
android:textAppearance="@android:style/TextAppearance.Small"
|
||||
android:textColor="#DFDFDF" />
|
||||
</TableRow>
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="false"
|
||||
android:text="@string/services_bob"
|
||||
android:textAppearance="@android:style/TextAppearance.Material.Small"
|
||||
android:textAppearance="@android:style/TextAppearance.Small"
|
||||
android:textColor="#DFDFDF" />
|
||||
</TableRow>
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="false"
|
||||
android:text="@string/services_sam"
|
||||
android:textAppearance="@android:style/TextAppearance.Material.Small"
|
||||
android:textAppearance="@android:style/TextAppearance.Small"
|
||||
android:textColor="#DFDFDF" />
|
||||
</TableRow>
|
||||
|
||||
@@ -145,11 +145,11 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="false"
|
||||
android:text="@string/services_i2cp"
|
||||
android:textAppearance="@android:style/TextAppearance.Material.Small"
|
||||
android:textAppearance="@android:style/TextAppearance.Small"
|
||||
android:textColor="#DFDFDF" />
|
||||
</TableRow>
|
||||
</TableLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
</ScrollView>
|
||||
|
||||
@@ -28,6 +28,18 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<Button
|
||||
android:id="@+id/OpenPreferences"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/OpenPreferences" />
|
||||
</LinearLayout>
|
||||
<!--
|
||||
<TextView
|
||||
android:id="@+id/settings_section2"
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_description2">Síť bez hranic</string>
|
||||
<string name="action_start">Začít</string>
|
||||
<string name="action_stop">Zastavit</string>
|
||||
<string name="action_exit">Odejít</string>
|
||||
<string name="action_graceful_stop">Hladké vypnutí</string>
|
||||
<string name="action_cancel_graceful_stop">Zrušit hladké vypnutí</string>
|
||||
<string name="action_reload_tunnels_config">Znovu načíst tunely</string>
|
||||
<string name="action_start_webview">Otevřít webovou konzoli</string>
|
||||
<string name="action_settings">Nastavení</string>
|
||||
<string name="graceful_stop_is_already_in_progress">Hladké vypnutí již probíhá</string>
|
||||
<string name="graceful_stop_is_in_progress">Hladké vypnutí právě probíhá</string>
|
||||
<string name="gracefulShutdownInProgress">Hladké vypnutí právě probíhá</string>
|
||||
<string name="already_stopped">Již zastaveno</string>
|
||||
<string name="uninitialized">Aplikace se inicializuje...</string>
|
||||
<string name="starting">Aplikace se zapíná...</string>
|
||||
<string name="jniLibraryLoaded">JNI knihovny načteny</string>
|
||||
<string name="startedOkay">Aplikace spuštěna</string>
|
||||
<string name="startFailed">Spuštění se nezdrařilo</string>
|
||||
<string name="stopped">Aplikace zastavena</string>
|
||||
<string name="stopping">Aplikace se vypíná...</string>
|
||||
<string name="remaining">zbývá</string>
|
||||
<string name="services">Vnitřní služby</string>
|
||||
<string name="services_http_proxy">HTTP Proxy</string>
|
||||
<string name="services_socks_proxy">SOCKS5 Proxy</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">Výzva</string>
|
||||
<string name="permDenied">Oprávnění k zápisu na SD kartu bylo zamítnuto. Abyste mohli pokračovat, je třeba toto oprávnění povolit</string>
|
||||
<string name="permRequired">Pro zápis klíčů a dalších souborů do I2PD složky na SD kartu je vyžadován přístup k SD kartě.</string>
|
||||
<string name="retryPermRequest">Opakovat žádost o oprávnění k zápisu na SD kartu</string>
|
||||
<string name="menu_item_battery_optimizations_str">Optimalizace baterie</string>
|
||||
<string name="battery_optimizations_enabled">Optimalizace baterie je zapnutá</string>
|
||||
<string name="battery_optimizations_enabled_explained">Váš Android dělá na I2PD náročné optimalizace baterie, což by mohlo vést k uzavření I2PD služby bez jediného důvodu.\nDoporučuje se povolit vypnutí optimalizace baterie.</string>
|
||||
<string name="battery_optimizations_enabled_dialog">Váš Android dělá na I2PD náročné optimalizace baterie, což by mohlo vést k uzavření I2PD služby bez jediného důvodu.\n\nNyní budete požádáni o zakázání této optimalizace.</string>
|
||||
<string name="continue_str">Pokračovat</string>
|
||||
<string name="device_does_not_support_disabling_battery_optimizations">Vaše verze Androidu nepodporuje vypnutí optimalizace baterie</string>
|
||||
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">Vaše verze Android OS nepodporuje zobrazování dialogových oken pro optimalizaci baterie pro aplikace.</string>
|
||||
<string name="shutdown_canceled">Plánované vypnutí zrušeno</string>
|
||||
<string name="tunnels_reloading">Obnovuji konfiguraci tunelů...</string>
|
||||
<string name="settings_section0">Základní nastavení</string>
|
||||
<string name="settings_section_tunnels">Tunely</string>
|
||||
<string name="autostart_enabled">Spustit při spuštění systému</string>
|
||||
<string name="add_tunnel_button">Přidat tunel</string>
|
||||
<string name="add_tunnel">Správa tunelů</string>
|
||||
<string name="del_tunnel_button">Smazat tunel</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_description2">Red sin fronteras</string>
|
||||
<string name="action_start">Iniciar</string>
|
||||
<string name="action_stop">Detener</string>
|
||||
<string name="action_exit">Salir</string>
|
||||
<string name="action_graceful_stop">Parar con gracia</string>
|
||||
<string name="action_cancel_graceful_stop">Cancelar parada con gracia</string>
|
||||
<string name="action_reload_tunnels_config">Recargar túneles</string>
|
||||
<string name="action_start_webview">Abrir Consola Web</string>
|
||||
<string name="action_settings">Ajustes</string>
|
||||
<string name="graceful_stop_is_already_in_progress">La parada con gracia ya se ha iniciado</string>
|
||||
<string name="graceful_stop_is_in_progress">La parada con gracia está en proceso</string>
|
||||
<string name="gracefulShutdownInProgress">Apagado con gracia en proceso</string>
|
||||
<string name="already_stopped">Ya se ha parado</string>
|
||||
<string name="uninitialized">Inicializando aplicación...</string>
|
||||
<string name="starting">Iniciando aplicación...</string>
|
||||
<string name="jniLibraryLoaded">Bibliotecas JNI cargadas</string>
|
||||
<string name="startedOkay">Aplicación iniciada</string>
|
||||
<string name="startFailed">Error al iniciar</string>
|
||||
<string name="stopped">Aplicación detenida</string>
|
||||
<string name="stopping">Deteniendo aplicación...</string>
|
||||
<string name="remaining">restantes</string>
|
||||
<string name="services">Servicios internos</string>
|
||||
<string name="services_http_proxy">Proxy HTTP</string>
|
||||
<string name="services_socks_proxy">Proxy SOCKS5</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">Permiso</string>
|
||||
<string name="permDenied">Permiso de escribir a la tarjeta SD denegado, necesitas permitirlo para continuar</string>
|
||||
<string name="permRequired">Se requiere acceso de escritura de la tarjeta SD para escribir las claves y otros archivos en la carpeta I2PD de la tarjeta SD.</string>
|
||||
<string name="retryPermRequest">Preguntar permisos de escritura de tarjeta SD de nuevo</string>
|
||||
<string name="menu_item_battery_optimizations_str">Optimizaciones de Batería</string>
|
||||
<string name="battery_optimizations_enabled">Optimizaciones de batería activadas</string>
|
||||
<string name="battery_optimizations_enabled_explained">Tu Android está realizando optimizaciones de batería importantes en I2PD que pueden ocasionar que el servicio se cierre sin razón.\nEs recomendable que desactives esas optimizaciones de batería.</string>
|
||||
<string name="battery_optimizations_enabled_dialog">Tu Android estáTu Android está realizando optimizaciones de batería importantes en I2PD que pueden ocasionar que el servicio se cierre sin razón.\n\nSe te pedirá que las desactives.</string>
|
||||
<string name="continue_str">Continuar</string>
|
||||
<string name="device_does_not_support_disabling_battery_optimizations">Tu versión de Android no soporta desactivar las optimizaciones de batería</string>
|
||||
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">Tu versión de S.O Android no soporta desactivar optimizaciones de batería para ciertas aplicaciones.</string>
|
||||
<string name="shutdown_canceled">Apagado planeado cancelado</string>
|
||||
<string name="tunnels_reloading">Recargando configuración de túneles...</string>
|
||||
<string name="settings_section0">Ajustes comunes</string>
|
||||
<string name="settings_section_tunnels">Túneles</string>
|
||||
<string name="autostart_enabled">Iniciar al arrancar</string>
|
||||
<string name="add_tunnel_button">Añadir túnel</string>
|
||||
<string name="add_tunnel">Gestión de túneles</string>
|
||||
<string name="del_tunnel_button">Borrar túnel</string>
|
||||
</resources>
|
||||
@@ -4,6 +4,8 @@
|
||||
<string name="action_start">Démarrer</string>
|
||||
<string name="action_stop">Arrêter</string>
|
||||
<string name="action_exit">Quitter</string>
|
||||
<string name="action_graceful_stop">Arrêt gracieux</string>
|
||||
<string name="action_cancel_graceful_stop">Annuler l\'arrêt gracieux</string>
|
||||
<string name="action_reload_tunnels_config">Actualiser les tunnels</string>
|
||||
<string name="action_start_webview">Ouvrir console web</string>
|
||||
<string name="action_settings">Paramètres</string>
|
||||
@@ -11,10 +13,18 @@
|
||||
<string name="graceful_stop_is_in_progress">Arrêt gracieux en cours</string>
|
||||
<string name="gracefulShutdownInProgress">Fermeture gracieuse en cours</string>
|
||||
<string name="already_stopped">Déjà arrêté</string>
|
||||
<string name="uninitialized">Initialisation de l\'application...</string>
|
||||
<string name="starting">Démarrage de l\'application...</string>
|
||||
<string name="jniLibraryLoaded">Librairies JNI chargées</string>
|
||||
<string name="startedOkay">Application démarrée</string>
|
||||
<string name="startFailed">Démarrage échoué</string>
|
||||
<string name="stopped">Application arrêtée</string>
|
||||
<string name="stopping">Arrêt de l\'application...</string>
|
||||
<string name="remaining">restant</string>
|
||||
<string name="services">Services internes</string>
|
||||
<string name="services_http_proxy">Proxy HTTP</string>
|
||||
<string name="services_socks_proxy">Proxy SOCKS5</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">Message</string>
|
||||
<string name="permDenied">Permission d\'écrire sur la carte SD refusée, vous devez autoriser pour continuer</string>
|
||||
<string name="permRequired">La permission d\'écrire sur la carte SD est requise pour écrire les clés et autres fichiers dans le dossier I2PD sur la carte SD.</string>
|
||||
<string name="retryPermRequest">Réessayer de demander la permission d\'écrire sur la carte SD</string>
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_description2">Rete senza confini</string>
|
||||
<string name="action_start">Avvia</string>
|
||||
<string name="action_stop">Arresta</string>
|
||||
<string name="action_exit">Esci</string>
|
||||
<string name="action_graceful_stop">Interruzione controllata</string>
|
||||
<string name="action_cancel_graceful_stop">Annulla interruzione controllata</string>
|
||||
<string name="action_reload_tunnels_config">Ricarica i tunnel</string>
|
||||
<string name="action_start_webview">Apri la console web</string>
|
||||
<string name="action_settings">Impostazioni</string>
|
||||
<string name="graceful_stop_is_already_in_progress">L\'interruzione controllata è già in corso</string>
|
||||
<string name="graceful_stop_is_in_progress">L\'interruzione controllata è in corso</string>
|
||||
<string name="gracefulShutdownInProgress">Interruzione controllata in corso</string>
|
||||
<string name="already_stopped">Già interrotto</string>
|
||||
<string name="uninitialized">Inizializzazione dell\'applicazione...</string>
|
||||
<string name="starting">L\'applicazione si sta avviando...</string>
|
||||
<string name="jniLibraryLoaded">Caricate le librerie JNI</string>
|
||||
<string name="startedOkay">Applicazione avviata</string>
|
||||
<string name="startFailed">Avvio fallito</string>
|
||||
<string name="stopped">Applicazione arrestata</string>
|
||||
<string name="stopping">Applicazione in arresto...</string>
|
||||
<string name="remaining">rimanenti</string>
|
||||
<string name="services">Servizi interni</string>
|
||||
<string name="services_http_proxy">Proxy HTTP</string>
|
||||
<string name="services_socks_proxy">Proxy SOCKS5</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">Messaggio</string>
|
||||
<string name="permDenied">Permesso di scrittura scheda SD negato, è necessario consentirlo per continuare</string>
|
||||
<string name="permRequired">L\'accesso in scrittura della scheda SD è richiesto per scrivare le chiavi e gli altri file nella cartella I2PD sulla scheda SD.</string>
|
||||
<string name="retryPermRequest">Riprova a richiedere il permesso di scrittura sulla scheda SD</string>
|
||||
<string name="menu_item_battery_optimizations_str">Ottimizzazione batteria</string>
|
||||
<string name="battery_optimizations_enabled">Ottimizzazione batteria abilitata</string>
|
||||
<string name="battery_optimizations_enabled_explained">Il tuo dispositivo Android sta eseguendo alcune pesanti ottimizzazioni della batteria su I2PD che potrebbero comportare l\'arresto di quest\'ultimo senza alcun motivo.\nSi raccomanda di consentire a I2PD di disabilitare queste ottimizzazioni della batteria.</string>
|
||||
<string name="battery_optimizations_enabled_dialog">Il tuo dispositivo Android sta eseguendo alcune pesanti ottimizzazioni della batteria su I2PD che potrebbero comportare l\'arresto di quest\'ultimo senza alcun motivo.\n\nOra verrà richiesto di disabilitare queste ottimizzazioni della batteria.</string>
|
||||
<string name="continue_str">Continua</string>
|
||||
<string name="device_does_not_support_disabling_battery_optimizations">La versione del tuo dispositivo Android non supporta l\'esclusione delle ottimizzazioni della batteria</string>
|
||||
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">La versione del tuo dispositivo Android non supporta la visualizzazione della finestra di dialogo per l\'ottimizzazione della batteria per le applicazioni.</string>
|
||||
<string name="shutdown_canceled">Arresto programmato annullato</string>
|
||||
<string name="tunnels_reloading">Ricaricando le configurazioni dei tunnel...</string>
|
||||
<string name="settings_section0">Impostazioni generali</string>
|
||||
<string name="settings_section_tunnels">Tunnel</string>
|
||||
<string name="autostart_enabled">Avvia all\'accensione</string>
|
||||
<string name="add_tunnel_button">Aggiungi tunnel</string>
|
||||
<string name="add_tunnel">Gestione tunnel</string>
|
||||
<string name="del_tunnel_button">Elimina tunnel</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_description2">Rede sem fronteiras</string>
|
||||
<string name="action_start">Iniciar</string>
|
||||
<string name="action_stop">Parar</string>
|
||||
<string name="action_exit">Sair</string>
|
||||
<string name="action_graceful_stop">Saída Graciosa</string>
|
||||
<string name="action_cancel_graceful_stop">Cancelar Saída Graciosa</string>
|
||||
<string name="action_reload_tunnels_config">Recarregar túneis</string>
|
||||
<string name="action_start_webview">Abrir o Web Console</string>
|
||||
<string name="action_settings">Configurações</string>
|
||||
<string name="graceful_stop_is_already_in_progress">Saída Graciosa já está em progresso</string>
|
||||
<string name="graceful_stop_is_in_progress">Saída Graciosa em progresso</string>
|
||||
<string name="gracefulShutdownInProgress">Saída Graciosa em progresso</string>
|
||||
<string name="already_stopped">Já parou</string>
|
||||
<string name="uninitialized">Inicializando aplicação...</string>
|
||||
<string name="starting">Iniciando aplicação...</string>
|
||||
<string name="jniLibraryLoaded">Bibliotecas JNI carregadas</string>
|
||||
<string name="startedOkay">Aplicação iniciada</string>
|
||||
<string name="startFailed">Inicialização falhou</string>
|
||||
<string name="stopped">Aplicação parou</string>
|
||||
<string name="stopping">Parando aplicação...</string>
|
||||
<string name="remaining">faltando</string>
|
||||
<string name="services">Serviços internos</string>
|
||||
<string name="services_http_proxy">Proxy HTTP</string>
|
||||
<string name="services_socks_proxy">Proxy SOCKS5</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">Permissão</string>
|
||||
<string name="permDenied">Permissões de escrita no cartão SD negadas, você precisa permitir isso para continuar</string>
|
||||
<string name="permRequired">Permissões de escrita no cartão SD são necessárias para gravar as chaves e outros arquivos na pasta do I2PD no cartão SD.</string>
|
||||
<string name="retryPermRequest">Tente novamente solicitar as permissões de escrita ao cartão SD</string>
|
||||
<string name="menu_item_battery_optimizations_str">Otimizações da Bateria</string>
|
||||
<string name="battery_optimizations_enabled">Otimizações da bateria ativadas</string>
|
||||
<string name="battery_optimizations_enabled_explained">O seu sistema está realizando fortes otimizações de uso de bateria pelo I2PD que podem levar a fechamentos inesperados do serviço.\nÉ recomendando desativar estas otimizações de bateria.</string>
|
||||
<string name="battery_optimizations_enabled_dialog">O seu sistema está realizando fortes otimizações de uso de bateria pelo I2PD que podem levar a fechamentos inesperados do serviço.\n\nVocê será solicitado a permitir desativá-las.</string>
|
||||
<string name="continue_str">Continuar</string>
|
||||
<string name="device_does_not_support_disabling_battery_optimizations">A sua versão do Android não suporta definir otimizações de bateria</string>
|
||||
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">A versão do seu sistema Android não suporta mostrar a caixa de diálogo para otimizações de bateria para aplicativos.</string>
|
||||
<string name="shutdown_canceled">Desligamento planejado cancelado</string>
|
||||
<string name="tunnels_reloading">Recarregando configurações dos túneis...</string>
|
||||
<string name="settings_section0">Configurações usuais</string>
|
||||
<string name="settings_section_tunnels">Túneis</string>
|
||||
<string name="autostart_enabled">Iniciar no boot</string>
|
||||
<string name="add_tunnel_button">Adicionar túnel</string>
|
||||
<string name="add_tunnel">Gerenciamento de túneis</string>
|
||||
<string name="del_tunnel_button">Exclui túnel</string>
|
||||
</resources>
|
||||
@@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_description2">Сеть без границ</string>
|
||||
|
||||
<string name="action_start">Запустить</string>
|
||||
<string name="action_stop">Остановить</string>
|
||||
<string name="action_exit">Выход</string>
|
||||
@@ -10,11 +9,9 @@
|
||||
<string name="action_reload_tunnels_config">Перезагрузить туннели</string>
|
||||
<string name="action_start_webview">Открыть Веб Консоль</string>
|
||||
<string name="action_settings">Настройки</string>
|
||||
|
||||
<string name="graceful_stop_is_already_in_progress">Корректная остановка уже запущена</string>
|
||||
<string name="graceful_stop_is_in_progress">Корректная остановка запущена</string>
|
||||
<string name="gracefulShutdownInProgress">Корректная остановка запущена</string>
|
||||
|
||||
<string name="already_stopped">Уже остановлено</string>
|
||||
<string name="uninitialized">Приложение инициализируется...</string>
|
||||
<string name="starting">Приложение запускается...</string>
|
||||
@@ -22,13 +19,15 @@
|
||||
<string name="startedOkay">Приложение запущено</string>
|
||||
<string name="startFailed">Запуск не удался</string>
|
||||
<string name="stopped">Приложение было остановлено</string>
|
||||
<string name="stopping">Остановка приложения...</string>
|
||||
<string name="remaining">осталось</string>
|
||||
|
||||
<string name="services">Внутренние сервисы</string>
|
||||
<string name="services_http_proxy">HTTP Прокси</string>
|
||||
<string name="services_socks_proxy">SOCKS5 Прокси</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">Запрос</string>
|
||||
<string name="permDenied">Права для записи на SD карту отклонены, вам необходимо предоставить их для продолжения</string>
|
||||
<string name="permRequired">Права на запись на SD карту необходимы для записи ключей и других файлов в папку I2PD на внутренней памяти.</string>
|
||||
<string name="retryPermRequest">Повторить запрос прав на запись на SD карту</string>
|
||||
|
||||
<string name="menu_item_battery_optimizations_str">Оптимизации аккумулятора</string>
|
||||
<string name="battery_optimizations_enabled">Оптимизации аккумулятора включены</string>
|
||||
<string name="battery_optimizations_enabled_explained">Ваша операционная система осуществляет оптимизации расхода аккумулятора, которые могут приводить к выгрузке I2PD из памяти и прекращению его работы с целью сэкономить заряд аккумулятора.\nРекомендуется отключить эти оптимизации.</string>
|
||||
@@ -36,22 +35,13 @@
|
||||
<string name="continue_str">Продолжить</string>
|
||||
<string name="device_does_not_support_disabling_battery_optimizations">Ваша версия Андроид не поддерживает отключение оптимизаций аккумулятора</string>
|
||||
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">Ваша версия Андроид не поддерживает показ диалога об оптимизациях аккумулятора для приложений.</string>
|
||||
|
||||
<string name="shutdown_canceled">Плановая остановка отменена</string>
|
||||
|
||||
<string name="tunnels_reloading">Перезагрузка конфигурации туннелей...</string>
|
||||
|
||||
<string name="autostart_enabled">Запуск после загрузки телефона</string>
|
||||
|
||||
<string name="settings_section0">Основные настройки</string>
|
||||
<string name="settings_section_tunnels">Туннели</string>
|
||||
|
||||
<string name="autostart_enabled">Запуск после загрузки телефона</string>
|
||||
<string name="add_tunnel_button">Добавить туннель</string>
|
||||
<string name="add_tunnel">Управление туннелями</string>
|
||||
|
||||
<string name="del_tunnel_button">Удалить туннель</string>
|
||||
<string name="services">Внутренние сервисы</string>
|
||||
<string name="services_http_proxy">HTTP Прокси</string>
|
||||
<string name="services_socks_proxy">SOCKS5 Прокси</string>
|
||||
<string name="stopping">Остановка приложения...</string>
|
||||
<string name="OpenPreferences">Открыть основные настройки</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_description2">Sınırları olmayan ağ</string>
|
||||
|
||||
<string name="action_start">Başlat</string>
|
||||
<string name="action_stop">Durdur</string>
|
||||
<string name="action_exit">Çık</string>
|
||||
@@ -10,11 +9,9 @@
|
||||
<string name="action_reload_tunnels_config">Tünelleri yeniden yükle</string>
|
||||
<string name="action_start_webview">Web Konsolunu Aç</string>
|
||||
<string name="action_settings">Ayarlar</string>
|
||||
|
||||
<string name="graceful_stop_is_already_in_progress">Düzgün durdurma zaten devam ediyor</string>
|
||||
<string name="graceful_stop_is_in_progress">Düzgün durdurma devam ediyor</string>
|
||||
<string name="gracefulShutdownInProgress">Düzgün kapatma devam ediyor</string>
|
||||
|
||||
<string name="already_stopped">Zaten durduruldu</string>
|
||||
<string name="uninitialized">Uygulama ilk ayarları yapılıyor...</string>
|
||||
<string name="starting">Uygulama başlatılıyor...</string>
|
||||
@@ -22,13 +19,15 @@
|
||||
<string name="startedOkay">Uygulama başlatıldı</string>
|
||||
<string name="startFailed">Başlatılamadı</string>
|
||||
<string name="stopped">Uygulama durduruldu</string>
|
||||
<string name="stopping">Uygulama durduruluyor...</string>
|
||||
<string name="remaining">kalan</string>
|
||||
|
||||
<string name="services">İç servisler</string>
|
||||
<string name="services_http_proxy">HTTP Proxy</string>
|
||||
<string name="services_socks_proxy">SOCKS5 Proxy</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">Bilgi</string>
|
||||
<string name="permDenied">SD karta yazma izni reddedildi, devam etmek için buna izin vermeniz gerekiyor</string>
|
||||
<string name="permRequired">Anahtarları ve diğer dosyaları SD karttaki I2PD klasörüne yazmak için SD karta yazma erişimi gereklidir.</string>
|
||||
<string name="retryPermRequest">SD karta yazma izinlerini istemeyi yeniden dene</string>
|
||||
|
||||
<string name="menu_item_battery_optimizations_str">Pil İyileştirmeleri</string>
|
||||
<string name="battery_optimizations_enabled">Pil iyileştirmeleri etkin</string>
|
||||
<string name="battery_optimizations_enabled_explained">Android aygıtınız, I2PD üzerinde başka bir neden olmaksızın arka plan programının kapanmasına neden olabilecek bazı ağır pil iyileştirmeleri yapıyor.\nBu pil iyileştirmelerinin devre dışı bırakılmasına izin verilmesi tavsiye edilir.</string>
|
||||
@@ -36,18 +35,12 @@
|
||||
<string name="continue_str">Devam et</string>
|
||||
<string name="device_does_not_support_disabling_battery_optimizations">Android sürümünüz pil iyileştirmelerini devre dışı bırakmayı desteklemiyor</string>
|
||||
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">Android işletim sistemi sürümünüz, uygulamalar için pil iyileştirmeleri iletişim kutusunun gösterilmesini desteklemiyor.</string>
|
||||
|
||||
<string name="shutdown_canceled">Zamanlanan kapatma iptal edildi</string>
|
||||
|
||||
<string name="tunnels_reloading">Tünel yapılandırması yeniden yükleniyor...</string>
|
||||
|
||||
<string name="settings_section0">Ortak ayarlar</string>
|
||||
<string name="settings_section_tunnels">Tüneller</string>
|
||||
|
||||
<string name="autostart_enabled">Önyüklemede başlat</string>
|
||||
<string name="add_tunnel_button">Tünel ekle</string>
|
||||
<string name="add_tunnel">Tünel yönetimi</string>
|
||||
|
||||
<string name="del_tunnel_button">Tünelis is</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_description2">Мережа без кордонів</string>
|
||||
<string name="action_start">Почати</string>
|
||||
<string name="action_stop">Зупинити</string>
|
||||
<string name="action_exit">Вийти</string>
|
||||
<string name="action_graceful_stop">Плавна зупинка</string>
|
||||
<string name="action_cancel_graceful_stop">Скасувати плавну зупинку</string>
|
||||
<string name="action_reload_tunnels_config">Перезавантажити тунелі</string>
|
||||
<string name="action_start_webview">Відкрити веб-консоль</string>
|
||||
<string name="action_settings">Налаштування</string>
|
||||
<string name="graceful_stop_is_already_in_progress">Плавна зупинка вже виконується</string>
|
||||
<string name="graceful_stop_is_in_progress">Плавна зупинка у процесі</string>
|
||||
<string name="gracefulShutdownInProgress">Виконується плавне завершення</string>
|
||||
<string name="already_stopped">Вже зупинено</string>
|
||||
<string name="uninitialized">Додаток запускається...</string>
|
||||
<string name="starting">Додаток запускається...</string>
|
||||
<string name="jniLibraryLoaded">Завантажено бібліотеки JNI</string>
|
||||
<string name="startedOkay">Запуск додатку</string>
|
||||
<string name="startFailed">Не вдалося запустити</string>
|
||||
<string name="stopped">Додаток зупинено</string>
|
||||
<string name="stopping">Додаток зупиняється...</string>
|
||||
<string name="remaining">залишилось</string>
|
||||
<string name="services">Внутрішні служби</string>
|
||||
<string name="services_http_proxy">Проксі HTTP</string>
|
||||
<string name="services_socks_proxy">Проксі SOCKS5</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">Запит</string>
|
||||
<string name="permDenied">Дозвіл на запис до SD-карти відхилений, Вам необхідно дозволити для продовження</string>
|
||||
<string name="permRequired">Для запису ключів та інших файлів до теки I2PD на SD-карті потрібен доступ до передачі даних на SD-карті.</string>
|
||||
<string name="retryPermRequest">Повторити запит на запис до SD-карти</string>
|
||||
<string name="menu_item_battery_optimizations_str">Оптимізація батареї</string>
|
||||
<string name="battery_optimizations_enabled">Оптимізацію батареї ввімкнено</string>
|
||||
<string name="battery_optimizations_enabled_explained">Ваш Android виконує деякі складні оптимізації використання заряду на I2PD, які можуть призвести до встановлення демонів без будь-яких інших причин.\nРекомендується дозволити вимкнення цих оптимізації використання акумулятора.</string>
|
||||
<string name="battery_optimizations_enabled_dialog">Ваш Android виконує деякі складні оптимізації використання заряду на I2PD, які можуть призвести до встановлення демонів без будь-яких інших причин.\n\nРекомендується дозволити вимкнення цих оптимізації використання акумулятора.</string>
|
||||
<string name="continue_str">Далі</string>
|
||||
<string name="device_does_not_support_disabling_battery_optimizations">Ваш пристрій не підтримує відключення оптимізації батареї</string>
|
||||
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">Ваша версія ОС Android не підтримує відображення діалогу для оптимізації заряду акумулятора для програм.</string>
|
||||
<string name="shutdown_canceled">Плановане завершення скасоване</string>
|
||||
<string name="tunnels_reloading">Перезавантаження налаштувань тунелів...</string>
|
||||
<string name="settings_section0">Загальні налаштування</string>
|
||||
<string name="settings_section_tunnels">Тунелі</string>
|
||||
<string name="autostart_enabled">Автозапуск</string>
|
||||
<string name="add_tunnel_button">Додайте тунель</string>
|
||||
<string name="add_tunnel">Керування тунелями</string>
|
||||
<string name="del_tunnel_button">Видалити тунель</string>
|
||||
</resources>
|
||||
@@ -1,46 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="remaining">qoldi</string>
|
||||
<string name="app_description2">Chegarasiz tarmoq</string>
|
||||
<string name="action_start">Boshlash</string>
|
||||
<string name="action_exit">Chiqish</string>
|
||||
<string name="action_graceful_stop">Yumshoq to\'xtatish</string>
|
||||
<string name="action_cancel_graceful_stop">Yumshoq to\'xtatish bekor qilish</string>
|
||||
<string name="action_reload_tunnels_config">Tunnellarni qayta yuklash</string>
|
||||
<string name="action_start_webview">Veb-konsolni ochish</string>
|
||||
<string name="action_settings">Sozlamalar</string>
|
||||
<string name="starting">Ilova ishga tushmoqda...</string>
|
||||
<string name="jniLibraryLoaded">JNI kutubxonalari yuklangan</string>
|
||||
<string name="startedOkay">Ilova ishga tushirildi</string>
|
||||
<string name="startFailed">Ishga tushirish muvaffaqiyatsiz tugadi</string>
|
||||
<string name="stopped">Ilova toʻxtatildi</string>
|
||||
<string name="stopping">Ilova toʻxtatilmoqda...</string>
|
||||
<string name="already_stopped">Allaqachon to\'xtatilgan</string>
|
||||
<string name="gracefulShutdownInProgress">Yumshoq to\'xtatish amalga oshirilmoqda</string>
|
||||
<string name="services">Ichki xizmatlar</string>
|
||||
<string name="services_http_proxy">HTTP proksi</string>
|
||||
<string name="services_socks_proxy">SOCKS5 proksi</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">So\'rov</string>
|
||||
<string name="action_stop">To\'xtatish</string>
|
||||
<string name="graceful_stop_is_already_in_progress">Yumshoq to\'xtatish allaqachon amalga oshirilmoqda</string>
|
||||
<string name="graceful_stop_is_in_progress">Yumshoq to\'xtatish amalga oshirilmoqda</string>
|
||||
<string name="uninitialized">Ilova ishga tushiriladi...</string>
|
||||
<string name="continue_str">Davom etish</string>
|
||||
<string name="settings_section_tunnels">Tunnellar</string>
|
||||
<string name="autostart_enabled">Avtomatik ishga tushirish</string>
|
||||
<string name="add_tunnel_button">Tunnelni qo\'shish</string>
|
||||
<string name="add_tunnel">Tunnellarni boshqarish</string>
|
||||
<string name="del_tunnel_button">Tunnelni o\'chirish</string>
|
||||
<string name="tunnels_reloading">Tunnellar konfiguratsiyalari qayta yuklanmoqda...</string>
|
||||
<string name="settings_section0">Umumiy sozlamalar</string>
|
||||
<string name="menu_item_battery_optimizations_str">Batareyani optimallashtirish</string>
|
||||
<string name="battery_optimizations_enabled">Batareya optimallashtirishi yoqilgan</string>
|
||||
<string name="shutdown_canceled">Rejalashtirilgan yumshoq o\'chirish bekor qilindi</string>
|
||||
<string name="retryPermRequest">Endi sizdan ularni o\'chirishga ruxsat berish so\'raladi</string>
|
||||
<string name="permDenied">SD kartaga yozish ruxsati rad etildi, buni davom ettirishga ruxsat berishingiz kerak</string>
|
||||
<string name="permRequired">Kalitlarni va boshqa fayllarni SD-kartadagi I2PD jildiga yozish uchun SD kartaga yozish huquqi talab qilinadi.</string>
|
||||
<string name="battery_optimizations_enabled_explained">Sizning Androidingiz I2PD-da batareyani kuchli optimallashtirishni amalga oshirmoqda, bu boshqa sababsiz demonning yopilishiga olib kelishi mumkin.\nUshbu batareyani optimallashtirishni o\'chirishga ruxsat berish tavsiya etiladi.</string>
|
||||
<string name="battery_optimizations_enabled_dialog">Sizning Androidingiz I2PD-da batareyani kuchli optimallashtirishni amalga oshirmoqda, bu boshqa sababsiz demonning yopilishiga olib kelishi mumkin.\n\nEndi sizdan ularni o\'chirishga ruxsat berish so\'raladi.</string>
|
||||
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">Sizning Android OS versiyangiz ilovalar uchun batareyani optimallashtirish dialogini ko\'rsatishni qo\'llab-quvvatlamaydi.</string>
|
||||
<string name="device_does_not_support_disabling_battery_optimizations">Sizning Android versiyangiz batareyani optimallashtirishdan voz kechishni qo\'llab-quvvatlamaydi</string>
|
||||
</resources>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_description2">Chegarasiz tarmoq</string>
|
||||
<string name="action_start">Boshlash</string>
|
||||
<string name="action_stop">To\'xtatish</string>
|
||||
<string name="action_exit">Chiqish</string>
|
||||
<string name="action_graceful_stop">Yumshoq to\'xtatish</string>
|
||||
<string name="action_cancel_graceful_stop">Yumshoq to\'xtatish bekor qilish</string>
|
||||
<string name="action_reload_tunnels_config">Tunnellarni qayta yuklash</string>
|
||||
<string name="action_start_webview">Veb-konsolni ochish</string>
|
||||
<string name="action_settings">Sozlamalar</string>
|
||||
<string name="graceful_stop_is_already_in_progress">Yumshoq to\'xtatish allaqachon amalga oshirilmoqda</string>
|
||||
<string name="graceful_stop_is_in_progress">Yumshoq to\'xtatish amalga oshirilmoqda</string>
|
||||
<string name="gracefulShutdownInProgress">Yumshoq to\'xtatish amalga oshirilmoqda</string>
|
||||
<string name="already_stopped">Allaqachon to\'xtatilgan</string>
|
||||
<string name="uninitialized">Ilova ishga tushiriladi...</string>
|
||||
<string name="starting">Ilova ishga tushmoqda...</string>
|
||||
<string name="jniLibraryLoaded">JNI kutubxonalari yuklangan</string>
|
||||
<string name="startedOkay">Ilova ishga tushirildi</string>
|
||||
<string name="startFailed">Ishga tushirish muvaffaqiyatsiz tugadi</string>
|
||||
<string name="stopped">Ilova toʻxtatildi</string>
|
||||
<string name="stopping">Ilova toʻxtatilmoqda...</string>
|
||||
<string name="remaining">qoldi</string>
|
||||
<string name="services">Ichki xizmatlar</string>
|
||||
<string name="services_http_proxy">HTTP proksi</string>
|
||||
<string name="services_socks_proxy">SOCKS5 proksi</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">So\'rov</string>
|
||||
<string name="permDenied">SD kartaga yozish ruxsati rad etildi, buni davom ettirishga ruxsat berishingiz kerak</string>
|
||||
<string name="permRequired">Kalitlarni va boshqa fayllarni SD-kartadagi I2PD jildiga yozish uchun SD kartaga yozish huquqi talab qilinadi.</string>
|
||||
<string name="retryPermRequest">Endi sizdan ularni o\'chirishga ruxsat berish so\'raladi</string>
|
||||
<string name="menu_item_battery_optimizations_str">Batareyani optimallashtirish</string>
|
||||
<string name="battery_optimizations_enabled">Batareya optimallashtirishi yoqilgan</string>
|
||||
<string name="battery_optimizations_enabled_explained">Sizning Androidingiz I2PD-da batareyani kuchli optimallashtirishni amalga oshirmoqda, bu boshqa sababsiz demonning yopilishiga olib kelishi mumkin.\nUshbu batareyani optimallashtirishni o\'chirishga ruxsat berish tavsiya etiladi.</string>
|
||||
<string name="battery_optimizations_enabled_dialog">Sizning Androidingiz I2PD-da batareyani kuchli optimallashtirishni amalga oshirmoqda, bu boshqa sababsiz demonning yopilishiga olib kelishi mumkin.\n\nEndi sizdan ularni o\'chirishga ruxsat berish so\'raladi.</string>
|
||||
<string name="continue_str">Davom etish</string>
|
||||
<string name="device_does_not_support_disabling_battery_optimizations">Sizning Android versiyangiz batareyani optimallashtirishdan voz kechishni qo\'llab-quvvatlamaydi</string>
|
||||
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">Sizning Android OS versiyangiz ilovalar uchun batareyani optimallashtirish dialogini ko\'rsatishni qo\'llab-quvvatlamaydi.</string>
|
||||
<string name="shutdown_canceled">Rejalashtirilgan yumshoq o\'chirish bekor qilindi</string>
|
||||
<string name="tunnels_reloading">Tunnellar konfiguratsiyalari qayta yuklanmoqda...</string>
|
||||
<string name="settings_section0">Umumiy sozlamalar</string>
|
||||
<string name="settings_section_tunnels">Tunnellar</string>
|
||||
<string name="autostart_enabled">Avtomatik ishga tushirish</string>
|
||||
<string name="add_tunnel_button">Tunnelni qo\'shish</string>
|
||||
<string name="add_tunnel">Tunnellarni boshqarish</string>
|
||||
<string name="del_tunnel_button">Tunnelni o\'chirish</string>
|
||||
</resources>
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_description2">网络无国界</string>
|
||||
<string name="action_start">开始运行</string>
|
||||
<string name="action_stop">停止运行</string>
|
||||
<string name="action_exit">退出</string>
|
||||
<string name="action_graceful_stop">平滑关闭</string>
|
||||
<string name="action_cancel_graceful_stop">取消平滑关闭</string>
|
||||
<string name="action_reload_tunnels_config">重新加载隧道</string>
|
||||
<string name="action_start_webview">打开网页控制台</string>
|
||||
<string name="action_settings">设置</string>
|
||||
<string name="graceful_stop_is_already_in_progress">平滑退出已在进行...</string>
|
||||
<string name="graceful_stop_is_in_progress">正在平滑退出</string>
|
||||
<string name="gracefulShutdownInProgress">正在平滑关闭 剩余时间:</string>
|
||||
<string name="already_stopped">已停止</string>
|
||||
<string name="uninitialized">I2Pd 正在初始化...</string>
|
||||
<string name="starting">I2Pd 正在启动...</string>
|
||||
<string name="jniLibraryLoaded">已加载Java本地接口库</string>
|
||||
<string name="startedOkay">I2Pd 已启动</string>
|
||||
<string name="startFailed">I2Pd 启动失败</string>
|
||||
<string name="stopped">I2Pd 已停止运行</string>
|
||||
<string name="stopping">I2Pd 正在停止运行...</string>
|
||||
<string name="remaining">分钟</string>
|
||||
<string name="services">内部服务</string>
|
||||
<string name="services_http_proxy">HTTP 代理</string>
|
||||
<string name="services_socks_proxy">SOCKS5 代理</string>
|
||||
<string name="title_activity_i2_pdperms_asker_prompt">需要权限</string>
|
||||
<string name="permDenied">无法获得 SD 卡写入权限,你需要允许它以继续</string>
|
||||
<string name="permRequired">需要SD卡写入权限才能将密钥和其他文件写入SD卡上的 I2PD 文件夹中。</string>
|
||||
<string name="retryPermRequest">尝试重新获取储存权限</string>
|
||||
<string name="menu_item_battery_optimizations_str">电池优化</string>
|
||||
<string name="battery_optimizations_enabled">电池优化已启用</string>
|
||||
<string name="battery_optimizations_enabled_explained">您的安卓设备正在对 I2Pd 使用严格的电池优化策略,这可能导致I2Pd无缘无故停止运行。\n建议关闭电池优化。</string>
|
||||
<string name="battery_optimizations_enabled_dialog">您的安卓设备正在对 I2Pd 进行严格的电池优化,这可能导致守护进程无缘无故停止运行。\n\n请点击继续以关闭电池优化。</string>
|
||||
<string name="continue_str">继续</string>
|
||||
<string name="device_does_not_support_disabling_battery_optimizations">您设备的 Android 版本不支持关闭电池优化</string>
|
||||
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">您设备的 Android 版本不支持打开电池优化的界面。</string>
|
||||
<string name="shutdown_canceled">计划关闭已取消</string>
|
||||
<string name="tunnels_reloading">正在重新加载隧道配置...</string>
|
||||
<string name="settings_section0">通用设置</string>
|
||||
<string name="settings_section_tunnels">隧道</string>
|
||||
<string name="autostart_enabled">开机自启</string>
|
||||
<string name="add_tunnel_button">添加隧道</string>
|
||||
<string name="add_tunnel">隧道管理</string>
|
||||
<string name="del_tunnel_button">删除隧道</string>
|
||||
</resources>
|
||||
@@ -60,5 +60,6 @@
|
||||
<string name="add_tunnel">Tunnels management</string>
|
||||
|
||||
<string name="del_tunnel_button">Delete tunnel</string>
|
||||
<string name="OpenPreferences">Open i2pd settings</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -3,97 +3,108 @@
|
||||
|
||||
<PreferenceCategory android:title="Main">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:defaultValue="true"
|
||||
android:key="check_box_preference_1"
|
||||
android:title="Log" />
|
||||
<ListPreference
|
||||
android:id="@+id/LogLevel"
|
||||
android:defaultValue="1"
|
||||
android:entries="@array/pref_loglevel"
|
||||
android:entryValues="@array/pref_loglevel"
|
||||
android:key="list_preference_1"
|
||||
android:key="logLevelPreference"
|
||||
android:summary="Logging level to file. Use 'none' to reduce memory usage"
|
||||
android:title="Log level" />
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/IPV4Enable"
|
||||
android:defaultValue="true"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="ipv4EnablePreference"
|
||||
android:title="IPv4" />
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/IPV6Enable"
|
||||
android:defaultValue="false"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="ipv6EnablePreference"
|
||||
android:title="IPv6" />
|
||||
<EditTextPreference
|
||||
android:defaultValue="Default value"
|
||||
android:key="edit_text_preference_1"
|
||||
android:id="@+id/Port"
|
||||
android:defaultValue="auto"
|
||||
android:key="portPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Port" />
|
||||
<ListPreference
|
||||
android:id="@+id/BandWithType"
|
||||
android:entries="@array/pref_bandwidth_limit_flags"
|
||||
android:entryValues="@array/pref_bandwidth_limit_flags"
|
||||
android:key="list_preference_1"
|
||||
android:key="bandwidthPreference"
|
||||
android:summary="Bandwidth limit for transit traffic"
|
||||
android:title="Bandwidth" />
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/NoTransitCheckbox"
|
||||
android:defaultValue="false"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="noTransitPreference"
|
||||
android:summary="Disable transit"
|
||||
android:title="No transit" />
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/FloodfillCheckBox"
|
||||
android:defaultValue="false"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="floodfillPreference"
|
||||
android:summary="Uses more battery"
|
||||
android:title="Floodfill" />
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/SSUCheckBox"
|
||||
android:defaultValue="true"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="ssuPreference"
|
||||
android:title="SSU" />
|
||||
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="NTCP2">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/NTCP2Checkbox"
|
||||
android:defaultValue="true"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="ntcp2EnablePreference"
|
||||
android:title="Enable" />
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/NTCPPublishCheckbox"
|
||||
android:defaultValue="true"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="ntcp2PublishPreference"
|
||||
android:summary="Disable to make unable to connect to your device"
|
||||
android:title="Publish" />
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="Web Console">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/WebConsoleEnableCheckbox"
|
||||
android:defaultValue="true"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="webConsoleEnablePreference"
|
||||
android:title="Enable" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/WebConsoleIPText"
|
||||
android:defaultValue="127.0.0.1"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="webConsoleAddressPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Address" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/WebConsolePortText"
|
||||
android:defaultValue="7070"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="webConsolePortPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Port" />
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/WebConsoleUseAuthCheckbox"
|
||||
android:defaultValue="false"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="webConsoleAuthPreference"
|
||||
android:summary="Use HTTP authorization to access Web Console"
|
||||
android:title="Autorization" />
|
||||
android:title="Authorization" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/WebConsoleUser"
|
||||
android:defaultValue="Default value"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="webConsoleUserPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="User" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/WebConsoleUserPassword"
|
||||
android:defaultValue="Default value"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="webConsolePasswordPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Password" />
|
||||
@@ -101,24 +112,28 @@
|
||||
<PreferenceCategory android:title="@string/services_http_proxy">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/EnableHTTPProxy"
|
||||
android:defaultValue="true"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="httpProxyEnablePreference"
|
||||
android:title="Enable" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/HTTPProxyHost"
|
||||
android:defaultValue="127.0.0.1"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="httpProxyAddressPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Address" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/HTTPProxyPort"
|
||||
android:defaultValue="4444"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="httpProxyPortPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Port" />
|
||||
<EditTextPreference
|
||||
android:defaultValue="proxy-keys.dat"
|
||||
android:key="edit_text_preference_1"
|
||||
android:id="@+id/HTTPProxyKeys"
|
||||
android:defaultValue="transient"
|
||||
android:key="httpProxyKeysPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Keys" />
|
||||
@@ -126,24 +141,28 @@
|
||||
<PreferenceCategory android:title="SOCKS Proxy">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/SocksProxyEnableCheckbox"
|
||||
android:defaultValue="false"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="socksProxyEnablePreference"
|
||||
android:title="Enable" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/SocksProxyHost"
|
||||
android:defaultValue="127.0.0.1"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="socksProxyAddressPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Address" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/SocksProxyPort"
|
||||
android:defaultValue="4447"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="socksProxyPortPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Port" />
|
||||
<EditTextPreference
|
||||
android:defaultValue="proxy-keys.dat"
|
||||
android:key="edit_text_preference_1"
|
||||
android:id="@+id/SocksProxyKey"
|
||||
android:defaultValue="transient"
|
||||
android:key="socksProxyKeysPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Keys" />
|
||||
@@ -151,18 +170,21 @@
|
||||
<PreferenceCategory android:title="SAM">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/SAMEnable"
|
||||
android:defaultValue="false"
|
||||
android:key="check_box_preference_1"
|
||||
android:key="samEnablePreference"
|
||||
android:title="Enable" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/SAMHost"
|
||||
android:defaultValue="127.0.0.1"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="samAddressPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Address" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/SAMPort"
|
||||
android:defaultValue="7656"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="samPortPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Port" />
|
||||
@@ -170,12 +192,14 @@
|
||||
<PreferenceCategory android:title="UPnP">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:defaultValue="true"
|
||||
android:key="check_box_preference_1"
|
||||
android:id="@+id/UPnPEnable"
|
||||
android:defaultValue="false"
|
||||
android:key="upnpEnablePreference"
|
||||
android:title="Enable" />
|
||||
<EditTextPreference
|
||||
android:id="@+id/UPnPForwardName"
|
||||
android:defaultValue="I2Pd"
|
||||
android:key="edit_text_preference_1"
|
||||
android:key="upnpForwardNamePreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:title="Forwarding name" />
|
||||
@@ -183,11 +207,12 @@
|
||||
<PreferenceCategory android:title="Limits">
|
||||
|
||||
<EditTextPreference
|
||||
android:defaultValue="50"
|
||||
android:key="edit_text_preference_1"
|
||||
android:id="@+id/TransitTunnelEdit"
|
||||
android:defaultValue="3000"
|
||||
android:key="transitTunnelPreference"
|
||||
android:selectAllOnFocus="true"
|
||||
android:singleLine="true"
|
||||
android:summary="Limit possible built transit tunnels"
|
||||
android:title="Transit tunnels" />
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
</PreferenceScreen>
|
||||
|
||||
@@ -24,6 +24,7 @@ LOCAL_SRC_FILES := \
|
||||
$(DAEMON_SRC_PATH)/UPnP.cpp \
|
||||
$(DAEMON_SRC_PATH)/HTTPServer.cpp \
|
||||
$(DAEMON_SRC_PATH)/I2PControl.cpp \
|
||||
$(DAEMON_SRC_PATH)/I2PControlHandlers.cpp \
|
||||
$(DAEMON_SRC_PATH)/i2pd.cpp \
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
|
||||
+3
-3
@@ -1,17 +1,17 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
google()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.1.3'
|
||||
classpath 'com.android.tools.build:gradle:7.3.1'
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<b>I2P</b> (Invisible Internet Protocol) je univerzální anonymní síťová vrstva.
|
||||
Veškerá komunikace přes I2P je anonymní a end-to-end šifrována, účastníci neodhalí své skutečné IP adresy.
|
||||
|
||||
<b>I2P klient</b> je software používaný pro vytváření a používání anonymních I2P sítí.
|
||||
Tyto sítě se běžně používají pro anonymní aplikace typu peer-to-peer (sdílení souborů, kryptoměny) a anonymní aplikace typu klient-server (webové stránky, instantní messengery, chat-servery).
|
||||
|
||||
<b>I2P</b> umožňuje lidem z celého světa komunikovat a sdílet informace bez omezení.
|
||||
|
||||
Pro více informací o <b>I2P</b> si můžete přečíst <a href="https://en.m.wikipedia.org/wiki/I2P">článek na Wikipedii</a>.
|
||||
@@ -0,0 +1 @@
|
||||
Kompletní C++ implementace I2P klienta
|
||||
@@ -0,0 +1 @@
|
||||
* Updated codebase to 2.42.1
|
||||
@@ -0,0 +1,5 @@
|
||||
* Updated codebase to 2.43.0
|
||||
* Remove unused READ_PHONE_STATE permission
|
||||
* Switch to OpenSSL 1.1.1q
|
||||
* Added Simplified Chinese translation
|
||||
* Disable SSU and enable SSU2 for new installations
|
||||
@@ -0,0 +1,4 @@
|
||||
* Updated codebase to 2.44.0
|
||||
* Switch to OpenSSL 1.1.1s
|
||||
* Added Ukrainian, Spain and Italian translations
|
||||
* Disable SSU and enable SSU2 for new installations
|
||||
@@ -0,0 +1,4 @@
|
||||
* Updated codebase to 2.45.0
|
||||
* Buildtools 32, target SDK 32, NDK 23c
|
||||
* Switch to Boost 1.78.0
|
||||
* Added Czech translation
|
||||
@@ -0,0 +1 @@
|
||||
* Fix storage access issue on Android 11+
|
||||
@@ -0,0 +1 @@
|
||||
* Fix installation and start on some Android 11+ devices
|
||||
@@ -0,0 +1 @@
|
||||
* Updated codebase to 2.45.1
|
||||
@@ -0,0 +1 @@
|
||||
* Updated codebase to 2.46.0
|
||||
@@ -0,0 +1,3 @@
|
||||
* Updated codebase to 2.46.1
|
||||
* Switch to OpenSSL 1.1.1t
|
||||
* Update Boost building scripts
|
||||
@@ -0,0 +1 @@
|
||||
* Updated codebase to 2.47.0
|
||||
@@ -0,0 +1 @@
|
||||
* Updated codebase to 2.48.0
|
||||
@@ -0,0 +1,2 @@
|
||||
* Updated codebase to 2.48.0 with SOCKS5 authorization fix (2.48.0-3-g07c5291)
|
||||
* Updated OpenSSL to 1.1.1u
|
||||
@@ -0,0 +1,2 @@
|
||||
* Updated codebase to 2.49.0
|
||||
* Updated OpenSSL to 1.1.1w
|
||||
@@ -0,0 +1 @@
|
||||
* Updated codebase to 2.50.0
|
||||
@@ -0,0 +1 @@
|
||||
* Updated codebase to 2.50.2
|
||||
@@ -0,0 +1,2 @@
|
||||
* Updated codebase to 2.51.0
|
||||
* Added minimal configuration menu (cudos: @wipedlifepotato)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
@@ -0,0 +1,9 @@
|
||||
<b>I2P</b> (Invisible Internet Protocol, Protocolo de Internet Invisible) es una capa de red anónima universal.
|
||||
Todas las comunicaciones a través de I2P son anónimas y cifradas de extremo a extremo, los participantes no revelan sus direcciones IP reales.
|
||||
|
||||
Un <b>cliente de I2P</b> es un software utilizado para construir y utilizar redes I2P anónimas.
|
||||
Tales redes son comúnmente utilizadas para aplicaciones de par en par (intercambio de archivos, criptomonedas) y aplicaciones anónimas cliente-servidor (sitios web, mensajería instantánea, servidores de chat).
|
||||
|
||||
<b>I2P</b> le permite a la gente de todo el mundo comunicarse y compartir información sin restricciones.
|
||||
|
||||
Para más información sobre <b>I2P</b>, puedes leer <a href="https://es.m.wikipedia.org/wiki/I2P">este artículo en Wikipedia</a>.
|
||||
@@ -0,0 +1 @@
|
||||
Implementación completa en C++ del cliente I2P
|
||||
@@ -0,0 +1,9 @@
|
||||
<b>I2P</b> (Invisible Internet Protocol) è un livello di rete anonimo universale.
|
||||
Tutte le comunicazioni su I2P sono anonime e crittografate end-to-end, i partecipanti non rivelano i propri indirizzi IP reali.
|
||||
|
||||
<b>Il client I2P</b> è un software utilizzato per costruire e utilizzare reti I2P anonime.
|
||||
Tali reti sono comunemente utilizzate per applicazioni peer-to-peer anonime (trasferimento file, cryptovalute) e applicazioni client-server anonime (siti web, applicazioni di messaggistica istantanea, server di chat).
|
||||
|
||||
<b>I2P</b> permette alle persone di tutto il mondo di comunicare e condividere informazioni senza restrizioni.
|
||||
|
||||
Per ulteriori informazioni riguardo <b>I2P</b>, puoi consultare l'<a href="https://en.m.wikipedia.org/wiki/I2P">articolo su Wikipedia</a>.
|
||||
@@ -0,0 +1 @@
|
||||
Implementazione C++ completa del client I2P
|
||||
@@ -0,0 +1,9 @@
|
||||
<b>I2P</b> (Invisible Internet Protocol) é uma camada de rede anônima universal.
|
||||
Todas as comunicações pela I2P são anonimas e criptografadas ponto-a-ponto, os participantes não revelam os seus verdadeiros endereços IP.
|
||||
|
||||
<b>Um cliente I2P</b> é um software usado para construir e utilizar redes I2P anonimas.
|
||||
Tais redes são comumente usadas em aplicações P2P anonimas (compartilhamento de arquivos, cripttomoedas) e aplicações cliente-servidor (websites, mensageiros instantâneos, servidores de chat).
|
||||
|
||||
O <b> I2P </b> permite às pessoas de todo o mundo se comunicarem e compartilhar informações sem restrições.
|
||||
|
||||
Para mais informações sobre a <b> I2P </b>, você pode ler o <a href="https://pt.wikipedia.org/wiki/I2P"> artigo na Wikipédia </a>.
|
||||
@@ -0,0 +1 @@
|
||||
Implementação completa do cliente I2P em C++
|
||||
@@ -6,4 +6,4 @@ Bu tür ağlar genellikle anonim eşler arası uygulamalar (dosya paylaşımı,
|
||||
|
||||
<b>I2P</b> dünyanın her yerinden insanların kısıtlama olmaksızın iletişim kurmasına ve bilgi paylaşmasına olanak tanır.
|
||||
|
||||
<b>I2P</b> hakkında daha fazla bilgi için <a href="https://en.m.wikipedia.org/wiki/I2P">Wikipedia makalesini</a> okuyabilirsiniz.
|
||||
<b>I2P</b> hakkında daha fazla bilgi için <a href="https://en.m.wikipedia.org/wiki/I2P">Wikipedia makalesini</a> okuyabilirsiniz.
|
||||
@@ -0,0 +1,9 @@
|
||||
<b>I2P</b> (Невидимий Інтернет Протокол) - це універсальний анонімний шар мережі.
|
||||
Усі повідомлення по I2P є анонімними та наскрізними до кінця зашифрованих, учасники не розкривають їхні реальні IP-адреси.
|
||||
|
||||
<b>I2P клієнт</b> є програмним забезпеченням для будівництва і використання анонімних I2P мереж.
|
||||
Такі мережі зазвичай використовуються для анонімних однорангових додатків (обмін файлами, криптовалютами) та анонімних додатків на сервері клієнта (вебсайт, миттєві повідомлення, чат-сервери).
|
||||
|
||||
<b>I2P</b> дозволяє людям з усього світу обмінюватися інформацією без обмежень.
|
||||
|
||||
Для отримання додаткової інформації про <b>I2P</b>ви можете прочитати <a href="https://en.m.wikipedia.org/wiki/I2P">статтю у Вікіпедії</a>.
|
||||
@@ -0,0 +1 @@
|
||||
Повнофункціональна C++ реалізація I2P клієнта
|
||||
@@ -0,0 +1,9 @@
|
||||
<b>I2P</b> (隐形互联网计划) 是一个通用的匿名网络层。
|
||||
所有通过 I2P 进行的通信都是匿名、端到端加密的,用户不会透露他们真实的 IP 地址。
|
||||
|
||||
<b>I2P 客户端</b> 是一个用于构建和使用匿名 I2P 网络的软件。
|
||||
这种网络通常用于匿名的 P2P 应用(如文件共享、加密货币) 以及匿名的客户端-服务器架构的应用(如网站、即时通讯、聊天服务器等) 。
|
||||
|
||||
<b>I2P</b> 允许来自世界各地的人不受限制地交流和分享信息。
|
||||
|
||||
欲了解更多关于 <b>I2P</b>的信息,请参见 <a href="https://en.m.wikipedia.org/wiki/I2P">Wikipedia</a> 。
|
||||
@@ -0,0 +1 @@
|
||||
I2P 客户端的全功能C++ 实现
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
|
||||
distributionSha256Sum=8cc27038d5dbd815759851ba53e70cf62e481b87494cc97cfd97982ada5ba634
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
Reference in New Issue
Block a user