From a75838a57dd4761247ad91baf15ba69aff3186d7 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 2 May 2024 12:22:06 +0530 Subject: [PATCH] AuroraApp: Switch from GlobalScope to MainScope Use MainScope instead of GlobalScope managed in the application class Signed-off-by: Aayush Gupta --- app/src/main/AndroidManifest.xml | 2 +- .../java/com/aurora/extensions/BroadcastReceiver.kt | 6 ++---- .../store/{AuroraApplication.kt => AuroraApp.kt} | 13 ++++++++++++- .../aurora/store/data/installer/InstallerBase.kt | 8 ++++---- .../aurora/store/data/installer/ServiceInstaller.kt | 4 ++-- .../aurora/store/data/providers/NetworkProvider.kt | 6 ++---- .../store/data/receiver/PackageManagerReceiver.kt | 4 ++-- .../com/aurora/store/util/DownloadWorkerUtil.kt | 10 ++++------ 8 files changed, 29 insertions(+), 24 deletions(-) rename app/src/main/java/com/aurora/store/{AuroraApplication.kt => AuroraApp.kt} (87%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1268adb7c..cec0787cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,7 @@ android:required="false"/> Unit ) { val pendingResult = goAsync() - GlobalScope.launch(context) { + AuroraApp.scope.launch(context) { try { block() } finally { diff --git a/app/src/main/java/com/aurora/store/AuroraApplication.kt b/app/src/main/java/com/aurora/store/AuroraApp.kt similarity index 87% rename from app/src/main/java/com/aurora/store/AuroraApplication.kt rename to app/src/main/java/com/aurora/store/AuroraApp.kt index dd469aae2..b60ce9571 100644 --- a/app/src/main/java/com/aurora/store/AuroraApplication.kt +++ b/app/src/main/java/com/aurora/store/AuroraApp.kt @@ -31,11 +31,13 @@ import com.aurora.store.util.DownloadWorkerUtil import com.aurora.store.util.NotificationUtil import com.aurora.store.util.PackageUtil import dagger.hilt.android.HiltAndroidApp +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel import javax.inject.Inject import org.lsposed.hiddenapibypass.HiddenApiBypass @HiltAndroidApp -class AuroraApplication : Application(), Configuration.Provider { +class AuroraApp : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory @@ -50,6 +52,10 @@ class AuroraApplication : Application(), Configuration.Provider { .build() companion object { + // Alternative to GlobalScope + var scope = MainScope() + private set + val enqueuedInstalls: MutableSet = mutableSetOf() } @@ -76,4 +82,9 @@ class AuroraApplication : Application(), Configuration.Provider { CommonUtil.cleanupInstallationSessions(applicationContext) } + override fun onLowMemory() { + super.onLowMemory() + scope.cancel("onLowMemory() called by system") + scope = MainScope() + } } diff --git a/app/src/main/java/com/aurora/store/data/installer/InstallerBase.kt b/app/src/main/java/com/aurora/store/data/installer/InstallerBase.kt index 60d5dcc51..0b6968cc3 100644 --- a/app/src/main/java/com/aurora/store/data/installer/InstallerBase.kt +++ b/app/src/main/java/com/aurora/store/data/installer/InstallerBase.kt @@ -22,7 +22,7 @@ package com.aurora.store.data.installer import android.content.Context import android.net.Uri import androidx.core.content.FileProvider -import com.aurora.store.AuroraApplication +import com.aurora.store.AuroraApp import com.aurora.store.BuildConfig import com.aurora.store.data.event.InstallerEvent import com.aurora.store.util.Log @@ -33,15 +33,15 @@ import java.io.File abstract class InstallerBase(protected var context: Context) : IInstaller { override fun clearQueue() { - AuroraApplication.enqueuedInstalls.clear() + AuroraApp.enqueuedInstalls.clear() } override fun isAlreadyQueued(packageName: String): Boolean { - return AuroraApplication.enqueuedInstalls.contains(packageName) + return AuroraApp.enqueuedInstalls.contains(packageName) } override fun removeFromInstallQueue(packageName: String) { - AuroraApplication.enqueuedInstalls.remove(packageName) + AuroraApp.enqueuedInstalls.remove(packageName) } open fun postError(packageName: String, error: String?, extra: String?) { diff --git a/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt index db63fc1e9..0943cd423 100644 --- a/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt @@ -32,7 +32,7 @@ import android.os.RemoteException import androidx.core.content.FileProvider import com.aurora.services.IPrivilegedCallback import com.aurora.services.IPrivilegedService -import com.aurora.store.AuroraApplication +import com.aurora.store.AuroraApp import com.aurora.store.BuildConfig import com.aurora.store.R import com.aurora.store.data.event.BusEvent @@ -108,7 +108,7 @@ class ServiceInstaller(context: Context) : InstallerBase(context) { readyWithAction.set(true) return } - AuroraApplication.enqueuedInstalls.add(packageName) + AuroraApp.enqueuedInstalls.add(packageName) val service = IPrivilegedService.Stub.asInterface(binder) if (service.hasPrivilegedPermissions()) { diff --git a/app/src/main/java/com/aurora/store/data/providers/NetworkProvider.kt b/app/src/main/java/com/aurora/store/data/providers/NetworkProvider.kt index 268b3c9ef..3ff920265 100644 --- a/app/src/main/java/com/aurora/store/data/providers/NetworkProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/NetworkProvider.kt @@ -26,14 +26,12 @@ import android.net.NetworkCapabilities import android.net.NetworkRequest import android.util.Log import com.aurora.extensions.isMAndAbove +import com.aurora.store.AuroraApp import com.aurora.store.data.model.NetworkStatus -import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.launchIn -@OptIn(DelicateCoroutinesApi::class) class NetworkProvider(context: Context) { private val TAG = NetworkProvider::class.java.simpleName @@ -45,7 +43,7 @@ class NetworkProvider(context: Context) { context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager init { - networkStatus.launchIn(GlobalScope) + networkStatus.launchIn(AuroraApp.scope) // Monitor network connectivityManager.registerNetworkCallback(getNetworkRequest(), diff --git a/app/src/main/java/com/aurora/store/data/receiver/PackageManagerReceiver.kt b/app/src/main/java/com/aurora/store/data/receiver/PackageManagerReceiver.kt index a95b86230..4a56b1885 100644 --- a/app/src/main/java/com/aurora/store/data/receiver/PackageManagerReceiver.kt +++ b/app/src/main/java/com/aurora/store/data/receiver/PackageManagerReceiver.kt @@ -39,9 +39,9 @@ import com.aurora.store.util.Preferences.PREFERENCE_AUTO_DELETE import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus @AndroidEntryPoint @@ -70,7 +70,7 @@ open class PackageManagerReceiver : BroadcastReceiver() { downloadWorkerUtil.downloadsList.filter { it.isNotEmpty() }.firstOrNull() ?.find { it.packageName == packageName && it.downloadStatus == DownloadStatus.COMPLETED } ?.let { - notifyInstallation(context, it) + withContext(Dispatchers.IO) { notifyInstallation(context, it) } if (Preferences.getBoolean(context, PREFERENCE_AUTO_DELETE)) { clearDownloads(context, it) } diff --git a/app/src/main/java/com/aurora/store/util/DownloadWorkerUtil.kt b/app/src/main/java/com/aurora/store/util/DownloadWorkerUtil.kt index a2f20d720..bb85e9765 100644 --- a/app/src/main/java/com/aurora/store/util/DownloadWorkerUtil.kt +++ b/app/src/main/java/com/aurora/store/util/DownloadWorkerUtil.kt @@ -8,6 +8,7 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.OutOfQuotaPolicy import androidx.work.WorkManager import com.aurora.gplayapi.data.models.App +import com.aurora.store.AuroraApp import com.aurora.store.data.model.DownloadStatus import com.aurora.store.data.room.download.Download import com.aurora.store.data.room.download.DownloadDao @@ -15,8 +16,6 @@ import com.aurora.store.data.work.DownloadWorker import com.google.gson.Gson import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject -import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.filter @@ -24,7 +23,6 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch -@OptIn(DelicateCoroutinesApi::class) class DownloadWorkerUtil @Inject constructor( @ApplicationContext private val context: Context, private val downloadDao: DownloadDao, @@ -42,12 +40,12 @@ class DownloadWorkerUtil @Inject constructor( } val downloadsList = downloadDao.downloads() - .stateIn(GlobalScope, SharingStarted.WhileSubscribed(), emptyList()) + .stateIn(AuroraApp.scope, SharingStarted.WhileSubscribed(), emptyList()) private val TAG = DownloadWorkerUtil::class.java.simpleName fun init() { - GlobalScope.launch { + AuroraApp.scope.launch { cancelFailedDownloads(downloadDao.downloads().firstOrNull() ?: emptyList()) }.invokeOnCompletion { observeDownloads() @@ -55,7 +53,7 @@ class DownloadWorkerUtil @Inject constructor( } private fun observeDownloads() { - GlobalScope.launch { + AuroraApp.scope.launch { downloadDao.downloads().collectLatest { list -> // Check and trigger next download in queue, if any if (!list.any { it.downloadStatus == DownloadStatus.DOWNLOADING }) {