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:
@@ -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"
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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?) {
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 }) {
|
||||||
|
|||||||
Reference in New Issue
Block a user