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 <aayushgupta219@gmail.com>
This commit is contained in:
81
app/src/main/java/com/aurora/store/data/work/AuthWorker.kt
Normal file
81
app/src/main/java/com/aurora/store/data/work/AuthWorker.kt
Normal file
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@ import android.util.Log
|
|||||||
import androidx.core.content.getSystemService
|
import androidx.core.content.getSystemService
|
||||||
import androidx.core.content.pm.PackageInfoCompat
|
import androidx.core.content.pm.PackageInfoCompat
|
||||||
import androidx.hilt.work.HiltWorker
|
import androidx.hilt.work.HiltWorker
|
||||||
import androidx.work.CoroutineWorker
|
|
||||||
import androidx.work.ForegroundInfo
|
import androidx.work.ForegroundInfo
|
||||||
import androidx.work.WorkerParameters
|
import androidx.work.WorkerParameters
|
||||||
import com.aurora.Constants
|
import com.aurora.Constants
|
||||||
@@ -38,11 +37,12 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.withContext
|
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
|
* 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.
|
* 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.
|
* Avoid using this worker directly and prefer using [UpdateHelper] instead.
|
||||||
|
* @see AuthWorker
|
||||||
*/
|
*/
|
||||||
@HiltWorker
|
@HiltWorker
|
||||||
class UpdateWorker @AssistedInject constructor(
|
class UpdateWorker @AssistedInject constructor(
|
||||||
@@ -54,7 +54,7 @@ class UpdateWorker @AssistedInject constructor(
|
|||||||
private val authProvider: AuthProvider,
|
private val authProvider: AuthProvider,
|
||||||
@Assisted private val appContext: Context,
|
@Assisted private val appContext: Context,
|
||||||
@Assisted workerParams: WorkerParameters
|
@Assisted workerParams: WorkerParameters
|
||||||
) : CoroutineWorker(appContext, workerParams) {
|
) : AuthWorker(authProvider, appContext, workerParams) {
|
||||||
|
|
||||||
private val TAG = UpdateWorker::class.java.simpleName
|
private val TAG = UpdateWorker::class.java.simpleName
|
||||||
|
|
||||||
@@ -72,6 +72,8 @@ class UpdateWorker @AssistedInject constructor(
|
|||||||
buildType != BuildType.DEBUG
|
buildType != BuildType.DEBUG
|
||||||
|
|
||||||
override suspend fun doWork(): Result {
|
override suspend fun doWork(): Result {
|
||||||
|
super.doWork()
|
||||||
|
|
||||||
Log.i(TAG, "Checking for app updates")
|
Log.i(TAG, "Checking for app updates")
|
||||||
val updateMode = UpdateMode.entries[inputData.getInt(
|
val updateMode = UpdateMode.entries[inputData.getInt(
|
||||||
UpdateHelper.UPDATE_MODE,
|
UpdateHelper.UPDATE_MODE,
|
||||||
|
|||||||
Reference in New Issue
Block a user