From 6c3abbd51cf32cf7fbab9e3fe844f6e82dfc14fd Mon Sep 17 00:00:00 2001 From: Kirill Kamakin Date: Sun, 20 Nov 2022 10:36:26 +0100 Subject: [PATCH] Highlight current tab in navigation drawer --- .../mealient/ui/activity/MainActivity.kt | 24 ++++++++++++------- .../ui/activity/MainActivityUiState.kt | 3 +++ .../mealient/ui/add/AddRecipeFragment.kt | 6 ++++- .../ui/auth/AuthenticationFragment.kt | 4 ++-- .../mealient/ui/baseurl/BaseURLFragment.kt | 6 ++++- .../ui/disclaimer/DisclaimerFragment.kt | 2 +- .../ui/recipes/RecipesListFragment.kt | 6 ++++- app/src/main/res/menu/navigation_menu.xml | 4 ++++ app/src/main/res/navigation/nav_graph.xml | 6 ++--- 9 files changed, 42 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt index 00eaaf6..0356d8d 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt @@ -8,6 +8,7 @@ import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView.OnQueryTextListener import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.WindowInsetsControllerCompat +import androidx.core.view.iterator import androidx.drawerlayout.widget.DrawerLayout import androidx.navigation.NavController import androidx.navigation.NavDirections @@ -65,11 +66,16 @@ class MainActivity : AppCompatActivity(R.layout.main_activity) { isAppearanceLightNavigationBars = isAppearanceLightBars isAppearanceLightStatusBars = isAppearanceLightBars } + setupSearchItem(binding.toolbar.menu.findItem(R.id.search_recipe_action)) viewModel.uiStateLive.observe(this, ::onUiStateChange) } private fun onNavigationItemSelected(menuItem: MenuItem): Boolean { logger.v { "onNavigationItemSelected() called with: menuItem = $menuItem" } + if (menuItem.isChecked) { + logger.d { "Not navigating because it is the current destination" } + return true + } val directions = when (menuItem.itemId) { R.id.add_recipe -> actionGlobalAddRecipeFragment() R.id.recipes_list -> actionGlobalRecipesListFragment() @@ -77,20 +83,24 @@ class MainActivity : AppCompatActivity(R.layout.main_activity) { R.id.login -> actionGlobalAuthenticationFragment() R.id.logout -> { viewModel.logout() - binding.drawer.close() return true } else -> throw IllegalArgumentException("Unknown menu item id: ${menuItem.itemId}") } + menuItem.isChecked = true navigateTo(directions) return true } private fun onUiStateChange(uiState: MainActivityUiState) { logger.v { "onUiStateChange() called with: uiState = $uiState" } - with(binding.navigationView) { - menu.findItem(R.id.logout).isVisible = uiState.canShowLogout - menu.findItem(R.id.login).isVisible = uiState.canShowLogin + for (menuItem in binding.navigationView.menu.iterator()) { + val itemId = menuItem.itemId + when (itemId) { + R.id.logout -> menuItem.isVisible = uiState.canShowLogout + R.id.login -> menuItem.isVisible = uiState.canShowLogin + } + menuItem.isChecked = itemId == uiState.checkedMenuItemId } if (uiState.navigationVisible) { @@ -101,11 +111,7 @@ class MainActivity : AppCompatActivity(R.layout.main_activity) { binding.toolbar.navigationIcon = null } - - binding.toolbar.menu.findItem(R.id.search_recipe_action).apply { - isVisible = uiState.searchVisible - setupSearchItem(this) - } + binding.toolbar.menu.findItem(R.id.search_recipe_action).isVisible = uiState.searchVisible } private fun setupSearchItem(searchItem: MenuItem) { diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityUiState.kt b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityUiState.kt index 45c5493..eda6f14 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityUiState.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityUiState.kt @@ -1,9 +1,12 @@ package gq.kirmanak.mealient.ui.activity +import androidx.annotation.IdRes + data class MainActivityUiState( val isAuthorized: Boolean = false, val navigationVisible: Boolean = false, val searchVisible: Boolean = false, + @IdRes val checkedMenuItemId: Int? = null, ) { val canShowLogin: Boolean get() = !isAuthorized diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/add/AddRecipeFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/add/AddRecipeFragment.kt index 48b30b0..c9cfeb0 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/add/AddRecipeFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/add/AddRecipeFragment.kt @@ -38,7 +38,11 @@ class AddRecipeFragment : Fragment(R.layout.fragment_add_recipe) { super.onViewCreated(view, savedInstanceState) logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" } activityViewModel.updateUiState { - it.copy(navigationVisible = true, searchVisible = false) + it.copy( + navigationVisible = true, + searchVisible = false, + checkedMenuItemId = R.id.add_recipe, + ) } viewModel.loadPreservedRequest() setupViews() diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt index 456cbc2..f28ae2d 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt @@ -32,7 +32,7 @@ class AuthenticationFragment : Fragment(R.layout.fragment_authentication) { logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" } binding.button.setOnClickListener { onLoginClicked() } activityViewModel.updateUiState { - it.copy(navigationVisible = true, searchVisible = false) + it.copy(navigationVisible = true, searchVisible = false, checkedMenuItemId = R.id.login) } viewModel.uiState.observe(viewLifecycleOwner, ::onUiStateChange) } @@ -61,7 +61,7 @@ class AuthenticationFragment : Fragment(R.layout.fragment_authentication) { private fun onUiStateChange(uiState: OperationUiState) = with(binding) { logger.v { "onUiStateChange() called with: authUiState = $uiState" } if (uiState.isSuccess) { - findNavController().popBackStack() + findNavController().navigateUp() return } diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLFragment.kt index 13a59c5..5313d56 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLFragment.kt @@ -36,7 +36,11 @@ class BaseURLFragment : Fragment(R.layout.fragment_base_url) { binding.button.setOnClickListener(::onProceedClick) viewModel.uiState.observe(viewLifecycleOwner, ::onUiStateChange) activityViewModel.updateUiState { - it.copy(navigationVisible = !args.isOnboarding, searchVisible = false) + it.copy( + navigationVisible = !args.isOnboarding, + searchVisible = false, + checkedMenuItemId = R.id.change_url, + ) } } diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt index f50b563..d7db583 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt @@ -58,7 +58,7 @@ class DisclaimerFragment : Fragment(R.layout.fragment_disclaimer) { } viewModel.startCountDown() activityViewModel.updateUiState { - it.copy(navigationVisible = false, searchVisible = false) + it.copy(navigationVisible = false, searchVisible = false, checkedMenuItemId = null) } } } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt index 1e81dd7..6b1273d 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt @@ -49,7 +49,11 @@ class RecipesListFragment : Fragment(R.layout.fragment_recipes_list) { super.onViewCreated(view, savedInstanceState) logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" } activityViewModel.updateUiState { - it.copy(navigationVisible = true, searchVisible = true) + it.copy( + navigationVisible = true, + searchVisible = true, + checkedMenuItemId = R.id.recipes_list + ) } setupRecipeAdapter() hideKeyboardOnScroll() diff --git a/app/src/main/res/menu/navigation_menu.xml b/app/src/main/res/menu/navigation_menu.xml index 7c16144..e896a64 100644 --- a/app/src/main/res/menu/navigation_menu.xml +++ b/app/src/main/res/menu/navigation_menu.xml @@ -2,21 +2,25 @@ diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index e465ffc..39e13e5 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -51,8 +51,7 @@ + app:popUpTo="@id/nav_graph" /> @@ -66,8 +65,7 @@ + app:destination="@id/authenticationFragment" />