From fad384cf38305b78ef4f0833d6b98beba3965388 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Wed, 21 Sep 2022 19:29:10 +0530 Subject: [PATCH 01/13] issue_5680_3: [Fix] return false from isActive() if user is UNAVAILABLE --- .../foundation/e/apps/login/LoginSourceCleanApk.kt | 12 +++++++++++- .../java/foundation/e/apps/login/LoginSourceGPlay.kt | 6 ++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/apps/login/LoginSourceCleanApk.kt b/app/src/main/java/foundation/e/apps/login/LoginSourceCleanApk.kt index f29ef0109..2b8f4eadc 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceCleanApk.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceCleanApk.kt @@ -18,6 +18,7 @@ package foundation.e.apps.login import foundation.e.apps.api.ResultSupreme +import foundation.e.apps.utils.enums.User import javax.inject.Inject import javax.inject.Singleton @@ -30,14 +31,23 @@ class LoginSourceCleanApk @Inject constructor( val loginDataStore: LoginDataStore, ) : LoginSourceInterface { + private val user: User + get() = loginDataStore.getUserType() + override fun isActive(): Boolean { + if (user == User.UNAVAILABLE) { + /* + * UNAVAILABLE user means first login is not completed. + */ + return false + } return loginDataStore.isOpenSourceSelected() || loginDataStore.isPWASelected() } override suspend fun getAuthObject(): AuthObject.CleanApk { return AuthObject.CleanApk( ResultSupreme.Success(Unit), - loginDataStore.getUserType(), + user, ) } diff --git a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt index 25a94b289..72378c8eb 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt @@ -54,6 +54,12 @@ class LoginSourceGPlay @Inject constructor( get() = LoginApiRepository(gPlayLoginInterface) override fun isActive(): Boolean { + if (user == User.UNAVAILABLE) { + /* + * UNAVAILABLE user means first login is not completed. + */ + return false + } return loginDataStore.isGplaySelected() } -- GitLab From 1bdcf469400935b37a787ac694eef49a505f5ed1 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Mon, 12 Sep 2022 21:45:13 +0530 Subject: [PATCH 02/13] issue_5680_4: Copy getUserType() to DataStoreModule --- .../e/apps/utils/modules/DataStoreModule.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt b/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt index a85d03365..7e57fd900 100644 --- a/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt +++ b/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt @@ -138,4 +138,22 @@ class DataStoreModule @Inject constructor( suspend fun getAASToken(): String { return aasToken.first() } + + /** + * Get the [User] type stored in the data store. + * In case nothing is stored, returns [User.UNAVAILABLE]. + * + * No need to wrap this function in try-catch block. + * + * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5680 + */ + fun getUserType(): User { + return runBlocking { + userType.first().run { + val userStrings = User.values().map { it.name } + if (this !in userStrings) User.UNAVAILABLE + else User.valueOf(this) + } + } + } } -- GitLab From 9a1e172646c3e70e8ef4852a6e81dc1a787b2c13 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Fri, 23 Sep 2022 13:08:07 +0530 Subject: [PATCH 03/13] issue_5680_4: Anonymous login --- .../e/apps/setup/signin/SignInFragment.kt | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/setup/signin/SignInFragment.kt b/app/src/main/java/foundation/e/apps/setup/signin/SignInFragment.kt index b2e354b67..3402306f8 100644 --- a/app/src/main/java/foundation/e/apps/setup/signin/SignInFragment.kt +++ b/app/src/main/java/foundation/e/apps/setup/signin/SignInFragment.kt @@ -3,33 +3,40 @@ package foundation.e.apps.setup.signin import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels +import androidx.lifecycle.ViewModelProvider import androidx.navigation.findNavController import dagger.hilt.android.AndroidEntryPoint import foundation.e.apps.R import foundation.e.apps.databinding.FragmentSignInBinding -import foundation.e.apps.utils.enums.User +import foundation.e.apps.login.LoginViewModel +import foundation.e.apps.utils.modules.CommonUtilsModule.safeNavigate @AndroidEntryPoint class SignInFragment : Fragment(R.layout.fragment_sign_in) { private var _binding: FragmentSignInBinding? = null private val binding get() = _binding!! - private val viewModel: SignInViewModel by viewModels() + private val viewModel: LoginViewModel by lazy { + ViewModelProvider(requireActivity())[LoginViewModel::class.java] + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) _binding = FragmentSignInBinding.bind(view) binding.googleBT.setOnClickListener { - view.findNavController().navigate(R.id.googleSignInFragment) + view.findNavController() + .safeNavigate(R.id.signInFragment, R.id.action_signInFragment_to_googleSignInFragment) } binding.anonymousBT.setOnClickListener { - viewModel.saveUserType(User.ANONYMOUS) + viewModel.initialAnonymousLogin { + view.findNavController() + .safeNavigate(R.id.signInFragment, R.id.action_signInFragment_to_homeFragment) + } } - viewModel.userType.observe(viewLifecycleOwner) { + /*viewModel.userType.observe(viewLifecycleOwner) { if (it.isNotBlank()) { when (User.valueOf(it)) { User.ANONYMOUS -> { @@ -44,7 +51,7 @@ class SignInFragment : Fragment(R.layout.fragment_sign_in) { } } } - } + }*/ } override fun onDestroyView() { -- GitLab From b125ef99ea8016b8fc38c0aae968afc008853661 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Fri, 23 Sep 2022 13:09:33 +0530 Subject: [PATCH 04/13] issue_5680_4: Google login with fix for blank emails --- .../signin/google/GoogleSignInFragment.kt | 51 +++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/setup/signin/google/GoogleSignInFragment.kt b/app/src/main/java/foundation/e/apps/setup/signin/google/GoogleSignInFragment.kt index d21a53646..f69d1490c 100644 --- a/app/src/main/java/foundation/e/apps/setup/signin/google/GoogleSignInFragment.kt +++ b/app/src/main/java/foundation/e/apps/setup/signin/google/GoogleSignInFragment.kt @@ -27,21 +27,23 @@ import android.webkit.WebSettings import android.webkit.WebView import android.webkit.WebViewClient import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels +import androidx.lifecycle.ViewModelProvider import androidx.navigation.findNavController import dagger.hilt.android.AndroidEntryPoint import foundation.e.apps.R import foundation.e.apps.api.gplay.utils.AC2DMUtil import foundation.e.apps.databinding.FragmentGoogleSigninBinding -import foundation.e.apps.setup.signin.SignInViewModel -import foundation.e.apps.utils.enums.User +import foundation.e.apps.login.LoginViewModel +import foundation.e.apps.utils.modules.CommonUtilsModule.safeNavigate @AndroidEntryPoint class GoogleSignInFragment : Fragment(R.layout.fragment_google_signin) { private var _binding: FragmentGoogleSigninBinding? = null private val binding get() = _binding!! - private val viewModel: SignInViewModel by viewModels() + private val viewModel: LoginViewModel by lazy { + ViewModelProvider(requireActivity())[LoginViewModel::class.java] + } companion object { private const val EMBEDDED_SETUP_URL = @@ -54,7 +56,7 @@ class GoogleSignInFragment : Fragment(R.layout.fragment_google_signin) { _binding = FragmentGoogleSigninBinding.bind(view) setupWebView() - viewModel.userType.observe(viewLifecycleOwner) { + /*viewModel.userType.observe(viewLifecycleOwner) { if (it.isNotBlank()) { when (User.valueOf(it)) { User.GOOGLE -> { @@ -64,7 +66,7 @@ class GoogleSignInFragment : Fragment(R.layout.fragment_google_signin) { else -> {} } } - } + }*/ } @SuppressLint("SetJavaScriptEnabled") @@ -84,10 +86,41 @@ class GoogleSignInFragment : Fragment(R.layout.fragment_google_signin) { val cookieMap = AC2DMUtil.parseCookieString(cookies) if (cookieMap.isNotEmpty() && cookieMap[AUTH_TOKEN] != null) { val oauthToken = cookieMap[AUTH_TOKEN] ?: "" - view.evaluateJavascript("(function() { return document.getElementById('profileIdentifier').innerHTML; })();") { + /* + * Function to find full email id done by html inspection + * (and lot of trial and error.) + * + * Once email is entered and pressed "Next", the full email + * (i.e. if user just enters "xxxxxxxx.yyyyyyyyy", + * we need full id "xxxxxxxx.yyyyyyyyy@gmail.com") + * is present inside a div as below + * + *
+ * xxxxxxxx.yyyyyyyyy@gmail.com + *
+ * + * The "class" and "jsname" attribute may be random. + * We find elements having attribute "data-profile-identifier". + * Fortunately in the entire page, there is no other element with this + * attribute other than this element, once we find this div, we get the email. + * + * Stackoverflow links on getting the div and div contents: + * https://stackoverflow.com/a/27978840 + * https://stackoverflow.com/a/10371757 + * + * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5680 + */ + view.evaluateJavascript( + "document.querySelector(\"div[data-profile-identifier]\").textContent;" + ) { val email = it.replace("\"".toRegex(), "") - viewModel.saveEmailToken(email, oauthToken) - viewModel.saveUserType(User.GOOGLE) + viewModel.initialGoogleLogin(email, oauthToken) { + view.findNavController() + .safeNavigate( + R.id.googleSignInFragment, + R.id.action_googleSignInFragment_to_homeFragment + ) + } } } } -- GitLab From ae37725ccda77cbf1903ae95cf495ab2bd09ee05 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Mon, 5 Sep 2022 09:26:48 +0530 Subject: [PATCH 05/13] issue_5680_4: Simplify uploading faulty tokens --- .../java/foundation/e/apps/MainActivityViewModel.kt | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt index a697111f9..c366c5e7a 100644 --- a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt @@ -164,15 +164,9 @@ class MainActivityViewModel @Inject constructor( } } - fun uploadFaultyTokenToEcloud(description: String) { + fun uploadFaultyTokenToEcloud(email: String, description: String) { viewModelScope.launch { - authData.value?.let { authData -> - val email: String = authData.run { - if (email != "null") email - else userProfile?.email ?: "null" - } - ecloudRepository.uploadFaultyEmail(email, description) - } + ecloudRepository.uploadFaultyEmail(email, description) } } -- GitLab From f49e73601305abf6a35c06ca7f70d0e18d04d50a Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 6 Sep 2022 06:18:18 +0530 Subject: [PATCH 06/13] issue_5680_4: Make faulty token description blank by default --- app/src/main/java/foundation/e/apps/MainActivityViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt index c366c5e7a..5c30878bd 100644 --- a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt @@ -164,7 +164,7 @@ class MainActivityViewModel @Inject constructor( } } - fun uploadFaultyTokenToEcloud(email: String, description: String) { + fun uploadFaultyTokenToEcloud(email: String, description: String = "") { viewModelScope.launch { ecloudRepository.uploadFaultyEmail(email, description) } -- GitLab From 7877ab3f94bd1440df1fc88ec4ccc54de5005063 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Mon, 5 Sep 2022 09:28:36 +0530 Subject: [PATCH 07/13] issue_5680_4: Changes to MainActivityViewModel --- .../java/foundation/e/apps/MainActivityViewModel.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt index 5c30878bd..35c381f4b 100644 --- a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt @@ -92,6 +92,8 @@ class MainActivityViewModel @Inject constructor( val purchaseDeclined: MutableLiveData = MutableLiveData() var authRequestRunning = false + var gPlayAuthData = AuthData("", "") + /* * If this live data is populated, it means Google sign in failed. * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5709 @@ -125,8 +127,12 @@ class MainActivityViewModel @Inject constructor( private var isGoogleLoginRunning = false } + /** + * Fetching userType from Flow / LiveData is unreliable. + * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5680 + */ fun getUser(): User { - return User.valueOf(userType.value ?: User.UNAVAILABLE.name) + return dataStoreModule.getUserType() } private fun setFirstTokenFetchTime() { @@ -454,7 +460,7 @@ class MainActivityViewModel @Inject constructor( */ fun verifyUiFilter(fusedApp: FusedApp, method: () -> Unit) { viewModelScope.launch { - val authData = authData.value + val authData = gPlayAuthData if (fusedApp.filterLevel.isInitialized()) { method() } else { -- GitLab From ed83fd7b8f78e29065948fd7b5c80945aebe8a08 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Mon, 5 Sep 2022 09:22:07 +0530 Subject: [PATCH 08/13] issue_5680_4: MainActivity - Comment out older login related code and use new login flow --- .../java/foundation/e/apps/MainActivity.kt | 62 +++++++++++++++---- 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index c58ac6990..a9aa05bf8 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -28,16 +28,20 @@ import android.view.View import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.lifecycleScope import androidx.navigation.NavOptions import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController +import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.exceptions.ApiException import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import foundation.e.apps.application.subFrags.ApplicationDialogFragment import foundation.e.apps.databinding.ActivityMainBinding +import foundation.e.apps.login.AuthObject +import foundation.e.apps.login.LoginViewModel import foundation.e.apps.manager.database.fusedDownload.FusedDownload import foundation.e.apps.manager.workmanager.InstallWorkManager import foundation.e.apps.purchase.AppPurchaseFragmentDirections @@ -46,11 +50,12 @@ import foundation.e.apps.updates.UpdatesNotifier import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus +import foundation.e.apps.utils.exceptions.GPlayValidationException import foundation.e.apps.utils.modules.CommonUtilsModule -import foundation.e.apps.utils.parentFragment.TimeoutFragment import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.filter import kotlinx.coroutines.launch +import org.json.JSONObject import timber.log.Timber import java.io.File import java.util.UUID @@ -58,6 +63,7 @@ import java.util.UUID @AndroidEntryPoint class MainActivity : AppCompatActivity() { private lateinit var signInViewModel: SignInViewModel + private lateinit var loginViewModel: LoginViewModel private lateinit var binding: ActivityMainBinding private val TAG = MainActivity::class.java.simpleName private lateinit var viewModel: MainActivityViewModel @@ -78,6 +84,7 @@ class MainActivity : AppCompatActivity() { viewModel = ViewModelProvider(this)[MainActivityViewModel::class.java] signInViewModel = ViewModelProvider(this)[SignInViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] // navOptions and activityNavController for TOS and SignIn Fragments val navOptions = NavOptions.Builder() @@ -85,9 +92,11 @@ class MainActivity : AppCompatActivity() { .build() navOptions.shouldLaunchSingleTop() - viewModel.tocStatus.observe(this) { + viewModel.tocStatus.distinctUntilChanged().observe(this) { if (it != true) { navController.navigate(R.id.TOSFragment, null, navOptions) + } else { + loginViewModel.startLoginFlow() } } @@ -98,29 +107,29 @@ class MainActivity : AppCompatActivity() { binding.fragment.visibility = View.VISIBLE // Watch and refresh authentication data - if (viewModel.authDataJson.value == null) { + /*if (viewModel.authDataJson.value == null) { viewModel.authDataJson.observe(this) { viewModel.handleAuthDataJson() } - } + }*/ } } - viewModel.userType.observe(this) { user -> + /*viewModel.userType.observe(this) { user -> viewModel.handleAuthDataJson() - } + }*/ - if (signInViewModel.authLiveData.value == null) { + /*if (signInViewModel.authLiveData.value == null) { signInViewModel.authLiveData.observe(this) { viewModel.updateAuthData(it) } - } + }*/ - viewModel.errorAuthResponse.observe(this) { + /*viewModel.errorAuthResponse.observe(this) { onSignInError() - } + }*/ - viewModel.authValidity.observe(this) { + /*viewModel.authValidity.observe(this) { viewModel.handleAuthValidity(it) { Timber.d("Timeout validating auth data!") val lastFragment = navHostFragment.childFragmentManager.fragments[0] @@ -129,6 +138,37 @@ class MainActivity : AppCompatActivity() { lastFragment.onTimeout() } } + }*/ + + /* + * New login code. + * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5680 + */ + loginViewModel.authObjects.distinctUntilChanged().observe(this) { + when { + it == null -> return@observe + it.isEmpty() -> { + // No auth type defined means user has not logged in yet + navController.navigate(R.id.signInFragment) + } + else -> {} + } + + it.find { it is AuthObject.GPlayAuth }?.result?.run { + if (isSuccess()) { + viewModel.gPlayAuthData = data as AuthData + } else if (!isSuccess() && exception is GPlayValidationException) { + val email = otherPayload.toString() + val descriptionJson = JSONObject().apply { + put("versionName", BuildConfig.VERSION_NAME) + put("versionCode", BuildConfig.VERSION_CODE) + put("debuggable", BuildConfig.DEBUG) + put("device", Build.DEVICE) + put("api", Build.VERSION.SDK_INT) + } + viewModel.uploadFaultyTokenToEcloud(email, descriptionJson.toString()) + } + } } navController.addOnDestinationChangedListener { _, destination, _ -> -- GitLab From 7ea6a2ce3d985f9db0564410c0fc05d9b44a3bdd Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Mon, 5 Sep 2022 09:23:54 +0530 Subject: [PATCH 09/13] issue_5680_4: TOSFragment - comment out opening login page, it will be automatically handled from MainActivity. --- .../main/java/foundation/e/apps/setup/tos/TOSFragment.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/apps/setup/tos/TOSFragment.kt b/app/src/main/java/foundation/e/apps/setup/tos/TOSFragment.kt index 920a70f49..778c489bf 100644 --- a/app/src/main/java/foundation/e/apps/setup/tos/TOSFragment.kt +++ b/app/src/main/java/foundation/e/apps/setup/tos/TOSFragment.kt @@ -35,7 +35,11 @@ class TOSFragment : Fragment(R.layout.fragment_tos) { viewModel.tocStatus.observe(viewLifecycleOwner) { if (canNavigate) { - view.findNavController().navigate(R.id.action_TOSFragment_to_signInFragment) + /* + * SignInFragment will be called automatically from MainActivity + * It is done from observing LoginViewModel's authObjects. + */ + // view.findNavController().navigate(R.id.action_TOSFragment_to_signInFragment) } if (it == true && webView != null) { -- GitLab From e4bd088d46fa35520ef41f3945e3bec7684c4c4d Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Fri, 23 Sep 2022 13:32:26 +0530 Subject: [PATCH 10/13] issue_5680_4: [Fix] IllegalStateException: There are multiple DataStores active for the same file --- app/src/main/java/foundation/e/apps/login/LoginDataStore.kt | 4 +--- .../java/foundation/e/apps/utils/modules/DataStoreModule.kt | 6 ++++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/login/LoginDataStore.kt b/app/src/main/java/foundation/e/apps/login/LoginDataStore.kt index 134d81924..f6246571e 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginDataStore.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginDataStore.kt @@ -29,6 +29,7 @@ import foundation.e.apps.utils.Constants.PREFERENCE_SHOW_FOSS import foundation.e.apps.utils.Constants.PREFERENCE_SHOW_GPLAY import foundation.e.apps.utils.Constants.PREFERENCE_SHOW_PWA import foundation.e.apps.utils.enums.User +import foundation.e.apps.utils.modules.DataStoreModule.Companion.dataStore import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.runBlocking @@ -42,9 +43,6 @@ class LoginDataStore @Inject constructor( private val gson: Gson ) { - private val preferenceDataStoreName = "Settings" - private val Context.dataStore by preferencesDataStore(preferenceDataStoreName) - private val preferenceManager = PreferenceManager.getDefaultSharedPreferences(context) private val AUTHDATA = stringPreferencesKey("authData") diff --git a/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt b/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt index 7e57fd900..b2be269c8 100644 --- a/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt +++ b/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt @@ -40,8 +40,10 @@ class DataStoreModule @Inject constructor( private val gson: Gson ) { - private val preferenceDataStoreName = "Settings" - private val Context.dataStore by preferencesDataStore(preferenceDataStoreName) + companion object { + private const val preferenceDataStoreName = "Settings" + val Context.dataStore by preferencesDataStore(preferenceDataStoreName) + } private val AUTHDATA = stringPreferencesKey("authData") private val EMAIL = stringPreferencesKey("email") -- GitLab From 62286e9760c529e2f75bf8df60855d6eb24cccc3 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Thu, 29 Sep 2022 13:19:12 +0530 Subject: [PATCH 11/13] issue_5680_4: remove lot of comments --- .../e/apps/MainActivityViewModel.kt | 4 --- .../e/apps/login/LoginSourceRepository.kt | 4 --- .../e/apps/login/api/GPlayApiFactory.kt | 4 --- .../e/apps/setup/signin/SignInFragment.kt | 17 --------- .../signin/google/GoogleSignInFragment.kt | 36 ------------------- .../e/apps/setup/tos/TOSFragment.kt | 13 ------- 6 files changed, 78 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt index 35c381f4b..79b3f77f2 100644 --- a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt @@ -127,10 +127,6 @@ class MainActivityViewModel @Inject constructor( private var isGoogleLoginRunning = false } - /** - * Fetching userType from Flow / LiveData is unreliable. - * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5680 - */ fun getUser(): User { return dataStoreModule.getUserType() } diff --git a/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt b/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt index 7570eab3e..e403c8ba1 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt @@ -21,10 +21,6 @@ import foundation.e.apps.utils.enums.User import javax.inject.Inject import javax.inject.Singleton -/** - * Perform various login tasks using login sources. - * https://gitlab.e.foundation/e/backlog/-/issues/5680 - */ @JvmSuppressWildcards @Singleton class LoginSourceRepository @Inject constructor( diff --git a/app/src/main/java/foundation/e/apps/login/api/GPlayApiFactory.kt b/app/src/main/java/foundation/e/apps/login/api/GPlayApiFactory.kt index 66da33c55..a910d525d 100644 --- a/app/src/main/java/foundation/e/apps/login/api/GPlayApiFactory.kt +++ b/app/src/main/java/foundation/e/apps/login/api/GPlayApiFactory.kt @@ -25,10 +25,6 @@ import java.util.Properties import javax.inject.Inject import javax.inject.Singleton -/** - * Factory method to return appropriate GPlay API. - * https://medium.com/geekculture/overview-of-factory-method-design-pattern-d3a6fe908ea4 - */ @Singleton class GPlayApiFactory @Inject constructor( private val gPlayHttpClient: GPlayHttpClient, diff --git a/app/src/main/java/foundation/e/apps/setup/signin/SignInFragment.kt b/app/src/main/java/foundation/e/apps/setup/signin/SignInFragment.kt index 3402306f8..ffd568aa0 100644 --- a/app/src/main/java/foundation/e/apps/setup/signin/SignInFragment.kt +++ b/app/src/main/java/foundation/e/apps/setup/signin/SignInFragment.kt @@ -35,23 +35,6 @@ class SignInFragment : Fragment(R.layout.fragment_sign_in) { .safeNavigate(R.id.signInFragment, R.id.action_signInFragment_to_homeFragment) } } - - /*viewModel.userType.observe(viewLifecycleOwner) { - if (it.isNotBlank()) { - when (User.valueOf(it)) { - User.ANONYMOUS -> { - view.findNavController() - .navigate(R.id.action_signInFragment_to_homeFragment) - } - User.GOOGLE -> { - view.findNavController() - .navigate(R.id.action_signInFragment_to_homeFragment) - } - else -> { - } - } - } - }*/ } override fun onDestroyView() { diff --git a/app/src/main/java/foundation/e/apps/setup/signin/google/GoogleSignInFragment.kt b/app/src/main/java/foundation/e/apps/setup/signin/google/GoogleSignInFragment.kt index f69d1490c..8470c359c 100644 --- a/app/src/main/java/foundation/e/apps/setup/signin/google/GoogleSignInFragment.kt +++ b/app/src/main/java/foundation/e/apps/setup/signin/google/GoogleSignInFragment.kt @@ -55,18 +55,6 @@ class GoogleSignInFragment : Fragment(R.layout.fragment_google_signin) { super.onViewCreated(view, savedInstanceState) _binding = FragmentGoogleSigninBinding.bind(view) setupWebView() - - /*viewModel.userType.observe(viewLifecycleOwner) { - if (it.isNotBlank()) { - when (User.valueOf(it)) { - User.GOOGLE -> { - view.findNavController() - .navigate(R.id.action_googleSignInFragment_to_homeFragment) - } - else -> {} - } - } - }*/ } @SuppressLint("SetJavaScriptEnabled") @@ -86,30 +74,6 @@ class GoogleSignInFragment : Fragment(R.layout.fragment_google_signin) { val cookieMap = AC2DMUtil.parseCookieString(cookies) if (cookieMap.isNotEmpty() && cookieMap[AUTH_TOKEN] != null) { val oauthToken = cookieMap[AUTH_TOKEN] ?: "" - /* - * Function to find full email id done by html inspection - * (and lot of trial and error.) - * - * Once email is entered and pressed "Next", the full email - * (i.e. if user just enters "xxxxxxxx.yyyyyyyyy", - * we need full id "xxxxxxxx.yyyyyyyyy@gmail.com") - * is present inside a div as below - * - *
- * xxxxxxxx.yyyyyyyyy@gmail.com - *
- * - * The "class" and "jsname" attribute may be random. - * We find elements having attribute "data-profile-identifier". - * Fortunately in the entire page, there is no other element with this - * attribute other than this element, once we find this div, we get the email. - * - * Stackoverflow links on getting the div and div contents: - * https://stackoverflow.com/a/27978840 - * https://stackoverflow.com/a/10371757 - * - * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5680 - */ view.evaluateJavascript( "document.querySelector(\"div[data-profile-identifier]\").textContent;" ) { diff --git a/app/src/main/java/foundation/e/apps/setup/tos/TOSFragment.kt b/app/src/main/java/foundation/e/apps/setup/tos/TOSFragment.kt index 778c489bf..9a0515c15 100644 --- a/app/src/main/java/foundation/e/apps/setup/tos/TOSFragment.kt +++ b/app/src/main/java/foundation/e/apps/setup/tos/TOSFragment.kt @@ -19,10 +19,6 @@ class TOSFragment : Fragment(R.layout.fragment_tos) { private var _binding: FragmentTosBinding? = null private val binding get() = _binding!! - /* - * Fix memory leaks related to WebView. - * Issue: https://gitlab.e.foundation/e/os/backlog/-/issues/485 - */ private var webView: WebView? = null private val viewModel: TOSViewModel by viewModels() @@ -31,16 +27,8 @@ class TOSFragment : Fragment(R.layout.fragment_tos) { super.onViewCreated(view, savedInstanceState) _binding = FragmentTosBinding.bind(view) webView = binding.tosWebView - var canNavigate = false viewModel.tocStatus.observe(viewLifecycleOwner) { - if (canNavigate) { - /* - * SignInFragment will be called automatically from MainActivity - * It is done from observing LoginViewModel's authObjects. - */ - // view.findNavController().navigate(R.id.action_TOSFragment_to_signInFragment) - } if (it == true && webView != null) { binding.TOSWarning.visibility = View.GONE @@ -72,7 +60,6 @@ class TOSFragment : Fragment(R.layout.fragment_tos) { binding.agreeBT.setOnClickListener { viewModel.saveTOCStatus(true) - canNavigate = true } } -- GitLab From 197a85b4681b8f6e736bce4df0119709a7e9f34c Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Fri, 30 Sep 2022 13:22:45 +0530 Subject: [PATCH 12/13] issue_5680_4: remove more comments --- .../java/foundation/e/apps/MainActivity.kt | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index a9aa05bf8..dced451cf 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -105,45 +105,9 @@ class MainActivity : AppCompatActivity() { if (isInternetAvailable) { binding.noInternet.visibility = View.GONE binding.fragment.visibility = View.VISIBLE - - // Watch and refresh authentication data - /*if (viewModel.authDataJson.value == null) { - viewModel.authDataJson.observe(this) { - viewModel.handleAuthDataJson() - } - }*/ } } - /*viewModel.userType.observe(this) { user -> - viewModel.handleAuthDataJson() - }*/ - - /*if (signInViewModel.authLiveData.value == null) { - signInViewModel.authLiveData.observe(this) { - viewModel.updateAuthData(it) - } - }*/ - - /*viewModel.errorAuthResponse.observe(this) { - onSignInError() - }*/ - - /*viewModel.authValidity.observe(this) { - viewModel.handleAuthValidity(it) { - Timber.d("Timeout validating auth data!") - val lastFragment = navHostFragment.childFragmentManager.fragments[0] - if (lastFragment is TimeoutFragment) { - Timber.d("Displaying timeout from MainActivity on fragment: " + lastFragment.javaClass.name) - lastFragment.onTimeout() - } - } - }*/ - - /* - * New login code. - * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5680 - */ loginViewModel.authObjects.distinctUntilChanged().observe(this) { when { it == null -> return@observe -- GitLab From 530707b8128393794a16d6c2a25766d62b9533b1 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Fri, 30 Sep 2022 14:22:25 +0530 Subject: [PATCH 13/13] issue_5680_4: suggestions --- app/src/main/java/foundation/e/apps/MainActivity.kt | 3 +-- .../foundation/e/apps/utils/modules/DataStoreModule.kt | 8 -------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index dced451cf..3d43ec3c1 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -112,7 +112,6 @@ class MainActivity : AppCompatActivity() { when { it == null -> return@observe it.isEmpty() -> { - // No auth type defined means user has not logged in yet navController.navigate(R.id.signInFragment) } else -> {} @@ -121,7 +120,7 @@ class MainActivity : AppCompatActivity() { it.find { it is AuthObject.GPlayAuth }?.result?.run { if (isSuccess()) { viewModel.gPlayAuthData = data as AuthData - } else if (!isSuccess() && exception is GPlayValidationException) { + } else if (exception is GPlayValidationException) { val email = otherPayload.toString() val descriptionJson = JSONObject().apply { put("versionName", BuildConfig.VERSION_NAME) diff --git a/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt b/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt index b2be269c8..a475ba175 100644 --- a/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt +++ b/app/src/main/java/foundation/e/apps/utils/modules/DataStoreModule.kt @@ -141,14 +141,6 @@ class DataStoreModule @Inject constructor( return aasToken.first() } - /** - * Get the [User] type stored in the data store. - * In case nothing is stored, returns [User.UNAVAILABLE]. - * - * No need to wrap this function in try-catch block. - * - * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5680 - */ fun getUserType(): User { return runBlocking { userType.first().run { -- GitLab