diff --git a/app/jni/DaemonAndroid.cpp b/app/jni/DaemonAndroid.cpp
index 5b179bf..c249e1e 100644
--- a/app/jni/DaemonAndroid.cpp
+++ b/app/jni/DaemonAndroid.cpp
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2013-2020, The PurpleI2P Project
+* Copyright (c) 2013-2022, The PurpleI2P Project
*
* This file is part of Purple i2pd project and licensed under BSD3
*
@@ -22,80 +22,19 @@ namespace i2p
{
namespace android
{
-/* Worker::Worker (DaemonAndroidImpl& daemon):
- m_Daemon (daemon)
- {
- }
-
- void Worker::startDaemon()
- {
- Log.d(TAG"Performing daemon start...");
- m_Daemon.start();
- Log.d(TAG"Daemon started.");
- emit resultReady();
- }
- void Worker::restartDaemon()
- {
- Log.d(TAG"Performing daemon restart...");
- m_Daemon.restart();
- Log.d(TAG"Daemon restarted.");
- emit resultReady();
- }
- void Worker::stopDaemon() {
- Log.d(TAG"Performing daemon stop...");
- m_Daemon.stop();
- Log.d(TAG"Daemon stopped.");
- emit resultReady();
- }
-
- Controller::Controller(DaemonAndroidImpl& daemon):
- m_Daemon (daemon)
- {
- Worker *worker = new Worker (m_Daemon);
- worker->moveToThread(&workerThread);
- connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
- connect(this, &Controller::startDaemon, worker, &Worker::startDaemon);
- connect(this, &Controller::stopDaemon, worker, &Worker::stopDaemon);
- connect(this, &Controller::restartDaemon, worker, &Worker::restartDaemon);
- connect(worker, &Worker::resultReady, this, &Controller::handleResults);
- workerThread.start();
- }
- Controller::~Controller()
- {
- Log.d(TAG"Closing and waiting for daemon worker thread...");
- workerThread.quit();
- workerThread.wait();
- Log.d(TAG"Waiting for daemon worker thread finished.");
- if(m_Daemon.isRunning())
- {
- Log.d(TAG"Stopping the daemon...");
- m_Daemon.stop();
- Log.d(TAG"Stopped the daemon.");
- }
- }
-*/
std::string dataDir = "";
std::string language = "";
DaemonAndroidImpl::DaemonAndroidImpl ()
- //:
- /*mutex(nullptr), */
- //m_IsRunning(false),
- //m_RunningChangedCallback(nullptr)
{
}
DaemonAndroidImpl::~DaemonAndroidImpl ()
{
- //delete mutex;
}
bool DaemonAndroidImpl::init(int argc, char* argv[])
{
- //mutex=new QMutex(QMutex::Recursive);
- //setRunningCallback(0);
- //m_IsRunning=false;
-
// make sure assets are ready before proceed
i2p::fs::DetectDataDir(dataDir, false);
int numAttempts = 0;
@@ -129,28 +68,7 @@ namespace android
stop();
start();
}
- /*
- void DaemonAndroidImpl::setRunningCallback(runningChangedCallback cb)
- {
- m_RunningChangedCallback = cb;
- }
-
- bool DaemonAndroidImpl::isRunning()
- {
- return m_IsRunning;
- }
- void DaemonAndroidImpl::setRunning(bool newValue)
- {
- bool oldValue = m_IsRunning;
- if(oldValue!=newValue)
- {
- m_IsRunning = newValue;
- if(m_RunningChangedCallback)
- m_RunningChangedCallback();
- }
- }
-*/
static DaemonAndroidImpl daemon;
static char* argv[1]={strdup("tmp")};
/**
@@ -161,40 +79,19 @@ namespace android
{
try
{
- //int result;
-
{
//Log.d(TAG"Initialising the daemon...");
bool daemonInitSuccess = daemon.init(1, argv);
if(!daemonInitSuccess)
{
- //QMessageBox::critical(0, "Error", "Daemon init failed");
return "Daemon init failed";
}
// Set webconsole language from application
i2p::i18n::SetLanguage(language);
- //Log.d(TAG"Initialised, creating the main window...");
- //MainWindow w;
- //Log.d(TAG"Before main window.show()...");
- //w.show ();
-
- {
- //i2p::qt::Controller daemonQtController(daemon);
- //Log.d(TAG"Starting the daemon...");
- //emit daemonQtController.startDaemon();
- //daemon.start ();
- //Log.d(TAG"Starting GUI event loop...");
- //result = app.exec();
- //daemon.stop ();
- daemon.start();
- }
+ daemon.start();
}
-
- //QMessageBox::information(&w, "Debug", "demon stopped");
- //Log.d(TAG"Exiting the application");
- //return result;
}
catch (boost::exception& ex)
{
diff --git a/app/jni/DaemonAndroid.h b/app/jni/DaemonAndroid.h
index 949690c..2c1db83 100644
--- a/app/jni/DaemonAndroid.h
+++ b/app/jni/DaemonAndroid.h
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2013-2020, The PurpleI2P Project
+* Copyright (c) 2013-2022, The PurpleI2P Project
*
* This file is part of Purple i2pd project and licensed under BSD3
*
@@ -22,8 +22,6 @@ namespace android
DaemonAndroidImpl ();
~DaemonAndroidImpl ();
- //typedef void (*runningChangedCallback)();
-
/**
* @return success
*/
@@ -31,14 +29,6 @@ namespace android
void start();
void stop();
void restart();
- //void setRunningCallback(runningChangedCallback cb);
- //bool isRunning();
- private:
- //void setRunning(bool running);
- private:
- //QMutex* mutex;
- //bool m_IsRunning;
- //runningChangedCallback m_RunningChangedCallback;
};
/**
@@ -47,7 +37,6 @@ namespace android
*/
std::string start();
- // stops the daemon
void stop();
// set datadir received from jni
@@ -56,45 +45,6 @@ namespace android
std::string GetDataDir(void);
// set webconsole language
void SetLanguage(std::string jlanguage);
- /*
- class Worker : public QObject
- {
- Q_OBJECT
- public:
-
- Worker (DaemonAndroidImpl& daemon);
-
- private:
-
- DaemonAndroidImpl& m_Daemon;
-
- public slots:
- void startDaemon();
- void restartDaemon();
- void stopDaemon();
-
- signals:
- void resultReady();
- };
-
- class Controller : public QObject
- {
- Q_OBJECT
- QThread workerThread;
- public:
- Controller(DaemonAndroidImpl& daemon);
- ~Controller();
- private:
- DaemonAndroidImpl& m_Daemon;
-
- public slots:
- void handleResults(){}
- signals:
- void startDaemon();
- void stopDaemon();
- void restartDaemon();
- };
- */
}
}
diff --git a/app/jni/i2pd b/app/jni/i2pd
index b7e20b9..064b804 160000
--- a/app/jni/i2pd
+++ b/app/jni/i2pd
@@ -1 +1 @@
-Subproject commit b7e20b9b86165a0eb2ba5bcf9a580f3824a38462
+Subproject commit 064b8042a5bd37bf44b4e712d8af16bca6c2acf7
diff --git a/app/jni/i2pd_android.cpp b/app/jni/i2pd_android.cpp
index 60ae415..28d2145 100644
--- a/app/jni/i2pd_android.cpp
+++ b/app/jni/i2pd_android.cpp
@@ -90,31 +90,12 @@ JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_onNetworkStateChanged
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_setDataDir
(JNIEnv *env, jclass clazz, jstring jdataDir) {
-
- /*
- // Method 1: convert UTF-16 jstring to std::string (https://stackoverflow.com/a/41820336)
- const jclass stringClass = env->GetObjectClass(jdataDir);
- const jmethodID getBytes = env->GetMethodID(stringClass, "getBytes", "(Ljava/lang/String;)[B");
- const jbyteArray stringJbytes = (jbyteArray) env->CallObjectMethod(jdataDir, getBytes, env->NewStringUTF("UTF-8"));
-
- size_t length = (size_t) env->GetArrayLength(stringJbytes);
- jbyte* pBytes = env->GetByteArrayElements(stringJbytes, NULL);
-
- std::string dataDir = std::string((char *)pBytes, length);
- env->ReleaseByteArrayElements(stringJbytes, pBytes, JNI_ABORT);
-
- env->DeleteLocalRef(stringJbytes);
- env->DeleteLocalRef(stringClass); */
-
- // Method 2: get string chars and make char array.
auto dataDir = env->GetStringUTFChars(jdataDir, NULL);
env->ReleaseStringUTFChars(jdataDir, dataDir);
-
- // Set DataDir
i2p::android::SetDataDir(dataDir);
}
-JNIEXPORT jint JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_GetTransitTunnelsCount
+JNIEXPORT jint JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getTransitTunnelsCount
(JNIEnv *env, jclass clazz) {
return i2p::tunnel::tunnels.CountTransitTunnels();
}
@@ -133,3 +114,28 @@ JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_setLanguage
env->ReleaseStringUTFChars(jlanguage, language);
i2p::android::SetLanguage(language);
}
+
+JNIEXPORT jboolean JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getHTTPProxyState
+ (JNIEnv *, jclass) {
+ return i2p::client::context.GetHttpProxy () ? true : false;
+}
+
+JNIEXPORT jboolean JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getSOCKSProxyState
+ (JNIEnv *, jclass) {
+ return i2p::client::context.GetSocksProxy() ? true : false;
+}
+
+JNIEXPORT jboolean JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getBOBState
+ (JNIEnv *, jclass) {
+ return i2p::client::context.GetBOBCommandChannel() ? true : false;
+}
+
+JNIEXPORT jboolean JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getSAMState
+ (JNIEnv *, jclass) {
+ return i2p::client::context.GetSAMBridge() ? true : false;
+}
+
+JNIEXPORT jboolean JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getI2CPState
+ (JNIEnv *, jclass) {
+ return i2p::client::context.GetI2CPServer() ? true : false;
+}
diff --git a/app/jni/org_purplei2p_i2pd_I2PD_JNI.h b/app/jni/org_purplei2p_i2pd_I2PD_JNI.h
index 9d86e5b..4c37e3d 100644
--- a/app/jni/org_purplei2p_i2pd_I2PD_JNI.h
+++ b/app/jni/org_purplei2p_i2pd_I2PD_JNI.h
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2013-2020, The PurpleI2P Project
+* Copyright (c) 2013-2022, The PurpleI2P Project
*
* This file is part of Purple i2pd project and licensed under BSD3
*
@@ -15,46 +15,57 @@
#ifdef __cplusplus
extern "C" {
#endif
-/*
- * Class: org_purplei2p_i2pd_I2PD_JNI
- * Method: stringFromJNI
- * Signature: ()Ljava/lang/String;
- */
+
JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getABICompiledWith
(JNIEnv *, jclass);
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);
-JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopAcceptingTunnels
+JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startAcceptingTunnels
(JNIEnv *, jclass);
-JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startAcceptingTunnels
+JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopAcceptingTunnels
(JNIEnv *, jclass);
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_reloadTunnelsConfigs
(JNIEnv *, jclass);
-JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_onNetworkStateChanged
- (JNIEnv * env, jclass clazz, jboolean isConnected);
-
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_setDataDir
(JNIEnv *env, jclass clazz, jstring jdataDir);
-JNIEXPORT jint JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_GetTransitTunnelsCount
+JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_setLanguage
+ (JNIEnv *env, jclass clazz, jstring jlanguage);
+
+JNIEXPORT jint JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getTransitTunnelsCount
(JNIEnv *, jclass);
JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getWebConsAddr
(JNIEnv *, jclass);
-JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_setLanguage
- (JNIEnv *env, jclass clazz, jstring jlanguage);
+JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getDataDir
+ (JNIEnv *, jclass);
+
+JNIEXPORT jboolean JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getHTTPProxyState
+ (JNIEnv *, jclass);
+
+JNIEXPORT jboolean JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getSOCKSProxyState
+ (JNIEnv *, jclass);
+
+JNIEXPORT jboolean JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getBOBState
+ (JNIEnv *, jclass);
+
+JNIEXPORT jboolean JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getSAMState
+ (JNIEnv *, jclass) ;
+
+JNIEXPORT jboolean JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getI2CPState
+ (JNIEnv *, jclass);
+
+JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_onNetworkStateChanged
+ (JNIEnv * env, jclass clazz, jboolean isConnected);
#ifdef __cplusplus
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 35734ce..125404c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,13 +12,12 @@
-
+ android:name=".I2PDPermsAskerActivity">
@@ -56,8 +54,7 @@
+ android:name=".I2PDActivity" />
= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
@@ -299,7 +293,7 @@ public class I2PDActivity extends Activity {
return true;
case R.id.action_start_webview:
- if( daemon.getState() == startedOkay)
+ if(daemon.isStartedOkay())
startActivity(new Intent(getApplicationContext(), WebConsoleActivity.class));
else
Toast.makeText(this,"I2Pd not was started!", Toast.LENGTH_SHORT).show();
@@ -334,11 +328,12 @@ public class I2PDActivity extends Activity {
new Thread(() -> {
Log.d(TAG, "stopping");
try {
+ textView.setText(getText(R.string.stopping));
daemon.stopDaemon();
} catch (Throwable tr) {
Log.e(TAG, "", tr);
}
- quit(); //TODO make menu items for starting i2pd. On my Android, I need to reboot the OS to restart i2pd.
+ quit();
}, "stop").start();
}
diff --git a/app/src/main/java/org/purplei2p/i2pd/I2PD_JNI.java b/app/src/main/java/org/purplei2p/i2pd/I2PD_JNI.java
index eb390eb..c1f7d1c 100644
--- a/app/src/main/java/org/purplei2p/i2pd/I2PD_JNI.java
+++ b/app/src/main/java/org/purplei2p/i2pd/I2PD_JNI.java
@@ -3,35 +3,33 @@ package org.purplei2p.i2pd;
public class I2PD_JNI {
public static native String getABICompiledWith();
+ public static void loadLibraries() {
+ System.loadLibrary("i2pd");
+ }
+
/**
* returns error info if failed
* returns "ok" if daemon initialized and started okay
*/
public static native String startDaemon();
-
- //should only be called after startDaemon() success
public static native void stopDaemon();
- public static native void stopAcceptingTunnels();
-
public static native void startAcceptingTunnels();
-
+ public static native void stopAcceptingTunnels();
public static native void reloadTunnelsConfigs();
- public static native void onNetworkStateChanged(boolean isConnected);
-
public static native void setDataDir(String jdataDir);
+ public static native void setLanguage(String jlanguage);
- public static native int GetTransitTunnelsCount();
-
+ public static native int getTransitTunnelsCount();
public static native String getWebConsAddr();
+ public static native String getDataDir();
- public static native void setLanguage(String jlanguage);
-
- public static void loadLibraries() {
- //System.loadLibrary("c++_shared");
- System.loadLibrary("i2pd");
- }
+ public static native boolean getHTTPProxyState();
+ public static native boolean getSOCKSProxyState();
+ public static native boolean getBOBState();
+ public static native boolean getSAMState();
+ public static native boolean getI2CPState();
- public static native String getDataDir();
+ public static native void onNetworkStateChanged(boolean isConnected);
}
diff --git a/app/src/main/java/org/purplei2p/i2pd/SettingsActivity.java b/app/src/main/java/org/purplei2p/i2pd/SettingsActivity.java
index 6553458..c75520b 100644
--- a/app/src/main/java/org/purplei2p/i2pd/SettingsActivity.java
+++ b/app/src/main/java/org/purplei2p/i2pd/SettingsActivity.java
@@ -10,14 +10,16 @@ import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
-import android.view.View;
+import android.view.MenuItem;
import android.widget.CompoundButton;
import android.widget.Switch;
import java.io.File;
import java.util.List;
+import java.util.Objects;
import org.purplei2p.i2pd.iniedotr.IniEditor;
+
public class SettingsActivity extends Activity {
protected IniEditor iniedit = new IniEditor();
private String dataDir = DaemonWrapper.getDataDir();//for inieditor
@@ -62,6 +64,7 @@ public class SettingsActivity extends Activity {
}
}
+
//@Override
private void requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@@ -76,11 +79,15 @@ public class SettingsActivity extends Activity {
}
}
}
+
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
super.onCreate(savedInstanceState);
- cacheDir = getApplicationContext().getCacheDir();
setContentView(R.layout.activity_settings);
+
+ Objects.requireNonNull(getActionBar()).setDisplayHomeAsUpEnabled(true);
+
+ cacheDir = getApplicationContext().getCacheDir();
Switch autostart_switch = findViewById(R.id.autostart_enable);
File onBoot = new File(cacheDir.getAbsolutePath() + onBootFileName);
autostart_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@@ -107,4 +114,14 @@ public class SettingsActivity extends Activity {
if(onBoot.exists())
autostart_switch.setChecked(true);
}
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+
+ if (id == android.R.id.home) {
+ finish();
+ return true;
+ }
+ return false;
+ }
}
diff --git a/app/src/main/java/org/purplei2p/i2pd/WebConsoleActivity.java b/app/src/main/java/org/purplei2p/i2pd/WebConsoleActivity.java
index 1e24ebf..e96d068 100644
--- a/app/src/main/java/org/purplei2p/i2pd/WebConsoleActivity.java
+++ b/app/src/main/java/org/purplei2p/i2pd/WebConsoleActivity.java
@@ -8,7 +8,6 @@ import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-
import java.util.Objects;
public class WebConsoleActivity extends Activity {
@@ -22,7 +21,7 @@ public class WebConsoleActivity extends Activity {
Objects.requireNonNull(getActionBar()).setDisplayHomeAsUpEnabled(true);
- webView = (WebView) findViewById(R.id.webview1);
+ webView = (WebView) findViewById(R.id.webconsole);
webView.setWebViewClient(new WebViewClient());
final WebSettings webSettings = webView.getSettings();
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 8fc4ef4..64b44b1 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,5 +1,6 @@
+ android:contentDescription="@string/app_name"
+ android:src="@drawable/ic_logo"
+ tools:ignore="ImageContrastCheck" />
-
+
+
+
+
+ android:gravity="center_horizontal"
+ android:text="@string/services"
+ android:textAppearance="@android:style/TextAppearance.Material.Medium"
+ android:textColor="#DFDFDF" />
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="match_parent"
+ android:gravity="center_horizontal">
-
+
+
+
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index c1a6bc0..b9505f6 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -3,8 +3,9 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:padding="@dimen/margin_medium"
+ android:background="@android:color/widget_edittext_dark"
android:orientation="vertical"
+ android:padding="@dimen/margin_medium"
tools:context=".SettingsActivity">
+ android:textOn="@string/enabled" />
-