AccountFragment: Throw users on splashFragment on logout

We have multiple checks implemented at this point in splashFragment to ensure
proper validation and navigation. If a user logs out and hits back button, he still
gets to browse Aurora Store which is an unintended behaviour.

Instead of handling same logic twice everywhere, make AccountFragment minimal and only
handle logging out here.

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-06-01 13:26:45 +05:30
parent cf4e0ee091
commit 6bf75bb68a
58 changed files with 75 additions and 412 deletions

View File

@@ -29,14 +29,6 @@ class AccountProvider private constructor(var context: Context) {
companion object : SingletonHolder<AccountProvider, Context>(::AccountProvider)
fun isSignedIn(): Boolean {
return Preferences.getBoolean(context, Constants.ACCOUNT_SIGNED_IN)
}
fun getSignInTimeStamp(): Long {
return Preferences.getLong(context, Constants.ACCOUNT_SIGNED_TIMESTAMP)
}
fun getAccountType(): AccountType {
val rawType = Preferences.getString(context, Constants.ACCOUNT_TYPE)
return when (rawType) {

View File

@@ -22,7 +22,6 @@ package com.aurora.store.view.ui.account
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import coil.load
import coil.transform.RoundedCornersTransformation
@@ -30,13 +29,10 @@ import com.aurora.Constants.URL_DISCLAIMER
import com.aurora.Constants.URL_LICENSE
import com.aurora.Constants.URL_TOS
import com.aurora.extensions.browse
import com.aurora.gplayapi.data.models.AuthData
import com.aurora.store.R
import com.aurora.store.data.AuthState
import com.aurora.store.data.providers.AccountProvider
import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.databinding.FragmentAccountBinding
import com.aurora.store.viewmodel.auth.AuthViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@@ -46,17 +42,11 @@ class AccountFragment : Fragment(R.layout.fragment_account) {
private val binding: FragmentAccountBinding
get() = _binding!!
private val viewModel: AuthViewModel by activityViewModels()
private lateinit var authData: AuthData
private lateinit var accountProvider: AccountProvider
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = FragmentAccountBinding.bind(view)
authData = AuthProvider.with(view.context).getAuthData()
accountProvider = AccountProvider.with(view.context)
val authData = AuthProvider.with(view.context).getAuthData()
// Toolbar
binding.layoutToolbarAction.txtTitle.text = getString(R.string.title_account_manager)
@@ -71,49 +61,22 @@ class AccountFragment : Fragment(R.layout.fragment_account) {
binding.chipTos.setOnClickListener { browse(URL_TOS) }
}
attachActions()
updateContents()
viewModel.liveData.observe(viewLifecycleOwner) {
when (it) {
AuthState.Fetching -> {
updateStatus(getString(R.string.requesting_new_session))
}
AuthState.Valid -> {
}
AuthState.Available -> {
updateStatus(getString(R.string.session_verifying))
updateActionLayout(false)
}
AuthState.Unavailable -> {
updateStatus(getString(R.string.session_login))
updateActionLayout(true)
}
AuthState.SignedIn -> {
updateContents()
}
AuthState.SignedOut -> {
updateStatus(getString(R.string.session_scrapped))
updateActionLayout(true)
}
AuthState.Verifying -> {
updateStatus(getString(R.string.verifying_new_session))
}
is AuthState.Failed -> {
updateStatus(it.status)
updateActionLayout(true)
resetActions()
}
authData.userProfile?.let {
val avatar = if (authData.isAnonymous) R.mipmap.ic_launcher else it.artwork.url
binding.imgAvatar.load(avatar) {
placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(32F))
}
binding.txtName.text = if (authData.isAnonymous) "Anonymous" else it.name
binding.txtEmail.text = if (authData.isAnonymous) "anonymous@gmail.com" else it.email
}
binding.btnLogout.addOnClickListener {
binding.btnLogout.updateProgress(true)
AccountProvider.with(view.context).logout()
findNavController().navigate(
AccountFragmentDirections.actionAccountFragmentToSplashFragment()
)
}
}
@@ -121,103 +84,4 @@ class AccountFragment : Fragment(R.layout.fragment_account) {
super.onDestroyView()
_binding = null
}
private fun updateContents() {
if (accountProvider.isSignedIn()) {
binding.viewFlipper.displayedChild = 1
updateStatus(getString(R.string.session_good))
} else {
binding.viewFlipper.displayedChild = 0
updateStatus(getString(R.string.session_enjoy))
}
updateUserProfile()
}
private fun updateStatus(string: String?) {
activity?.runOnUiThread {
binding.txtStatus.apply {
text = string
}
}
}
private fun updateActionLayout(isVisible: Boolean) {
if (isVisible) {
binding.layoutAction.visibility = View.VISIBLE
} else {
binding.layoutAction.visibility = View.INVISIBLE
}
}
private fun attachActions() {
binding.btnAnonymous.updateProgress(false)
binding.btnGoogle.updateProgress(false)
binding.btnAnonymous.addOnClickListener {
if (viewModel.liveData.value != AuthState.Fetching) {
binding.btnAnonymous.updateProgress(true)
viewModel.buildAnonymousAuthData()
}
}
binding.btnGoogle.addOnClickListener {
if (viewModel.liveData.value != AuthState.Fetching) {
binding.btnGoogle.updateProgress(true)
findNavController().navigate(
AccountFragmentDirections.actionAccountFragmentToGoogleFragment(
R.id.accountFragment
)
)
}
}
binding.btnLogout.addOnClickListener {
AccountProvider.with(it.context).logout()
binding.btnAnonymous.updateProgress(false)
binding.btnGoogle.updateProgress(false)
updateContents()
}
}
private fun resetActions() {
binding.btnGoogle.apply {
updateProgress(false)
isEnabled = true
}
binding.btnAnonymous.apply {
updateProgress(false)
isEnabled = true
}
}
private fun updateUserProfile() {
authData = AuthProvider.with(requireContext()).getAuthData()
if (accountProvider.isSignedIn()) {
authData.userProfile?.let {
binding.imgAvatar.load(it.artwork.url) {
placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(32F))
}
binding.txtName.text = if (authData.isAnonymous)
"Anonymous"
else
it.name
binding.txtEmail.text = if (authData.isAnonymous)
"anonymous@gmail.com"
else
it.email
}
} else {
binding.imgAvatar.load(R.mipmap.ic_launcher) {
transformations(RoundedCornersTransformation(32F))
}
binding.txtName.text = getString(R.string.app_name)
binding.txtEmail.text = getString(R.string.account_logged_out)
}
}
}

View File

@@ -32,7 +32,6 @@ import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.aurora.store.R
import com.aurora.store.data.event.BusEvent
import com.aurora.store.databinding.FragmentGoogleBinding
@@ -46,7 +45,6 @@ import org.greenrobot.eventbus.ThreadMode
@AndroidEntryPoint
class GoogleFragment : Fragment(R.layout.fragment_google) {
private val args: GoogleFragmentArgs by navArgs()
private val viewModel: AuthViewModel by activityViewModels()
companion object {
@@ -146,19 +144,9 @@ class GoogleFragment : Fragment(R.layout.fragment_google) {
).show()
}
when (args.destination) {
R.id.splashFragment -> {
findNavController().navigate(
GoogleFragmentDirections.actionGoogleFragmentToSplashFragment()
)
}
R.id.accountFragment -> {
findNavController().navigate(
GoogleFragmentDirections.actionGoogleFragmentToAccountFragment()
)
}
}
findNavController().navigate(
GoogleFragmentDirections.actionGoogleFragmentToSplashFragment()
)
}
else -> {}

View File

@@ -162,11 +162,7 @@ class SplashFragment : Fragment(R.layout.fragment_splash) {
}
private fun updateStatus(string: String?) {
activity?.runOnUiThread {
binding.txtStatus.apply {
text = string
}
}
activity?.runOnUiThread { binding.txtStatus.text = string }
}
private fun updateActionLayout(isVisible: Boolean) {
@@ -197,11 +193,7 @@ class SplashFragment : Fragment(R.layout.fragment_splash) {
binding.btnGoogle.addOnClickListener {
if (viewModel.liveData.value != AuthState.Fetching) {
binding.btnGoogle.updateProgress(true)
findNavController().navigate(
SplashFragmentDirections.actionSplashFragmentToGoogleFragment(
R.id.splashFragment
)
)
findNavController().navigate(R.id.googleFragment)
}
}
}
@@ -230,6 +222,7 @@ class SplashFragment : Fragment(R.layout.fragment_splash) {
2 -> SplashFragmentDirections.actionSplashFragmentToUpdatesFragment()
else -> SplashFragmentDirections.actionSplashFragmentToNavigationApps()
}
activity?.viewModelStore?.clear() // Clear ViewModelStore to avoid bugs with logout
findNavController().navigate(directions)
}