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

@@ -59,7 +59,7 @@
android:required="false"/> android:required="false"/>
<application <application
android:name=".AuroraApplication" android:name=".AuroraApp"
android:allowBackup="true" android:allowBackup="true"
android:banner="@drawable/ic_tv_banner" android:banner="@drawable/ic_tv_banner"
android:enableOnBackInvokedCallback="true" android:enableOnBackInvokedCallback="true"

View File

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

View File

@@ -31,11 +31,13 @@ import com.aurora.store.util.DownloadWorkerUtil
import com.aurora.store.util.NotificationUtil import com.aurora.store.util.NotificationUtil
import com.aurora.store.util.PackageUtil import com.aurora.store.util.PackageUtil
import dagger.hilt.android.HiltAndroidApp import dagger.hilt.android.HiltAndroidApp
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import javax.inject.Inject import javax.inject.Inject
import org.lsposed.hiddenapibypass.HiddenApiBypass import org.lsposed.hiddenapibypass.HiddenApiBypass
@HiltAndroidApp @HiltAndroidApp
class AuroraApplication : Application(), Configuration.Provider { class AuroraApp : Application(), Configuration.Provider {
@Inject @Inject
lateinit var workerFactory: HiltWorkerFactory lateinit var workerFactory: HiltWorkerFactory
@@ -50,6 +52,10 @@ class AuroraApplication : Application(), Configuration.Provider {
.build() .build()
companion object { companion object {
// Alternative to GlobalScope
var scope = MainScope()
private set
val enqueuedInstalls: MutableSet<String> = mutableSetOf() val enqueuedInstalls: MutableSet<String> = mutableSetOf()
} }
@@ -76,4 +82,9 @@ class AuroraApplication : Application(), Configuration.Provider {
CommonUtil.cleanupInstallationSessions(applicationContext) 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.content.Context
import android.net.Uri import android.net.Uri
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import com.aurora.store.AuroraApplication import com.aurora.store.AuroraApp
import com.aurora.store.BuildConfig import com.aurora.store.BuildConfig
import com.aurora.store.data.event.InstallerEvent import com.aurora.store.data.event.InstallerEvent
import com.aurora.store.util.Log import com.aurora.store.util.Log
@@ -33,15 +33,15 @@ import java.io.File
abstract class InstallerBase(protected var context: Context) : IInstaller { abstract class InstallerBase(protected var context: Context) : IInstaller {
override fun clearQueue() { override fun clearQueue() {
AuroraApplication.enqueuedInstalls.clear() AuroraApp.enqueuedInstalls.clear()
} }
override fun isAlreadyQueued(packageName: String): Boolean { override fun isAlreadyQueued(packageName: String): Boolean {
return AuroraApplication.enqueuedInstalls.contains(packageName) return AuroraApp.enqueuedInstalls.contains(packageName)
} }
override fun removeFromInstallQueue(packageName: String) { override fun removeFromInstallQueue(packageName: String) {
AuroraApplication.enqueuedInstalls.remove(packageName) AuroraApp.enqueuedInstalls.remove(packageName)
} }
open fun postError(packageName: String, error: String?, extra: String?) { 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 androidx.core.content.FileProvider
import com.aurora.services.IPrivilegedCallback import com.aurora.services.IPrivilegedCallback
import com.aurora.services.IPrivilegedService import com.aurora.services.IPrivilegedService
import com.aurora.store.AuroraApplication import com.aurora.store.AuroraApp
import com.aurora.store.BuildConfig import com.aurora.store.BuildConfig
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.event.BusEvent import com.aurora.store.data.event.BusEvent
@@ -108,7 +108,7 @@ class ServiceInstaller(context: Context) : InstallerBase(context) {
readyWithAction.set(true) readyWithAction.set(true)
return return
} }
AuroraApplication.enqueuedInstalls.add(packageName) AuroraApp.enqueuedInstalls.add(packageName)
val service = IPrivilegedService.Stub.asInterface(binder) val service = IPrivilegedService.Stub.asInterface(binder)
if (service.hasPrivilegedPermissions()) { if (service.hasPrivilegedPermissions()) {

View File

@@ -26,14 +26,12 @@ import android.net.NetworkCapabilities
import android.net.NetworkRequest import android.net.NetworkRequest
import android.util.Log import android.util.Log
import com.aurora.extensions.isMAndAbove import com.aurora.extensions.isMAndAbove
import com.aurora.store.AuroraApp
import com.aurora.store.data.model.NetworkStatus import com.aurora.store.data.model.NetworkStatus
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
@OptIn(DelicateCoroutinesApi::class)
class NetworkProvider(context: Context) { class NetworkProvider(context: Context) {
private val TAG = NetworkProvider::class.java.simpleName private val TAG = NetworkProvider::class.java.simpleName
@@ -45,7 +43,7 @@ class NetworkProvider(context: Context) {
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
init { init {
networkStatus.launchIn(GlobalScope) networkStatus.launchIn(AuroraApp.scope)
// Monitor network // Monitor network
connectivityManager.registerNetworkCallback(getNetworkRequest(), connectivityManager.registerNetworkCallback(getNetworkRequest(),

View File

@@ -39,9 +39,9 @@ import com.aurora.store.util.Preferences.PREFERENCE_AUTO_DELETE
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.withContext
import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.EventBus
@AndroidEntryPoint @AndroidEntryPoint
@@ -70,7 +70,7 @@ open class PackageManagerReceiver : BroadcastReceiver() {
downloadWorkerUtil.downloadsList.filter { it.isNotEmpty() }.firstOrNull() downloadWorkerUtil.downloadsList.filter { it.isNotEmpty() }.firstOrNull()
?.find { it.packageName == packageName && it.downloadStatus == DownloadStatus.COMPLETED } ?.find { it.packageName == packageName && it.downloadStatus == DownloadStatus.COMPLETED }
?.let { ?.let {
notifyInstallation(context, it) withContext(Dispatchers.IO) { notifyInstallation(context, it) }
if (Preferences.getBoolean(context, PREFERENCE_AUTO_DELETE)) { if (Preferences.getBoolean(context, PREFERENCE_AUTO_DELETE)) {
clearDownloads(context, it) clearDownloads(context, it)
} }

View File

@@ -8,6 +8,7 @@ import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.OutOfQuotaPolicy import androidx.work.OutOfQuotaPolicy
import androidx.work.WorkManager import androidx.work.WorkManager
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.store.AuroraApp
import com.aurora.store.data.model.DownloadStatus import com.aurora.store.data.model.DownloadStatus
import com.aurora.store.data.room.download.Download import com.aurora.store.data.room.download.Download
import com.aurora.store.data.room.download.DownloadDao 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 com.google.gson.Gson
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
@@ -24,7 +23,6 @@ import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@OptIn(DelicateCoroutinesApi::class)
class DownloadWorkerUtil @Inject constructor( class DownloadWorkerUtil @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val downloadDao: DownloadDao, private val downloadDao: DownloadDao,
@@ -42,12 +40,12 @@ class DownloadWorkerUtil @Inject constructor(
} }
val downloadsList = downloadDao.downloads() val downloadsList = downloadDao.downloads()
.stateIn(GlobalScope, SharingStarted.WhileSubscribed(), emptyList()) .stateIn(AuroraApp.scope, SharingStarted.WhileSubscribed(), emptyList())
private val TAG = DownloadWorkerUtil::class.java.simpleName private val TAG = DownloadWorkerUtil::class.java.simpleName
fun init() { fun init() {
GlobalScope.launch { AuroraApp.scope.launch {
cancelFailedDownloads(downloadDao.downloads().firstOrNull() ?: emptyList()) cancelFailedDownloads(downloadDao.downloads().firstOrNull() ?: emptyList())
}.invokeOnCompletion { }.invokeOnCompletion {
observeDownloads() observeDownloads()
@@ -55,7 +53,7 @@ class DownloadWorkerUtil @Inject constructor(
} }
private fun observeDownloads() { private fun observeDownloads() {
GlobalScope.launch { AuroraApp.scope.launch {
downloadDao.downloads().collectLatest { list -> downloadDao.downloads().collectLatest { list ->
// Check and trigger next download in queue, if any // Check and trigger next download in queue, if any
if (!list.any { it.downloadStatus == DownloadStatus.DOWNLOADING }) { if (!list.any { it.downloadStatus == DownloadStatus.DOWNLOADING }) {