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

Commit dc6e2ad2 authored by Hasib Prince's avatar Hasib Prince
Browse files

handled all types of login

parent 6320fe9f
Loading
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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()
@@ -311,4 +313,8 @@ class GplayStoreRepositoryImpl @Inject constructor(
        }
        return downloadData
    }

    private fun getAuthData(): AuthData {
        return Gson().fromJson(context.configurations.authData, AuthData::class.java)
    }
}
+1 −2
Original line number Diff line number Diff line
@@ -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)
        }

@@ -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)
        }
+4 −1
Original line number Diff line number Diff line
@@ -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(
@@ -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
            }
        }
+50 −28
Original line number Diff line number Diff line
@@ -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,
@@ -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(
@@ -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,
+14 −8
Original line number Diff line number Diff line
@@ -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
@@ -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

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

@@ -109,7 +115,7 @@ class LoginViewModel @Inject constructor(
        viewModelScope.launch {
            loginSourceRepository.saveUserType(User.ANONYMOUS)
            onUserSaved()
            startLoginFlow()
            startLoginFlow(user = User.ANONYMOUS)
        }
    }

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