From 793677f22ef864149bd8758518d7e7fbe7ff2d2e Mon Sep 17 00:00:00 2001 From: Jonathan Klee Date: Wed, 30 Oct 2024 15:02:20 +0100 Subject: [PATCH] Introduce CustomException --- .../foundation/e/apps/data/NetworkHandler.kt | 12 ++- .../foundation/e/apps/data/ResultSupreme.kt | 9 ++- .../e/apps/data/login/AuthObject.kt | 16 ++-- .../data/login/AuthenticatorRepository.kt | 9 ++- .../data/login/api/PlayStoreLoginWrapper.kt | 46 ++++++++++-- .../login/exceptions/CleanApkException.kt | 26 ------- ...idationException.kt => CustomException.kt} | 31 +++++--- .../data/login/exceptions/GPlayException.kt | 26 ------- .../login/exceptions/GPlayLoginException.kt | 31 -------- .../data/login/exceptions/LoginException.kt | 24 ------ .../exceptions/UnknownSourceException.kt | 23 ------ .../splitinstall/SplitInstallBinder.kt | 5 +- .../e/apps/provider/AgeRatingProvider.kt | 5 +- .../java/foundation/e/apps/ui/MainActivity.kt | 4 +- .../ui/application/ApplicationFragment.kt | 14 ++-- .../ui/application/ApplicationViewModel.kt | 23 +++--- .../ApplicationListFragment.kt | 8 +- .../ApplicationListViewModel.kt | 28 ++++--- .../e/apps/ui/categories/AppsFragment.kt | 8 +- .../apps/ui/categories/CategoriesViewModel.kt | 19 ++--- .../e/apps/ui/categories/GamesFragment.kt | 8 +- .../foundation/e/apps/ui/home/HomeFragment.kt | 29 +++----- .../e/apps/ui/home/HomeViewModel.kt | 20 ++--- .../ui/parentFragment/LoadingViewModel.kt | 11 ++- .../apps/ui/parentFragment/TimeoutFragment.kt | 74 +++++++------------ .../e/apps/ui/search/SearchFragment.kt | 8 +- .../e/apps/ui/search/SearchViewModel.kt | 28 +++---- .../e/apps/ui/updates/UpdatesFragment.kt | 22 ++++-- .../e/apps/ui/updates/UpdatesViewModel.kt | 23 +++--- 29 files changed, 240 insertions(+), 350 deletions(-) delete mode 100644 app/src/main/java/foundation/e/apps/data/login/exceptions/CleanApkException.kt rename app/src/main/java/foundation/e/apps/data/login/exceptions/{GPlayValidationException.kt => CustomException.kt} (63%) delete mode 100644 app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayException.kt delete mode 100644 app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayLoginException.kt delete mode 100644 app/src/main/java/foundation/e/apps/data/login/exceptions/LoginException.kt delete mode 100644 app/src/main/java/foundation/e/apps/data/login/exceptions/UnknownSourceException.kt diff --git a/app/src/main/java/foundation/e/apps/data/NetworkHandler.kt b/app/src/main/java/foundation/e/apps/data/NetworkHandler.kt index f5c5cdd50..5b13f5591 100644 --- a/app/src/main/java/foundation/e/apps/data/NetworkHandler.kt +++ b/app/src/main/java/foundation/e/apps/data/NetworkHandler.kt @@ -18,9 +18,9 @@ package foundation.e.apps.data +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.data.playstore.utils.GPlayHttpClient import foundation.e.apps.data.playstore.utils.GplayHttpRequestException -import foundation.e.apps.data.login.exceptions.GPlayException import kotlinx.coroutines.delay import timber.log.Timber import java.net.SocketTimeoutException @@ -55,9 +55,15 @@ private fun handleSocketTimeoutException(e: SocketTimeoutException): ResultS private fun resultSupremeGplayHttpRequestException(e: GplayHttpRequestException): ResultSupreme { val message = extractErrorMessage(e) - val exception = GPlayException(e.status == GPlayHttpClient.STATUS_CODE_TIMEOUT, message) + val error = if (e.status == GPlayHttpClient.STATUS_CODE_TIMEOUT) { + CustomException.Error.TIMEOUT_ERROR + } else { + CustomException.Error.UNKNOWN_ERROR + } + + val exception = CustomException(error, message) - return if (exception.isTimeout) { + return if (error == CustomException.Error.TIMEOUT_ERROR) { ResultSupreme.Timeout(exception = exception) } else { ResultSupreme.Error(message, exception) diff --git a/app/src/main/java/foundation/e/apps/data/ResultSupreme.kt b/app/src/main/java/foundation/e/apps/data/ResultSupreme.kt index a7a773f60..70eb4ff6e 100644 --- a/app/src/main/java/foundation/e/apps/data/ResultSupreme.kt +++ b/app/src/main/java/foundation/e/apps/data/ResultSupreme.kt @@ -18,6 +18,7 @@ package foundation.e.apps.data import foundation.e.apps.data.enums.ResultStatus +import foundation.e.apps.data.login.exceptions.CustomException import java.util.concurrent.TimeoutException private const val UNKNOWN_ERROR = "Unknown error!" @@ -60,7 +61,7 @@ sealed class ResultSupreme { data?.let { setData(it) } - this.exception = exception + this.exception?.encapsulatedException = exception } } @@ -76,7 +77,7 @@ sealed class ResultSupreme { */ constructor(message: String, exception: Exception? = null) : this() { this.message = message - this.exception = exception + this.exception?.encapsulatedException = exception } /** @@ -111,7 +112,7 @@ sealed class ResultSupreme { /** * Exception from try-catch block for error cases. */ - var exception: Exception? = null + var exception: CustomException? = null fun isValidData() = data != null @@ -155,7 +156,7 @@ sealed class ResultSupreme { this.data = data } else { this.message = message.ifBlank { status.message } - this.exception = exception + this.exception?.encapsulatedException = exception } } return resultObject diff --git a/app/src/main/java/foundation/e/apps/data/login/AuthObject.kt b/app/src/main/java/foundation/e/apps/data/login/AuthObject.kt index e63f051de..7d2eb7cf7 100644 --- a/app/src/main/java/foundation/e/apps/data/login/AuthObject.kt +++ b/app/src/main/java/foundation/e/apps/data/login/AuthObject.kt @@ -21,8 +21,7 @@ import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.User import foundation.e.apps.data.login.AuthObject.GPlayAuth -import foundation.e.apps.data.login.exceptions.CleanApkException -import foundation.e.apps.data.login.exceptions.GPlayValidationException +import foundation.e.apps.data.login.exceptions.CustomException /** * Auth objects define which sources data is to be loaded from, for each source, also provides @@ -48,10 +47,12 @@ sealed class AuthObject { return GPlayAuth( ResultSupreme.Error( message = message, - exception = GPlayValidationException( + exception = CustomException( + CustomException.Error.AUTHENTICATION_ERROR, message, this.user, 401, + CustomException.Type.GOOGLE_PLAY ) ).apply { otherPayload = this@GPlayAuth.result.otherPayload @@ -66,14 +67,15 @@ sealed class AuthObject { return CleanApk( ResultSupreme.Error( message = "Unauthorized", - exception = CleanApkException( - isTimeout = false, - message = "Unauthorized", + exception = CustomException( + CustomException.Error.AUTHENTICATION_ERROR, + "Unauthorized", + this.user ) ), this.user, ) } } - // Add more auth types here + } diff --git a/app/src/main/java/foundation/e/apps/data/login/AuthenticatorRepository.kt b/app/src/main/java/foundation/e/apps/data/login/AuthenticatorRepository.kt index fccc0b15a..1533dd498 100644 --- a/app/src/main/java/foundation/e/apps/data/login/AuthenticatorRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/login/AuthenticatorRepository.kt @@ -20,7 +20,7 @@ package foundation.e.apps.data.login import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.User -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import javax.inject.Inject import javax.inject.Singleton @@ -34,7 +34,12 @@ class AuthenticatorRepository @Inject constructor( private var gPlayAuth: AuthData? = null fun getGPlayAuthOrThrow(): AuthData { - return gPlayAuth ?: throw GPlayLoginException(false, "AuthData is not available!", getUserType()) + return gPlayAuth ?: throw CustomException( + CustomException.Error.AUTHENTICATION_ERROR, + "AuthData is not available!", + getUserType(), + type = CustomException.Type.GOOGLE_PLAY + ) } fun setGPlayAuth(auth: AuthData) { diff --git a/app/src/main/java/foundation/e/apps/data/login/api/PlayStoreLoginWrapper.kt b/app/src/main/java/foundation/e/apps/data/login/api/PlayStoreLoginWrapper.kt index 4d013b2f0..c1604c3a4 100644 --- a/app/src/main/java/foundation/e/apps/data/login/api/PlayStoreLoginWrapper.kt +++ b/app/src/main/java/foundation/e/apps/data/login/api/PlayStoreLoginWrapper.kt @@ -23,7 +23,7 @@ import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.User import foundation.e.apps.data.playstore.utils.AC2DMUtil import foundation.e.apps.data.handleNetworkResult -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import java.util.Locale @@ -52,8 +52,20 @@ class PlayStoreLoginWrapper constructor( return result.apply { this.data?.locale = locale this.exception = when (result) { - is ResultSupreme.Timeout -> GPlayLoginException(true, "GPlay API timeout", user) - is ResultSupreme.Error -> GPlayLoginException(false, result.message, user) + is ResultSupreme.Timeout -> + CustomException( + CustomException.Error.TIMEOUT_ERROR, + "GPlay API timeout", + user, + type = CustomException.Type.GOOGLE_PLAY + ) + is ResultSupreme.Error -> + CustomException( + CustomException.Error.AUTHENTICATION_ERROR, + result.message, + user, + type = CustomException.Type.GOOGLE_PLAY + ) else -> { EventBus.invokeEvent(AppEvent.SuccessfulLogin(user)) null @@ -82,8 +94,19 @@ class PlayStoreLoginWrapper constructor( } return ResultSupreme.replicate(result, response).apply { this.exception = when (result) { - is ResultSupreme.Timeout -> GPlayLoginException(true, "GPlay API timeout", user) - is ResultSupreme.Error -> GPlayLoginException(false, result.message, user) + is ResultSupreme.Timeout -> + CustomException( + CustomException.Error.TIMEOUT_ERROR, + "GPlay API timeout", + user, + type = CustomException.Type.GOOGLE_PLAY + ) + is ResultSupreme.Error -> CustomException( + CustomException.Error.AUTHENTICATION_ERROR, + result.message, + user, + type = CustomException.Type.GOOGLE_PLAY + ) else -> null } } @@ -129,8 +152,17 @@ class PlayStoreLoginWrapper constructor( } return result.apply { this.exception = when (result) { - is ResultSupreme.Timeout -> GPlayLoginException(true, "GPlay API timeout", User.GOOGLE) - is ResultSupreme.Error -> GPlayLoginException(false, result.message, User.GOOGLE) + is ResultSupreme.Timeout -> CustomException( + CustomException.Error.TIMEOUT_ERROR, + "GPlay API timeout", + User.GOOGLE, + type = CustomException.Type.GOOGLE_PLAY + ) + is ResultSupreme.Error -> CustomException( + CustomException.Error.AUTHENTICATION_ERROR, + result.message, + User.GOOGLE, + type = CustomException.Type.GOOGLE_PLAY) else -> null } } diff --git a/app/src/main/java/foundation/e/apps/data/login/exceptions/CleanApkException.kt b/app/src/main/java/foundation/e/apps/data/login/exceptions/CleanApkException.kt deleted file mode 100644 index 293819914..000000000 --- a/app/src/main/java/foundation/e/apps/data/login/exceptions/CleanApkException.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2019-2022 E FOUNDATION - * - * 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.data.login.exceptions - -/** - * This exception is for all CleanApk data loading exceptions. - */ -class CleanApkException( - val isTimeout: Boolean, - message: String? = null, -) : LoginException(message) diff --git a/app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayValidationException.kt b/app/src/main/java/foundation/e/apps/data/login/exceptions/CustomException.kt similarity index 63% rename from app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayValidationException.kt rename to app/src/main/java/foundation/e/apps/data/login/exceptions/CustomException.kt index 5b4322a4c..271a29bce 100644 --- a/app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayValidationException.kt +++ b/app/src/main/java/foundation/e/apps/data/login/exceptions/CustomException.kt @@ -19,14 +19,23 @@ package foundation.e.apps.data.login.exceptions import foundation.e.apps.data.enums.User -/** - * This exception is specifically used when a GPlay auth data could not be validated. - * This is not the case as timeout, this exception usually means the server informed that the - * current auth data is not valid. - * Use [networkCode] to be sure that the server call was successful (should be 200). - */ -class GPlayValidationException( - message: String, - user: User, - val networkCode: Int, -) : GPlayLoginException(false, message, user) +class CustomException( + val error: Error? = null, + override val message: String? = null, + val user: User? = null, + val networkCode: Int = -1, + val type: Type? = null, + var encapsulatedException: Exception? = null +) : Exception(message) { + + enum class Error { + TIMEOUT_ERROR, + AUTHENTICATION_ERROR, + UNKNOWN_ERROR + } + + enum class Type { + GOOGLE_PLAY, + CLEAN_PK + } +} diff --git a/app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayException.kt b/app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayException.kt deleted file mode 100644 index 345208778..000000000 --- a/app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayException.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2019-2022 E FOUNDATION - * - * 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.data.login.exceptions - -/** - * This exception is for all Google Play network calls or other GPlay related exceptions. - */ -open class GPlayException( - val isTimeout: Boolean, - message: String? = null, -) : LoginException(message) diff --git a/app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayLoginException.kt b/app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayLoginException.kt deleted file mode 100644 index d6a64a7bb..000000000 --- a/app/src/main/java/foundation/e/apps/data/login/exceptions/GPlayLoginException.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2019-2022 MURENA SAS - * - * 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.data.login.exceptions - -import foundation.e.apps.data.enums.User - -/** - * Parent class for all GPlay login related errors. - * Examples: - * unable to get anonymous token, AuthData validation failed, aasToken error etc. - */ -open class GPlayLoginException( - isTimeout: Boolean, - message: String? = null, - val user: User, -) : GPlayException(isTimeout, message) diff --git a/app/src/main/java/foundation/e/apps/data/login/exceptions/LoginException.kt b/app/src/main/java/foundation/e/apps/data/login/exceptions/LoginException.kt deleted file mode 100644 index e69cb47b5..000000000 --- a/app/src/main/java/foundation/e/apps/data/login/exceptions/LoginException.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2019-2022 E FOUNDATION - * - * 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.data.login.exceptions - -/** - * Super class for all Login related exceptions. - * https://gitlab.e.foundation/e/backlog/-/issues/5680 - */ -open class LoginException(message: String?) : Exception(message) diff --git a/app/src/main/java/foundation/e/apps/data/login/exceptions/UnknownSourceException.kt b/app/src/main/java/foundation/e/apps/data/login/exceptions/UnknownSourceException.kt deleted file mode 100644 index 3c881d9f6..000000000 --- a/app/src/main/java/foundation/e/apps/data/login/exceptions/UnknownSourceException.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2019-2022 E FOUNDATION - * - * 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.data.login.exceptions - -/** - * Generic exception class - used to define unknown errors. - */ -class UnknownSourceException : LoginException("") diff --git a/app/src/main/java/foundation/e/apps/install/splitinstall/SplitInstallBinder.kt b/app/src/main/java/foundation/e/apps/install/splitinstall/SplitInstallBinder.kt index a3e0c7684..6d61487dc 100644 --- a/app/src/main/java/foundation/e/apps/install/splitinstall/SplitInstallBinder.kt +++ b/app/src/main/java/foundation/e/apps/install/splitinstall/SplitInstallBinder.kt @@ -26,7 +26,6 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.pm.PackageManager -import android.os.Build import androidx.core.app.ActivityCompat import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat @@ -37,7 +36,7 @@ import foundation.e.apps.R import foundation.e.apps.data.DownloadManager import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.login.AuthenticatorRepository -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -73,7 +72,7 @@ class SplitInstallBinder( authenticatorRepository.getValidatedAuthData() authenticatorRepository.getGPlayAuthOrThrow() downloadModule(packageName, moduleName) - } catch (exception: GPlayLoginException) { + } catch (exception: CustomException) { Timber.w("$AUTH_DATA_ERROR_MESSAGE $exception") handleError(packageName) } diff --git a/app/src/main/java/foundation/e/apps/provider/AgeRatingProvider.kt b/app/src/main/java/foundation/e/apps/provider/AgeRatingProvider.kt index 0ed06df83..0a72459d0 100644 --- a/app/src/main/java/foundation/e/apps/provider/AgeRatingProvider.kt +++ b/app/src/main/java/foundation/e/apps/provider/AgeRatingProvider.kt @@ -26,7 +26,6 @@ import android.content.UriMatcher import android.database.Cursor import android.database.MatrixCursor import android.net.Uri -import android.os.Build import androidx.core.app.NotificationCompat import dagger.hilt.EntryPoint import dagger.hilt.InstallIn @@ -44,7 +43,7 @@ import foundation.e.apps.data.blockedApps.BlockedAppRepository import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.install.models.AppInstall import foundation.e.apps.data.login.AuthenticatorRepository -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.data.parentalcontrol.ContentRatingDao import foundation.e.apps.data.parentalcontrol.ContentRatingEntity import foundation.e.apps.data.parentalcontrol.fdroid.FDroidAntiFeatureRepository @@ -288,7 +287,7 @@ class AgeRatingProvider : ContentProvider() { return try { authenticatorRepository.getGPlayAuthOrThrow() true - } catch (e: GPlayLoginException) { + } catch (e: CustomException) { Timber.e("No AuthData to check content rating") false } diff --git a/app/src/main/java/foundation/e/apps/ui/MainActivity.kt b/app/src/main/java/foundation/e/apps/ui/MainActivity.kt index b897133a0..b3d40fdaa 100644 --- a/app/src/main/java/foundation/e/apps/ui/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/ui/MainActivity.kt @@ -50,7 +50,7 @@ import foundation.e.apps.data.enums.User import foundation.e.apps.data.install.models.AppInstall import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.login.PlayStoreAuthenticator -import foundation.e.apps.data.login.exceptions.GPlayValidationException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.databinding.ActivityMainBinding import foundation.e.apps.install.updates.UpdatesNotifier import foundation.e.apps.ui.application.subFrags.ApplicationDialogFragment @@ -356,7 +356,7 @@ class MainActivity : AppCompatActivity() { gPlayAuthObject?.result?.run { if (isSuccess()) { viewModel.gPlayAuthData = data as AuthData - } else if (exception is GPlayValidationException) { + } else if (exception?.type == CustomException.Type.GOOGLE_PLAY) { val email = otherPayload.toString() viewModel.uploadFaultyTokenToEcloud( email, diff --git a/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt b/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt index c4bde026c..4f4733967 100644 --- a/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt @@ -61,7 +61,7 @@ import foundation.e.apps.data.enums.Status import foundation.e.apps.data.enums.User import foundation.e.apps.data.enums.isInitialized import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.databinding.FragmentApplicationBinding import foundation.e.apps.di.CommonUtilsModule.LIST_OF_NULL import foundation.e.apps.domain.ValidateAppAgeLimitUseCase.Companion.KEY_ANTI_FEATURES_NSFW @@ -621,23 +621,23 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) { } override fun onTimeout( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder - ): AlertDialog.Builder? { + ): AlertDialog.Builder { return predefinedDialog } override fun onSignInError( - exception: GPlayLoginException, + exception: CustomException, predefinedDialog: AlertDialog.Builder - ): AlertDialog.Builder? { + ): AlertDialog.Builder { return predefinedDialog } override fun onDataLoadError( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder - ): AlertDialog.Builder? { + ): AlertDialog.Builder { return predefinedDialog } diff --git a/app/src/main/java/foundation/e/apps/ui/application/ApplicationViewModel.kt b/app/src/main/java/foundation/e/apps/ui/application/ApplicationViewModel.kt index 363198426..19c2df2db 100644 --- a/app/src/main/java/foundation/e/apps/ui/application/ApplicationViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/application/ApplicationViewModel.kt @@ -34,8 +34,7 @@ import foundation.e.apps.data.enums.Status import foundation.e.apps.data.install.AppManagerWrapper import foundation.e.apps.data.install.models.AppInstall import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.CleanApkException -import foundation.e.apps.data.login.exceptions.GPlayException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.data.parentalcontrol.fdroid.FDroidAntiFeatureRepository import foundation.e.apps.data.playstore.PlayStoreRepository import foundation.e.apps.install.download.data.DownloadProgress @@ -148,18 +147,20 @@ class ApplicationViewModel @Inject constructor( updateAppContentRatingState(packageName, appData.first.contentRating) val status = appData.second + val hasTimedOut = appData.second == ResultStatus.TIMEOUT + val error = if (hasTimedOut) { + CustomException.Error.TIMEOUT_ERROR + } else { + CustomException.Error.UNKNOWN_ERROR + } if (appData.second != ResultStatus.OK) { val exception = - if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) - GPlayException( - appData.second == ResultStatus.TIMEOUT, - status.message.ifBlank { "Data load error" } - ) - else CleanApkException( - appData.second == ResultStatus.TIMEOUT, - status.message.ifBlank { "Data load error" } - ) + if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) { + CustomException(error, status.message.ifBlank { "Data load error" }, type = CustomException.Type.GOOGLE_PLAY) + } else { + CustomException(error, status.message.ifBlank { "Data load error" }) + } exceptionsList.add(exception) exceptionsLiveData.postValue(exceptionsList) diff --git a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt index ef7aa73a6..a3050985d 100644 --- a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt @@ -36,7 +36,7 @@ import foundation.e.apps.data.enums.Status import foundation.e.apps.data.application.ApplicationInstaller import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.databinding.FragmentApplicationListBinding import foundation.e.apps.install.download.data.DownloadProgress import foundation.e.apps.install.pkg.PwaManager @@ -270,21 +270,21 @@ class ApplicationListFragment : } override fun onTimeout( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog } override fun onSignInError( - exception: GPlayLoginException, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog } override fun onDataLoadError( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog diff --git a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListViewModel.kt b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListViewModel.kt index bf4272a17..dad65ee63 100644 --- a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListViewModel.kt @@ -28,8 +28,7 @@ import foundation.e.apps.data.enums.Source import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.CleanApkException -import foundation.e.apps.data.login.exceptions.GPlayException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.ui.parentFragment.LoadingViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -112,16 +111,21 @@ class ApplicationListViewModel @Inject constructor( private fun getException( authData: AuthData, result: ResultSupreme, String>> - ) = if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) { - GPlayException( - result.isTimeout(), - result.message.ifBlank { "Data load error" } - ) - } else { - CleanApkException( - result.isTimeout(), - result.message.ifBlank { "Data load error" } - ) + ) : CustomException { + val error = if (result.isTimeout()) { + CustomException.Error.TIMEOUT_ERROR + } else { + CustomException.Error.UNKNOWN_ERROR + } + + if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) { + return CustomException(error, + result.message.ifBlank { "Data load error" }, type = CustomException.Type.GOOGLE_PLAY + ) + } else { + return CustomException(error, result.message.ifBlank { "Data load error" } + ) + } } private fun updateNextPageUrl(nextPageUrl: String?) { diff --git a/app/src/main/java/foundation/e/apps/ui/categories/AppsFragment.kt b/app/src/main/java/foundation/e/apps/ui/categories/AppsFragment.kt index fadb8dd12..5842321bb 100644 --- a/app/src/main/java/foundation/e/apps/ui/categories/AppsFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/categories/AppsFragment.kt @@ -28,7 +28,7 @@ import dagger.hilt.android.AndroidEntryPoint import foundation.e.apps.R import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.databinding.FragmentAppsBinding import foundation.e.apps.ui.MainActivityViewModel import foundation.e.apps.ui.categories.model.CategoriesRVAdapter @@ -80,21 +80,21 @@ class AppsFragment : TimeoutFragment(R.layout.fragment_apps) { } override fun onTimeout( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog } override fun onSignInError( - exception: GPlayLoginException, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog } override fun onDataLoadError( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog diff --git a/app/src/main/java/foundation/e/apps/ui/categories/CategoriesViewModel.kt b/app/src/main/java/foundation/e/apps/ui/categories/CategoriesViewModel.kt index 163562d95..228252f01 100644 --- a/app/src/main/java/foundation/e/apps/ui/categories/CategoriesViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/categories/CategoriesViewModel.kt @@ -27,8 +27,7 @@ import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Category import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.CleanApkException -import foundation.e.apps.data.login.exceptions.GPlayException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.ui.parentFragment.LoadingViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -67,17 +66,15 @@ class CategoriesViewModel @Inject constructor( val status = categoriesData.second + val error = if (categoriesData.second == ResultStatus.TIMEOUT) { + CustomException.Error.TIMEOUT_ERROR + } else { + CustomException.Error.UNKNOWN_ERROR + } + if (status != ResultStatus.OK) { val exception = - if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) - GPlayException( - categoriesData.second == ResultStatus.TIMEOUT, - status.message.ifBlank { "Data load error" } - ) - else CleanApkException( - categoriesData.second == ResultStatus.TIMEOUT, - status.message.ifBlank { "Data load error" } - ) + CustomException(error, status.message.ifBlank { "Data load error" }) exceptionsList.add(exception) exceptionsLiveData.postValue(exceptionsList) diff --git a/app/src/main/java/foundation/e/apps/ui/categories/GamesFragment.kt b/app/src/main/java/foundation/e/apps/ui/categories/GamesFragment.kt index dbbf2ad7a..f245eec8c 100644 --- a/app/src/main/java/foundation/e/apps/ui/categories/GamesFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/categories/GamesFragment.kt @@ -28,7 +28,7 @@ import dagger.hilt.android.AndroidEntryPoint import foundation.e.apps.R import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.databinding.FragmentGamesBinding import foundation.e.apps.ui.MainActivityViewModel import foundation.e.apps.ui.categories.model.CategoriesRVAdapter @@ -80,21 +80,21 @@ class GamesFragment : TimeoutFragment(R.layout.fragment_games) { } override fun onTimeout( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog } override fun onSignInError( - exception: GPlayLoginException, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog } override fun onDataLoadError( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog diff --git a/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt b/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt index 7c5e7c9fc..8ada3f9cb 100644 --- a/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt @@ -33,8 +33,7 @@ import foundation.e.apps.data.enums.Status import foundation.e.apps.data.application.ApplicationInstaller import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.GPlayException -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.databinding.FragmentHomeBinding import foundation.e.apps.di.CommonUtilsModule.safeNavigate import foundation.e.apps.install.download.data.DownloadProgress @@ -145,24 +144,20 @@ class HomeFragment : TimeoutFragment(R.layout.fragment_home), ApplicationInstall } override fun onTimeout( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder - ): AlertDialog.Builder? { + ): AlertDialog.Builder { return predefinedDialog.apply { - if (exception is GPlayException) { - setMessage(R.string.timeout_desc_gplay) - setNegativeButton(R.string.open_settings) { _, _ -> - openSettings() - } - } else { - setMessage(R.string.timeout_desc_cleanapk) + setMessage(R.string.timeout_desc_gplay) + setNegativeButton(R.string.open_settings) { _, _ -> + openSettings() } setCancelable(false) } } override fun onSignInError( - exception: GPlayLoginException, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog.apply { @@ -173,14 +168,12 @@ class HomeFragment : TimeoutFragment(R.layout.fragment_home), ApplicationInstall } override fun onDataLoadError( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder - ): AlertDialog.Builder? { + ): AlertDialog.Builder { return predefinedDialog.apply { - if (exception is GPlayException) { - setNegativeButton(R.string.open_settings) { _, _ -> - openSettings() - } + setNegativeButton(R.string.open_settings) { _, _ -> + openSettings() } } } diff --git a/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt b/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt index afd4f8cd2..74b43a226 100644 --- a/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt @@ -28,8 +28,7 @@ import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Home import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.CleanApkException -import foundation.e.apps.data.login.exceptions.GPlayException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil import foundation.e.apps.ui.parentFragment.LoadingViewModel import kotlinx.coroutines.launch @@ -83,16 +82,13 @@ class HomeViewModel @Inject constructor( return@observe } - val exception = - if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) - GPlayException( - it.isTimeout(), - it.message.ifBlank { "Data load error" } - ) - else CleanApkException( - it.isTimeout(), - it.message.ifBlank { "Data load error" } - ) + val error = if (it.isTimeout()) { + CustomException.Error.TIMEOUT_ERROR + } else { + CustomException.Error.UNKNOWN_ERROR + } + + val exception = CustomException(error, it.message.ifBlank { "Data load error" }) exceptionsList.add(exception) exceptionsLiveData.postValue(exceptionsList) diff --git a/app/src/main/java/foundation/e/apps/ui/parentFragment/LoadingViewModel.kt b/app/src/main/java/foundation/e/apps/ui/parentFragment/LoadingViewModel.kt index a59e502ca..ac62485ac 100644 --- a/app/src/main/java/foundation/e/apps/ui/parentFragment/LoadingViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/parentFragment/LoadingViewModel.kt @@ -20,8 +20,7 @@ package foundation.e.apps.ui.parentFragment import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.GPlayValidationException -import foundation.e.apps.data.login.exceptions.UnknownSourceException +import foundation.e.apps.data.login.exceptions.CustomException abstract class LoadingViewModel : ViewModel() { @@ -29,8 +28,8 @@ abstract class LoadingViewModel : ViewModel() { private var autoRetried = false } - val exceptionsLiveData: MutableLiveData> = MutableLiveData() - val exceptionsList = ArrayList() + val exceptionsLiveData: MutableLiveData> = MutableLiveData() + val exceptionsList = ArrayList() /** * Call this method from ViewModel. @@ -53,11 +52,11 @@ abstract class LoadingViewModel : ViewModel() { val failedAuthList = authObjectList.filter { !it.result.isSuccess() } failedAuthList.forEach { - exceptionsList.add(it.result.exception ?: UnknownSourceException()) + exceptionsList.add(it.result.exception ?: CustomException()) } exceptionsList.find { - it is GPlayValidationException + it.type == CustomException.Type.GOOGLE_PLAY }?.run { if (!autoRetried && retryBlock(failedAuthList)) { autoRetried = true diff --git a/app/src/main/java/foundation/e/apps/ui/parentFragment/TimeoutFragment.kt b/app/src/main/java/foundation/e/apps/ui/parentFragment/TimeoutFragment.kt index 6d3d162b8..30e160d6e 100644 --- a/app/src/main/java/foundation/e/apps/ui/parentFragment/TimeoutFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/parentFragment/TimeoutFragment.kt @@ -35,11 +35,7 @@ import foundation.e.apps.data.enums.User import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.login.PlayStoreAuthenticator import foundation.e.apps.ui.LoginViewModel -import foundation.e.apps.data.login.exceptions.CleanApkException -import foundation.e.apps.data.login.exceptions.GPlayException -import foundation.e.apps.data.login.exceptions.GPlayLoginException -import foundation.e.apps.data.login.exceptions.GPlayValidationException -import foundation.e.apps.data.login.exceptions.UnknownSourceException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.databinding.DialogErrorLogBinding import foundation.e.apps.ui.MainActivityViewModel import timber.log.Timber @@ -138,7 +134,7 @@ abstract class TimeoutFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) { * or null to not show anything. */ abstract fun onTimeout( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder, ): AlertDialog.Builder? @@ -162,7 +158,7 @@ abstract class TimeoutFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) { * or null to not show anything. */ abstract fun onSignInError( - exception: GPlayLoginException, + exception: CustomException, predefinedDialog: AlertDialog.Builder, ): AlertDialog.Builder? @@ -181,7 +177,7 @@ abstract class TimeoutFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) { * 6. Dialog is cancellable. */ abstract fun onDataLoadError( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder, ): AlertDialog.Builder? @@ -248,7 +244,7 @@ abstract class TimeoutFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) { * instance if it deems fit. Else it may return null, in which case no timeout dialog * is shown to the user. */ - fun showTimeout(exception: Exception) { + private fun showTimeout(exception: CustomException) { val dialogView = DialogErrorLogBinding.inflate(requireActivity().layoutInflater) dialogView.apply { moreInfo.setOnClickListener { @@ -296,7 +292,7 @@ abstract class TimeoutFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) { * instance if it deems fit. Else it may return null, at which case no error dialog * is shown to the user. */ - fun showSignInError(exception: GPlayLoginException) { + fun showSignInError(exception: CustomException) { val dialogView = DialogErrorLogBinding.inflate(requireActivity().layoutInflater) dialogView.apply { @@ -329,9 +325,10 @@ abstract class TimeoutFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) { setPositiveButton(R.string.retry) { _, _ -> showLoadingUI() - when (exception) { - is GPlayValidationException -> clearAndRestartGPlayLogin() - else -> loginViewModel.startLoginFlow() + if (exception.networkCode == 401) { + clearAndRestartGPlayLogin() + } else { + loginViewModel.startLoginFlow() } } setNegativeButton(R.string.logout) { _, _ -> @@ -356,7 +353,7 @@ abstract class TimeoutFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) { * instance if it deems fit. Else it may return null, at which case no error dialog * is shown to the user. */ - fun showDataLoadError(exception: Exception) { + fun showDataLoadError(exception: CustomException) { val dialogView = DialogErrorLogBinding.inflate(requireActivity().layoutInflater) dialogView.apply { moreInfo.setOnClickListener { @@ -400,42 +397,27 @@ abstract class TimeoutFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) { * Common code to handle exceptions / errors during data loading. * Can be overridden in child fragments. */ - open fun handleExceptionsCommon(exceptions: List) { - val cleanApkException = exceptions.find { it is CleanApkException }?.run { - this as CleanApkException - } - val gPlayException = exceptions.find { it is GPlayException }?.run { - this as GPlayException - } - val unknownSourceException = exceptions.find { it is UnknownSourceException } + open fun handleExceptionsCommon(exceptions: List) { - if (gPlayException?.message?.contains(STATUS_TOO_MANY_REQUESTS) == true) { - return - } + exceptions.forEach { + when { + it.type == CustomException.Type.GOOGLE_PLAY -> { + if (it.message?.contains(STATUS_TOO_MANY_REQUESTS) == true) { + return + } - /* - * Take caution altering the cases. - * Cases to be defined from most restrictive to least restrictive. - */ - when { - // Handle timeouts - cleanApkException?.isTimeout == true -> showTimeout(cleanApkException) - gPlayException?.isTimeout == true -> showTimeout(gPlayException) - - // Handle sign-in error - gPlayException is GPlayLoginException -> showSignInError(gPlayException) - - // Other errors - data loading error - gPlayException != null -> showDataLoadError(gPlayException) - cleanApkException != null -> showDataLoadError(cleanApkException) - - // Unknown exception - unknownSourceException != null -> { - showAndSetDialog( + if (it.error == CustomException.Error.AUTHENTICATION_ERROR) { + showSignInError(it) + } + } + + it.error == CustomException.Error.TIMEOUT_ERROR -> showTimeout(it) + + else -> showAndSetDialog( AlertDialog.Builder(requireActivity()) .setTitle(R.string.unknown_error) - .setPositiveButton(R.string.close, null) - ) + .setPositiveButton(R.string.close, null)) + } } } diff --git a/app/src/main/java/foundation/e/apps/ui/search/SearchFragment.kt b/app/src/main/java/foundation/e/apps/ui/search/SearchFragment.kt index c84b019d8..0ae80fa78 100644 --- a/app/src/main/java/foundation/e/apps/ui/search/SearchFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/search/SearchFragment.kt @@ -49,7 +49,7 @@ import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.enums.Status import foundation.e.apps.data.install.models.AppInstall import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.databinding.FragmentSearchBinding import foundation.e.apps.install.download.data.DownloadProgress import foundation.e.apps.install.pkg.PwaManager @@ -344,21 +344,21 @@ class SearchFragment : } override fun onTimeout( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog } override fun onDataLoadError( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog } override fun onSignInError( - exception: GPlayLoginException, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog diff --git a/app/src/main/java/foundation/e/apps/ui/search/SearchViewModel.kt b/app/src/main/java/foundation/e/apps/ui/search/SearchViewModel.kt index 9d89d8f31..61eb29a7c 100644 --- a/app/src/main/java/foundation/e/apps/ui/search/SearchViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/search/SearchViewModel.kt @@ -34,9 +34,7 @@ import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.exodus.repositories.IAppPrivacyInfoRepository import foundation.e.apps.data.exodus.repositories.PrivacyScoreRepository import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.CleanApkException -import foundation.e.apps.data.login.exceptions.GPlayException -import foundation.e.apps.data.login.exceptions.UnknownSourceException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.di.CommonUtilsModule.LIST_OF_NULL import foundation.e.apps.ui.parentFragment.LoadingViewModel import kotlinx.coroutines.Dispatchers @@ -151,20 +149,16 @@ class SearchViewModel @Inject constructor( hasGPlayBeenFetched = false emitFilteredResults(searchResultSupreme) + if (!searchResultSupreme.isSuccess()) { - val exception = - if (authData != null) { - GPlayException( - searchResultSupreme.isTimeout(), - searchResultSupreme.message.ifBlank { DATA_LOAD_ERROR } - ) - } else { - CleanApkException( - searchResultSupreme.isTimeout(), - searchResultSupreme.message.ifBlank { DATA_LOAD_ERROR } - ) - } + val error = if (searchResultSupreme.isTimeout()) { + CustomException.Error.TIMEOUT_ERROR + } else { + CustomException.Error.UNKNOWN_ERROR + } + + val exception = CustomException(error, searchResultSupreme.message.ifBlank { DATA_LOAD_ERROR }) handleException(exception) } @@ -196,7 +190,7 @@ class SearchViewModel @Inject constructor( val gplaySearchResult = applicationRepository.getGplaySearchResults(query, nextSubBundle) if (!gplaySearchResult.isSuccess()) { - handleException(gplaySearchResult.exception ?: UnknownSourceException()) + handleException(gplaySearchResult.exception ?: CustomException()) } nextSubBundle = gplaySearchResult.data?.second @@ -219,7 +213,7 @@ class SearchViewModel @Inject constructor( return currentAppList.distinctBy { it.package_name } } - private fun handleException(exception: Exception) { + private fun handleException(exception: CustomException) { exceptionsList.add(exception) exceptionsLiveData.postValue(exceptionsList) } diff --git a/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt index 941ec2f11..f1629f5c8 100644 --- a/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt @@ -42,8 +42,7 @@ import foundation.e.apps.data.application.ApplicationInstaller import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.install.models.AppInstall import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.GPlayException -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.databinding.FragmentUpdatesBinding import foundation.e.apps.di.CommonUtilsModule.safeNavigate import foundation.e.apps.install.download.data.DownloadProgress @@ -153,7 +152,14 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), ApplicationI Timber.d("===>> observeupdate list called") if (resultStatus != ResultStatus.OK) { - val exception = GPlayException(resultStatus == ResultStatus.TIMEOUT) + val error = if (resultStatus == ResultStatus.TIMEOUT) { + CustomException.Error.TIMEOUT_ERROR + } else { + CustomException.Error.UNKNOWN_ERROR + } + + val exception = CustomException(error, "exception") + val alertDialogBuilder = AlertDialog.Builder(requireContext()) onTimeout(exception, alertDialogBuilder) } @@ -238,11 +244,11 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), ApplicationI } override fun onTimeout( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog.apply { - if (exception is GPlayException) { + if (exception.type == CustomException.Type.GOOGLE_PLAY) { setMessage(R.string.timeout_desc_gplay) setNegativeButton(R.string.open_settings) { _, _ -> openSettings() @@ -254,7 +260,7 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), ApplicationI } override fun onSignInError( - exception: GPlayLoginException, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog.apply { @@ -265,11 +271,11 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), ApplicationI } override fun onDataLoadError( - exception: Exception, + exception: CustomException, predefinedDialog: AlertDialog.Builder ): AlertDialog.Builder? { return predefinedDialog.apply { - if (exception is GPlayException) { + if (exception.type == CustomException.Type.GOOGLE_PLAY) { setNegativeButton(R.string.open_settings) { _, _ -> openSettings() } diff --git a/app/src/main/java/foundation/e/apps/ui/updates/UpdatesViewModel.kt b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesViewModel.kt index 77214dc20..41f8d6871 100644 --- a/app/src/main/java/foundation/e/apps/ui/updates/UpdatesViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesViewModel.kt @@ -28,8 +28,7 @@ import foundation.e.apps.data.enums.Status import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.CleanApkException -import foundation.e.apps.data.login.exceptions.GPlayException +import foundation.e.apps.data.login.exceptions.CustomException import foundation.e.apps.data.preference.AppLoungePreference import foundation.e.apps.data.updates.UpdatesManagerRepository import foundation.e.apps.ui.parentFragment.LoadingViewModel @@ -73,18 +72,14 @@ class UpdatesViewModel @Inject constructor( val status = updatesResult.second if (status != ResultStatus.OK) { - val exception = - if (authData != null && - (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) - ) { - GPlayException( - updatesResult.second == ResultStatus.TIMEOUT, - status.message.ifBlank { "Data load error" } - ) - } else CleanApkException( - updatesResult.second == ResultStatus.TIMEOUT, - status.message.ifBlank { "Data load error" } - ) + + val error = if (updatesResult.second == ResultStatus.TIMEOUT) { + CustomException.Error.TIMEOUT_ERROR + } else { + CustomException.Error.UNKNOWN_ERROR + } + + val exception = CustomException(error, status.message.ifBlank { "Data load error" }) exceptionsList.add(exception) exceptionsLiveData.postValue(exceptionsList) -- GitLab