Browse Source

rework main ui, change theme, remove unused code

Signed-off-by: R4SAS <r4sas@i2pmail.org>
pull/44/head
R4SAS 2 years ago
parent
commit
75d444f374
Signed by: r4sas
GPG Key ID: 66F6C87B98EBCFE2
  1. 107
      app/jni/DaemonAndroid.cpp
  2. 52
      app/jni/DaemonAndroid.h
  3. 2
      app/jni/i2pd
  4. 46
      app/jni/i2pd_android.cpp
  5. 45
      app/jni/org_purplei2p_i2pd_I2PD_JNI.h
  6. 9
      app/src/main/AndroidManifest.xml
  7. 5
      app/src/main/java/org/purplei2p/i2pd/DaemonWrapper.java
  8. 59
      app/src/main/java/org/purplei2p/i2pd/I2PDActivity.java
  9. 30
      app/src/main/java/org/purplei2p/i2pd/I2PD_JNI.java
  10. 21
      app/src/main/java/org/purplei2p/i2pd/SettingsActivity.java
  11. 3
      app/src/main/java/org/purplei2p/i2pd/WebConsoleActivity.java
  12. 142
      app/src/main/res/layout/activity_main.xml
  13. 9
      app/src/main/res/layout/activity_settings.xml
  14. 2
      app/src/main/res/layout/activity_web_console.xml
  15. 1
      app/src/main/res/menu/options_main.xml
  16. 8
      app/src/main/res/values-ru/strings.xml
  17. 8
      app/src/main/res/values-tr/strings.xml
  18. 18
      app/src/main/res/values/strings.xml
  19. 2
      build.gradle
  20. 4
      gradle/wrapper/gradle-wrapper.properties

107
app/jni/DaemonAndroid.cpp

@ -1,5 +1,5 @@ @@ -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 @@ -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 @@ -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 @@ -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)
{

52
app/jni/DaemonAndroid.h

@ -1,5 +1,5 @@ @@ -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 @@ -22,8 +22,6 @@ namespace android
DaemonAndroidImpl ();
~DaemonAndroidImpl ();
//typedef void (*runningChangedCallback)();
/**
* @return success
*/
@ -31,14 +29,6 @@ namespace android @@ -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 @@ -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 @@ -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();
};
*/
}
}

2
app/jni/i2pd

@ -1 +1 @@ @@ -1 +1 @@
Subproject commit b7e20b9b86165a0eb2ba5bcf9a580f3824a38462
Subproject commit 064b8042a5bd37bf44b4e712d8af16bca6c2acf7

46
app/jni/i2pd_android.cpp

@ -90,31 +90,12 @@ JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_onNetworkStateChanged @@ -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 @@ -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;
}

45
app/jni/org_purplei2p_i2pd_I2PD_JNI.h

@ -1,5 +1,5 @@ @@ -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 @@ @@ -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
}

9
app/src/main/AndroidManifest.xml

@ -12,13 +12,12 @@ @@ -12,13 +12,12 @@
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:theme="@android:style/Theme.Holo.Light.DarkActionBar"
android:theme="@android:style/Theme.DeviceDefault"
android:usesCleartextTraffic="true">
<receiver
@ -47,8 +46,7 @@ @@ -47,8 +46,7 @@
</receiver>
<activity
android:name=".I2PDPermsAskerActivity"
android:label="@string/app_name">
android:name=".I2PDPermsAskerActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
@ -56,8 +54,7 @@ @@ -56,8 +54,7 @@
</activity>
<activity
android:name=".I2PDActivity"
android:label="@string/app_name" />
android:name=".I2PDActivity" />
<service
android:name=".ForegroundService"

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

