From 8f316a15d936d24aee94a6973e2162b2054da13c Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 18:01:30 +0530 Subject: [PATCH 01/12] define livedata in AppLoungeApplication.kt --- .../main/java/foundation/e/apps/AppLoungeApplication.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/AppLoungeApplication.kt b/app/src/main/java/foundation/e/apps/AppLoungeApplication.kt index 08a583145..45bcaacfd 100644 --- a/app/src/main/java/foundation/e/apps/AppLoungeApplication.kt +++ b/app/src/main/java/foundation/e/apps/AppLoungeApplication.kt @@ -21,6 +21,7 @@ package foundation.e.apps import android.app.Application import android.util.Log import androidx.hilt.work.HiltWorkerFactory +import androidx.lifecycle.MutableLiveData import androidx.work.Configuration import dagger.hilt.android.HiltAndroidApp import foundation.e.apps.manager.pkg.PkgManagerBR @@ -50,6 +51,12 @@ class AppLoungeApplication : Application(), Configuration.Provider { @Inject lateinit var dataStoreModule: DataStoreModule + /* + * Populate this with auth object class names. + * Example: if GPlay login is invalid, put AuthObject.GPlayAuth::class.java.simpleName + */ + val loginInvalidLivedata by lazy { MutableLiveData() } + override fun onCreate() { super.onCreate() -- GitLab From 573af7461e4e31ff382147954c060c04d208ffdd Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 18:02:37 +0530 Subject: [PATCH 02/12] define loginInvalidLivedata in di --- .../java/foundation/e/apps/di/LoginModule.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/di/LoginModule.kt b/app/src/main/java/foundation/e/apps/di/LoginModule.kt index 559d7e84d..0a2a588a5 100644 --- a/app/src/main/java/foundation/e/apps/di/LoginModule.kt +++ b/app/src/main/java/foundation/e/apps/di/LoginModule.kt @@ -17,17 +17,34 @@ package foundation.e.apps.di +import android.content.Context +import androidx.lifecycle.MutableLiveData import dagger.Module import dagger.Provides import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import foundation.e.apps.AppLoungeApplication import foundation.e.apps.login.LoginSourceCleanApk import foundation.e.apps.login.LoginSourceGPlay import foundation.e.apps.login.LoginSourceInterface +import javax.inject.Named +import kotlinx.coroutines.DelicateCoroutinesApi @InstallIn(SingletonComponent::class) @Module object LoginModule { + + @OptIn(DelicateCoroutinesApi::class) + @Named("loginInvalidData") + @Provides + fun provideLoginInvalidLivedata( + @ApplicationContext context: Context, + ): MutableLiveData { + val application = context.applicationContext as AppLoungeApplication + return application.loginInvalidLivedata + } + @Provides fun providesLoginSources( gPlay: LoginSourceGPlay, -- GitLab From ae5c6708d3b2e72d261ee31e1f3f1ea80a4ff18c Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 18:31:45 +0530 Subject: [PATCH 03/12] post invalid state from GPlayHttpClient.kt if 401 network code --- .../e/apps/api/gplay/utils/GPlayHttpClient.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/apps/api/gplay/utils/GPlayHttpClient.kt b/app/src/main/java/foundation/e/apps/api/gplay/utils/GPlayHttpClient.kt index 6725e07b1..79ec15994 100644 --- a/app/src/main/java/foundation/e/apps/api/gplay/utils/GPlayHttpClient.kt +++ b/app/src/main/java/foundation/e/apps/api/gplay/utils/GPlayHttpClient.kt @@ -19,8 +19,10 @@ package foundation.e.apps.api.gplay.utils +import androidx.lifecycle.MutableLiveData import com.aurora.gplayapi.data.models.PlayResponse import com.aurora.gplayapi.network.IHttpClient +import foundation.e.apps.login.AuthObject import foundation.e.apps.utils.modules.CommonUtilsFunctions import okhttp3.Cache import okhttp3.Headers.Companion.toHeaders @@ -37,9 +39,11 @@ import java.io.IOException import java.net.SocketTimeoutException import java.net.UnknownHostException import javax.inject.Inject +import javax.inject.Named class GPlayHttpClient @Inject constructor( - cache: Cache + cache: Cache, + @Named("loginInvalidData") private val loginInvalidLivedata: MutableLiveData, ) : IHttpClient { private val POST = "POST" @@ -178,6 +182,11 @@ class GPlayHttpClient @Inject constructor( isSuccessful = response.isSuccessful code = response.code + loginInvalidLivedata.postValue( + if (code == 401) AuthObject.GPlayAuth::class.java.simpleName + else "" + ) + if (response.body != null) { responseBytes = response.body!!.bytes() } -- GitLab From 6c38b0c2b7c39cde5e82e9eeab63bf618c50d911 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 19:04:09 +0530 Subject: [PATCH 04/12] markInvalidAuthObject in LoginViewModel.kt --- .../foundation/e/apps/login/LoginViewModel.kt | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt index d4bee02b9..e1e89a75e 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt @@ -21,7 +21,10 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import foundation.e.apps.api.ResultSupreme import foundation.e.apps.utils.enums.User +import foundation.e.apps.utils.exceptions.CleanApkException +import foundation.e.apps.utils.exceptions.GPlayValidationException import kotlinx.coroutines.launch import javax.inject.Inject @@ -99,6 +102,47 @@ class LoginViewModel @Inject constructor( } } + fun markInvalidAuthObject(sourceName: String) { + val authObjectsLocal = authObjects.value?.toMutableList() + val invalidObject = authObjectsLocal?.find { it::class.java.simpleName == sourceName } + + val replacedObject = when (invalidObject) { + is AuthObject.GPlayAuth -> + AuthObject.GPlayAuth( + ResultSupreme.Error( + message = "Unauthorized", + exception = GPlayValidationException( + "Unauthorized", + invalidObject.user, + 401, + ) + ), + invalidObject.user, + ) + is AuthObject.CleanApk -> + AuthObject.CleanApk( + ResultSupreme.Error( + message = "Unauthorized", + exception = CleanApkException( + isTimeout = false, + message = "Unauthorized", + ) + ), + invalidObject.user, + ) + else -> null + } + + authObjectsLocal?.apply { + if (invalidObject != null && replacedObject != null) { + remove(invalidObject) + add(replacedObject) + } + } + + authObjects.postValue(authObjectsLocal) + } + /** * Clears all saved data and logs out the user to the sign in screen. */ -- GitLab From 06274052109a76241ca2d6e4ff8b080d3cd5b203 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 19:07:05 +0530 Subject: [PATCH 05/12] observe loginInvalidLivedata from MainActivity.kt --- app/src/main/java/foundation/e/apps/MainActivity.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index e9a8adfb5..0cd94dd71 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -26,6 +26,7 @@ import android.os.StatFs import android.os.storage.StorageManager import android.view.View import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.lifecycleScope @@ -61,6 +62,8 @@ import kotlinx.coroutines.launch import timber.log.Timber import java.io.File import java.util.UUID +import javax.inject.Inject +import javax.inject.Named @AndroidEntryPoint class MainActivity : AppCompatActivity() { @@ -70,6 +73,10 @@ class MainActivity : AppCompatActivity() { private val TAG = MainActivity::class.java.simpleName private lateinit var viewModel: MainActivityViewModel + @Inject + @Named("loginInvalidData") + lateinit var loginInvalidLivedata: MutableLiveData + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -113,6 +120,12 @@ class MainActivity : AppCompatActivity() { } } + loginInvalidLivedata.distinctUntilChanged().observe(this) { + if (it.isNotBlank()) { + loginViewModel.markInvalidAuthObject(it) + } + } + loginViewModel.authObjects.distinctUntilChanged().observe(this) { when { it == null -> return@observe -- GitLab From 49c980c3d731c214e4a086f7a79c54982ec8941b Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 19:13:55 +0530 Subject: [PATCH 06/12] update GPlay validation message in markInvalidAuthObject --- .../main/java/foundation/e/apps/login/LoginViewModel.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt index e1e89a75e..a2620c66b 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt @@ -107,18 +107,21 @@ class LoginViewModel @Inject constructor( val invalidObject = authObjectsLocal?.find { it::class.java.simpleName == sourceName } val replacedObject = when (invalidObject) { - is AuthObject.GPlayAuth -> + is AuthObject.GPlayAuth -> { + val message = "Validating AuthData failed.\n" + + "Network code: 401" AuthObject.GPlayAuth( ResultSupreme.Error( - message = "Unauthorized", + message = message, exception = GPlayValidationException( - "Unauthorized", + message, invalidObject.user, 401, ) ), invalidObject.user, ) + } is AuthObject.CleanApk -> AuthObject.CleanApk( ResultSupreme.Error( -- GitLab From 440e11de5d5683b21414d0b0bb4f1f195a3d4637 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 19:15:23 +0530 Subject: [PATCH 07/12] skip validation --- .../java/foundation/e/apps/login/LoginSourceGPlay.kt | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) 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 c48081ddb..7e8568e1f 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt @@ -86,13 +86,8 @@ class LoginSourceGPlay @Inject constructor( } ) - // validate authData and save it if nothing is saved (first time use.) - validateAuthData(authData).run { - if (isSuccess() && savedAuth == null) { - saveAuthData(authData) - } - return AuthObject.GPlayAuth(this, user) - } + saveAuthData(authData) + return AuthObject.GPlayAuth(ResultSupreme.Success(authData), user) } override suspend fun clearSavedAuth() { -- GitLab From e8da5fb11e64c737c28257cd47b712d53ea59831 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 20:54:09 +0530 Subject: [PATCH 08/12] improvement in saving authData --- .../foundation/e/apps/login/LoginSourceGPlay.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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 7e8568e1f..6585b3c78 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt @@ -26,6 +26,7 @@ import foundation.e.apps.login.api.GPlayApiFactory import foundation.e.apps.login.api.GPlayLoginInterface import foundation.e.apps.login.api.GoogleLoginApi 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 java.util.Locale @@ -86,8 +87,19 @@ class LoginSourceGPlay @Inject constructor( } ) - saveAuthData(authData) - return AuthObject.GPlayAuth(ResultSupreme.Success(authData), user) + val formattedAuthData = formattedAuthData(authData) + formattedAuthData.locale = locale + val result: ResultSupreme = ResultSupreme.create( + status = ResultStatus.OK, + data = formattedAuthData + ) + result.otherPayload = formattedAuthData.email + + if (savedAuth == null) { + saveAuthData(formattedAuthData) + } + + return AuthObject.GPlayAuth(result, user) } override suspend fun clearSavedAuth() { -- GitLab From a389648d64009853388f075b9ad4aa9935f0b77f Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 20:55:34 +0530 Subject: [PATCH 09/12] pass invalid token mail to replaced authObject --- .../main/java/foundation/e/apps/login/LoginViewModel.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt index a2620c66b..ffcda225e 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt @@ -20,6 +20,7 @@ package foundation.e.apps.login import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.lifecycle.HiltViewModel import foundation.e.apps.api.ResultSupreme import foundation.e.apps.utils.enums.User @@ -111,14 +112,16 @@ class LoginViewModel @Inject constructor( val message = "Validating AuthData failed.\n" + "Network code: 401" AuthObject.GPlayAuth( - ResultSupreme.Error( + ResultSupreme.Error( message = message, exception = GPlayValidationException( message, invalidObject.user, 401, ) - ), + ).apply { + otherPayload = invalidObject.result.otherPayload + }, invalidObject.user, ) } -- GitLab From 63ff52559a49312d0623f3821b684edc9a12764f Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 21:01:28 +0530 Subject: [PATCH 10/12] documentation for markInvalidAuthObject --- .../main/java/foundation/e/apps/login/LoginViewModel.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt index ffcda225e..fa44fdd0d 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt @@ -26,6 +26,7 @@ import foundation.e.apps.api.ResultSupreme import foundation.e.apps.utils.enums.User import foundation.e.apps.utils.exceptions.CleanApkException import foundation.e.apps.utils.exceptions.GPlayValidationException +import foundation.e.apps.utils.parentFragment.LoadingViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -103,6 +104,12 @@ class LoginViewModel @Inject constructor( } } + /** + * Once an AuthObject is marked as invalid, it will be refreshed + * automatically by LoadingViewModel. + * If GPlay auth is invalid, [LoadingViewModel.onLoadData] has a retry block, + * this block will clear existing GPlay AuthData and freshly start the login flow. + */ fun markInvalidAuthObject(sourceName: String) { val authObjectsLocal = authObjects.value?.toMutableList() val invalidObject = authObjectsLocal?.find { it::class.java.simpleName == sourceName } -- GitLab From 0907f43e10586f9bac80237fd86baadc94349641 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 14 Mar 2023 21:01:55 +0530 Subject: [PATCH 11/12] minor refactor --- app/src/main/java/foundation/e/apps/login/LoginViewModel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt index fa44fdd0d..41777b2e8 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt @@ -110,9 +110,9 @@ class LoginViewModel @Inject constructor( * If GPlay auth is invalid, [LoadingViewModel.onLoadData] has a retry block, * this block will clear existing GPlay AuthData and freshly start the login flow. */ - fun markInvalidAuthObject(sourceName: String) { + fun markInvalidAuthObject(authObjectName: String) { val authObjectsLocal = authObjects.value?.toMutableList() - val invalidObject = authObjectsLocal?.find { it::class.java.simpleName == sourceName } + val invalidObject = authObjectsLocal?.find { it::class.java.simpleName == authObjectName } val replacedObject = when (invalidObject) { is AuthObject.GPlayAuth -> { -- GitLab From 59edf7c5d9a228b542aedaff42e630fa4c993d62 Mon Sep 17 00:00:00 2001 From: hasibprince Date: Wed, 15 Mar 2023 15:21:57 +0600 Subject: [PATCH 12/12] Refactor handling invalid auth --- .../foundation/e/apps/AppLoungeApplication.kt | 7 --- .../java/foundation/e/apps/MainActivity.kt | 34 ++++++----- .../e/apps/api/gplay/utils/GPlayHttpClient.kt | 20 ++++--- .../java/foundation/e/apps/di/LoginModule.kt | 16 ------ .../e/apps/login/LoginSourceGPlay.kt | 10 ++-- .../foundation/e/apps/login/LoginViewModel.kt | 57 +++++++++++-------- .../e/apps/utils/eventBus/AppEvent.kt | 2 + 7 files changed, 72 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/AppLoungeApplication.kt b/app/src/main/java/foundation/e/apps/AppLoungeApplication.kt index 45bcaacfd..08a583145 100644 --- a/app/src/main/java/foundation/e/apps/AppLoungeApplication.kt +++ b/app/src/main/java/foundation/e/apps/AppLoungeApplication.kt @@ -21,7 +21,6 @@ package foundation.e.apps import android.app.Application import android.util.Log import androidx.hilt.work.HiltWorkerFactory -import androidx.lifecycle.MutableLiveData import androidx.work.Configuration import dagger.hilt.android.HiltAndroidApp import foundation.e.apps.manager.pkg.PkgManagerBR @@ -51,12 +50,6 @@ class AppLoungeApplication : Application(), Configuration.Provider { @Inject lateinit var dataStoreModule: DataStoreModule - /* - * Populate this with auth object class names. - * Example: if GPlay login is invalid, put AuthObject.GPlayAuth::class.java.simpleName - */ - val loginInvalidLivedata by lazy { MutableLiveData() } - override fun onCreate() { super.onCreate() diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index 0cd94dd71..dd3b075e2 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -26,7 +26,6 @@ import android.os.StatFs import android.os.storage.StorageManager import android.view.View import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.lifecycleScope @@ -57,13 +56,12 @@ import foundation.e.apps.utils.eventBus.EventBus import foundation.e.apps.utils.exceptions.GPlayValidationException import foundation.e.apps.utils.modules.CommonUtilsFunctions import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.launch import timber.log.Timber import java.io.File import java.util.UUID -import javax.inject.Inject -import javax.inject.Named @AndroidEntryPoint class MainActivity : AppCompatActivity() { @@ -73,10 +71,6 @@ class MainActivity : AppCompatActivity() { private val TAG = MainActivity::class.java.simpleName private lateinit var viewModel: MainActivityViewModel - @Inject - @Named("loginInvalidData") - lateinit var loginInvalidLivedata: MutableLiveData - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -120,12 +114,6 @@ class MainActivity : AppCompatActivity() { } } - loginInvalidLivedata.distinctUntilChanged().observe(this) { - if (it.isNotBlank()) { - loginViewModel.markInvalidAuthObject(it) - } - } - loginViewModel.authObjects.distinctUntilChanged().observe(this) { when { it == null -> return@observe @@ -143,7 +131,10 @@ class MainActivity : AppCompatActivity() { viewModel.gPlayAuthData = data as AuthData } else if (exception is GPlayValidationException) { val email = otherPayload.toString() - viewModel.uploadFaultyTokenToEcloud(email, CommonUtilsFunctions.getAppBuildInfo()) + viewModel.uploadFaultyTokenToEcloud( + email, + CommonUtilsFunctions.getAppBuildInfo() + ) } } } @@ -226,6 +217,8 @@ class MainActivity : AppCompatActivity() { viewModel.updateAppWarningList() lifecycleScope.launchWhenResumed { + observeInvalidAuth() + EventBus.events.filter { appEvent -> appEvent is AppEvent.SignatureMissMatchError }.collectLatest { @@ -239,6 +232,19 @@ class MainActivity : AppCompatActivity() { } } + private suspend fun observeInvalidAuth() { + EventBus.events.filter { appEvent -> + appEvent is AppEvent.InvalidAuthEvent + }.distinctUntilChanged { old, new -> + ((old.data is String) && (new.data is String) && old.data == new.data) + }.collectLatest { + val data = it.data as String + if (data.isNotBlank()) { + loginViewModel.markInvalidAuthObject(data) + } + } + } + private fun setupBottomNavItemSelectedListener( bottomNavigationView: BottomNavigationView, navHostFragment: NavHostFragment, diff --git a/app/src/main/java/foundation/e/apps/api/gplay/utils/GPlayHttpClient.kt b/app/src/main/java/foundation/e/apps/api/gplay/utils/GPlayHttpClient.kt index 79ec15994..9876fa4d1 100644 --- a/app/src/main/java/foundation/e/apps/api/gplay/utils/GPlayHttpClient.kt +++ b/app/src/main/java/foundation/e/apps/api/gplay/utils/GPlayHttpClient.kt @@ -19,11 +19,14 @@ package foundation.e.apps.api.gplay.utils -import androidx.lifecycle.MutableLiveData import com.aurora.gplayapi.data.models.PlayResponse import com.aurora.gplayapi.network.IHttpClient import foundation.e.apps.login.AuthObject +import foundation.e.apps.utils.eventBus.AppEvent +import foundation.e.apps.utils.eventBus.EventBus import foundation.e.apps.utils.modules.CommonUtilsFunctions +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch import okhttp3.Cache import okhttp3.Headers.Companion.toHeaders import okhttp3.HttpUrl @@ -39,11 +42,9 @@ import java.io.IOException import java.net.SocketTimeoutException import java.net.UnknownHostException import javax.inject.Inject -import javax.inject.Named class GPlayHttpClient @Inject constructor( cache: Cache, - @Named("loginInvalidData") private val loginInvalidLivedata: MutableLiveData, ) : IHttpClient { private val POST = "POST" @@ -182,10 +183,15 @@ class GPlayHttpClient @Inject constructor( isSuccessful = response.isSuccessful code = response.code - loginInvalidLivedata.postValue( - if (code == 401) AuthObject.GPlayAuth::class.java.simpleName - else "" - ) + Timber.d("$TAG: Url: ${response.request.url}\nStatus: $code") + + if (code == 401) { + MainScope().launch { + EventBus.invokeEvent( + AppEvent.InvalidAuthEvent(AuthObject.GPlayAuth::class.java.simpleName) + ) + } + } if (response.body != null) { responseBytes = response.body!!.bytes() diff --git a/app/src/main/java/foundation/e/apps/di/LoginModule.kt b/app/src/main/java/foundation/e/apps/di/LoginModule.kt index 0a2a588a5..ba12b0f08 100644 --- a/app/src/main/java/foundation/e/apps/di/LoginModule.kt +++ b/app/src/main/java/foundation/e/apps/di/LoginModule.kt @@ -17,34 +17,18 @@ package foundation.e.apps.di -import android.content.Context -import androidx.lifecycle.MutableLiveData import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import foundation.e.apps.AppLoungeApplication import foundation.e.apps.login.LoginSourceCleanApk import foundation.e.apps.login.LoginSourceGPlay import foundation.e.apps.login.LoginSourceInterface -import javax.inject.Named -import kotlinx.coroutines.DelicateCoroutinesApi @InstallIn(SingletonComponent::class) @Module object LoginModule { - @OptIn(DelicateCoroutinesApi::class) - @Named("loginInvalidData") - @Provides - fun provideLoginInvalidLivedata( - @ApplicationContext context: Context, - ): MutableLiveData { - val application = context.applicationContext as AppLoungeApplication - return application.loginInvalidLivedata - } - @Provides fun providesLoginSources( gPlay: LoginSourceGPlay, 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 6585b3c78..b77c57a8b 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt @@ -87,7 +87,7 @@ class LoginSourceGPlay @Inject constructor( } ) - val formattedAuthData = formattedAuthData(authData) + val formattedAuthData = formatAuthData(authData) formattedAuthData.locale = locale val result: ResultSupreme = ResultSupreme.create( status = ResultStatus.OK, @@ -146,7 +146,7 @@ class LoginSourceGPlay @Inject constructor( * Aurora OSS GPlay API complains of missing headers sometimes. * Converting [authData] to Json and back to [AuthData] fixed it. */ - private fun formattedAuthData(authData: AuthData): AuthData { + private fun formatAuthData(authData: AuthData): AuthData { val localAuthDataJson = gson.toJson(authData) return gson.fromJson(localAuthDataJson, AuthData::class.java) } @@ -156,7 +156,7 @@ class LoginSourceGPlay @Inject constructor( */ private suspend fun getAuthData(): ResultSupreme { return loginApiRepository.fetchAuthData("", "", locale).run { - if (isSuccess()) ResultSupreme.Success(formattedAuthData(this.data!!)) + if (isSuccess()) ResultSupreme.Success(formatAuthData(this.data!!)) else this } } @@ -207,7 +207,7 @@ class LoginSourceGPlay @Inject constructor( */ loginDataStore.saveAasToken(aasTokenFetched) return loginApiRepository.fetchAuthData(email, aasTokenFetched, locale).run { - if (isSuccess()) ResultSupreme.Success(formattedAuthData(this.data!!)) + if (isSuccess()) ResultSupreme.Success(formatAuthData(this.data!!)) else this } } @@ -221,7 +221,7 @@ class LoginSourceGPlay @Inject constructor( authData: AuthData, ): ResultSupreme { - val formattedAuthData = formattedAuthData(authData) + val formattedAuthData = formatAuthData(authData) formattedAuthData.locale = locale val validityResponse = loginApiRepository.login(formattedAuthData) diff --git a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt index 41777b2e8..6cb9b6bb5 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginViewModel.kt @@ -116,33 +116,10 @@ class LoginViewModel @Inject constructor( val replacedObject = when (invalidObject) { is AuthObject.GPlayAuth -> { - val message = "Validating AuthData failed.\n" + - "Network code: 401" - AuthObject.GPlayAuth( - ResultSupreme.Error( - message = message, - exception = GPlayValidationException( - message, - invalidObject.user, - 401, - ) - ).apply { - otherPayload = invalidObject.result.otherPayload - }, - invalidObject.user, - ) + createInvalidGplayAuth(invalidObject) } is AuthObject.CleanApk -> - AuthObject.CleanApk( - ResultSupreme.Error( - message = "Unauthorized", - exception = CleanApkException( - isTimeout = false, - message = "Unauthorized", - ) - ), - invalidObject.user, - ) + createInvalidCleanApkAuth(invalidObject) else -> null } @@ -156,6 +133,36 @@ class LoginViewModel @Inject constructor( authObjects.postValue(authObjectsLocal) } + private fun createInvalidCleanApkAuth(invalidObject: AuthObject.CleanApk) = + AuthObject.CleanApk( + ResultSupreme.Error( + message = "Unauthorized", + exception = CleanApkException( + isTimeout = false, + message = "Unauthorized", + ) + ), + invalidObject.user, + ) + + private fun createInvalidGplayAuth(invalidObject: AuthObject.GPlayAuth): AuthObject.GPlayAuth { + val message = "Validating AuthData failed.\nNetwork code: 401" + + return AuthObject.GPlayAuth( + ResultSupreme.Error( + message = message, + exception = GPlayValidationException( + message, + invalidObject.user, + 401, + ) + ).apply { + otherPayload = invalidObject.result.otherPayload + }, + invalidObject.user, + ) + } + /** * Clears all saved data and logs out the user to the sign in screen. */ diff --git a/app/src/main/java/foundation/e/apps/utils/eventBus/AppEvent.kt b/app/src/main/java/foundation/e/apps/utils/eventBus/AppEvent.kt index 797f708c0..1509729b2 100644 --- a/app/src/main/java/foundation/e/apps/utils/eventBus/AppEvent.kt +++ b/app/src/main/java/foundation/e/apps/utils/eventBus/AppEvent.kt @@ -26,4 +26,6 @@ import foundation.e.apps.utils.enums.ResultStatus sealed class AppEvent(val data: Any) { class SignatureMissMatchError(packageName: String) : AppEvent(packageName) class UpdateEvent(result: ResultSupreme.WorkError) : AppEvent(result) + + class InvalidAuthEvent(authName: String) : AppEvent(authName) } -- GitLab