From 2a2a0930c4c4904b6445e19249594ed540a29511 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 12 Mar 2025 16:06:08 +0800 Subject: [PATCH 1/4] fixup! Audit DownloadHelper & UpdateHelper scopes Move back both UpdateHelper and DownloadHelper to mainscope as they are only for observing changes to the data and don't need to be run on a IO dispatcher Signed-off-by: Aayush Gupta --- .../main/java/com/aurora/store/AuroraApp.kt | 6 ++---- .../store/data/helper/DownloadHelper.kt | 19 ++++++++++--------- .../aurora/store/data/helper/UpdateHelper.kt | 11 +++++------ 3 files changed, 17 insertions(+), 19 deletions(-) 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() { From 7c2e9dc399f61cb0edee2d1759cba1744573db36 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 13 Mar 2025 12:19:04 +0800 Subject: [PATCH 2/4] DownloadWorker: Drop non-required check for nullable packageName packageName will never be null as App() constructor enforces specifiying packageName atleast similar to Download() class. Signed-off-by: Aayush Gupta --- .../java/com/aurora/store/data/work/DownloadWorker.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) 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..b0554adc2 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 @@ -86,7 +86,6 @@ class DownloadWorker @AssistedInject constructor( 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") @@ -102,12 +101,7 @@ class DownloadWorker @AssistedInject constructor( // 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) { From 1f3cea116cf3c7016c23e4c95d3ac7ddab138479 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 13 Mar 2025 12:21:36 +0800 Subject: [PATCH 3/4] DownloadWorker: Drop non-required check for authdata validity The parent worker (AuthWorker) already does the required verification and refresh the AuthData if expired. It will never be expired in this case. Signed-off-by: Aayush Gupta --- .../main/java/com/aurora/store/data/work/DownloadWorker.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) 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 b0554adc2..9045e874c 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 @@ -63,9 +63,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,7 +85,6 @@ class DownloadWorker @AssistedInject constructor( private val NOTIFICATION_ID: Int = 200 object Exceptions { - class InvalidAuthDataException : Exception("AuthData is invalid") class NoNetworkException : Exception("No network available") class NothingToDownloadException : Exception("Failed to purchase app") class DownloadFailedException : Exception("Download failed") @@ -96,9 +95,6 @@ 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 { download = downloadDao.getDownload(inputData.getString(DownloadHelper.PACKAGE_NAME)!!) From 9af602267b4d4a6ece4cb6991c9b4278f5e966d7 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 13 Mar 2025 12:25:17 +0800 Subject: [PATCH 4/4] DownloadWorker: Switch to ktx extension for bitmap scaling Signed-off-by: Aayush Gupta --- app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 9045e874c..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 @@ -103,7 +104,7 @@ class DownloadWorker @AssistedInject constructor( 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)