From 520fe505709d8ec03501f10885a64264757b168a Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 7 Apr 2026 11:18:33 +0200 Subject: [PATCH] fix(navigation-view): highlighting menu item, fixes index out of bound error Signed-off-by: alperozturk96 --- .../extensions/NavigationViewExtensions.kt | 29 ++++++++++++------- .../android/ui/activity/DrawerActivity.java | 22 ++------------ 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/nextcloud/utils/extensions/NavigationViewExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/NavigationViewExtensions.kt index 0cd6bbb3c2a7..9072b146535b 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/NavigationViewExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/NavigationViewExtensions.kt @@ -11,6 +11,7 @@ import android.view.Menu import androidx.core.view.forEach import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.navigation.NavigationView +import com.owncloud.android.R fun NavigationView.getSelectedMenuItemId(): Int { menu.forEach { @@ -21,19 +22,25 @@ fun NavigationView.getSelectedMenuItemId(): Int { return Menu.NONE } -fun NavigationView.unsetAllNavigationItems() { - uncheckMenu(menu) -} +fun highlightNavigationView( + drawerNavigationView: NavigationView?, + bottomNavigationView: BottomNavigationView?, + menuItemId: Int +) { + drawerNavigationView?.setCheckedItem(menuItemId) -fun BottomNavigationView.unsetAllNavigationItems() { - uncheckMenu(menu) -} + bottomNavigationView?.let { bottomNav -> + val bottomNavItems = setOf(R.id.nav_assistant, R.id.nav_all_files, R.id.nav_favorites, R.id.nav_gallery) + val menuItem = bottomNav.menu.findItem(menuItemId) -private fun uncheckMenu(menu: Menu) { - menu.forEach { item -> - item.isChecked = false + // Uncheck previous item that exists in drawer if this ID doesn't belong to bottom nav + if (menuItemId !in bottomNavItems) { + bottomNav.menu.findItem(bottomNav.selectedItemId)?.isChecked = false + } - // recursively uncheck submenu items - item.subMenu?.let { uncheckMenu(it) } + // Highlight new item, skip assistant because Assistant screen doesn't have same bottom navigation bar + if (menuItem != null && menuItem.itemId != R.id.nav_assistant) { + menuItem.isChecked = true + } } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 8a151e88aa58..de80beee66e4 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -298,25 +298,9 @@ protected void setupDrawer(int id) { * @param menuItemId the ID of the menu item to mark as selected/highlighted */ public void highlightNavigationViewItem(int menuItemId) { - if (drawerNavigationView != null) { - NavigationViewExtensionsKt.unsetAllNavigationItems(drawerNavigationView); - MenuItem menuItem = drawerNavigationView.getMenu().findItem(menuItemId); - - if (menuItem != null && !menuItem.isChecked()) { - menuItem.setChecked(true); - } - } - - if (bottomNavigationView != null) { - NavigationViewExtensionsKt.unsetAllNavigationItems(bottomNavigationView); - MenuItem menuItem = bottomNavigationView.getMenu().findItem(menuItemId); - - // Don't highlight assistant bottom navigation item because Assistant screen doesn't have same bottom navigation bar - if (menuItem != null && !menuItem.isChecked() && menuItem.getItemId() != R.id.nav_assistant) { - menuItem.setChecked(true); - } - } - + NavigationViewExtensionsKt.highlightNavigationView(drawerNavigationView, + bottomNavigationView, + menuItemId); Log_OC.d(TAG, "New menu item is: " + menuItemId); }