diff --git a/app/src/main/java/com/aurora/store/AuroraApp.kt b/app/src/main/java/com/aurora/store/AuroraApp.kt index e6962d49c..b6bf58aa9 100644 --- a/app/src/main/java/com/aurora/store/AuroraApp.kt +++ b/app/src/main/java/com/aurora/store/AuroraApp.kt @@ -95,10 +95,8 @@ class AuroraApp : Application(), Configuration.Provider, SingletonImageLoader.Fa NotificationUtil.createNotificationChannel(this) // Initialize Download and Update helpers to observe and trigger downloads - scope.launch { - downloadHelper.init() - updateHelper.init() - } + downloadHelper.init() + updateHelper.init() //Register broadcast receiver for package install/uninstall ContextCompat.registerReceiver( diff --git a/app/src/main/java/com/aurora/store/data/helper/DownloadHelper.kt b/app/src/main/java/com/aurora/store/data/helper/DownloadHelper.kt index 433f1c2af..14b593873 100644 --- a/app/src/main/java/com/aurora/store/data/helper/DownloadHelper.kt +++ b/app/src/main/java/com/aurora/store/data/helper/DownloadHelper.kt @@ -16,12 +16,13 @@ import com.aurora.store.data.room.update.Update import com.aurora.store.data.work.DownloadWorker import com.aurora.store.util.PathUtil import dagger.hilt.android.qualifiers.ApplicationContext -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.withContext +import kotlinx.coroutines.launch import javax.inject.Inject /** @@ -49,16 +50,16 @@ class DownloadHelper @Inject constructor( /** * Removes failed download from the queue and starts observing for newly enqueued apps. */ - suspend fun init() { - withContext(Dispatchers.IO) { + fun init() { + AuroraApp.scope.launch { cancelFailedDownloads(downloadDao.downloads().firstOrNull() ?: emptyList()) + }.invokeOnCompletion { + observeDownloads() } - - observeDownloads() } - private suspend fun observeDownloads() { - downloadDao.downloads().collect { list -> + private fun observeDownloads() { + downloadDao.downloads().onEach { list -> try { if (list.none { it.downloadStatus == DownloadStatus.DOWNLOADING }) { list.find { it.downloadStatus == DownloadStatus.QUEUED } @@ -70,7 +71,7 @@ class DownloadHelper @Inject constructor( } catch (exception: Exception) { Log.e(TAG, "Failed to enqueue download worker", exception) } - } + }.launchIn(AuroraApp.scope) } /** diff --git a/app/src/main/java/com/aurora/store/data/helper/UpdateHelper.kt b/app/src/main/java/com/aurora/store/data/helper/UpdateHelper.kt index 7f7447bcf..7df3604e1 100644 --- a/app/src/main/java/com/aurora/store/data/helper/UpdateHelper.kt +++ b/app/src/main/java/com/aurora/store/data/helper/UpdateHelper.kt @@ -25,14 +25,13 @@ import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS_IDLE import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS_METERED import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_CHECK_INTERVAL import dagger.hilt.android.qualifiers.ApplicationContext -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.withContext +import kotlinx.coroutines.launch import java.util.concurrent.TimeUnit.HOURS import java.util.concurrent.TimeUnit.MINUTES import javax.inject.Inject @@ -69,12 +68,12 @@ class UpdateHelper @Inject constructor( /** * Deletes invalid updates from database and starts observing events */ - suspend fun init() { - withContext(Dispatchers.IO) { + fun init() { + AuroraApp.scope.launch { deleteInvalidUpdates() + }.invokeOnCompletion { + observeUpdates() } - - observeUpdates() } private fun observeUpdates() { diff --git a/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt b/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt index b1503dd6e..a9b06a9f6 100644 --- a/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt +++ b/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt @@ -13,6 +13,7 @@ import android.graphics.Bitmap import android.graphics.BitmapFactory import android.util.Log import androidx.core.content.getSystemService +import androidx.core.graphics.scale import androidx.hilt.work.HiltWorker import androidx.work.ForegroundInfo import androidx.work.WorkInfo.Companion.STOP_REASON_CANCELLED_BY_APP @@ -63,9 +64,9 @@ import com.aurora.gplayapi.data.models.File as GPlayFile */ @HiltWorker class DownloadWorker @AssistedInject constructor( + authProvider: AuthProvider, private val downloadDao: DownloadDao, private val appInstaller: AppInstaller, - private val authProvider: AuthProvider, private val httpClient: IHttpClient, private val purchaseHelper: PurchaseHelper, @Assisted private val appContext: Context, @@ -85,8 +86,6 @@ class DownloadWorker @AssistedInject constructor( private val NOTIFICATION_ID: Int = 200 object Exceptions { - class InvalidAuthDataException : Exception("AuthData is invalid") - class NoPackageNameException : Exception("No packagename provided") class NoNetworkException : Exception("No network available") class NothingToDownloadException : Exception("Failed to purchase app") class DownloadFailedException : Exception("Download failed") @@ -97,23 +96,15 @@ class DownloadWorker @AssistedInject constructor( override suspend fun doWork(): Result { super.doWork() - // Bail out immediately if authData is not valid - if (!authProvider.isSavedAuthDataValid()) return onFailure(Exceptions.InvalidAuthDataException()) - // Fetch required data for download try { - val packageName = inputData.getString(DownloadHelper.PACKAGE_NAME) - - // Bail out if no package name is provided - if (packageName.isNullOrBlank()) return onFailure(Exceptions.NoPackageNameException()) - - download = downloadDao.getDownload(packageName) + download = downloadDao.getDownload(inputData.getString(DownloadHelper.PACKAGE_NAME)!!) val response = (httpClient as HttpClient).call(download.iconURL).body if (response != null) { val bitmap = BitmapFactory.decodeStream(withContext(Dispatchers.IO) { response.byteStream() }) - icon = Bitmap.createScaledBitmap(bitmap, 96, 96, true) + icon = bitmap.scale(96, 96) } } catch (exception: Exception) { return onFailure(exception)