Loading app/src/main/java/foundation/e/apps/ui/LoginViewModel.kt +32 −34 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() { Loading @@ -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?, Loading @@ -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) } } Loading @@ -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() } Loading @@ -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() } Loading @@ -151,8 +151,7 @@ class LoginViewModel @Inject constructor( */ fun initialNoGoogleLogin(onUserSaved: () -> Unit) { viewModelScope.launch { stores.disableStore(Source.PLAY_STORE) authenticatorRepository.setNoGoogleMode() initialNoGoogleLoginUseCase() onUserSaved() startLoginFlow() } Loading Loading @@ -186,8 +185,7 @@ class LoginViewModel @Inject constructor( */ fun logout() { viewModelScope.launch { cache.evictAll() authenticatorRepository.logout() logoutUseCase() authObjects.postValue(listOf()) } } Loading app/src/main/java/foundation/e/apps/ui/MainActivity.kt +621 −621 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { Loading app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt +18 −13 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -106,6 +107,10 @@ class MainActivityViewModel @Inject constructor( return appLoungeDataStore.getUser() } fun getLoginState(): LoginState { return appLoungeDataStore.getLoginState() } fun getUserEmail(): String { return appLoungeDataStore.emailData.getSync() } Loading app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt +10 −7 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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() Loading app/src/main/java/foundation/e/apps/ui/application/ApplicationViewModel.kt +244 −244 Original line number Diff line number Diff line Loading @@ -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 Loading
app/src/main/java/foundation/e/apps/ui/LoginViewModel.kt +32 −34 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() { Loading @@ -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?, Loading @@ -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) } } Loading @@ -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() } Loading @@ -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() } Loading @@ -151,8 +151,7 @@ class LoginViewModel @Inject constructor( */ fun initialNoGoogleLogin(onUserSaved: () -> Unit) { viewModelScope.launch { stores.disableStore(Source.PLAY_STORE) authenticatorRepository.setNoGoogleMode() initialNoGoogleLoginUseCase() onUserSaved() startLoginFlow() } Loading Loading @@ -186,8 +185,7 @@ class LoginViewModel @Inject constructor( */ fun logout() { viewModelScope.launch { cache.evictAll() authenticatorRepository.logout() logoutUseCase() authObjects.postValue(listOf()) } } Loading
app/src/main/java/foundation/e/apps/ui/MainActivity.kt +621 −621 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { Loading
app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt +18 −13 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -106,6 +107,10 @@ class MainActivityViewModel @Inject constructor( return appLoungeDataStore.getUser() } fun getLoginState(): LoginState { return appLoungeDataStore.getLoginState() } fun getUserEmail(): String { return appLoungeDataStore.emailData.getSync() } Loading
app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt +10 −7 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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() Loading
app/src/main/java/foundation/e/apps/ui/application/ApplicationViewModel.kt +244 −244 Original line number Diff line number Diff line Loading @@ -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