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

Commit fb555dfc authored by Jonathan Klee's avatar Jonathan Klee
Browse files

refactor: update login flow in ui

parent 6ebaeee6
Loading
Loading
Loading
Loading
+32 −34
Original line number Diff line number Diff line
@@ -25,13 +25,17 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import foundation.e.apps.R
import foundation.e.apps.data.Stores
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.enums.User
import foundation.e.apps.data.login.AuthObject
import foundation.e.apps.data.login.AuthenticatorRepository
import foundation.e.apps.data.login.microg.MicrogAccountFetchResult
import foundation.e.apps.data.login.microg.MicrogAccountManager
import foundation.e.apps.data.login.core.AuthObject
import foundation.e.apps.data.login.core.StoreType
import foundation.e.apps.data.login.playstore.MicrogAccountManager
import foundation.e.apps.domain.login.CompleteMicrogLoginUseCase
import foundation.e.apps.domain.login.FetchMicrogAccountUseCase
import foundation.e.apps.domain.login.HasMicrogAccountUseCase
import foundation.e.apps.domain.login.InitialAnonymousLoginUseCase
import foundation.e.apps.domain.login.InitialGoogleLoginUseCase
import foundation.e.apps.domain.login.InitialNoGoogleLoginUseCase
import foundation.e.apps.domain.login.LogoutUseCase
import foundation.e.apps.domain.login.StartLoginFlowUseCase
import foundation.e.apps.ui.parentFragment.LoadingViewModel
import kotlinx.coroutines.launch
import okhttp3.Cache
@@ -42,11 +46,17 @@ import javax.inject.Inject
 * Use it as shared view model across all fragments.
 */
