From 10f386bf25340178f58d37ee386359276a9c2ac6 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sun, 20 Oct 2024 11:56:59 +0530 Subject: [PATCH] UpdateWorker: Try to refresh authdata before checking for updates Introduce a new standalone worker to refresh authdata and make it open for inheritance as periodic workers are not allowed to be chained. Signed-off-by: Aayush Gupta --- .../com/aurora/store/data/work/AuthWorker.kt | 81 +++++++++++++++++++ .../aurora/store/data/work/UpdateWorker.kt | 10 ++- 2 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/aurora/store/data/work/AuthWorker.kt diff --git a/app/src/main/java/com/aurora/store/data/work/AuthWorker.kt b/app/src/main/java/com/aurora/store/data/work/AuthWorker.kt new file mode 100644 index 000000000..b62cda05d --- /dev/null +++ b/app/src/main/java/com/aurora/store/data/work/AuthWorker.kt @@ -0,0 +1,81 @@ +package com.aurora.store.data.work + +import android.content.Context +import android.util.Log +import androidx.hilt.work.HiltWorker +import androidx.work.CoroutineWorker +import androidx.work.WorkerParameters +import com.aurora.gplayapi.data.models.AuthData +import com.aurora.gplayapi.helpers.AuthHelper +import com.aurora.store.data.model.AccountType +import com.aurora.store.data.providers.AccountProvider +import com.aurora.store.data.providers.AuthProvider +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject + +/** + * Worker to refresh [AuthData] in background + * @see UpdateWorker + */ +@HiltWorker +open class AuthWorker @AssistedInject constructor( + private val authProvider: AuthProvider, + @Assisted private val appContext: Context, + @Assisted workerParams: WorkerParameters +) : CoroutineWorker(appContext, workerParams) { + + private val TAG = AuthWorker::class.java.simpleName + + override suspend fun doWork(): Result { + if (!AccountProvider.isLoggedIn(appContext)) { + Log.i(TAG, "User has logged out!") + return Result.failure() + } + + if (authProvider.isSavedAuthDataValid()) { + Log.i(TAG, "Saved AuthData is valid") + return Result.success() + } + + // Generate and validate new auth + try { + val accountType = AccountProvider.getAccountType(appContext) + val authData = when (accountType) { + AccountType.GOOGLE -> { + authProvider.buildGoogleAuthData( + AccountProvider.getLoginEmail(appContext)!!, + AccountProvider.getLoginToken(appContext)!!.first, + AccountProvider.getLoginToken(appContext)!!.second + ).getOrThrow() + } + + AccountType.ANONYMOUS -> authProvider.buildAnonymousAuthData().getOrThrow() + } + + require(verifyAndSaveAuth(authData, accountType) != null) + Log.i(TAG, "Refreshed AuthData successfully") + return Result.success() + } catch (exception: Exception) { + Log.e(TAG, "Failed to refresh authData!", exception) + return Result.failure() + } + } + + private fun verifyAndSaveAuth(authData: AuthData, accountType: AccountType): AuthData? { + return if (authData.authToken.isNotEmpty() && authData.deviceConfigToken.isNotEmpty()) { + authProvider.saveAuthData(authData) + AccountProvider.login( + appContext, + authData.email, + authData.aasToken.ifBlank { authData.authToken }, + if (authData.aasToken.isBlank()) AuthHelper.Token.AUTH else AuthHelper.Token.AAS, + accountType + ) + authData + } else { + authProvider.removeAuthData(appContext) + AccountProvider.logout(appContext) + null + } + } +} diff --git a/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt b/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt index 99da93441..0faee1461 100644 --- a/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt +++ b/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt @@ -6,7 +6,6 @@ import android.util.Log import androidx.core.content.getSystemService import androidx.core.content.pm.PackageInfoCompat import androidx.hilt.work.HiltWorker -import androidx.work.CoroutineWorker import androidx.work.ForegroundInfo import androidx.work.WorkerParameters import com.aurora.Constants @@ -38,11 +37,12 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext /** - * A worker to check for updates for installed apps based on + * A worker to check for updates for installed apps based on saved authentication data, * filters and the auto-updates mode selected by the user. The repeat interval * is configurable by the user, defaulting to 3 hours with a flex time of 30 minutes. - * + * * Avoid using this worker directly and prefer using [UpdateHelper] instead. + * @see AuthWorker */ @HiltWorker class UpdateWorker @AssistedInject constructor( @@ -54,7 +54,7 @@ class UpdateWorker @AssistedInject constructor( private val authProvider: AuthProvider, @Assisted private val appContext: Context, @Assisted workerParams: WorkerParameters -) : CoroutineWorker(appContext, workerParams) { +) : AuthWorker(authProvider, appContext, workerParams) { private val TAG = UpdateWorker::class.java.simpleName @@ -72,6 +72,8 @@ class UpdateWorker @AssistedInject constructor( buildType != BuildType.DEBUG override suspend fun doWork(): Result { + super.doWork() + Log.i(TAG, "Checking for app updates") val updateMode = UpdateMode.entries[inputData.getInt( UpdateHelper.UPDATE_MODE,