Loading app/src/main/java/foundation/e/apps/data/gplay/GplayStoreRepositoryImpl.kt +7 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package foundation.e.apps.data.gplay import android.content.Context import app.lounge.storage.cache.configurations import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData Loading @@ -33,6 +34,7 @@ import com.aurora.gplayapi.helpers.Chart import com.aurora.gplayapi.helpers.PurchaseHelper import com.aurora.gplayapi.helpers.SearchHelper import com.aurora.gplayapi.helpers.TopChartsHelper import com.google.gson.Gson import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R import foundation.e.apps.data.fused.utils.CategoryType Loading @@ -55,7 +57,7 @@ class GplayStoreRepositoryImpl @Inject constructor( override suspend fun getHomeScreenData(): Any { val homeScreenData = mutableMapOf<String, List<App>>() val homeElements = createTopChartElements() val authData = loginSourceRepository.gplayAuth ?: return homeScreenData val authData = getAuthData()//loginSourceRepository.gplayAuth ?: return homeScreenData homeElements.forEach { val chart = it.value.keys.iterator().next() Loading Loading @@ -311,4 +313,8 @@ class GplayStoreRepositoryImpl @Inject constructor( } return downloadData } private fun getAuthData(): AuthData { return Gson().fromJson(context.configurations.authData, AuthData::class.java) } } app/src/main/java/foundation/e/apps/domain/login/repository/GoogleLoginRepositoryImpl.kt +1 −2 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ class GoogleLoginRepositoryImpl @Inject constructor( } val aasToken = context.configurations.aasToken if (oauthToken.isNullOrEmpty() && aasToken.isNotEmpty()) { if (aasToken.isNotEmpty()) { return AuthHelper.build(email, aasToken, properties) } Loading Loading @@ -56,7 +56,6 @@ class GoogleLoginRepositoryImpl @Inject constructor( AuthTokenPlayResponseParser.parseResponse(String(result.data.responseBytes)) val token = parsedResult["Token"] ?: "" Timber.d("Parsed token: $token") context.configurations.aasToken = token return AuthHelper.build(email, token, properties) } Loading app/src/main/java/foundation/e/apps/domain/login/repository/LoginRepositoryImpl.kt +4 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,9 @@ import app.lounge.model.AnonymousAuthDataRequestBody import app.lounge.networking.NetworkResult import app.lounge.storage.cache.configurations import com.aurora.gplayapi.data.models.AuthData import com.google.gson.Gson import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.data.enums.User import javax.inject.Inject class LoginRepositoryImpl @Inject constructor( Loading @@ -41,7 +43,8 @@ class LoginRepositoryImpl @Inject constructor( is NetworkResult.Error -> throw Exception(result.errorMessage, result.exception) is NetworkResult.Success -> { applicationContext.configurations.authData = result.data.toString() applicationContext.configurations.userType = User.ANONYMOUS.toString() applicationContext.configurations.authData = Gson().toJson(result.data) return result.data } } Loading app/src/main/java/foundation/e/apps/domain/login/usecase/LoginUseCase.kt +50 −28 Original line number Diff line number Diff line Loading @@ -5,22 +5,24 @@ import app.lounge.model.AnonymousAuthDataRequestBody import app.lounge.storage.cache.configurations import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.helpers.AuthHelper import com.google.gson.Gson import com.google.gson.JsonSyntaxException import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.User import foundation.e.apps.data.login.AuthObject import foundation.e.apps.domain.login.repository.GoogleLoginRepository import foundation.e.apps.domain.login.repository.GoogleLoginRepositoryImpl import foundation.e.apps.domain.login.repository.LoginRepositoryImpl import foundation.e.apps.utils.Resource import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.flowOn import timber.log.Timber import java.lang.Exception import java.util.Properties import javax.inject.Inject import kotlin.Exception class LoginUseCase @Inject constructor( @ApplicationContext private val context: Context, Loading @@ -32,43 +34,44 @@ class LoginUseCase @Inject constructor( user: User?, email: String = "", oauthToken: String = "" ): Flow<Resource<AuthObject>> { ): Flow<Resource<out AuthObject>> { return flow { try { val currentUser = user ?: User.valueOf(context.configurations.userType) val currentEmail = email.ifEmpty { context.configurations.email } emit(Resource.Loading()) val currentUser = user ?: User.valueOf(context.configurations.userType.ifEmpty { "UNAVAILABLE" }) val currentAuthData = getAuthData() Timber.d("currentAuthData: $(currentAuthData != null) currentUser: $currentUser") if (currentAuthData != null && currentUser != User.UNAVAILABLE) { Timber.d("User is already available!") emit( createResourceSuccess(currentAuthData, currentUser) ) return@flow } if (currentUser == User.GOOGLE && oauthToken.isNotEmpty()) { if (currentUser == User.GOOGLE) { val currentEmail = email.ifEmpty { context.configurations.email } fetchGplayAuthObject(currentEmail, oauthToken, currentUser)?.let { emit(Resource.Success(it)) return@flow } return@flow } val currentToken = context.configurations.aasToken if (currentUser == User.ANONYMOUS && currentToken.isEmpty()) { loginRepositoryImpl.anonymousUser(authDataRequestBody = AnonymousAuthDataRequestBody( if (currentUser == User.ANONYMOUS) { val authData = loginRepositoryImpl.anonymousUser( authDataRequestBody = AnonymousAuthDataRequestBody( properties = properties, userAgent = "" ) ) emit(createResourceSuccess(authData, currentUser)) return@flow } val authData = AuthHelper.build(currentEmail, currentToken, properties) emit(Resource.Error("User is not available!")) if (currentUser == User.GOOGLE || currentUser == User.ANONYMOUS) { emit( Resource.Success( AuthObject.GPlayAuth( ResultSupreme.Success(authData), currentUser ) ) ) } else { emit(Resource.Error("No User Available!")) } } catch (e: Exception) { Timber.w(e) emit( Loading @@ -77,9 +80,28 @@ class LoginUseCase @Inject constructor( ) ) } }.flowOn(Dispatchers.IO) } private fun getAuthData(): AuthData? { return try { Gson().fromJson(context.configurations.authData, AuthData::class.java) } catch (e: Exception) { null } } private fun createResourceSuccess( authData: AuthData, currentUser: User ): Resource.Success<AuthObject> = Resource.Success( AuthObject.GPlayAuth( ResultSupreme.Success(authData), currentUser ) ) private suspend fun fetchGplayAuthObject( currentEmail: String, oauthToken: String, Loading app/src/main/java/foundation/e/apps/presentation/login/LoginViewModel.kt +14 −8 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import app.lounge.storage.cache.configurations import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.data.enums.User Loading @@ -36,8 +37,10 @@ import foundation.e.apps.ui.parentFragment.LoadingViewModel import foundation.e.apps.utils.Resource import foundation.e.apps.utils.SystemInfoProvider import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import timber.log.Timber import java.util.Properties import javax.inject.Inject Loading Loading @@ -76,27 +79,30 @@ class LoginViewModel @Inject constructor( ) { viewModelScope.launch { val authObjectList = mutableListOf<AuthObject>() loginUseCase.getAuthObject(user, email, oauthToken).onEach { resutl -> when (resutl) { loginUseCase.getAuthObject(user, email, oauthToken).onEach { result -> when (result) { is Resource.Success -> { _loginState.value = LoginState(isLoggedIn = true) resutl.data?.let { result.data?.let { authObjectList.add(it) authObjects.postValue(authObjectList) } authObjects.postValue(authObjectList) } is Resource.Error -> { Timber.d("AuthObject Error: ${result.message}") _loginState.value = LoginState( error = resutl.message ?: "An unexpected error occured" error = result.message ?: "An unexpected error occurred!" ) authObjects.postValue(authObjectList) } is Resource.Loading -> { _loginState.value = LoginState(isLoading = true) } } } }.collect() } } Loading @@ -109,7 +115,7 @@ class LoginViewModel @Inject constructor( viewModelScope.launch { loginSourceRepository.saveUserType(User.ANONYMOUS) onUserSaved() startLoginFlow() startLoginFlow(user = User.ANONYMOUS) } } Loading @@ -121,7 +127,7 @@ class LoginViewModel @Inject constructor( */ fun initialGoogleLogin(email: String, oauthToken: String, onUserSaved: () -> Unit) { viewModelScope.launch { startLoginFlow(email = email, oauthToken = oauthToken) startLoginFlow(user = User.GOOGLE, email = email, oauthToken = oauthToken) onUserSaved() } } Loading Loading
app/src/main/java/foundation/e/apps/data/gplay/GplayStoreRepositoryImpl.kt +7 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package foundation.e.apps.data.gplay import android.content.Context import app.lounge.storage.cache.configurations import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData Loading @@ -33,6 +34,7 @@ import com.aurora.gplayapi.helpers.Chart import com.aurora.gplayapi.helpers.PurchaseHelper import com.aurora.gplayapi.helpers.SearchHelper import com.aurora.gplayapi.helpers.TopChartsHelper import com.google.gson.Gson import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R import foundation.e.apps.data.fused.utils.CategoryType Loading @@ -55,7 +57,7 @@ class GplayStoreRepositoryImpl @Inject constructor( override suspend fun getHomeScreenData(): Any { val homeScreenData = mutableMapOf<String, List<App>>() val homeElements = createTopChartElements() val authData = loginSourceRepository.gplayAuth ?: return homeScreenData val authData = getAuthData()//loginSourceRepository.gplayAuth ?: return homeScreenData homeElements.forEach { val chart = it.value.keys.iterator().next() Loading Loading @@ -311,4 +313,8 @@ class GplayStoreRepositoryImpl @Inject constructor( } return downloadData } private fun getAuthData(): AuthData { return Gson().fromJson(context.configurations.authData, AuthData::class.java) } }
app/src/main/java/foundation/e/apps/domain/login/repository/GoogleLoginRepositoryImpl.kt +1 −2 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ class GoogleLoginRepositoryImpl @Inject constructor( } val aasToken = context.configurations.aasToken if (oauthToken.isNullOrEmpty() && aasToken.isNotEmpty()) { if (aasToken.isNotEmpty()) { return AuthHelper.build(email, aasToken, properties) } Loading Loading @@ -56,7 +56,6 @@ class GoogleLoginRepositoryImpl @Inject constructor( AuthTokenPlayResponseParser.parseResponse(String(result.data.responseBytes)) val token = parsedResult["Token"] ?: "" Timber.d("Parsed token: $token") context.configurations.aasToken = token return AuthHelper.build(email, token, properties) } Loading
app/src/main/java/foundation/e/apps/domain/login/repository/LoginRepositoryImpl.kt +4 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,9 @@ import app.lounge.model.AnonymousAuthDataRequestBody import app.lounge.networking.NetworkResult import app.lounge.storage.cache.configurations import com.aurora.gplayapi.data.models.AuthData import com.google.gson.Gson import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.data.enums.User import javax.inject.Inject class LoginRepositoryImpl @Inject constructor( Loading @@ -41,7 +43,8 @@ class LoginRepositoryImpl @Inject constructor( is NetworkResult.Error -> throw Exception(result.errorMessage, result.exception) is NetworkResult.Success -> { applicationContext.configurations.authData = result.data.toString() applicationContext.configurations.userType = User.ANONYMOUS.toString() applicationContext.configurations.authData = Gson().toJson(result.data) return result.data } } Loading
app/src/main/java/foundation/e/apps/domain/login/usecase/LoginUseCase.kt +50 −28 Original line number Diff line number Diff line Loading @@ -5,22 +5,24 @@ import app.lounge.model.AnonymousAuthDataRequestBody import app.lounge.storage.cache.configurations import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.helpers.AuthHelper import com.google.gson.Gson import com.google.gson.JsonSyntaxException import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.User import foundation.e.apps.data.login.AuthObject import foundation.e.apps.domain.login.repository.GoogleLoginRepository import foundation.e.apps.domain.login.repository.GoogleLoginRepositoryImpl import foundation.e.apps.domain.login.repository.LoginRepositoryImpl import foundation.e.apps.utils.Resource import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.flowOn import timber.log.Timber import java.lang.Exception import java.util.Properties import javax.inject.Inject import kotlin.Exception class LoginUseCase @Inject constructor( @ApplicationContext private val context: Context, Loading @@ -32,43 +34,44 @@ class LoginUseCase @Inject constructor( user: User?, email: String = "", oauthToken: String = "" ): Flow<Resource<AuthObject>> { ): Flow<Resource<out AuthObject>> { return flow { try { val currentUser = user ?: User.valueOf(context.configurations.userType) val currentEmail = email.ifEmpty { context.configurations.email } emit(Resource.Loading()) val currentUser = user ?: User.valueOf(context.configurations.userType.ifEmpty { "UNAVAILABLE" }) val currentAuthData = getAuthData() Timber.d("currentAuthData: $(currentAuthData != null) currentUser: $currentUser") if (currentAuthData != null && currentUser != User.UNAVAILABLE) { Timber.d("User is already available!") emit( createResourceSuccess(currentAuthData, currentUser) ) return@flow } if (currentUser == User.GOOGLE && oauthToken.isNotEmpty()) { if (currentUser == User.GOOGLE) { val currentEmail = email.ifEmpty { context.configurations.email } fetchGplayAuthObject(currentEmail, oauthToken, currentUser)?.let { emit(Resource.Success(it)) return@flow } return@flow } val currentToken = context.configurations.aasToken if (currentUser == User.ANONYMOUS && currentToken.isEmpty()) { loginRepositoryImpl.anonymousUser(authDataRequestBody = AnonymousAuthDataRequestBody( if (currentUser == User.ANONYMOUS) { val authData = loginRepositoryImpl.anonymousUser( authDataRequestBody = AnonymousAuthDataRequestBody( properties = properties, userAgent = "" ) ) emit(createResourceSuccess(authData, currentUser)) return@flow } val authData = AuthHelper.build(currentEmail, currentToken, properties) emit(Resource.Error("User is not available!")) if (currentUser == User.GOOGLE || currentUser == User.ANONYMOUS) { emit( Resource.Success( AuthObject.GPlayAuth( ResultSupreme.Success(authData), currentUser ) ) ) } else { emit(Resource.Error("No User Available!")) } } catch (e: Exception) { Timber.w(e) emit( Loading @@ -77,9 +80,28 @@ class LoginUseCase @Inject constructor( ) ) } }.flowOn(Dispatchers.IO) } private fun getAuthData(): AuthData? { return try { Gson().fromJson(context.configurations.authData, AuthData::class.java) } catch (e: Exception) { null } } private fun createResourceSuccess( authData: AuthData, currentUser: User ): Resource.Success<AuthObject> = Resource.Success( AuthObject.GPlayAuth( ResultSupreme.Success(authData), currentUser ) ) private suspend fun fetchGplayAuthObject( currentEmail: String, oauthToken: String, Loading
app/src/main/java/foundation/e/apps/presentation/login/LoginViewModel.kt +14 −8 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import app.lounge.storage.cache.configurations import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.data.enums.User Loading @@ -36,8 +37,10 @@ import foundation.e.apps.ui.parentFragment.LoadingViewModel import foundation.e.apps.utils.Resource import foundation.e.apps.utils.SystemInfoProvider import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import timber.log.Timber import java.util.Properties import javax.inject.Inject Loading Loading @@ -76,27 +79,30 @@ class LoginViewModel @Inject constructor( ) { viewModelScope.launch { val authObjectList = mutableListOf<AuthObject>() loginUseCase.getAuthObject(user, email, oauthToken).onEach { resutl -> when (resutl) { loginUseCase.getAuthObject(user, email, oauthToken).onEach { result -> when (result) { is Resource.Success -> { _loginState.value = LoginState(isLoggedIn = true) resutl.data?.let { result.data?.let { authObjectList.add(it) authObjects.postValue(authObjectList) } authObjects.postValue(authObjectList) } is Resource.Error -> { Timber.d("AuthObject Error: ${result.message}") _loginState.value = LoginState( error = resutl.message ?: "An unexpected error occured" error = result.message ?: "An unexpected error occurred!" ) authObjects.postValue(authObjectList) } is Resource.Loading -> { _loginState.value = LoginState(isLoading = true) } } } }.collect() } } Loading @@ -109,7 +115,7 @@ class LoginViewModel @Inject constructor( viewModelScope.launch { loginSourceRepository.saveUserType(User.ANONYMOUS) onUserSaved() startLoginFlow() startLoginFlow(user = User.ANONYMOUS) } } Loading @@ -121,7 +127,7 @@ class LoginViewModel @Inject constructor( */ fun initialGoogleLogin(email: String, oauthToken: String, onUserSaved: () -> Unit) { viewModelScope.launch { startLoginFlow(email = email, oauthToken = oauthToken) startLoginFlow(user = User.GOOGLE, email = email, oauthToken = oauthToken) onUserSaved() } } Loading