diff --git a/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt b/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt
new file mode 100644
index 0000000000000000000000000000000000000000..32bcc7bd7604d7d9c8a8fcf9055323494eafccea
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright MURENA SAS 2023
+ * Apps Quickly and easily install Android apps onto your device!
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package foundation.e.apps.login
+
+import com.aurora.gplayapi.data.models.AuthData
+import foundation.e.apps.api.ResultSupreme
+
+interface AuthDataValidator {
+ suspend fun validateAuthData(): ResultSupreme
+}
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt
index b77c57a8b23c28acc641f67b61edf045403e6d38..323ae6e823f124f64df4b8249aeb2a94974c0f46 100644
--- a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt
+++ b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt
@@ -29,6 +29,7 @@ import foundation.e.apps.login.api.LoginApiRepository
import foundation.e.apps.utils.enums.ResultStatus
import foundation.e.apps.utils.enums.User
import foundation.e.apps.utils.exceptions.GPlayValidationException
+import timber.log.Timber
import java.util.Locale
import javax.inject.Inject
import javax.inject.Singleton
@@ -44,7 +45,7 @@ class LoginSourceGPlay @Inject constructor(
@ApplicationContext private val context: Context,
private val gson: Gson,
private val loginDataStore: LoginDataStore,
-) : LoginSourceInterface {
+) : LoginSourceInterface, AuthDataValidator {
@Inject
lateinit var gPlayApiFactory: GPlayApiFactory
@@ -78,14 +79,14 @@ class LoginSourceGPlay @Inject constructor(
val savedAuth = getSavedAuthData()
val authData = (
- savedAuth ?: run {
- // if no saved data, then generate new auth data.
- generateAuthData().let {
- if (it.isSuccess()) it.data!!
- else return AuthObject.GPlayAuth(it, user)
+ savedAuth ?: run {
+ // if no saved data, then generate new auth data.
+ generateAuthData().let {
+ if (it.isSuccess()) it.data!!
+ else return AuthObject.GPlayAuth(it, user)
+ }
}
- }
- )
+ )
val formattedAuthData = formatAuthData(authData)
formattedAuthData.locale = locale
@@ -238,12 +239,12 @@ class LoginSourceGPlay @Inject constructor(
} else {
val message =
"Validating AuthData failed.\n" +
- "Network code: ${playResponse?.code}\n" +
- "Success: ${playResponse?.isSuccessful}" +
- playResponse?.errorString?.run {
- if (isNotBlank()) "\nError message: $this"
- else ""
- }
+ "Network code: ${playResponse?.code}\n" +
+ "Success: ${playResponse?.isSuccessful}" +
+ playResponse?.errorString?.run {
+ if (isNotBlank()) "\nError message: $this"
+ else ""
+ }
ResultSupreme.Error(
message,
@@ -251,4 +252,22 @@ class LoginSourceGPlay @Inject constructor(
)
}
}
+
+ override suspend fun validateAuthData(): ResultSupreme {
+ val savedAuth = getSavedAuthData()
+ if (!isAuthDataValid(savedAuth)) {
+ Timber.i("Validating AuthData...")
+ val authData = generateAuthData()
+ authData.data?.let {
+ saveAuthData(it)
+ return authData
+ }
+ return ResultSupreme.create(ResultStatus.UNKNOWN)
+ }
+
+ return ResultSupreme.create(ResultStatus.OK, savedAuth)
+ }
+
+ private suspend fun isAuthDataValid(savedAuth: AuthData?) =
+ savedAuth != null && loginApiRepository.login(savedAuth).exception == null
}
diff --git a/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt b/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt
index ddc4bb392f7e478cef09cbdb36ad7ad4de5dfc7f..86fc9227967ae8b2c47722ef7ec753afc51b9a4f 100644
--- a/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt
+++ b/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt
@@ -17,6 +17,8 @@
package foundation.e.apps.login
+import com.aurora.gplayapi.data.models.AuthData
+import foundation.e.apps.api.ResultSupreme
import foundation.e.apps.utils.enums.User
import javax.inject.Inject
import javax.inject.Singleton
@@ -58,4 +60,9 @@ class LoginSourceRepository @Inject constructor(
suspend fun logout() {
loginCommon.logout()
}
+
+ suspend fun getValidatedAuthData(): ResultSupreme {
+ val authDataValidator = (sources.find { it is AuthDataValidator } as AuthDataValidator)
+ return authDataValidator.validateAuthData()
+ }
}
diff --git a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorker.kt b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorker.kt
index 0ac61c8933eb10937e93bc0716fa6b42edcd2fe6..306e4b2149703041e0cb756f5d5a6608a731ed37 100644
--- a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorker.kt
+++ b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorker.kt
@@ -23,6 +23,7 @@ import foundation.e.apps.api.ResultSupreme
import foundation.e.apps.api.cleanapk.CleanAPKInterface
import foundation.e.apps.api.fused.FusedAPIRepository
import foundation.e.apps.api.fused.data.FusedApp
+import foundation.e.apps.login.LoginSourceRepository
import foundation.e.apps.manager.database.fusedDownload.FusedDownload
import foundation.e.apps.manager.fused.FusedManagerRepository
import foundation.e.apps.manager.workmanager.InstallWorkManager
@@ -49,6 +50,7 @@ class UpdatesWorker @AssistedInject constructor(
private val fusedAPIRepository: FusedAPIRepository,
private val fusedManagerRepository: FusedManagerRepository,
private val dataStoreManager: DataStoreManager,
+ private val loginSourceRepository: LoginSourceRepository,
private val gson: Gson,
) : CoroutineWorker(context, params) {
@@ -110,7 +112,7 @@ class UpdatesWorker @AssistedInject constructor(
val isConnectedToUnmeteredNetwork = isConnectedToUnmeteredNetwork(applicationContext)
val appsNeededToUpdate = mutableListOf()
val user = getUser()
- val authData = getAuthData()
+ val authData = loginSourceRepository.getValidatedAuthData().data
val resultStatus: ResultStatus
if (user in listOf(User.ANONYMOUS, User.GOOGLE) && authData != null) {
@@ -225,6 +227,7 @@ class UpdatesWorker @AssistedInject constructor(
if (!fusedApp.isFree && authData.isAnonymous) {
return@forEach
}
+
val iconBase64 = getIconImageToBase64(fusedApp)
val fusedDownload = FusedDownload(