mirror of
https://github.com/PurpleI2P/i2pd-android.git
synced 2025-02-03 10:26:01 +00:00
Enable/Disable button; Toast on webconsole if not enabled; i2pdpath;on boot autostart;getDataPath/iniEditor preinit for setting
This commit is contained in:
parent
55cde8e11c
commit
fd04d7070d
@ -218,5 +218,11 @@ namespace android
|
|||||||
{
|
{
|
||||||
dataDir = jdataDir;
|
dataDir = jdataDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
GetDataDir(void)
|
||||||
|
{
|
||||||
|
return dataDir;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,8 @@ namespace android
|
|||||||
|
|
||||||
// set datadir received from jni
|
// set datadir received from jni
|
||||||
void SetDataDir(std::string jdataDir);
|
void SetDataDir(std::string jdataDir);
|
||||||
|
// get datadir
|
||||||
|
std::string GetDataDir(void);
|
||||||
/*
|
/*
|
||||||
class Worker : public QObject
|
class Worker : public QObject
|
||||||
{
|
{
|
||||||
|
@ -56,6 +56,10 @@ JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startDaemon
|
|||||||
(JNIEnv *env, jclass clazz) {
|
(JNIEnv *env, jclass clazz) {
|
||||||
return env->NewStringUTF(i2p::android::start().c_str());
|
return env->NewStringUTF(i2p::android::start().c_str());
|
||||||
}
|
}
|
||||||
|
JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getDataDir
|
||||||
|
(JNIEnv *env, jclass clazz) {
|
||||||
|
return env->NewStringUTF( i2p::android::GetDataDir().c_str() );
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopDaemon
|
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopDaemon
|
||||||
(JNIEnv *env, jclass clazz) {
|
(JNIEnv *env, jclass clazz) {
|
||||||
|
@ -26,6 +26,9 @@ JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getABICompiledWith
|
|||||||
JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startDaemon
|
JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startDaemon
|
||||||
(JNIEnv *, jclass);
|
(JNIEnv *, jclass);
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getDataDir
|
||||||
|
(JNIEnv *, jclass);
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopDaemon
|
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopDaemon
|
||||||
(JNIEnv *, jclass);
|
(JNIEnv *, jclass);
|
||||||
|
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||||
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
@ -19,6 +21,13 @@
|
|||||||
android:theme="@android:style/Theme.Holo.Light.DarkActionBar"
|
android:theme="@android:style/Theme.Holo.Light.DarkActionBar"
|
||||||
android:usesCleartextTraffic="true">
|
android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
|
<receiver android:enabled="true" android:name=".receivers.BootUpReceiver"
|
||||||
|
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.webkit.WebView.MetricsOptOut"
|
android:name="android.webkit.WebView.MetricsOptOut"
|
||||||
android:value="true" />
|
android:value="true" />
|
||||||
|
@ -24,6 +24,7 @@ import android.util.Log;
|
|||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
public class DaemonWrapper {
|
public class DaemonWrapper {
|
||||||
|
|
||||||
private static final String TAG = "i2pd";
|
private static final String TAG = "i2pd";
|
||||||
private final AssetManager assetManager;
|
private final AssetManager assetManager;
|
||||||
private final ConnectivityManager connectivityManager;
|
private final ConnectivityManager connectivityManager;
|
||||||
@ -118,31 +119,7 @@ public class DaemonWrapper {
|
|||||||
this.assetManager = assetManager;
|
this.assetManager = assetManager;
|
||||||
this.connectivityManager = connectivityManager;
|
this.connectivityManager = connectivityManager;
|
||||||
setState(State.starting);
|
setState(State.starting);
|
||||||
new Thread(() -> {
|
startDaemon();
|
||||||
try {
|
|
||||||
processAssets();
|
|
||||||
I2PD_JNI.loadLibraries();
|
|
||||||
setState(State.jniLibraryLoaded);
|
|
||||||
registerNetworkCallback();
|
|
||||||
} catch (Throwable tr) {
|
|
||||||
lastThrowable = tr;
|
|
||||||
setState(State.startFailed);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
synchronized (DaemonWrapper.this) {
|
|
||||||
I2PD_JNI.setDataDir(Environment.getExternalStorageDirectory().getAbsolutePath() + "/i2pd");
|
|
||||||
daemonStartResult = I2PD_JNI.startDaemon();
|
|
||||||
if ("ok".equals(daemonStartResult)) {
|
|
||||||
setState(State.startedOkay);
|
|
||||||
} else
|
|
||||||
setState(State.startFailed);
|
|
||||||
}
|
|
||||||
} catch (Throwable tr) {
|
|
||||||
lastThrowable = tr;
|
|
||||||
setState(State.startFailed);
|
|
||||||
}
|
|
||||||
}, "i2pdDaemonStart").start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Throwable lastThrowable;
|
private Throwable lastThrowable;
|
||||||
@ -167,6 +144,16 @@ public class DaemonWrapper {
|
|||||||
return daemonStartResult;
|
return daemonStartResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getDataDir() { // for settings iniEditor
|
||||||
|
return I2PD_JNI.getDataDir();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void changeDataDir(String dataDir, Boolean updateAssets) {
|
||||||
|
I2PD_JNI.setDataDir(dataDir);
|
||||||
|
if( updateAssets ) processAssets();
|
||||||
|
//ToDo: move old dir to new dir?
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isStartedOkay() {
|
public boolean isStartedOkay() {
|
||||||
return getState().isStartedOkay();
|
return getState().isStartedOkay();
|
||||||
}
|
}
|
||||||
@ -182,6 +169,34 @@ public class DaemonWrapper {
|
|||||||
setState(State.stopped);
|
setState(State.stopped);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public synchronized void startDaemon() {
|
||||||
|
if( getState() != State.stopped && getState() != State.starting ) return;
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
processAssets();
|
||||||
|
I2PD_JNI.loadLibraries();
|
||||||
|
setState(State.jniLibraryLoaded);
|
||||||
|
registerNetworkCallback();
|
||||||
|
} catch (Throwable tr) {
|
||||||
|
lastThrowable = tr;
|
||||||
|
setState(State.startFailed);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
synchronized (DaemonWrapper.this) {
|
||||||
|
I2PD_JNI.setDataDir(i2pdpath);//(Environment.getExternalStorageDirectory().getAbsolutePath() + "/i2pd");
|
||||||
|
daemonStartResult = I2PD_JNI.startDaemon();
|
||||||
|
if ("ok".equals(daemonStartResult)) {
|
||||||
|
setState(State.startedOkay);
|
||||||
|
} else
|
||||||
|
setState(State.startFailed);
|
||||||
|
}
|
||||||
|
} catch (Throwable tr) {
|
||||||
|
lastThrowable = tr;
|
||||||
|
setState(State.startFailed);
|
||||||
|
}
|
||||||
|
}, "i2pdDaemonStart").start();
|
||||||
|
}
|
||||||
|
|
||||||
private void processAssets() {
|
private void processAssets() {
|
||||||
if (!assetsCopied) {
|
if (!assetsCopied) {
|
||||||
|
@ -27,6 +27,8 @@ import android.provider.Settings;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
@ -35,12 +37,17 @@ import androidx.core.app.ActivityCompat;
|
|||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
import static android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS;
|
import static android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS;
|
||||||
|
import static org.purplei2p.i2pd.DaemonWrapper.State.startedOkay;
|
||||||
|
import static org.purplei2p.i2pd.DaemonWrapper.State.starting;
|
||||||
|
import static org.purplei2p.i2pd.DaemonWrapper.State.stopped;
|
||||||
|
|
||||||
public class I2PDActivity extends Activity {
|
public class I2PDActivity extends Activity {
|
||||||
private static final String TAG = "i2pdActvt";
|
private static final String TAG = "i2pdActvt";
|
||||||
private static final int MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
|
private static final int MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
|
||||||
public static final int GRACEFUL_DELAY_MILLIS = 10 * 60 * 1000;
|
public static final int GRACEFUL_DELAY_MILLIS = 10 * 60 * 1000;
|
||||||
public static final String PACKAGE_URI_SCHEME = "package:";
|
public static final String PACKAGE_URI_SCHEME = "package:";
|
||||||
|
private Button enableButton;
|
||||||
|
private Button disableButton;
|
||||||
|
|
||||||
private TextView textView;
|
private TextView textView;
|
||||||
|
|
||||||
@ -64,6 +71,9 @@ public class I2PDActivity extends Activity {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DaemonWrapper.State state = daemon.getState();
|
DaemonWrapper.State state = daemon.getState();
|
||||||
|
if(state == startedOkay){
|
||||||
|
disableButton.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
String startResultStr = DaemonWrapper.State.startFailed.equals(state) ? String.format(": %s", daemon.getDaemonStartResult()) : "";
|
String startResultStr = DaemonWrapper.State.startFailed.equals(state) ? String.format(": %s", daemon.getDaemonStartResult()) : "";
|
||||||
String graceStr = DaemonWrapper.State.gracefulShutdownInProgress.equals(state) ? String.format(": %s %s", formatGraceTimeRemaining(), getText(R.string.remaining)) : "";
|
String graceStr = DaemonWrapper.State.gracefulShutdownInProgress.equals(state) ? String.format(": %s %s", formatGraceTimeRemaining(), getText(R.string.remaining)) : "";
|
||||||
textView.setText(String.format("%s%s%s", getText(state.getStatusStringResourceId()), startResultStr, graceStr));
|
textView.setText(String.format("%s%s%s", getText(state.getStatusStringResourceId()), startResultStr, graceStr));
|
||||||
@ -92,9 +102,9 @@ public class I2PDActivity extends Activity {
|
|||||||
Log.i(TAG, "onCreate");
|
Log.i(TAG, "onCreate");
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_main);
|
setContentView(R.layout.activity_main);
|
||||||
|
enableButton = findViewById(R.id.enableButton);
|
||||||
|
disableButton = findViewById(R.id.disableButton);
|
||||||
textView = (TextView) findViewById(R.id.textView);
|
textView = (TextView) findViewById(R.id.textView);
|
||||||
|
|
||||||
if (daemon == null) {
|
if (daemon == null) {
|
||||||
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
daemon = new DaemonWrapper(getAssets(), connectivityManager);
|
daemon = new DaemonWrapper(getAssets(), connectivityManager);
|
||||||
@ -103,7 +113,25 @@ public class I2PDActivity extends Activity {
|
|||||||
|
|
||||||
daemon.addStateChangeListener(daemonStateUpdatedListener);
|
daemon.addStateChangeListener(daemonStateUpdatedListener);
|
||||||
daemonStateUpdatedListener.daemonStateUpdate(DaemonWrapper.State.uninitialized, daemon.getState());
|
daemonStateUpdatedListener.daemonStateUpdate(DaemonWrapper.State.uninitialized, daemon.getState());
|
||||||
|
enableButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
if( daemon.getState() != startedOkay && daemon.getState() != starting ){
|
||||||
|
daemon.stopDaemon();
|
||||||
|
daemon.startDaemon();
|
||||||
|
disableButton.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
disableButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
if( daemon.getState() != stopped ){
|
||||||
|
daemon.stopDaemon();
|
||||||
|
disableButton.setVisibility(View.INVISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
// request permissions
|
// request permissions
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
||||||
@ -266,7 +294,10 @@ public class I2PDActivity extends Activity {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
case R.id.action_start_webview:
|
case R.id.action_start_webview:
|
||||||
startActivity(new Intent(getApplicationContext(), WebConsoleActivity.class));
|
if( daemon.getState() == startedOkay)
|
||||||
|
startActivity(new Intent(getApplicationContext(), WebConsoleActivity.class));
|
||||||
|
else
|
||||||
|
Toast.makeText(this,"I2Pd not was started!", Toast.LENGTH_SHORT).show();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,4 +30,6 @@ public class I2PD_JNI {
|
|||||||
//System.loadLibrary("c++_shared");
|
//System.loadLibrary("c++_shared");
|
||||||
System.loadLibrary("i2pd");
|
System.loadLibrary("i2pd");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static native String getDataDir();
|
||||||
}
|
}
|
||||||
|
1182
app/src/main/java/org/purplei2p/i2pd/iniedotr/IniEditor.java
Normal file
1182
app/src/main/java/org/purplei2p/i2pd/iniedotr/IniEditor.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,19 @@
|
|||||||
|
package org.purplei2p.i2pd.receivers;
|
||||||
|
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
|
||||||
|
import org.purplei2p.i2pd.I2PDPermsAskerActivity;
|
||||||
|
|
||||||
|
public class BootUpReceiver extends BroadcastReceiver {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
/* todo: disable the autostart? */
|
||||||
|
Intent i = new Intent(context, I2PDPermsAskerActivity.class);
|
||||||
|
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
context.startActivity(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,12 +5,30 @@
|
|||||||
android:id="@+id/activity_main"
|
android:id="@+id/activity_main"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
android:background="#9C27B0"
|
||||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
|
||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
tools:context="org.purplei2p.i2pd.I2PDActivity">
|
tools:context="org.purplei2p.i2pd.I2PDActivity">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/enableButton"
|
||||||
|
style="@android:style/Widget.Button.Inset"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:background="@android:drawable/presence_offline" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/disableButton"
|
||||||
|
style="@android:style/Widget.Button.Inset"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:background="@android:drawable/presence_online"
|
||||||
|
android:visibility="invisible" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -32,6 +50,10 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center_horizontal" />
|
android:gravity="center_horizontal" />
|
||||||
|
|
||||||
|
<Space
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
@ -1,3 +1,4 @@
|
|||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
org.gradle.parallel=true
|
org.gradle.parallel=true
|
||||||
|
android.defaultConfig.vectorDrawables.useSupportLibrary = true
|
||||||
|
Loading…
x
Reference in New Issue
Block a user