diff --git a/android/jni/i2pd_android.cpp b/android/jni/i2pd_android.cpp
index 8791c90b..ac968fd3 100755
--- a/android/jni/i2pd_android.cpp
+++ b/android/jni/i2pd_android.cpp
@@ -58,6 +58,11 @@ JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopAcceptingTunnels
i2p::context.SetAcceptsTunnels (false);
}
+JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startAcceptingTunnels
+ (JNIEnv * env, jclass clazz) {
+ i2p::context.SetAcceptsTunnels (true);
+}
+
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_onNetworkStateChanged
(JNIEnv * env, jclass clazz, jboolean isConnected)
{
diff --git a/android/jni/org_purplei2p_i2pd_I2PD_JNI.h b/android/jni/org_purplei2p_i2pd_I2PD_JNI.h
index 04923d22..7beb1284 100644
--- a/android/jni/org_purplei2p_i2pd_I2PD_JNI.h
+++ b/android/jni/org_purplei2p_i2pd_I2PD_JNI.h
@@ -24,6 +24,9 @@ JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopDaemon
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopAcceptingTunnels
(JNIEnv *, jclass);
+JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startAcceptingTunnels
+ (JNIEnv *, jclass);
+
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_onNetworkStateChanged
(JNIEnv * env, jclass clazz, jboolean isConnected);
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
index a0cc264c..18aef3b1 100755
--- a/android/res/values/strings.xml
+++ b/android/res/values/strings.xml
@@ -3,6 +3,7 @@
i2pd
Stop
Graceful Stop
+ Cancel Graceful Stop
Graceful stop is already in progress
Graceful stop is in progress
Already stopped
diff --git a/android/src/org/purplei2p/i2pd/DaemonSingleton.java b/android/src/org/purplei2p/i2pd/DaemonSingleton.java
index 4f3e62f7..4c3d5f44 100644
--- a/android/src/org/purplei2p/i2pd/DaemonSingleton.java
+++ b/android/src/org/purplei2p/i2pd/DaemonSingleton.java
@@ -33,6 +33,13 @@ public class DaemonSingleton {
}
}
+ public synchronized void startAcceptingTunnels() {
+ if(isStartedOkay()){
+ setState(State.startedOkay);
+ I2PD_JNI.startAcceptingTunnels();
+ }
+ }
+
private volatile boolean startedOkay;
public enum State {
diff --git a/android/src/org/purplei2p/i2pd/I2PDActivity.java b/android/src/org/purplei2p/i2pd/I2PDActivity.java
index 31058765..3c95a832 100755
--- a/android/src/org/purplei2p/i2pd/I2PDActivity.java
+++ b/android/src/org/purplei2p/i2pd/I2PDActivity.java
@@ -144,14 +144,10 @@ public class I2PDActivity extends Activity {
case MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE:
{
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
- {
Log.e(TAG, "Memory permission granted");
- }
else
- {
Log.e(TAG, "Memory permission declined");
// TODO: terminate
- }
return;
}
default: ;
@@ -244,7 +240,16 @@ public class I2PDActivity extends Activity {
i2pdStop();
return true;
case R.id.action_graceful_stop:
- i2pdGracefulStop();
+ if (getGracefulQuitTimer()!= null)
+ {
+ item.setTitle(R.string.action_graceful_stop);
+ i2pdCancelGracefulStop ();
+ }
+ else
+ {
+ item.setTitle(R.string.action_cancel_graceful_stop);
+ i2pdGracefulStop();
+ }
return true;
}
@@ -307,6 +312,32 @@ public class I2PDActivity extends Activity {
},"gracInit").start();
}
+
+ private void i2pdCancelGracefulStop()
+ {
+ cancelGracefulStop();
+ Toast.makeText(this, R.string.startedOkay, Toast.LENGTH_SHORT).show();
+ new Thread(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ try
+ {
+ Log.d(TAG, "grac stopping cancel");
+ if(daemon.isStartedOkay())
+ daemon.startAcceptingTunnels();
+ else
+ i2pdStop();
+ }
+ catch(Throwable tr)
+ {
+ Log.e(TAG,"",tr);
+ }
+ }
+
+ },"gracCancel").start();
+ }
private void rescheduleGraceStop(Timer gracefulQuitTimerOld, long gracefulStopAtMillis) {
if(gracefulQuitTimerOld!=null)gracefulQuitTimerOld.cancel();
diff --git a/android/src/org/purplei2p/i2pd/I2PD_JNI.java b/android/src/org/purplei2p/i2pd/I2PD_JNI.java
index f965d471..63867273 100644
--- a/android/src/org/purplei2p/i2pd/I2PD_JNI.java
+++ b/android/src/org/purplei2p/i2pd/I2PD_JNI.java
@@ -12,6 +12,8 @@ public class I2PD_JNI {
public static native void stopAcceptingTunnels();
+ public static native void startAcceptingTunnels();
+
public static native void onNetworkStateChanged(boolean isConnected);
public static void loadLibraries() {