@HiltViewModel
@Suppress("LongParameterList")
class LoginViewModel @Inject constructor(
    private val authenticatorRepository: AuthenticatorRepository,
    private val startLoginFlowUseCase: StartLoginFlowUseCase,
    private val hasMicrogAccountUseCase: HasMicrogAccountUseCase,
    private val fetchMicrogAccountUseCase: FetchMicrogAccountUseCase,
    private val completeMicrogLoginUseCase: CompleteMicrogLoginUseCase,
    private val initialAnonymousLoginUseCase: InitialAnonymousLoginUseCase,
    private val initialGoogleLoginUseCase: InitialGoogleLoginUseCase,
    private val initialNoGoogleLoginUseCase: InitialNoGoogleLoginUseCase,
    private val logoutUseCase: LogoutUseCase,
    private val cache: Cache,
    private val stores: Stores,
    private val microgAccountManager: MicrogAccountManager,
    @ApplicationContext private val context: Context
) : ViewModel() {

@@ -66,14 +76,14 @@ class LoginViewModel @Inject constructor(
    /**
     * Main point of starting of entire authentication process.
     */
    fun startLoginFlow(clearList: List<String> = listOf()) {
    fun startLoginFlow(clearList: List<StoreType> = listOf()) {
        viewModelScope.launch {
            val authObjectsLocal = authenticatorRepository.fetchAuthObjects(clearList)
            val authObjectsLocal = startLoginFlowUseCase(clearList)
            authObjects.postValue(authObjectsLocal)
        }
    }

    fun hasMicrogAccount(): Boolean = microgAccountManager.hasMicrogAccount()
    fun hasMicrogAccount(): Boolean = hasMicrogAccountUseCase()

    fun initialMicrogLogin(
        accountName: String?,
@@ -84,25 +94,18 @@ class LoginViewModel @Inject constructor(
        viewModelScope.launch {
            val fallbackMessage = context.getString(R.string.sign_in_microg_login_failed)
            runCatching {
                microgAccountManager.fetchMicrogAccount(accountName)
                fetchMicrogAccountUseCase(accountName)
            }.onSuccess { result ->
                when (result) {
                    is MicrogAccountFetchResult.Success -> {
                        val microgAccount = result.microgAccount
                        stores.enableStore(Source.PLAY_STORE)
                        authenticatorRepository.saveGoogleLogin(
                            microgAccount.account.name,
                            microgAccount.oauthToken
                        )
                        authenticatorRepository.saveAasToken("")
                        authenticatorRepository.saveUserType(User.GOOGLE)
                    is MicrogAccountManager.FetchResult.Success -> {
                        completeMicrogLoginUseCase(result.microgAccount)
                        onUserSaved()
                        startLoginFlow()
                    }

                    is MicrogAccountFetchResult.RequiresUserAction -> onIntentRequired(result.intent)
                    is MicrogAccountManager.FetchResult.RequiresUserAction -> onIntentRequired(result.intent)

                    is MicrogAccountFetchResult.Error -> {
                    is MicrogAccountManager.FetchResult.Error -> {
                        onError(result.throwable.localizedMessage ?: fallbackMessage)
                    }
                }
@@ -119,8 +122,7 @@ class LoginViewModel @Inject constructor(
     */
    fun initialAnonymousLogin(onUserSaved: () -> Unit) {
        viewModelScope.launch {
            stores.enableStore(Source.PLAY_STORE)
            authenticatorRepository.saveUserType(User.ANONYMOUS)
            initialAnonymousLoginUseCase()
            onUserSaved()
            startLoginFlow()
        }
@@ -134,9 +136,7 @@ class LoginViewModel @Inject constructor(
     */
    fun initialGoogleLogin(email: String, oauthToken: String, onUserSaved: () -> Unit) {
        viewModelScope.launch {
            stores.enableStore(Source.PLAY_STORE)
            authenticatorRepository.saveGoogleLogin(email, oauthToken)
            authenticatorRepository.saveUserType(User.GOOGLE)
            initialGoogleLoginUseCase(email, oauthToken)
            onUserSaved()
            startLoginFlow()
        }
@@ -151,8 +151,7 @@ class LoginViewModel @Inject constructor(
     */
    fun initialNoGoogleLogin(onUserSaved: () -> Unit) {
        viewModelScope.launch {
            stores.disableStore(Source.PLAY_STORE)
            authenticatorRepository.setNoGoogleMode()
            initialNoGoogleLoginUseCase()
            onUserSaved()
            startLoginFlow()
        }
@@ -186,8 +185,7 @@ class LoginViewModel @Inject constructor(
     */
    fun logout() {
        viewModelScope.launch {
            cache.evictAll()
            authenticatorRepository.logout()
            logoutUseCase()
            authObjects.postValue(listOf())
        }
    }
+621 −621
Original line number Diff line number Diff line
@@ -50,8 +50,8 @@ import foundation.e.apps.contract.ParentalControlContract.COLUMN_LOGIN_TYPE
import foundation.e.apps.data.Constants
import foundation.e.apps.data.enums.User
import foundation.e.apps.data.install.models.AppInstall
import foundation.e.apps.data.login.AuthObject
import foundation.e.apps.data.login.PlayStoreAuthenticator
import foundation.e.apps.data.login.core.AuthObject
import foundation.e.apps.data.login.core.StoreType
import foundation.e.apps.data.login.exceptions.GPlayValidationException
import foundation.e.apps.databinding.ActivityMainBinding
import foundation.e.apps.install.updates.UpdatesNotifier
@@ -182,7 +182,7 @@ class MainActivity : AppCompatActivity() {
    }

    private fun refreshSession() {
        loginViewModel.startLoginFlow(listOf(PlayStoreAuthenticator::class.java.simpleName))
        loginViewModel.startLoginFlow(listOf(StoreType.PLAY_STORE))
    }

    fun isInitialScreen(): Boolean {
+18 −13
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import foundation.e.apps.data.enums.isUnFiltered
import foundation.e.apps.data.gitlab.SystemAppsUpdatesRepository
import foundation.e.apps.data.install.AppManagerWrapper
import foundation.e.apps.data.install.models.AppInstall
import foundation.e.apps.data.login.state.LoginState
import foundation.e.apps.data.parentalcontrol.fdroid.FDroidAntiFeatureRepository
import foundation.e.apps.data.parentalcontrol.googleplay.GPlayContentRatingRepository
import foundation.e.apps.data.preference.AppLoungeDataStore
@@ -106,6 +107,10 @@ class MainActivityViewModel @Inject constructor(
        return appLoungeDataStore.getUser()
    }

    fun getLoginState(): LoginState {
        return appLoungeDataStore.getLoginState()
    }

    fun getUserEmail(): String {
        return appLoungeDataStore.emailData.getSync()
    }
+10 −7
Original line number Diff line number Diff line
@@ -60,8 +60,9 @@ import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.enums.User
import foundation.e.apps.data.enums.isInitialized
import foundation.e.apps.data.login.AuthObject
import foundation.e.apps.data.login.core.AuthObject
import foundation.e.apps.data.login.exceptions.GPlayLoginException
import foundation.e.apps.data.login.state.LoginState
import foundation.e.apps.databinding.FragmentApplicationBinding
import foundation.e.apps.domain.ValidateAppAgeLimitUseCase.Companion.KEY_ANTI_FEATURES_NSFW
import foundation.e.apps.install.download.data.DownloadProgress
@@ -748,12 +749,14 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) {
        view: View
    ) {
        installButton.setOnClickListener {
            val errorMsg = when (mainActivityViewModel.getUser()) {
                User.ANONYMOUS,
                User.NO_GOOGLE,
                User.UNAVAILABLE -> getString(R.string.install_blocked_anonymous)

                User.GOOGLE -> getString(R.string.install_blocked_google)
            val loginState = mainActivityViewModel.getLoginState()
            val user = mainActivityViewModel.getUser()
            val errorMsg = when {
                loginState == LoginState.UNAVAILABLE ->
                    getString(R.string.install_blocked_anonymous)
                user == User.ANONYMOUS || user == User.NO_GOOGLE ->
                    getString(R.string.install_blocked_anonymous)
                else -> getString(R.string.install_blocked_google)
            }
            if (errorMsg.isNotBlank()) {
                Snackbar.make(view, errorMsg, Snackbar.LENGTH_SHORT).show()
+244 −244
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.install.AppManagerWrapper
import foundation.e.apps.data.install.models.AppInstall
import foundation.e.apps.data.login.AuthObject
import foundation.e.apps.data.login.core.AuthObject
import foundation.e.apps.data.parentalcontrol.fdroid.FDroidAntiFeatureRepository
import foundation.e.apps.data.playstore.PlayStoreRepository
import foundation.e.apps.install.download.data.DownloadProgress
Loading