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:
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 -> {}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user