From b986ff91927f7351119a6abb664ce099850681fe Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Wed, 10 Jul 2019 14:57:16 +0100 Subject: [PATCH 1/6] #1258 upgrade leakcanary to 2.0 and enable crashing on instrumentation runs --- app/build.gradle | 7 ++++--- .../main/java/org/kiwix/kiwixmobile/KiwixApplication.java | 7 ------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2e8506008..0cec50dae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,9 +124,9 @@ dependencies { implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion" // Leak canary - releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3' - androidTestImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3' - debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-alpha-2' + androidTestImplementation "com.squareup.leakcanary:leakcanary-android-instrumentation:2.0-alpha-2" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" implementation "android.arch.lifecycle:extensions:1.1.1" @@ -212,6 +212,7 @@ android { minSdkVersion 15 targetSdkVersion 28 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArgument "listener", "leakcanary.FailTestOnLeakRunListener" // See https://github.com/linkedin/dexmaker/issues/65 for why we need the following line. testInstrumentationRunnerArguments.notClass = "com.android.dex.DexIndexOverflowException" multiDexEnabled true diff --git a/app/src/main/java/org/kiwix/kiwixmobile/KiwixApplication.java b/app/src/main/java/org/kiwix/kiwixmobile/KiwixApplication.java index 1f96ddc21..5311cc96f 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/KiwixApplication.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/KiwixApplication.java @@ -26,7 +26,6 @@ import android.util.Log; import androidx.appcompat.app.AppCompatDelegate; import androidx.multidex.MultiDexApplication; import com.jakewharton.threetenabp.AndroidThreeTen; -import com.squareup.leakcanary.LeakCanary; import dagger.android.AndroidInjector; import dagger.android.DispatchingAndroidInjector; import dagger.android.HasActivityInjector; @@ -73,11 +72,6 @@ public class KiwixApplication extends MultiDexApplication implements HasActivity @Override public void onCreate() { super.onCreate(); - if (LeakCanary.isInAnalyzerProcess(this)) { - // This process is dedicated to LeakCanary for heap analysis. - // You should not init your app in this process. - return; - } AndroidThreeTen.init(this); if (isExternalStorageWritable()) { File appDirectory = new File(Environment.getExternalStorageDirectory() + "/Kiwix"); @@ -110,7 +104,6 @@ public class KiwixApplication extends MultiDexApplication implements HasActivity Log.d("KIWIX", "Started KiwixApplication"); applicationComponent.inject(this); - LeakCanary.install(this); if (BuildConfig.DEBUG) { StrictMode.setThreadPolicy(buildThreadPolicy(new StrictMode.ThreadPolicy.Builder())); StrictMode.setVmPolicy(buildVmPolicy(new StrictMode.VmPolicy.Builder())); From acd9fbd18e1516282afd7dd86d57f313ca68e5c3 Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Thu, 11 Jul 2019 12:07:05 +0100 Subject: [PATCH 2/6] #1258 reduce network logs, move disk read operations onto IO thread --- .../org/kiwix/kiwixmobile/di/modules/NetworkModule.java | 2 +- .../kiwix/kiwixmobile/utils/SharedPreferenceUtil.java | 9 +++++++-- .../java/org/kiwix/kiwixmobile/utils/files/FileSearch.kt | 5 +++-- .../zim_manager/fileselect_view/StorageObserver.kt | 4 ++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/di/modules/NetworkModule.java b/app/src/main/java/org/kiwix/kiwixmobile/di/modules/NetworkModule.java index f0c8b4ce6..1a86ded46 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/di/modules/NetworkModule.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/di/modules/NetworkModule.java @@ -36,7 +36,7 @@ import org.kiwix.kiwixmobile.data.remote.UserAgentInterceptor; @Provides @Singleton OkHttpClient provideOkHttpClient() { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); - logging.setLevel(BuildConfig.DEBUG ? Level.BODY : Level.BASIC); + logging.setLevel(BuildConfig.DEBUG ? Level.BASIC : Level.NONE); return new OkHttpClient().newBuilder().followRedirects(true).followSslRedirects(true) .connectTimeout(10, TimeUnit.SECONDS) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/utils/SharedPreferenceUtil.java b/app/src/main/java/org/kiwix/kiwixmobile/utils/SharedPreferenceUtil.java index fd9858bd9..c64f2bef9 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/utils/SharedPreferenceUtil.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/utils/SharedPreferenceUtil.java @@ -4,7 +4,9 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.Environment; import android.preference.PreferenceManager; +import io.reactivex.Flowable; import io.reactivex.processors.BehaviorProcessor; +import io.reactivex.processors.PublishProcessor; import java.util.Calendar; import javax.inject.Inject; import javax.inject.Singleton; @@ -35,12 +37,11 @@ public class SharedPreferenceUtil { private static final String PREF_SHOW_BOOKMARKS_CURRENT_BOOK = "show_bookmarks_current_book"; private static final String PREF_SHOW_HISTORY_CURRENT_BOOK = "show_history_current_book"; private SharedPreferences sharedPreferences; - public final BehaviorProcessor prefStorages; + private final PublishProcessor prefStorages = PublishProcessor.create(); @Inject public SharedPreferenceUtil(Context context) { sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); - prefStorages = BehaviorProcessor.createDefault(getPrefStorage()); } public boolean getPrefWifiOnly() { @@ -130,6 +131,10 @@ public class SharedPreferenceUtil { prefStorages.onNext(storage); } + public Flowable getPrefStorages(){ + return prefStorages.startWith(getPrefStorage()); + } + public void putPrefFullScreen(boolean fullScreen) { sharedPreferences.edit().putBoolean(PREF_FULLSCREEN, fullScreen).apply(); } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/utils/files/FileSearch.kt b/app/src/main/java/org/kiwix/kiwixmobile/utils/files/FileSearch.kt index 25f7f56fe..3d5d11a0e 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/utils/files/FileSearch.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/utils/files/FileSearch.kt @@ -26,6 +26,7 @@ import android.provider.MediaStore.MediaColumns import eu.mhutti1.utils.storage.StorageDeviceUtils import io.reactivex.Flowable import io.reactivex.functions.BiFunction +import io.reactivex.schedulers.Schedulers import org.kiwix.kiwixmobile.extensions.forEachRow import org.kiwix.kiwixmobile.extensions.get import java.io.File @@ -37,8 +38,8 @@ class FileSearch @Inject constructor(private val context: Context) { fun scan(defaultPath: String) = Flowable.combineLatest( - Flowable.fromCallable { scanFileSystem(defaultPath) }, - Flowable.fromCallable(this::scanMediaStore), + Flowable.fromCallable { scanFileSystem(defaultPath) }.subscribeOn(Schedulers.io()), + Flowable.fromCallable(this::scanMediaStore).subscribeOn(Schedulers.io()), BiFunction, List, List> { filesSystemFiles, mediaStoreFiles -> filesSystemFiles + mediaStoreFiles } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserver.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserver.kt index 8552bdd61..bf6d6852b 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserver.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserver.kt @@ -14,11 +14,11 @@ import javax.inject.Inject class StorageObserver @Inject constructor( private val sharedPreferenceUtil: SharedPreferenceUtil, - downloadDao: NewDownloadDao, + private val downloadDao: NewDownloadDao, private val fileSearch: FileSearch ) { - val booksOnFileSystem = scanFiles() + val booksOnFileSystem get() = scanFiles() .withLatestFrom( downloadDao.downloads(), BiFunction(this::toFilesThatAreNotDownloading) From 1929b81c76fba8b73f5dada87edc7998a5c12b31 Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Thu, 11 Jul 2019 16:04:01 +0100 Subject: [PATCH 3/6] #1258 disable crashing on leak --- app/build.gradle | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index aef8bff6b..e9decee80 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,7 +126,6 @@ dependencies { // Leak canary debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-alpha-2' - androidTestImplementation "com.squareup.leakcanary:leakcanary-android-instrumentation:2.0-alpha-2" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" @@ -213,7 +212,6 @@ android { minSdkVersion 15 targetSdkVersion 28 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - testInstrumentationRunnerArgument "listener", "leakcanary.FailTestOnLeakRunListener" // See https://github.com/linkedin/dexmaker/issues/65 for why we need the following line. testInstrumentationRunnerArguments.notClass = "com.android.dex.DexIndexOverflowException" multiDexEnabled true From f593ab9620a50a0efa1480e58a9fb9257a4925d7 Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Fri, 12 Jul 2019 10:21:24 +0100 Subject: [PATCH 4/6] #1258 reduce severity of unknown nullness and reprioritise travis executions for linting --- .travis.yml | 11 ++++++----- app/build.gradle | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5a95a9093..0350b325b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,17 +56,18 @@ before_script: - adb shell input keyevent 82 & script: - - ./gradlew createKiwixDebugCoverageReport lintKiwixDebug jacocoTestKiwixDebugUnitTestReport assemble + - ./gradlew lintKiwixDebug jacocoTestKiwixDebugUnitTestReport createKiwixDebugCoverageReport assemble after_success: - bash <(curl -s https://codecov.io/bash) - ./gradlew kiwixtestUploadKiwix after_failure: - - export LOG_DIR = ${TRAVIS_HOME}/build/kiwix/kiwix-android/app/build/outputs/reports/androidTests/connected/flavors/KIWIX/ - - lynx --dump ${LOG_DIR}com.android.builder.testing.ConnectedDevice.html - - lynx --dump ${LOG_DIR}com.android.builder.testing.html - - lynx --dump ${LOG_DIR}org.kiwix.kiwixmobile.tests.BasicTest.html; + - export REPORT_DIR=${TRAVIS_HOME}/build/kiwix/kiwix-android/app/build/outputs/reports/ + - export LOG_DIR=${REPORT_DIR}androidTests/connected/flavors/KIWIX/ + - lynx -dump ${LOG_DIR}index.html + - lynx -dump ${REPORT_DIR}lint-results-kiwixDebug.html + before_deploy: # - export APP_CHANGELOG=$(cat app/src/kiwix/play/release-notes/en-US/default.txt) diff --git a/app/build.gradle b/app/build.gradle index e9decee80..0811414a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -231,6 +231,7 @@ android { warningsAsErrors true ignore 'MissingTranslation', //TODO stop ignoring 'CheckResult' + warning 'UnknownNullness' baseline file("lint-baseline.xml") } From 1ee18f4eb48b2e5112de0d762095181ad4175f2c Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Fri, 12 Jul 2019 11:58:28 +0100 Subject: [PATCH 5/6] #1258 inject test schedulers --- .../org/kiwix/kiwixmobile/utils/files/FileSearchTest.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/test/java/org/kiwix/kiwixmobile/utils/files/FileSearchTest.kt b/app/src/test/java/org/kiwix/kiwixmobile/utils/files/FileSearchTest.kt index a76949f85..3fd2f32ea 100644 --- a/app/src/test/java/org/kiwix/kiwixmobile/utils/files/FileSearchTest.kt +++ b/app/src/test/java/org/kiwix/kiwixmobile/utils/files/FileSearchTest.kt @@ -29,11 +29,14 @@ import io.mockk.clearMocks import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic +import io.reactivex.schedulers.Schedulers import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.AfterAll import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test +import org.kiwix.kiwixmobile.resetSchedulers +import org.kiwix.kiwixmobile.setScheduler import java.io.File class FileSearchTest { @@ -47,6 +50,10 @@ class FileSearchTest { private val unitTestTempDirectoryPath = "unittest${File.separator}" + init { + setScheduler(Schedulers.trampoline()) + } + @BeforeEach fun init() { clearMocks(context, externalStorageDirectory, contentResolver, storageDevice) @@ -66,6 +73,7 @@ class FileSearchTest { @AfterAll fun teardown() { deleteTempDirectory() + resetSchedulers() } @Nested From b61f5913b5831a041094d6cd9d27b095e866283c Mon Sep 17 00:00:00 2001 From: Sean Mac Gillicuddy Date: Fri, 12 Jul 2019 14:22:09 +0100 Subject: [PATCH 6/6] #1258 reorder travis command --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 34fe9e7eb..219b3973e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,7 +56,7 @@ before_script: - adb shell input keyevent 82 & script: - - ./gradlew lintKiwixDebug jacocoTestKiwixDebugUnitTestReport createKiwixDebugCoverageReport assemble + - ./gradlew createKiwixDebugCoverageReport lintKiwixDebug jacocoTestKiwixDebugUnitTestReport assemble after_success: - bash <(curl -s https://codecov.io/bash)