Loading app/src/main/java/foundation/e/apps/di/LoginModule.kt +0 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import dagger.hilt.components.SingletonComponent import foundation.e.apps.data.login.LoginSourceCleanApk import foundation.e.apps.data.login.LoginSourceGPlay import foundation.e.apps.data.login.LoginSourceInterface 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.domain.login.usecase.GplayLoginUseCase Loading app/src/main/java/foundation/e/apps/domain/login/repository/GoogleLoginRepositoryImpl.kt +7 −1 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.PlayResponse import com.aurora.gplayapi.helpers.AuthHelper import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.data.enums.User import timber.log.Timber import java.lang.Exception import java.util.Properties Loading @@ -20,8 +21,13 @@ class GoogleLoginRepositoryImpl @Inject constructor( ) : GoogleLoginRepository { override suspend fun getGoogleLoginAuthData(email: String, oauthToken: String?): AuthData? { val aasToken = context.configurations.aasToken context.configurations.email = email context.configurations.userType = User.GOOGLE.name oauthToken?.let { context.configurations.oauthtoken = oauthToken } val aasToken = context.configurations.aasToken if (oauthToken.isNullOrEmpty() && aasToken.isNotEmpty()) { return AuthHelper.build(email, aasToken, properties) } Loading app/src/main/java/foundation/e/apps/domain/login/usecase/GplayLoginUseCase.kt +3 −2 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ 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.utils.Resource import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.single import javax.inject.Inject Loading @@ -16,7 +17,7 @@ class GplayLoginUseCase @Inject constructor(private val googleLoginRepository: G suspend operator fun invoke( email: String, oauthToken: String, ): Resource<AuthObject> = flow { ): Flow<Resource<AuthObject>> = flow { try { emit(Resource.Loading()) val authData = googleLoginRepository.getGoogleLoginAuthData(email, oauthToken) Loading @@ -26,5 +27,5 @@ class GplayLoginUseCase @Inject constructor(private val googleLoginRepository: G } catch (e: Exception) { emit(Resource.Error(e.localizedMessage ?: "")) } }.single() } } No newline at end of file app/src/main/java/foundation/e/apps/domain/login/usecase/LoginUseCase.kt +73 −13 Original line number Diff line number Diff line package foundation.e.apps.domain.login.usecase import android.content.Context 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 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.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach import timber.log.Timber import java.lang.Exception import java.util.Properties Loading @@ -13,22 +24,71 @@ import javax.inject.Inject class LoginUseCase @Inject constructor( @ApplicationContext private val context: Context, private val userLoginUseCase: UserLoginUseCase, private val gplayLoginUseCase: GplayLoginUseCase, private val googleLoginRepository: GoogleLoginRepositoryImpl, private val loginRepositoryImpl: LoginRepositoryImpl, private val properties: Properties ) { suspend fun getAuthObject(user: User?, email: String = "", oauthToken: String = ""): Resource<AuthObject>? { return try { suspend fun getAuthObject( user: User?, email: String = "", oauthToken: String = "" ): Flow<Resource<AuthObject>> { return flow { try { val currentUser = user ?: User.valueOf(context.configurations.userType) val currentEmail = email.ifEmpty { context.configurations.email } when (currentUser) { User.ANONYMOUS -> userLoginUseCase.invoke(properties, "") User.GOOGLE -> gplayLoginUseCase.invoke(email, oauthToken) else -> null if (currentUser == User.GOOGLE && oauthToken.isNotEmpty()) { fetchGplayAuthObject(currentEmail, oauthToken, currentUser)?.let { emit(Resource.Success(it)) return@flow } } val currentToken = context.configurations.aasToken if (currentUser == User.ANONYMOUS && currentToken.isEmpty()) { loginRepositoryImpl.anonymousUser(authDataRequestBody = AnonymousAuthDataRequestBody( properties = properties, userAgent = "" ) ) } val authData = AuthHelper.build(currentEmail, currentToken, properties) 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) null emit( Resource.Error( e.localizedMessage ?: context.getString(R.string.unknown_error) ) ) } } } private suspend fun fetchGplayAuthObject( currentEmail: String, oauthToken: String, user: User ): AuthObject? { var authObject: AuthObject? = null googleLoginRepository.getGoogleLoginAuthData(currentEmail, oauthToken)?.let { authObject = AuthObject.GPlayAuth(ResultSupreme.Success(it), user) } return authObject } } No newline at end of file app/src/main/java/foundation/e/apps/presentation/login/LoginViewModel.kt +23 −24 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ 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.onEach import kotlinx.coroutines.launch import java.util.Properties import javax.inject.Inject Loading Loading @@ -75,14 +76,30 @@ class LoginViewModel @Inject constructor( ) { viewModelScope.launch { val authObjectList = mutableListOf<AuthObject>() loginUseCase.getAuthObject(user, email, oauthToken)?.data?.let { loginUseCase.getAuthObject(user, email, oauthToken).onEach { resutl -> when (resutl) { is Resource.Success -> { _loginState.value = LoginState(isLoggedIn = true) resutl.data?.let { authObjectList.add(it) } // val authObjectsLocal = loginSourceRepository.getAuthObjects(clearList) authObjects.postValue(authObjectList) } } is Resource.Error -> { _loginState.value = LoginState( error = resutl.message ?: "An unexpected error occured" ) } is Resource.Loading -> { _loginState.value = LoginState(isLoading = true) } } } } } /** * Call this to use ANONYMOUS mode. * This method is called only for the first time when logging in the user. Loading @@ -104,10 +121,8 @@ class LoginViewModel @Inject constructor( */ fun initialGoogleLogin(email: String, oauthToken: String, onUserSaved: () -> Unit) { viewModelScope.launch { // loginSourceRepository.saveGoogleLogin(email, oauthToken) // loginSourceRepository.saveUserType(User.GOOGLE) onUserSaved() startLoginFlow(email = email, oauthToken = oauthToken) onUserSaved() } } Loading Loading @@ -191,7 +206,7 @@ class LoginViewModel @Inject constructor( fun authenticateGoogleUser(email: String, oauthToken: String) { viewModelScope.launch(Dispatchers.IO) { gplayLoginUseCase(email, oauthToken).also { result -> gplayLoginUseCase(email, oauthToken).onEach { result -> when (result) { is Resource.Success -> { _loginState.value = LoginState(isLoggedIn = true) Loading @@ -211,19 +226,3 @@ class LoginViewModel @Inject constructor( } } } class LoginFactory @Inject constructor( @ApplicationContext private val context: Context, private val userLoginUseCase: UserLoginUseCase, private val gplayLoginUseCase: GplayLoginUseCase ) { suspend fun getLoginUseCase(user: User?): BaseUseCase? { val currentUser = user ?: User.valueOf(context.configurations.userType) return when (currentUser) { User.ANONYMOUS -> userLoginUseCase User.GOOGLE -> gplayLoginUseCase else -> null } } } Loading
app/src/main/java/foundation/e/apps/di/LoginModule.kt +0 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import dagger.hilt.components.SingletonComponent import foundation.e.apps.data.login.LoginSourceCleanApk import foundation.e.apps.data.login.LoginSourceGPlay import foundation.e.apps.data.login.LoginSourceInterface 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.domain.login.usecase.GplayLoginUseCase Loading
app/src/main/java/foundation/e/apps/domain/login/repository/GoogleLoginRepositoryImpl.kt +7 −1 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.PlayResponse import com.aurora.gplayapi.helpers.AuthHelper import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.data.enums.User import timber.log.Timber import java.lang.Exception import java.util.Properties Loading @@ -20,8 +21,13 @@ class GoogleLoginRepositoryImpl @Inject constructor( ) : GoogleLoginRepository { override suspend fun getGoogleLoginAuthData(email: String, oauthToken: String?): AuthData? { val aasToken = context.configurations.aasToken context.configurations.email = email context.configurations.userType = User.GOOGLE.name oauthToken?.let { context.configurations.oauthtoken = oauthToken } val aasToken = context.configurations.aasToken if (oauthToken.isNullOrEmpty() && aasToken.isNotEmpty()) { return AuthHelper.build(email, aasToken, properties) } Loading
app/src/main/java/foundation/e/apps/domain/login/usecase/GplayLoginUseCase.kt +3 −2 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ 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.utils.Resource import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.single import javax.inject.Inject Loading @@ -16,7 +17,7 @@ class GplayLoginUseCase @Inject constructor(private val googleLoginRepository: G suspend operator fun invoke( email: String, oauthToken: String, ): Resource<AuthObject> = flow { ): Flow<Resource<AuthObject>> = flow { try { emit(Resource.Loading()) val authData = googleLoginRepository.getGoogleLoginAuthData(email, oauthToken) Loading @@ -26,5 +27,5 @@ class GplayLoginUseCase @Inject constructor(private val googleLoginRepository: G } catch (e: Exception) { emit(Resource.Error(e.localizedMessage ?: "")) } }.single() } } No newline at end of file
app/src/main/java/foundation/e/apps/domain/login/usecase/LoginUseCase.kt +73 −13 Original line number Diff line number Diff line package foundation.e.apps.domain.login.usecase import android.content.Context 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 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.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach import timber.log.Timber import java.lang.Exception import java.util.Properties Loading @@ -13,22 +24,71 @@ import javax.inject.Inject class LoginUseCase @Inject constructor( @ApplicationContext private val context: Context, private val userLoginUseCase: UserLoginUseCase, private val gplayLoginUseCase: GplayLoginUseCase, private val googleLoginRepository: GoogleLoginRepositoryImpl, private val loginRepositoryImpl: LoginRepositoryImpl, private val properties: Properties ) { suspend fun getAuthObject(user: User?, email: String = "", oauthToken: String = ""): Resource<AuthObject>? { return try { suspend fun getAuthObject( user: User?, email: String = "", oauthToken: String = "" ): Flow<Resource<AuthObject>> { return flow { try { val currentUser = user ?: User.valueOf(context.configurations.userType) val currentEmail = email.ifEmpty { context.configurations.email } when (currentUser) { User.ANONYMOUS -> userLoginUseCase.invoke(properties, "") User.GOOGLE -> gplayLoginUseCase.invoke(email, oauthToken) else -> null if (currentUser == User.GOOGLE && oauthToken.isNotEmpty()) { fetchGplayAuthObject(currentEmail, oauthToken, currentUser)?.let { emit(Resource.Success(it)) return@flow } } val currentToken = context.configurations.aasToken if (currentUser == User.ANONYMOUS && currentToken.isEmpty()) { loginRepositoryImpl.anonymousUser(authDataRequestBody = AnonymousAuthDataRequestBody( properties = properties, userAgent = "" ) ) } val authData = AuthHelper.build(currentEmail, currentToken, properties) 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) null emit( Resource.Error( e.localizedMessage ?: context.getString(R.string.unknown_error) ) ) } } } private suspend fun fetchGplayAuthObject( currentEmail: String, oauthToken: String, user: User ): AuthObject? { var authObject: AuthObject? = null googleLoginRepository.getGoogleLoginAuthData(currentEmail, oauthToken)?.let { authObject = AuthObject.GPlayAuth(ResultSupreme.Success(it), user) } return authObject } } No newline at end of file
app/src/main/java/foundation/e/apps/presentation/login/LoginViewModel.kt +23 −24 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ 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.onEach import kotlinx.coroutines.launch import java.util.Properties import javax.inject.Inject Loading Loading @@ -75,14 +76,30 @@ class LoginViewModel @Inject constructor( ) { viewModelScope.launch { val authObjectList = mutableListOf<AuthObject>() loginUseCase.getAuthObject(user, email, oauthToken)?.data?.let { loginUseCase.getAuthObject(user, email, oauthToken).onEach { resutl -> when (resutl) { is Resource.Success -> { _loginState.value = LoginState(isLoggedIn = true) resutl.data?.let { authObjectList.add(it) } // val authObjectsLocal = loginSourceRepository.getAuthObjects(clearList) authObjects.postValue(authObjectList) } } is Resource.Error -> { _loginState.value = LoginState( error = resutl.message ?: "An unexpected error occured" ) } is Resource.Loading -> { _loginState.value = LoginState(isLoading = true) } } } } } /** * Call this to use ANONYMOUS mode. * This method is called only for the first time when logging in the user. Loading @@ -104,10 +121,8 @@ class LoginViewModel @Inject constructor( */ fun initialGoogleLogin(email: String, oauthToken: String, onUserSaved: () -> Unit) { viewModelScope.launch { // loginSourceRepository.saveGoogleLogin(email, oauthToken) // loginSourceRepository.saveUserType(User.GOOGLE) onUserSaved() startLoginFlow(email = email, oauthToken = oauthToken) onUserSaved() } } Loading Loading @@ -191,7 +206,7 @@ class LoginViewModel @Inject constructor( fun authenticateGoogleUser(email: String, oauthToken: String) { viewModelScope.launch(Dispatchers.IO) { gplayLoginUseCase(email, oauthToken).also { result -> gplayLoginUseCase(email, oauthToken).onEach { result -> when (result) { is Resource.Success -> { _loginState.value = LoginState(isLoggedIn = true) Loading @@ -211,19 +226,3 @@ class LoginViewModel @Inject constructor( } } } class LoginFactory @Inject constructor( @ApplicationContext private val context: Context, private val userLoginUseCase: UserLoginUseCase, private val gplayLoginUseCase: GplayLoginUseCase ) { suspend fun getLoginUseCase(user: User?): BaseUseCase? { val currentUser = user ?: User.valueOf(context.configurations.userType) return when (currentUser) { User.ANONYMOUS -> userLoginUseCase User.GOOGLE -> gplayLoginUseCase else -> null } } }