Browse Source

Enable/Disable button; Toast on webconsole if not enabled; i2pdpath;on boot autostart;getDataPath/iniEditor preinit for setting

pull/58/head
Aleksander Undisclosed Yvarov 3 years ago committed by R4SAS
parent
commit
fd04d7070d
  1. 6
      app/jni/DaemonAndroid.cpp
  2. 2
      app/jni/DaemonAndroid.h
  3. 4
      app/jni/i2pd_android.cpp
  4. 3
      app/jni/org_purplei2p_i2pd_I2PD_JNI.h
  5. 9
      app/src/main/AndroidManifest.xml
  6. 65
      app/src/main/java/org/purplei2p/i2pd/DaemonWrapper.java
  7. 39
      app/src/main/java/org/purplei2p/i2pd/I2PDActivity.java
  8. 2
      app/src/main/java/org/purplei2p/i2pd/I2PD_JNI.java
  9. 1182
      app/src/main/java/org/purplei2p/i2pd/iniedotr/IniEditor.java
  10. 19
      app/src/main/java/org/purplei2p/i2pd/receivers/BootUpReceiver.java
  11. 26
      app/src/main/res/layout/activity_main.xml
  12. 3
      gradle.properties

6
app/jni/DaemonAndroid.cpp

@ -218,5 +218,11 @@ namespace android @@ -218,5 +218,11 @@ namespace android
{
dataDir = jdataDir;
}
std::string
GetDataDir(void)
{
return dataDir;
}
}
}

2
app/jni/DaemonAndroid.h

@ -52,6 +52,8 @@ namespace android @@ -52,6 +52,8 @@ namespace android
// set datadir received from jni
void SetDataDir(std::string jdataDir);
// get datadir
std::string GetDataDir(void);
/*
class Worker : public QObject
{

4
app/jni/i2pd_android.cpp

@ -56,6 +56,10 @@ JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startDaemon @@ -56,6 +56,10 @@ JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startDaemon
(JNIEnv *env, jclass clazz) {
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
(JNIEnv *env, jclass clazz) {

3
app/jni/org_purplei2p_i2pd_I2PD_JNI.h

@ -26,6 +26,9 @@ JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getABICompiledWith @@ -26,6 +26,9 @@ JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getABICompiledWith
JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startDaemon
(JNIEnv *, jclass);
JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getDataDir
(JNIEnv *, jclass);
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopDaemon
(JNIEnv *, jclass);

9
app/src/main/AndroidManifest.xml

@ -10,6 +10,8 @@ @@ -10,6 +10,8 @@
<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" />
<application
android:allowBackup="true"
@ -19,6 +21,13 @@ @@ -19,6 +21,13 @@
android:theme="@android:style/Theme.Holo.Light.DarkActionBar"
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
android:name="android.webkit.WebView.MetricsOptOut"
android:value="true" />

65
app/src/main/java/org/purplei2p/i2pd/DaemonWrapper.java

@ -24,6 +24,7 @@ import android.util.Log; @@ -24,6 +24,7 @@ import android.util.Log;
import androidx.annotation.RequiresApi;
public class DaemonWrapper {
private static final String TAG = "i2pd";
private final AssetManager assetManager;
private final ConnectivityManager connectivityManager;
@ -118,31 +119,7 @@ public class DaemonWrapper { @@ -118,31 +119,7 @@ public class DaemonWrapper {
this.assetManager = assetManager;
this.connectivityManager = connectivityManager;
setState(State.starting);
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(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();
startDaemon();
}
private Throwable lastThrowable;
@ -167,6 +144,16 @@ public class DaemonWrapper { @@ -167,6 +144,16 @@ public class DaemonWrapper {
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() {
return getState().isStartedOkay();
}
@ -182,6 +169,34 @@ public class DaemonWrapper { @@ -182,6 +169,34 @@ public class DaemonWrapper {
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() {
if (!assetsCopied) {

39
app/src/main/java/org/purplei2p/i2pd/I2PDActivity.java

@ -27,6 +27,8 @@ import android.provider.Settings; @@ -27,6 +27,8 @@ import android.provider.Settings;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
@ -35,12 +37,17 @@ import androidx.core.app.ActivityCompat; @@ -35,12 +37,17 @@ import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
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 {
private static final String TAG = "i2pdActvt";
private static final int MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
public static final int GRACEFUL_DELAY_MILLIS = 10 * 60 * 1000;
public static final String PACKAGE_URI_SCHEME = "package:";
private Button enableButton;
private Button disableButton;
private TextView textView;
@ -64,6 +71,9 @@ public class I2PDActivity extends Activity { @@ -64,6 +71,9 @@ public class I2PDActivity extends Activity {
return;
}
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 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));
@ -92,9 +102,9 @@ public class I2PDActivity extends Activity { @@ -92,9 +102,9 @@ public class I2PDActivity extends Activity {
Log.i(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
enableButton = findViewById(R.id.enableButton);
disableButton = findViewById(R.id.disableButton);
textView = (TextView) findViewById(R.id.textView);
if (daemon == null) {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
daemon = new DaemonWrapper(getAssets(), connectivityManager);
@ -103,7 +113,25 @@ public class I2PDActivity extends Activity { @@ -103,7 +113,25 @@ public class I2PDActivity extends Activity {
daemon.addStateChangeListener(daemonStateUpdatedListener);
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
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
@ -266,7 +294,10 @@ public class I2PDActivity extends Activity { @@ -266,7 +294,10 @@ public class I2PDActivity extends Activity {
return true;
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;
}

2
app/src/main/java/org/purplei2p/i2pd/I2PD_JNI.java

@ -30,4 +30,6 @@ public class I2PD_JNI { @@ -30,4 +30,6 @@ public class I2PD_JNI {
//System.loadLibrary("c++_shared");
System.loadLibrary("i2pd");
}
public static native String getDataDir();
}

1182
app/src/main/java/org/purplei2p/i2pd/iniedotr/IniEditor.java

File diff suppressed because it is too large Load Diff

19
app/src/main/java/org/purplei2p/i2pd/receivers/BootUpReceiver.java

@ -0,0 +1,19 @@ @@ -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);
}
}

26
app/src/main/res/layout/activity_main.xml

@ -5,12 +5,30 @@ @@ -5,12 +5,30 @@
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:background="#9C27B0"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_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">
<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
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -32,6 +50,10 @@ @@ -32,6 +50,10 @@
android:layout_height="wrap_content"
android:gravity="center_horizontal" />
<Space
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</LinearLayout>
</RelativeLayout>

3
gradle.properties

@ -1,3 +1,4 @@ @@ -1,3 +1,4 @@
android.enableJetifier=true
android.useAndroidX=true
org.gradle.parallel=true
org.gradle.parallel=true
android.defaultConfig.vectorDrawables.useSupportLibrary = true

Loading…
Cancel
Save