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" /> - + + - -