Fix calling navigateToAuth twice and even more
Calling that method several times in a row is not supported, Navigation library throws an Exception saying it doesn't know how to navigate there
This commit is contained in:
@@ -7,6 +7,7 @@ import android.view.ViewGroup
|
|||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
|
import androidx.lifecycle.Observer
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import com.google.android.material.textfield.TextInputLayout
|
import com.google.android.material.textfield.TextInputLayout
|
||||||
@@ -21,18 +22,20 @@ class AuthenticationFragment : Fragment() {
|
|||||||
get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" }
|
get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" }
|
||||||
private val viewModel by viewModels<AuthenticationViewModel>()
|
private val viewModel by viewModels<AuthenticationViewModel>()
|
||||||
|
|
||||||
|
private val authStatuses by lazy { viewModel.authenticationStatuses() }
|
||||||
|
private val authStatusObserver = Observer<Boolean> { onAuthStatusChange(it) }
|
||||||
|
private fun onAuthStatusChange(isAuthenticated: Boolean) {
|
||||||
|
Timber.v("onAuthStatusChange() called with: isAuthenticated = $isAuthenticated")
|
||||||
|
if (isAuthenticated) {
|
||||||
|
authStatuses.removeObserver(authStatusObserver)
|
||||||
|
navigateToRecipes()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
Timber.v("onCreate() called with: savedInstanceState = $savedInstanceState")
|
Timber.v("onCreate() called with: savedInstanceState = $savedInstanceState")
|
||||||
listenToAuthenticationStatuses()
|
authStatuses.observe(this, authStatusObserver)
|
||||||
}
|
|
||||||
|
|
||||||
private fun listenToAuthenticationStatuses() {
|
|
||||||
Timber.d("listenToAuthenticationStatuses() called")
|
|
||||||
viewModel.authenticationStatuses().observe(this) {
|
|
||||||
Timber.d("listenToAuthenticationStatuses: new status = $it")
|
|
||||||
if (it) navigateToRecipes()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
|
import androidx.lifecycle.Observer
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
@@ -25,7 +26,17 @@ class RecipesFragment : Fragment() {
|
|||||||
private val binding: FragmentRecipesBinding
|
private val binding: FragmentRecipesBinding
|
||||||
get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" }
|
get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" }
|
||||||
private val viewModel by viewModels<RecipeViewModel>()
|
private val viewModel by viewModels<RecipeViewModel>()
|
||||||
|
|
||||||
private val authViewModel by viewModels<AuthenticationViewModel>()
|
private val authViewModel by viewModels<AuthenticationViewModel>()
|
||||||
|
private val authStatuses by lazy { authViewModel.authenticationStatuses() }
|
||||||
|
private val authStatusObserver = Observer<Boolean> { onAuthStatusChange(it) }
|
||||||
|
private fun onAuthStatusChange(isAuthenticated: Boolean) {
|
||||||
|
Timber.v("onAuthStatusChange() called with: isAuthenticated = $isAuthenticated")
|
||||||
|
if (!isAuthenticated) {
|
||||||
|
authStatuses.removeObserver(authStatusObserver)
|
||||||
|
navigateToAuthFragment()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
@@ -41,7 +52,7 @@ class RecipesFragment : Fragment() {
|
|||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState")
|
Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState")
|
||||||
setupRecipeAdapter()
|
setupRecipeAdapter()
|
||||||
listenToAuthStatuses()
|
authStatuses.observe(this, authStatusObserver)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun navigateToRecipeInfo(recipeSummaryEntity: RecipeSummaryEntity) {
|
private fun navigateToRecipeInfo(recipeSummaryEntity: RecipeSummaryEntity) {
|
||||||
@@ -54,14 +65,6 @@ class RecipesFragment : Fragment() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun listenToAuthStatuses() {
|
|
||||||
Timber.v("listenToAuthStatuses() called")
|
|
||||||
authViewModel.authenticationStatuses().observe(this) {
|
|
||||||
Timber.v("listenToAuthStatuses: new auth status = $it")
|
|
||||||
if (!it) navigateToAuthFragment()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun navigateToAuthFragment() {
|
private fun navigateToAuthFragment() {
|
||||||
Timber.v("navigateToAuthFragment() called")
|
Timber.v("navigateToAuthFragment() called")
|
||||||
findNavController().navigate(RecipesFragmentDirections.actionRecipesFragmentToAuthenticationFragment())
|
findNavController().navigate(RecipesFragmentDirections.actionRecipesFragmentToAuthenticationFragment())
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
|
import androidx.lifecycle.Observer
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
@@ -19,10 +20,20 @@ class RecipeInfoFragment : Fragment() {
|
|||||||
private var _binding: FragmentRecipeInfoBinding? = null
|
private var _binding: FragmentRecipeInfoBinding? = null
|
||||||
private val binding: FragmentRecipeInfoBinding
|
private val binding: FragmentRecipeInfoBinding
|
||||||
get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" }
|
get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" }
|
||||||
private val authViewModel by viewModels<AuthenticationViewModel>()
|
|
||||||
private val arguments by navArgs<RecipeInfoFragmentArgs>()
|
private val arguments by navArgs<RecipeInfoFragmentArgs>()
|
||||||
private val viewModel by viewModels<RecipeInfoViewModel>()
|
private val viewModel by viewModels<RecipeInfoViewModel>()
|
||||||
|
|
||||||
|
private val authViewModel by viewModels<AuthenticationViewModel>()
|
||||||
|
private val authStatuses by lazy { authViewModel.authenticationStatuses() }
|
||||||
|
private val authStatusObserver = Observer<Boolean> { onAuthStatusChange(it) }
|
||||||
|
private fun onAuthStatusChange(isAuthenticated: Boolean) {
|
||||||
|
Timber.v("onAuthStatusChange() called with: isAuthenticated = $isAuthenticated")
|
||||||
|
if (!isAuthenticated) {
|
||||||
|
authStatuses.removeObserver(authStatusObserver)
|
||||||
|
navigateToAuthFragment()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
@@ -36,9 +47,11 @@ class RecipeInfoFragment : Fragment() {
|
|||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState")
|
Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState")
|
||||||
listenToAuthStatuses()
|
authStatuses.observe(this, authStatusObserver)
|
||||||
|
|
||||||
viewModel.loadRecipeImage(binding.image, arguments.recipeSlug)
|
viewModel.loadRecipeImage(binding.image, arguments.recipeSlug)
|
||||||
viewModel.loadRecipeInfo(arguments.recipeId, arguments.recipeSlug)
|
viewModel.loadRecipeInfo(arguments.recipeId, arguments.recipeSlug)
|
||||||
|
|
||||||
viewModel.recipeInfo.observe(viewLifecycleOwner) {
|
viewModel.recipeInfo.observe(viewLifecycleOwner) {
|
||||||
Timber.d("onViewCreated: full info $it")
|
Timber.d("onViewCreated: full info $it")
|
||||||
binding.title.text = it.recipeSummaryEntity.name
|
binding.title.text = it.recipeSummaryEntity.name
|
||||||
@@ -56,14 +69,6 @@ class RecipeInfoFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun listenToAuthStatuses() {
|
|
||||||
Timber.v("listenToAuthStatuses() called")
|
|
||||||
authViewModel.authenticationStatuses().observe(this) {
|
|
||||||
Timber.d("listenToAuthStatuses: new auth status = $it")
|
|
||||||
if (!it) navigateToAuthFragment()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun navigateToAuthFragment() {
|
private fun navigateToAuthFragment() {
|
||||||
Timber.v("navigateToAuthFragment() called")
|
Timber.v("navigateToAuthFragment() called")
|
||||||
findNavController().navigate(RecipeInfoFragmentDirections.actionRecipeInfoFragmentToAuthenticationFragment())
|
findNavController().navigate(RecipeInfoFragmentDirections.actionRecipeInfoFragmentToAuthenticationFragment())
|
||||||
|
|||||||
Reference in New Issue
Block a user