AuroraApp: Switch from GlobalScope to MainScope

Use MainScope instead of GlobalScope managed in the application class

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-05-02 12:22:06 +05:30
parent e142e4f00d
commit a75838a57d
8 changed files with 29 additions and 24 deletions

View File

@@ -1,21 +1,19 @@
package com.aurora.extensions
import android.content.BroadcastReceiver
import com.aurora.store.AuroraApp
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
@OptIn(DelicateCoroutinesApi::class)
fun BroadcastReceiver.goAsync(
context: CoroutineContext = EmptyCoroutineContext,
block: suspend CoroutineScope.() -> Unit
) {
val pendingResult = goAsync()
GlobalScope.launch(context) {
AuroraApp.scope.launch(context) {
try {
block()
} finally {

View File

@@ -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<String> = 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()
}
}

View File

@@ -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?) {

View File

@@ -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()) {

View File

@@ -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(),

View File

@@ -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)
}

View File

@@ -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 }) {