From 64a61da973e8346853884feeb03f1475c382aee0 Mon Sep 17 00:00:00 2001 From: LooKeR Date: Tue, 23 Nov 2021 11:39:36 +0530 Subject: [PATCH] Improve: MainScope() is for UI changes --- .../com/looker/droidify/MainApplication.kt | 5 +-- .../looker/droidify/content/Preferences.kt | 4 +-- .../droidify/content/ProductPreferences.kt | 35 +++++++++---------- .../droidify/service/DownloadService.kt | 8 +++-- 4 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/main/kotlin/com/looker/droidify/MainApplication.kt b/src/main/kotlin/com/looker/droidify/MainApplication.kt index 71c4e7da..d9a50359 100644 --- a/src/main/kotlin/com/looker/droidify/MainApplication.kt +++ b/src/main/kotlin/com/looker/droidify/MainApplication.kt @@ -19,7 +19,8 @@ import com.looker.droidify.service.SyncService import com.looker.droidify.utility.Utils.setLanguage import com.looker.droidify.utility.Utils.toInstalledItem import com.looker.droidify.utility.extension.android.Android -import kotlinx.coroutines.MainScope +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import java.net.InetSocketAddress @@ -89,7 +90,7 @@ class MainApplication : Application(), ImageLoaderFactory { var lastAutoSync = Preferences[Preferences.Key.AutoSync] var lastUpdateUnstable = Preferences[Preferences.Key.UpdateUnstable] var lastLanguage = Preferences[Preferences.Key.Language] - MainScope().launch { + CoroutineScope(Dispatchers.Default).launch { Preferences.subject.collect { if (it == Preferences.Key.ProxyType || it == Preferences.Key.ProxyHost || it == Preferences.Key.ProxyPort) { updateProxy() diff --git a/src/main/kotlin/com/looker/droidify/content/Preferences.kt b/src/main/kotlin/com/looker/droidify/content/Preferences.kt index 769ecd43..664635bf 100644 --- a/src/main/kotlin/com/looker/droidify/content/Preferences.kt +++ b/src/main/kotlin/com/looker/droidify/content/Preferences.kt @@ -8,8 +8,8 @@ import com.looker.droidify.Common.PREFS_LANGUAGE_DEFAULT import com.looker.droidify.R import com.looker.droidify.entity.ProductItem import com.looker.droidify.utility.extension.android.Android +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch @@ -41,7 +41,7 @@ object Preferences { context.getSharedPreferences("${context.packageName}_preferences", Context.MODE_PRIVATE) preferences.registerOnSharedPreferenceChangeListener { _, keyString -> - MainScope().launch(Dispatchers.IO) { + CoroutineScope(Dispatchers.Default).launch { keys[keyString]?.let { _subject.emit(it) } diff --git a/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt b/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt index fb6ef278..77aa4aa1 100644 --- a/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt +++ b/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt @@ -7,36 +7,33 @@ import com.looker.droidify.entity.ProductPreference import com.looker.droidify.utility.extension.json.Json import com.looker.droidify.utility.extension.json.parseDictionary import com.looker.droidify.utility.extension.json.writeDictionary -import io.reactivex.rxjava3.schedulers.Schedulers -import io.reactivex.rxjava3.subjects.PublishSubject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch import java.io.ByteArrayOutputStream import java.nio.charset.Charset object ProductPreferences { private val defaultProductPreference = ProductPreference(false, 0L) private lateinit var preferences: SharedPreferences - private val subject = PublishSubject.create>() + private val mutableSubject = MutableSharedFlow>() + private val subject = mutableSubject.asSharedFlow() fun init(context: Context) { preferences = context.getSharedPreferences("product_preferences", Context.MODE_PRIVATE) Database.LockAdapter.putAll(preferences.all.keys .mapNotNull { packageName -> - this[packageName].databaseVersionCode?.let { - Pair( - packageName, - it - ) - } + this[packageName].databaseVersionCode?.let { Pair(packageName, it) } }) - subject - .observeOn(Schedulers.io()) - .subscribe { (packageName, versionCode) -> - if (versionCode != null) { - Database.LockAdapter.put(Pair(packageName, versionCode)) - } else { - Database.LockAdapter.delete(packageName) - } + CoroutineScope(Dispatchers.Default).launch { + subject.collect { (packageName, versionCode) -> + if (versionCode != null) Database.LockAdapter.put(Pair(packageName, versionCode)) + else Database.LockAdapter.delete(packageName) } + } } private val ProductPreference.databaseVersionCode: Long? @@ -71,7 +68,9 @@ object ProductPreferences { if (oldProductPreference.ignoreUpdates != productPreference.ignoreUpdates || oldProductPreference.ignoreVersionCode != productPreference.ignoreVersionCode ) { - subject.onNext(Pair(packageName, productPreference.databaseVersionCode)) + CoroutineScope(Dispatchers.Default).launch { + mutableSubject.emit(Pair(packageName, productPreference.databaseVersionCode)) + } } } } diff --git a/src/main/kotlin/com/looker/droidify/service/DownloadService.kt b/src/main/kotlin/com/looker/droidify/service/DownloadService.kt index 14bf36c4..ff606b5f 100644 --- a/src/main/kotlin/com/looker/droidify/service/DownloadService.kt +++ b/src/main/kotlin/com/looker/droidify/service/DownloadService.kt @@ -27,8 +27,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.subjects.PublishSubject -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import java.io.File import java.security.MessageDigest import java.util.concurrent.TimeUnit @@ -45,6 +44,8 @@ class DownloadService : ConnectionService() { private val downloadingSubject = PublishSubject.create() } + val scope = CoroutineScope(Dispatchers.Default) + class Receiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val action = intent.action.orEmpty() @@ -171,6 +172,7 @@ class DownloadService : ConnectionService() { downloadingDisposable?.dispose() downloadingDisposable = null + scope.cancel() cancelTasks(null) cancelCurrentTask(null) } @@ -310,7 +312,7 @@ class DownloadService : ConnectionService() { }) if (!consumed) { if (rootInstallerEnabled) { - MainScope().launch { + scope.launch { AppInstaller.getInstance(this@DownloadService) ?.defaultInstaller?.install(task.release.cacheFileName) }