Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6320fe9f authored by Hasib Prince's avatar Hasib Prince
Browse files

handled google signin in flow

parent c9e70f76
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -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
+7 −1
Original line number Diff line number Diff line
@@ -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
@@ -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)
        }
+3 −2
Original line number Diff line number Diff line
@@ -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
@@ -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)
@@ -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
+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
@@ -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
+23 −24
Original line number Diff line number Diff line
@@ -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
@@ -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.
@@ -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()
        }
    }

@@ -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)
@@ -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