From 9adfb382e8c0fa9b1fddeb031dcc32f901412330 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 28 Jul 2019 03:38:27 -0700 Subject: [PATCH] Only launch FlashActivity if app is foreground --- app/src/main/java/com/topjohnwu/magisk/App.kt | 40 ++----------------- .../topjohnwu/magisk/di/ApplicationModule.kt | 33 ++++++++++++++- .../com/topjohnwu/magisk/extensions/XKoin.kt | 4 +- .../model/download/NotificationService.kt | 2 +- .../model/download/RemoteFileService.kt | 20 ++++++---- 5 files changed, 49 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/App.kt b/app/src/main/java/com/topjohnwu/magisk/App.kt index 318f6c8de..40bab9705 100644 --- a/app/src/main/java/com/topjohnwu/magisk/App.kt +++ b/app/src/main/java/com/topjohnwu/magisk/App.kt @@ -1,13 +1,11 @@ package com.topjohnwu.magisk import android.annotation.SuppressLint -import android.app.Activity import android.app.Application import android.content.Context import android.content.res.Configuration import android.os.AsyncTask import android.os.Build -import android.os.Bundle import androidx.appcompat.app.AppCompatDelegate import androidx.multidex.MultiDex import androidx.room.Room @@ -16,7 +14,7 @@ import androidx.work.impl.WorkDatabase_Impl import com.topjohnwu.magisk.data.database.RepoDatabase import com.topjohnwu.magisk.data.database.RepoDatabase_Impl import com.topjohnwu.magisk.di.koinModules -import com.topjohnwu.magisk.extensions.inject +import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.utils.LocaleManager import com.topjohnwu.magisk.utils.RootUtils import com.topjohnwu.net.Networking @@ -26,13 +24,10 @@ import org.koin.core.context.startKoin import timber.log.Timber import java.util.concurrent.ThreadPoolExecutor -open class App : Application(), Application.ActivityLifecycleCallbacks { +open class App : Application() { lateinit var protectedContext: Context - @Volatile - private var foreground: Activity? = null - override fun attachBaseContext(base: Context) { super.attachBaseContext(base) if (BuildConfig.DEBUG) @@ -54,7 +49,7 @@ open class App : Application(), Application.ActivityLifecycleCallbacks { deContext.moveSharedPreferencesFrom(base, base.defaultPrefsName) } - registerActivityLifecycleCallbacks(this) + registerActivityLifecycleCallbacks(get()) Networking.init(base) LocaleManager.setLocale(this) @@ -65,28 +60,6 @@ open class App : Application(), Application.ActivityLifecycleCallbacks { LocaleManager.setLocale(this) } - //region ActivityLifecycleCallbacks - override fun onActivityCreated(activity: Activity, bundle: Bundle?) {} - - override fun onActivityStarted(activity: Activity) {} - - @Synchronized - override fun onActivityResumed(activity: Activity) { - foreground = activity - } - - @Synchronized - override fun onActivityPaused(activity: Activity) { - foreground = null - } - - override fun onActivityStopped(activity: Activity) {} - - override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {} - - override fun onActivityDestroyed(activity: Activity) {} - //endregion - private val Context.defaultPrefsName get() = "${packageName}_preferences" companion object { @@ -120,12 +93,5 @@ open class App : Application(), Application.ActivityLifecycleCallbacks { } } } - - @Deprecated("") - @JvmStatic - fun foreground(): Activity? { - val app: App by inject() - return app.foreground - } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt index ebdfd1025..016dfff90 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt @@ -1,12 +1,14 @@ package com.topjohnwu.magisk.di +import android.app.Activity +import android.app.Application import android.content.Context +import android.os.Bundle import androidx.preference.PreferenceManager import com.skoumal.teanity.rxbus.RxBus import com.topjohnwu.magisk.App import org.koin.dsl.module - val applicationModule = module { single { RxBus() } factory { get().resources } @@ -15,4 +17,31 @@ val applicationModule = module { factory(Protected) { get().protectedContext } single(SUTimeout) { get(Protected).getSharedPreferences("su_timeout", 0) } single { PreferenceManager.getDefaultSharedPreferences(get(Protected)) } -} \ No newline at end of file + single { ActivityTracker() as Application.ActivityLifecycleCallbacks } + factory { (get() as ActivityTracker).foreground } +} + +private class ActivityTracker : Application.ActivityLifecycleCallbacks { + + var foreground: Activity? = null + + override fun onActivityCreated(activity: Activity, bundle: Bundle?) {} + + override fun onActivityStarted(activity: Activity) {} + + @Synchronized + override fun onActivityResumed(activity: Activity) { + foreground = activity + } + + @Synchronized + override fun onActivityPaused(activity: Activity) { + foreground = null + } + + override fun onActivityStopped(activity: Activity) {} + + override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {} + + override fun onActivityDestroyed(activity: Activity) {} +} diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XKoin.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XKoin.kt index 0f76726dc..60a56c5af 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XKoin.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XKoin.kt @@ -6,12 +6,12 @@ import org.koin.core.qualifier.Qualifier fun getKoin() = GlobalContext.get().koin -inline fun inject( +inline fun inject( qualifier: Qualifier? = null, noinline parameters: ParametersDefinition? = null ) = lazy { get(qualifier, parameters) } -inline fun get( +inline fun get( qualifier: Qualifier? = null, noinline parameters: ParametersDefinition? = null ): T = getKoin().get(qualifier, parameters) \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/download/NotificationService.kt b/app/src/main/java/com/topjohnwu/magisk/model/download/NotificationService.kt index 034f08897..37285bf3e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/download/NotificationService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/download/NotificationService.kt @@ -40,7 +40,7 @@ abstract class NotificationService : Service() { } } - protected fun finishWork( + protected fun finishNotify( id: Int, editBody: (NotificationCompat.Builder) -> NotificationCompat.Builder? = { null } ) : Int { diff --git a/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt b/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt index b938d77f0..a845cafed 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/download/RemoteFileService.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.model.download +import android.app.Activity import android.content.Intent import androidx.core.app.NotificationCompat import com.skoumal.teanity.extensions.subscribeK @@ -7,6 +8,7 @@ import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.network.GithubRawServices import com.topjohnwu.magisk.extensions.firstMap +import com.topjohnwu.magisk.extensions.get import com.topjohnwu.magisk.extensions.writeTo import com.topjohnwu.magisk.model.entity.internal.DownloadSubject import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Magisk @@ -15,7 +17,6 @@ import com.topjohnwu.magisk.utils.ProgInputStream import com.topjohnwu.magisk.view.Notifications import com.topjohnwu.superuser.ShellUtils import io.reactivex.Single -import io.reactivex.android.schedulers.AndroidSchedulers import okhttp3.ResponseBody import org.koin.android.ext.android.inject import timber.log.Timber @@ -47,12 +48,15 @@ abstract class RemoteFileService : NotificationService() { private fun start(subject: DownloadSubject) = search(subject) .onErrorResumeNext(download(subject)) .doOnSubscribe { update(subject.hashCode()) { it.setContentTitle(subject.title) } } - .observeOn(AndroidSchedulers.mainThread()) - .doOnError { remove(subject.hashCode()) } - .doOnSuccess { - val id = finish(it, subject) - runCatching { onFinished(it, subject, id) }.onFailure { Timber.e(it) } - }.subscribeK() + .subscribeK(onError = { + Timber.e(it) + remove(subject.hashCode()) + }) { + val newId = finishNotify(it, subject) + get()?.run { + onFinished(it, subject, newId) + } + } private fun search(subject: DownloadSubject) = Single.fromCallable { if (!Config.isDownloadCacheEnabled) { @@ -98,7 +102,7 @@ abstract class RemoteFileService : NotificationService() { } } - private fun finish(file: File, subject: DownloadSubject) = finishWork(subject.hashCode()) { + private fun finishNotify(file: File, subject: DownloadSubject) = finishNotify(subject.hashCode()) { it.addActions(file, subject) .setContentText(getString(R.string.download_complete)) .setSmallIcon(android.R.drawable.stat_sys_download_done)