diff --git a/.gitignore b/.gitignore index 532b316f..661833e5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ *.iml /.idea/libraries /.idea/workspace.xml +/.idea/caches +/.idea/codeStyles /local.properties /captures .externalNativeBuild diff --git a/app/build.gradle b/app/build.gradle index aaa6b036..61a6797b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,14 @@ apply plugin: 'com.android.application' -apply plugin: 'witness' android { compileSdkVersion 25 - buildToolsVersion '26.0.2' + buildToolsVersion '27.0.3' defaultConfig { applicationId "com.m2049r.xmrwallet" minSdkVersion 21 targetSdkVersion 25 - versionCode 86 - versionName "1.4.6 'Monero Spedner'" + versionCode 87 + versionName "1.4.7 'Monero Spedner'" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { @@ -17,9 +16,6 @@ android { arguments '-DANDROID_STL=c++_shared' } } - ndk { - abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' - } } buildTypes { @@ -52,59 +48,35 @@ android { // APKs for the same app that all have the same version information. android.applicationVariants.all { variant -> // Assigns a different version code for each output APK. - variant.outputs.each { + variant.outputs.all { output -> def abiName = output.getFilter(com.android.build.OutputFile.ABI) output.versionCodeOverride = abiCodes.get(abiName, 0) + 10 * variant.versionCode + + if (abiName == null) abiName = "universal" + def v = "${variant.versionName}".replaceFirst(" .*\$", "").replace(".", "x") + outputFileName = "$rootProject.ext.apkName-" + v + "_" + abiName + ".apk" } } } dependencies { - compile 'com.android.support:appcompat-v7:25.4.0' - compile 'com.android.support:design:25.4.0' - compile 'com.android.support:support-v4:25.4.0' - compile 'com.android.support:recyclerview-v7:25.4.0' - compile 'com.android.support:cardview-v7:25.4.0' - compile 'com.android.support.constraint:constraint-layout:1.0.2' - compile 'me.dm7.barcodescanner:zxing:1.9.8' + implementation 'com.android.support:appcompat-v7:25.4.0' + implementation 'com.android.support:design:25.4.0' + implementation 'com.android.support:support-v4:25.4.0' + implementation 'com.android.support:recyclerview-v7:25.4.0' + implementation 'com.android.support:cardview-v7:25.4.0' + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + implementation 'me.dm7.barcodescanner:zxing:1.9.8' - compile "com.squareup.okhttp3:okhttp:$rootProject.ext.okHttpVersion" - compile "com.jakewharton.timber:timber:$rootProject.ext.timberVersion" + implementation "com.squareup.okhttp3:okhttp:$rootProject.ext.okHttpVersion" + implementation "com.jakewharton.timber:timber:$rootProject.ext.timberVersion" - compile 'com.nulab-inc:zxcvbn:1.2.3' + implementation 'com.nulab-inc:zxcvbn:1.2.3' - testCompile "junit:junit:$rootProject.ext.junitVersion" - testCompile "org.mockito:mockito-all:$rootProject.ext.mockitoVersion" - testCompile "com.squareup.okhttp3:mockwebserver:$rootProject.ext.okHttpVersion" - testCompile 'org.json:json:20140107' - testCompile 'net.jodah:concurrentunit:0.4.2' -} - -dependencyVerification { - verify = [ - 'com.android.support:design:3f409bf2019967ffc344cfaf11e52131fac982468a1707aaeb25bf3c52838966', - 'com.android.support:appcompat-v7:70551e62660db15b790c5275f56b9de4dd9407d1494d07c8f3dd5698f3638677', - 'com.android.support:transition:848270144fb180efd2bf928a00ed176dbbc5290badfd638390ffba90088df8b3', - 'me.dm7.barcodescanner:zxing:d43973c9527c23fa8e6d338c6a2c458e373ce1ac6bcaa3bc41d11ae49116000d', - 'me.dm7.barcodescanner:core:a5c8a704089b58029db166172ed8e55d756877d010a85a0b1c94fdc96ffb8f9a', - 'com.android.support:support-v4:ee44c481a1f4d6978568e223e8125379b52b2ececdd53450e09ebae144bd377d', - 'com.android.support:recyclerview-v7:a2fe121f9d01ed8980e97095b4a3fe9700a0aa0a7d4b0f8c594f765ad8455a0d', - 'com.android.support:cardview-v7:f3fbbe1fcfdbec7333c6a2c516c5fd511a909d1975271818e268d6fe297d8c70', - 'com.android.support.constraint:constraint-layout:b0c688cc2b7172608f8153a689d746da40f71e52d7e2fe2bfd9df2f92db77085', - 'com.android.support:animated-vector-drawable:628ab1d56a6ee4cbedf32617af8b2a1fe02964ed0628e8f898cc09ddba6e1835', - 'com.android.support:support-vector-drawable:077009d13882ee96f061e4bc2dbe7cce7ae1762d8297592a787ff741afbfb1f2', - 'com.android.support:support-fragment:316d35d4d2d2902057efad104a73e4bdb50bee260a7075678185b8cd71170945', - 'com.android.support:support-core-ui:e72ae29b823889686cff6fcb948d6745c2baf6d4c2af4fdffa1ec1e42e3833a3', - 'com.android.support:support-media-compat:566a161d9cb0083ef62a53e46b71ce5b3d455b8635b1a0a4ae28d96d4b583de8', - 'com.android.support:support-core-utils:34b8437dfa95ff28d29cf57ffa3b1354a9fa9bfe4059f0fd5ce2f5e4326a1748', - 'com.android.support:support-compat:54019c63614ce08b02d7b9605490cd2b29ba5b2505f394a9517450b5f72b30ca', - 'com.android.support:support-annotations:a774272036941b4e912eb426d70c848bde7f06a3bf5fb491f75a427dc6595270', - 'com.android.support.constraint:constraint-layout-solver:8c62525a9bc5cff5633a96cb9b32fffeccaf41b8841aa87fc22607070dea9b8d', - 'com.google.zxing:core:bba7724e02a997cec38213af77133ee8e24b0d5cf5fa7ecbc16a4fa93f11ee0d', - 'com.squareup.okio:okio:734269c3ebc5090e3b23566db558f421f0b4027277c79ad5d176b8ec168bb850', - 'com.squareup.okhttp3:okhttp:7265adbd6f028aade307f58569d814835cd02bc9beffb70c25f72c9de50d61c4', - 'com.jakewharton.timber:timber:35c22867f2673132e97e17857d36bb2fc25f5790f0425406833ed0254d62fc66', - 'com.nulab-inc:zxcvbn:18d7862a6abd2705defec478d77dedadf8f3bb7cf811df22995494f05485785f', - ] + testImplementation "junit:junit:$rootProject.ext.junitVersion" + testImplementation "org.mockito:mockito-all:$rootProject.ext.mockitoVersion" + testImplementation "com.squareup.okhttp3:mockwebserver:$rootProject.ext.okHttpVersion" + testImplementation 'org.json:json:20140107' + testImplementation 'net.jodah:concurrentunit:0.4.2' } diff --git a/app/src/main/cpp/monerujo.cpp b/app/src/main/cpp/monerujo.cpp index 626f7138..01f23425 100644 --- a/app/src/main/cpp/monerujo.cpp +++ b/app/src/main/cpp/monerujo.cpp @@ -1075,6 +1075,85 @@ Java_com_m2049r_xmrwallet_model_PendingTransaction_getTxCount(JNIEnv *env, jobje } +// these are all in Bitmonero::Wallet - which I find wrong, so they are here! +//static void init(const char *argv0, const char *default_log_base_name); +//static void debug(const std::string &category, const std::string &str); +//static void info(const std::string &category, const std::string &str); +//static void warning(const std::string &category, const std::string &str); +//static void error(const std::string &category, const std::string &str); +JNIEXPORT void JNICALL +Java_com_m2049r_xmrwallet_model_WalletManager_initLogger(JNIEnv *env, jobject instance, + jstring argv0, jstring default_log_base_name) { + + const char *_argv0 = env->GetStringUTFChars(argv0, NULL); + const char *_default_log_base_name = env->GetStringUTFChars(default_log_base_name, NULL); + + Bitmonero::Wallet::init(_argv0, _default_log_base_name); + + env->ReleaseStringUTFChars(argv0, _argv0); + env->ReleaseStringUTFChars(default_log_base_name, _default_log_base_name); +} + +JNIEXPORT void JNICALL +Java_com_m2049r_xmrwallet_model_WalletManager_logDebug(JNIEnv *env, jobject instance, + jstring category, jstring message) { + + const char *_category = env->GetStringUTFChars(category, NULL); + const char *_message = env->GetStringUTFChars(message, NULL); + + Bitmonero::Wallet::debug(_category, _message); + + env->ReleaseStringUTFChars(category, _category); + env->ReleaseStringUTFChars(message, _message); +} + +JNIEXPORT void JNICALL +Java_com_m2049r_xmrwallet_model_WalletManager_logInfo(JNIEnv *env, jobject instance, + jstring category, jstring message) { + + const char *_category = env->GetStringUTFChars(category, NULL); + const char *_message = env->GetStringUTFChars(message, NULL); + + Bitmonero::Wallet::info(_category, _message); + + env->ReleaseStringUTFChars(category, _category); + env->ReleaseStringUTFChars(message, _message); +} + +JNIEXPORT void JNICALL +Java_com_m2049r_xmrwallet_model_WalletManager_logWarning(JNIEnv *env, jobject instance, + jstring category, jstring message) { + + const char *_category = env->GetStringUTFChars(category, NULL); + const char *_message = env->GetStringUTFChars(message, NULL); + + Bitmonero::Wallet::warning(_category, _message); + + env->ReleaseStringUTFChars(category, _category); + env->ReleaseStringUTFChars(message, _message); +} + +JNIEXPORT void JNICALL +Java_com_m2049r_xmrwallet_model_WalletManager_logError(JNIEnv *env, jobject instance, + jstring category, jstring message) { + + const char *_category = env->GetStringUTFChars(category, NULL); + const char *_message = env->GetStringUTFChars(message, NULL); + + Bitmonero::Wallet::error(_category, _message); + + env->ReleaseStringUTFChars(category, _category); + env->ReleaseStringUTFChars(message, _message); +} + +JNIEXPORT void JNICALL +Java_com_m2049r_xmrwallet_model_WalletManager_setLogLevel(JNIEnv *env, jobject instance, + jint level) { + Bitmonero::WalletManagerFactory::setLogLevel(level); +} + + + #ifdef __cplusplus } #endif diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java index 48deca44..271d084f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java @@ -743,7 +743,9 @@ public class LoginActivity extends SecureActivity } void startLoginFragment() { + // we set these here because we cannot be ceratin we have permissions for storage before Helper.setMoneroHome(this); + Helper.initLogger(this); Fragment fragment = new LoginFragment(); getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, fragment).commit(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/WalletNode.java b/app/src/main/java/com/m2049r/xmrwallet/data/WalletNode.java index 378b5c4f..42705ab1 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/WalletNode.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/WalletNode.java @@ -86,6 +86,10 @@ public class WalletNode { return name; } + public NetworkType getNetworkType() { + return networkType; + } + public String getAddress() { return host + ":" + port; } diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java index 911e9e10..47b2ed18 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java +++ b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java @@ -41,6 +41,7 @@ public class WalletManager { if (WalletManager.Instance == null) { WalletManager.Instance = new WalletManager(); } + return WalletManager.Instance; } @@ -215,7 +216,7 @@ public class WalletManager { //public void setDaemon(String address, NetworkType networkType, String username, String password) { public void setDaemon(WalletNode walletNode) { this.daemonAddress = walletNode.getAddress(); - this.networkType = networkType; + this.networkType = walletNode.getNetworkType(); this.daemonUsername = walletNode.getUsername(); this.daemonPassword = walletNode.getPassword(); setDaemonAddressJ(daemonAddress); @@ -269,5 +270,17 @@ public class WalletManager { //TODO static std::tuple checkUpdates(const std::string &software, const std::string &subdir); - + static public native void initLogger(String argv0, String defaultLogBaseName); + //TODO: maybe put these in an enum like in monero core - but why? + static public int LOGLEVEL_SILENT = -1; + static public int LOGLEVEL_WARN = 0; + static public int LOGLEVEL_INFO = 1; + static public int LOGLEVEL_DEBUG = 2; + static public int LOGLEVEL_TRACE = 3; + static public int LOGLEVEL_MAX = 4; + static public native void setLogLevel(int level); + static public native void logDebug(String category, String message); + static public native void logInfo(String category, String message); + static public native void logWarning(String category, String message); + static public native void logError(String category, String message); } \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java index 0c8ea06b..db5d8233 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java @@ -38,6 +38,7 @@ import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.inputmethod.InputMethodManager; +import com.m2049r.xmrwallet.BuildConfig; import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.model.NetworkType; import com.m2049r.xmrwallet.model.Wallet; @@ -287,4 +288,19 @@ public class Helper { throw new IllegalStateException(ex); } } + + static public void initLogger(Context context) { + if (BuildConfig.DEBUG) { + initLogger(context, WalletManager.LOGLEVEL_DEBUG); + } + // no logger if not debug + } + + // TODO make the log levels refer to the WalletManagerFactory::LogLevel enum ? + static public void initLogger(Context context, int level) { + String home = getStorage(context, HOME_DIR).getAbsolutePath(); + WalletManager.initLogger(home + "/monerujo", "monerujo.log"); + if (level >= WalletManager.LOGLEVEL_SILENT) + WalletManager.setLogLevel(level); + } } diff --git a/build.gradle b/build.gradle index b3384800..30c6cfd6 100644 --- a/build.gradle +++ b/build.gradle @@ -6,10 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' - classpath files('external-libs/gradle-witness.jar') - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files + classpath 'com.android.tools.build:gradle:3.1.1' } } @@ -27,6 +24,7 @@ task clean(type: Delete) { } ext { + apkName = 'monerujo' okHttpVersion = '3.9.0' junitVersion = '4.12' mockitoVersion = '1.10.19' diff --git a/external-libs/gradle-witness.jar b/external-libs/gradle-witness.jar deleted file mode 100644 index a82cb01f..00000000 Binary files a/external-libs/gradle-witness.jar and /dev/null differ diff --git a/gradle.properties b/gradle.properties index aac7c9b4..d658914d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,6 @@ org.gradle.jvmargs=-Xmx1536m # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true + +# keep build timestamps in APK +android.keepTimestampsInApk = true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 30a223c5..24a05048 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Oct 25 23:06:49 CEST 2017 +#Mon Apr 09 08:52:01 CEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip