diff --git a/android/.gitignore b/android/.gitignore index 7e166aa6..d9fa5a57 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -5,8 +5,4 @@ ant.properties local.properties build.sh bin -log* -.gradle* -build -assets -gradle-app.setting +log* \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 46d0d057..a88403fd 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -11,24 +11,23 @@ buildscript { apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion "25.0.0" - defaultConfig { - applicationId "org.purplei2p.i2pd" - targetSdkVersion 25 - minSdkVersion 14 - versionCode 1 - versionName "2.17.2e" - } + compileSdkVersion 25 + buildToolsVersion "25.0.2" + defaultConfig { + applicationId "org.purplei2p.i2pd" + targetSdkVersion 25 + minSdkVersion 14 + versionCode 1 + versionName "2.17.1" + } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] - res.srcDirs = ['res'] - jniLibs.srcDirs = ['libs'] - assets.srcDirs = ['assets'] + res.srcDirs = ['res'] + jniLibs.srcDirs = ['libs'] + } } - } signingConfigs { orignal { storeFile file("i2pdapk.jks") @@ -38,30 +37,11 @@ android { } } buildTypes { - release { - minifyEnabled false - signingConfig signingConfigs.orignal - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' - } + release { + minifyEnabled false + signingConfig signingConfigs.orignal + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' + } } } -tasks.withType(JavaCompile) { - options.compilerArgs << '-Xlint:unchecked' << '-Xlint:deprecation' - options.deprecation = true -} - -task zipCerts(type:Zip) { - from (files('../contrib/')) - include 'certificates/**/*.crt' - destinationDir file('assets') - archiveName 'certificates.zip' - entryCompression ZipEntryCompression.STORED -} -preBuild.dependsOn zipCerts - -task clean(type: Delete,overwrite: true) { - delete 'build' - delete 'assets' -} - diff --git a/android/gradle.properties b/android/gradle.properties deleted file mode 100644 index d8894a70..00000000 --- a/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx2048M -XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 diff --git a/android/jni/DaemonAndroid.cpp b/android/jni/DaemonAndroid.cpp index 9865ac79..75584740 100644 --- a/android/jni/DaemonAndroid.cpp +++ b/android/jni/DaemonAndroid.cpp @@ -126,11 +126,12 @@ namespace android } */ static DaemonAndroidImpl daemon; + static char* argv[1]={strdup("tmp")}; /** * returns error details if failed * returns "ok" if daemon initialized and started okay */ - std::string start(int argc, char* argv[]) + std::string start(/*int argc, char* argv[]*/) { try { @@ -138,7 +139,7 @@ namespace android { //Log.d(TAG"Initialising the daemon..."); - bool daemonInitSuccess = daemon.init(argc,argv); + bool daemonInitSuccess = daemon.init(1,argv); if(!daemonInitSuccess) { //QMessageBox::critical(0, "Error", "Daemon init failed"); diff --git a/android/jni/DaemonAndroid.h b/android/jni/DaemonAndroid.h index 81031936..9cc8219b 100644 --- a/android/jni/DaemonAndroid.h +++ b/android/jni/DaemonAndroid.h @@ -37,7 +37,7 @@ namespace android * returns "ok" if daemon init failed * returns errinfo if daemon initialized and started okay */ - std::string start(int argc, char* argv[]); + std::string start(); // stops the daemon void stop(); diff --git a/android/jni/i2pd_android.cpp b/android/jni/i2pd_android.cpp index 1079a252..8791c90b 100755 --- a/android/jni/i2pd_android.cpp +++ b/android/jni/i2pd_android.cpp @@ -44,24 +44,8 @@ JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getABICompiledWith } JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startDaemon - (JNIEnv * env, jclass clazz, jobjectArray args) { - int argc = env->GetArrayLength(args); - typedef char *pchar; - pchar* argv = new pchar[argc]; - for (int i = 0; i < argc; i++) { - jstring arg = (jstring) env->GetObjectArrayElement(args, i); - const char *argStr = env->GetStringUTFChars(arg, 0); - size_t len = strlen(argStr); - argv[i] = new char[len + 1]; - strcpy(argv[i], argStr); - env->ReleaseStringUTFChars(arg, argStr); - } - const char* result = i2p::android::start(argc,argv).c_str(); - for (int i = 0; i < argc; i++) { - delete [] argv[i]; - } - delete [] argv; - return env->NewStringUTF(result); + (JNIEnv * env, jclass clazz) { + return env->NewStringUTF(i2p::android::start().c_str()); } JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopDaemon diff --git a/android/jni/org_purplei2p_i2pd_I2PD_JNI.h b/android/jni/org_purplei2p_i2pd_I2PD_JNI.h index 484b3230..04923d22 100644 --- a/android/jni/org_purplei2p_i2pd_I2PD_JNI.h +++ b/android/jni/org_purplei2p_i2pd_I2PD_JNI.h @@ -16,7 +16,7 @@ JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getABICompiledWith (JNIEnv *, jclass); JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startDaemon - (JNIEnv *, jclass, jobjectArray args); + (JNIEnv *, jclass); JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopDaemon (JNIEnv *, jclass); diff --git a/android/src/org/purplei2p/i2pd/DaemonSingleton.java b/android/src/org/purplei2p/i2pd/DaemonSingleton.java index beff0c39..65afd0f5 100644 --- a/android/src/org/purplei2p/i2pd/DaemonSingleton.java +++ b/android/src/org/purplei2p/i2pd/DaemonSingleton.java @@ -14,10 +14,10 @@ public class DaemonSingleton { public static DaemonSingleton getInstance() { return instance; } - + public synchronized void addStateChangeListener(StateUpdateListener listener) { stateUpdateListeners.add(listener); } public synchronized void removeStateChangeListener(StateUpdateListener listener) { stateUpdateListeners.remove(listener); } - + public synchronized void stopAcceptingTunnels() { if(isStartedOkay()){ state=State.gracefulShutdownInProgress; @@ -25,21 +25,20 @@ public class DaemonSingleton { I2PD_JNI.stopAcceptingTunnels(); } } - + public void onNetworkStateChange(boolean isConnected) { I2PD_JNI.onNetworkStateChanged(isConnected); } - + private boolean startedOkay; public static enum State {uninitialized,starting,jniLibraryLoaded,startedOkay,startFailed,gracefulShutdownInProgress}; - + private State state = State.uninitialized; - + public State getState() { return state; } - - public synchronized void start(final String confDir, final String dataDir) { + public synchronized void start() { if(state != State.uninitialized)return; state = State.starting; fireStateUpdate(); @@ -63,15 +62,7 @@ public class DaemonSingleton { } try { synchronized (DaemonSingleton.this) { - - String args[] = new String[] { - "i2pd", "--service", "--daemon", - "--datadir=" + dataDir, - "--conf=" + confDir + "/i2pd.conf", - "--tunconf=" + confDir + "/tunnels.conf" - }; - - daemonStartResult = I2PD_JNI.startDaemon(args); + daemonStartResult = I2PD_JNI.startDaemon(); if("ok".equals(daemonStartResult)){ state=State.startedOkay; setStartedOkay(true); @@ -85,9 +76,9 @@ public class DaemonSingleton { fireStateUpdate(); } return; - } + } } - + }, "i2pdDaemonStart").start(); } private Throwable lastThrowable; @@ -96,10 +87,10 @@ public class DaemonSingleton { private synchronized void fireStateUpdate() { Log.i(TAG, "daemon state change: "+state); for(StateUpdateListener listener : stateUpdateListeners) { - try { - listener.daemonStateUpdate(); - } catch (Throwable tr) { - Log.e(TAG, "exception in listener ignored", tr); + try { + listener.daemonStateUpdate(); + } catch (Throwable tr) { + Log.e(TAG, "exception in listener ignored", tr); } } } @@ -111,7 +102,7 @@ public class DaemonSingleton { public String getDaemonStartResult() { return daemonStartResult; } - + private final Object startedOkayLock = new Object(); public boolean isStartedOkay() { diff --git a/android/src/org/purplei2p/i2pd/Decompress.java b/android/src/org/purplei2p/i2pd/Decompress.java deleted file mode 100644 index 917abc7c..00000000 --- a/android/src/org/purplei2p/i2pd/Decompress.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.purplei2p.i2pd; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import android.content.Context; -import android.util.Log; - -public class Decompress { - private static final int BUFFER_SIZE = 1024 * 10; - private static final String TAG = "Decompress"; - - public static void unzipFromAssets(Context context, String zipFile, String destination) { - try { - if (destination == null || destination.length() == 0) - destination = context.getFilesDir().getAbsolutePath(); - InputStream stream = context.getAssets().open(zipFile); - unzip(stream, destination); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static void unzip(String zipFile, String location) { - try { - FileInputStream fin = new FileInputStream(zipFile); - unzip(fin, location); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - - } - - public static void unzip(InputStream stream, String destination) { - dirChecker(destination, ""); - byte[] buffer = new byte[BUFFER_SIZE]; - try { - ZipInputStream zin = new ZipInputStream(stream); - ZipEntry ze = null; - - while ((ze = zin.getNextEntry()) != null) { - Log.v(TAG, "Unzipping " + ze.getName()); - - if (ze.isDirectory()) { - dirChecker(destination, ze.getName()); - } else { - File f = new File(destination + ze.getName()); - if (!f.exists()) { - FileOutputStream fout = new FileOutputStream(destination + ze.getName()); - int count; - while ((count = zin.read(buffer)) != -1) { - fout.write(buffer, 0, count); - } - zin.closeEntry(); - fout.close(); - } - } - - } - zin.close(); - } catch (Exception e) { - Log.e(TAG, "unzip", e); - } - - } - - private static void dirChecker(String destination, String dir) { - File f = new File(destination + dir); - - if (!f.isDirectory()) { - boolean success = f.mkdirs(); - if (!success) { - Log.w(TAG, "Failed to create folder " + f.getName()); - } - } - } -} diff --git a/android/src/org/purplei2p/i2pd/ForegroundService.java b/android/src/org/purplei2p/i2pd/ForegroundService.java index 645d0dca..bfd650c8 100644 --- a/android/src/org/purplei2p/i2pd/ForegroundService.java +++ b/android/src/org/purplei2p/i2pd/ForegroundService.java @@ -5,8 +5,6 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; -import android.content.Context; -import android.os.Environment; import android.os.Binder; import android.os.IBinder; import android.util.Log; @@ -30,20 +28,13 @@ public class ForegroundService extends Service { } } - private String dataDir; - private String confDir; - @Override public void onCreate() { notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); - dataDir = this.getDir("data", Context.MODE_PRIVATE).toString(); - confDir = Environment.getExternalStoragePublicDirectory("i2pd").toString(); // Display a notification about us starting. We put an icon in the status bar. showNotification(); - - Log.i("ForegroundService", "About to start daemon with dataDir: " + dataDir + ", confDir: " + confDir); - daemon.start(confDir, dataDir); + daemon.start(); // Tell the user we started. Toast.makeText(this, R.string.i2pd_service_started, Toast.LENGTH_SHORT).show(); } @@ -51,7 +42,7 @@ public class ForegroundService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("ForegroundService", "Received start id " + startId + ": " + intent); - daemon.start(confDir, dataDir); + daemon.start(); return START_STICKY; } @@ -59,7 +50,7 @@ public class ForegroundService extends Service { public void onDestroy() { // Cancel the persistent notification. notificationManager.cancel(NOTIFICATION); - + stopForeground(true); // Tell the user we stopped. @@ -100,7 +91,7 @@ public class ForegroundService extends Service { //mNM.notify(NOTIFICATION, notification); startForeground(NOTIFICATION, notification); } - + private final DaemonSingleton daemon = DaemonSingleton.getInstance(); } diff --git a/android/src/org/purplei2p/i2pd/I2PD.java b/android/src/org/purplei2p/i2pd/I2PD.java index d66a0174..a2494b2b 100755 --- a/android/src/org/purplei2p/i2pd/I2PD.java +++ b/android/src/org/purplei2p/i2pd/I2PD.java @@ -2,13 +2,6 @@ package org.purplei2p.i2pd; import java.io.PrintWriter; import java.io.StringWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; - import java.util.Timer; import java.util.TimerTask; @@ -31,12 +24,12 @@ public class I2PD extends Activity { private static final String TAG = "i2pd"; private TextView textView; - + private final DaemonSingleton daemon = DaemonSingleton.getInstance(); private DaemonSingleton.StateUpdateListener daemonStateUpdatedListener = new DaemonSingleton.StateUpdateListener() { - + @Override public void daemonStateUpdate() { runOnUiThread(new Runnable(){ @@ -60,14 +53,11 @@ public class I2PD extends Activity { }); } }; - + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - //install certs every time - Decompress.unzipFromAssets(this, "certificates.zip", this.getDir("data", Context.MODE_PRIVATE).toString() + "/" ); - textView = new TextView(this); setContentView(textView); DaemonSingleton.getInstance().addStateChangeListener(daemonStateUpdatedListener); @@ -133,7 +123,7 @@ public class I2PD extends Activity { } }; - + private boolean mIsBound; private void doBindService() { @@ -157,7 +147,7 @@ public class I2PD extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.options_main, menu); + getMenuInflater().inflate(R.menu.options_main, menu); return true; } @@ -226,9 +216,9 @@ public class I2PD extends Activity { @Override public void run() { - quit(); + quit(); } - + }, 10*60*1000/*milliseconds*/); }else{ quit(); @@ -237,7 +227,7 @@ public class I2PD extends Activity { Log.e(TAG,"",tr); } } - + },"gracQuitInit").start(); } diff --git a/android/src/org/purplei2p/i2pd/I2PD_JNI.java b/android/src/org/purplei2p/i2pd/I2PD_JNI.java index bfdf8967..f965d471 100644 --- a/android/src/org/purplei2p/i2pd/I2PD_JNI.java +++ b/android/src/org/purplei2p/i2pd/I2PD_JNI.java @@ -6,12 +6,12 @@ public class I2PD_JNI { * returns error info if failed * returns "ok" if daemon initialized and started okay */ - public static native String startDaemon(String args[]); + 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 onNetworkStateChanged(boolean isConnected); public static void loadLibraries() {