@ -85,13 +85,12 @@ public class DaemonWrapper { @@ -85,13 +85,12 @@ public class DaemonWrapper {
}
public int getTransitTunnelsCount() {
return I2PD_JNI.GetTransitTunnelsCount();
return I2PD_JNI.getTransitTunnelsCount();
}
public enum State {
uninitialized(R.string.uninitialized),
starting(R.string.starting),
jniLibraryLoaded(R.string.jniLibraryLoaded),
startedOkay(R.string.startedOkay),
startFailed(R.string.startFailed),
gracefulShutdownInProgress(R.string.gracefulShutdownInProgress),
@ -168,7 +167,6 @@ public class DaemonWrapper { @@ -168,7 +167,6 @@ public class DaemonWrapper {
} catch (Throwable tr) {
Log.e(TAG, "", tr);
}
setState(State.stopped);
}
}
@ -178,7 +176,6 @@ public class DaemonWrapper { @@ -178,7 +176,6 @@ public class DaemonWrapper {
try {
processAssets();
I2PD_JNI.loadLibraries();
setState(State.jniLibraryLoaded);
//registerNetworkCallback();
} catch (Throwable tr) {
lastThrowable = tr;

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

@ -27,8 +27,7 @@ import android.provider.Settings; @@ -27,8 +27,7 @@ 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.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
@ -37,19 +36,20 @@ import androidx.core.app.ActivityCompat; @@ -37,19 +36,20 @@ 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;
private CheckBox HTTPProxyState;
private CheckBox SOCKSProxyState;
private CheckBox BOBState;
private CheckBox SAMState;
private CheckBox I2CPState;
private static volatile DaemonWrapper daemon;
@ -65,15 +65,23 @@ public class I2PDActivity extends Activity { @@ -65,15 +65,23 @@ public class I2PDActivity extends Activity {
try {
if (textView == null)
return;
Throwable tr = daemon.getLastThrowable();
if (tr != null) {
textView.setText(throwableToString(tr));
return;
}
DaemonWrapper.State state = daemon.getState();
if(state == startedOkay){
disableButton.setVisibility(View.VISIBLE);
if (daemon.isStartedOkay()) {
HTTPProxyState.setChecked(I2PD_JNI.getHTTPProxyState());
SOCKSProxyState.setChecked(I2PD_JNI.getSOCKSProxyState());
BOBState.setChecked(I2PD_JNI.getBOBState());
SAMState.setChecked(I2PD_JNI.getSAMState());
I2CPState.setChecked(I2PD_JNI.getI2CPState());
}
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));
@ -102,9 +110,14 @@ public class I2PDActivity extends Activity { @@ -102,9 +110,14 @@ 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.appStatusText);
HTTPProxyState = (CheckBox) findViewById(R.id.service_httpproxy_box);
SOCKSProxyState = (CheckBox) findViewById(R.id.service_socksproxy_box);
BOBState = (CheckBox) findViewById(R.id.service_bob_box);
SAMState = (CheckBox) findViewById(R.id.service_sam_box);
I2CPState = (CheckBox) findViewById(R.id.service_i2cp_box);
if (daemon == null) {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
daemon = new DaemonWrapper(getAssets(), connectivityManager);
@ -113,25 +126,6 @@ public class I2PDActivity extends Activity { @@ -113,25 +126,6 @@ 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) {
@ -299,7 +293,7 @@ public class I2PDActivity extends Activity { @@ -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 { @@ -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();
}

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

@ -3,35 +3,33 @@ package org.purplei2p.i2pd; @@ -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);
}

21
app/src/main/java/org/purplei2p/i2pd/SettingsActivity.java

@ -10,14 +10,16 @@ import android.os.Build; @@ -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 { @@ -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 { @@ -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 { @@ -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;
}
}

3
app/src/main/java/org/purplei2p/i2pd/WebConsoleActivity.java

@ -8,7 +8,6 @@ import android.webkit.WebSettings; @@ -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 { @@ -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();

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

@ -1,5 +1,6 @@ @@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
@ -10,14 +11,17 @@ @@ -10,14 +11,17 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
android:id="@+id/mainLogo"
android:layout_width="match_parent"
android:layout_height="140dp"
android:src="@drawable/ic_logo" />
android:contentDescription="@string/app_name"
android:src="@drawable/ic_logo"
tools:ignore="ImageContrastCheck" />
<TextView
style="@android:style/Widget.Holo.Light.TextView.SpinnerItem"
@ -43,50 +47,108 @@ @@ -43,50 +47,108 @@
android:layout_width="match_parent"
android:layout_height="@dimen/margin_medium" />
<LinearLayout
<TextView
android:id="@+id/appStatusText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textAppearance="@android:style/TextAppearance.Material.Large"
android:textColor="#DFDFDF" />
<Space
android:layout_width="match_parent"
android:layout_height="@dimen/margin_medium" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:gravity="center_horizontal"
android:text="@string/services"
android:textAppearance="@android:style/TextAppearance.Material.Medium"
android:textColor="#DFDFDF" />
<RelativeLayout
android:layout_height="wrap_content"
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<TableRow
android:layout_width="match_parent"
android:layout_gravity="center">
<Button
android:id="@+id/enableButton"
style="@android:style/Widget.Button.Inset"
android:layout_width="@dimen/margin_huge"
android:layout_height="@dimen/margin_huge"
android:layout_centerInParent="true"
android:background="@android:drawable/presence_offline"
android:longClickable="true" />
<Button
android:id="@+id/disableButton"
style="@android:style/Widget.Button.Inset"
android:layout_width="@dimen/margin_huge"
android:layout_height="@dimen/margin_huge"
android:layout_centerInParent="true"
android:background="@android:drawable/presence_online"
android:longClickable="true"
android:visibility="invisible" />
</RelativeLayout>
<Space
android:layout_width="wrap_content"
android:layout_height="@dimen/margin_medium" />
<TextView
android:id="@+id/appStatusText"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<CheckBox
android:id="@+id/service_httpproxy_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:text="@string/services_http_proxy"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textColor="#DFDFDF" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<CheckBox
android:id="@+id/service_socksproxy_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:text="@string/services_socks_proxy"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textColor="#DFDFDF" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<CheckBox
android:id="@+id/service_bob_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:text="@string/services_bob"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textColor="#DFDFDF" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<CheckBox
android:id="@+id/service_sam_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:text="@string/services_sam"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textColor="#DFDFDF" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textColor="#DFDFDF"
android:textSize="18sp" />
android:layout_height="match_parent"
android:gravity="center_horizontal">
</LinearLayout>
<CheckBox
android:id="@+id/service_i2cp_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:text="@string/services_i2cp"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textColor="#DFDFDF" />
</TableRow>
</TableLayout>
</LinearLayout>

9
app/src/main/res/layout/activity_settings.xml

@ -3,8 +3,9 @@ @@ -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">
<TextView
@ -21,15 +22,15 @@ @@ -21,15 +22,15 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:text="@string/autostart_enabled"
android:textOff="@string/disabled"
android:textOn="@string/enabled"
android:text="@string/autostart_enabled" />
android:textOn="@string/enabled" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider" />
<!--
<!--
<TextView
android:id="@+id/settings_section2"
android:layout_width="match_parent"

2
app/src/main/res/layout/activity_web_console.xml

@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
android:id="@+id/swipe">
<WebView
android:id="@+id/webview1"
android:id="@+id/webconsole"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

1
app/src/main/res/menu/options_main.xml

@ -25,6 +25,7 @@ @@ -25,6 +25,7 @@
android:title="@string/action_graceful_stop" />
<item
android:id="@+id/action_settings"
android:orderInCategory="95"
android:title="@string/action_settings" />
<item
android:id="@+id/action_stop"

8
app/src/main/res/values-ru/strings.xml

@ -17,8 +17,8 @@ @@ -17,8 +17,8 @@
<string name="gracefulShutdownInProgress">Корректная остановка запущена</string>
<string name="already_stopped">Уже остановлено</string>
<string name="uninitialized">Приложение инициализируется</string>
<string name="starting">Приложение запускается</string>
<string name="uninitialized">Приложение инициализируется...</string>
<string name="starting">Приложение запускается...</string>
<string name="jniLibraryLoaded">Загружены JNI библиотеки</string>
<string name="startedOkay">Приложение запущено</string>
<string name="startFailed">Запуск не удался</string>
@ -53,4 +53,8 @@ @@ -53,4 +53,8 @@
<string name="del_tunnel_button">Удалить</string>
<string name="enabled">Вкл</string>
<string name="disabled">Выкл</string>
<string name="services">Внутренние сервисы</string>
<string name="services_http_proxy">HTTP Прокси</string>
<string name="services_socks_proxy">SOCKS5 Прокси</string>
<string name="stopping">Остановка приложения</string>
</resources>

8
app/src/main/res/values-tr/strings.xml

@ -6,8 +6,8 @@ @@ -6,8 +6,8 @@
<string name="action_start">Başlat</string>
<string name="action_stop">Durdur</string>
<string name="action_exit">Çık</string>
<string name="action_graceful_stop">Düzgün Durdur</string>
<string name="action_cancel_graceful_stop">Düzgün Durdurmayı İptal Et</string>
<string name="action_graceful_stop">Düzgün durdur</string>
<string name="action_cancel_graceful_stop">Düzgün durdurmayı İptal Et</string>
<string name="action_reload_tunnels_config">Tünelleri yeniden yükle</string>
<string name="action_start_webview">Web Konsolunu Aç</string>
<string name="action_settings">Ayarlar</string>
@ -17,8 +17,8 @@ @@ -17,8 +17,8 @@
<string name="gracefulShutdownInProgress">Düzgün kapatma devam ediyor</string>
<string name="already_stopped">Zaten durduruldu</string>
<string name="uninitialized">Uygulama ilk ayarları yapılıyor</string>
<string name="starting">Uygulama başlatılıyor</string>
<string name="uninitialized">Uygulama ilk ayarları yapılıyor...</string>
<string name="starting">Uygulama başlatılıyor...</string>
<string name="jniLibraryLoaded">JNI kütüphaneleri yüklendi</string>
<string name="startedOkay">Uygulama başlatıldı</string>
<string name="startFailed">Başlatılamadı</string>

18
app/src/main/res/values/strings.xml

@ -7,8 +7,8 @@ @@ -7,8 +7,8 @@
<string name="action_start">Start</string>
<string name="action_stop">Stop</string>
<string name="action_exit">Exit</string>
<string name="action_graceful_stop">Graceful Stop</string>
<string name="action_cancel_graceful_stop">Cancel Graceful Stop</string>
<string name="action_graceful_stop">Graceful stop</string>
<string name="action_cancel_graceful_stop">Cancel Graceful stop</string>
<string name="action_reload_tunnels_config">Reload tunnels</string>
<string name="action_start_webview">Open Web Console</string>
<string name="action_settings">Settings</string>
@ -18,15 +18,23 @@ @@ -18,15 +18,23 @@
<string name="gracefulShutdownInProgress">Graceful shutdown in progress</string>
<string name="already_stopped">Already stopped</string>
<string name="uninitialized">Application initializing</string>
<string name="starting">Application starting</string>
<string name="uninitialized">Application initializing...</string>
<string name="starting">Application starting...</string>
<string name="jniLibraryLoaded">Loaded JNI libraries</string>
<string name="startedOkay">Application Started</string>
<string name="startedOkay">Application started</string>
<string name="startFailed">Start failed</string>
<string name="stopped">Application stopped</string>
<string name="stopping">Application stopping</string>
<string name="remaining">remaining</string>
<string name="ok" translatable="false">OK</string>
<string name="services">Internal services</string>
<string name="services_http_proxy">HTTP Proxy</string>
<string name="services_socks_proxy">SOCKS5 Proxy</string>
<string name="services_bob" translatable="false">BOB</string>
<string name="services_sam" translatable="false">SAM</string>
<string name="services_i2cp" translatable="false">I2CP</string>
<string name="title_activity_i2_pdperms_asker_prompt">Prompt</string>
<string name="permDenied">SD card write permission denied, you need to allow this to continue</string>
<string name="permRequired">SD card write access is required to write the keys and other files to the I2PD folder on SD card.</string>

2
build.gradle

@ -4,7 +4,7 @@ buildscript { @@ -4,7 +4,7 @@ buildscript {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.0'
classpath 'com.android.tools.build:gradle:7.1.2'
}
}

4
gradle/wrapper/gradle-wrapper.properties vendored

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=8b356fd8702d5ffa2e066ed0be45a023a779bba4dd1a68fd11bc2a6bdc981e8f
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
distributionSha256Sum=f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

Loading…
Cancel
Save