From b01cca5fc4c12b40e4912d7a8912d12d55053375 Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Tue, 13 Jan 2026 13:04:49 +0100
Subject: [PATCH 01/14] fix: drawer-item-highlight
Signed-off-by: alperozturk96
---
.../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 3 +++
1 file changed, 3 insertions(+)
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
index c599740c49fb..97b9f9a8078a 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
@@ -813,6 +813,7 @@ class FileDisplayActivity :
protected fun resetScrollingAndUpdateActionBar() {
updateActionBarTitleAndHomeButton(file)
+ binding.appbar.appbar.setExpanded(true, false)
resetScrolling(true)
}
@@ -1392,6 +1393,8 @@ class FileDisplayActivity :
menuItemId = R.id.nav_personal_files
} else if (MainApp.isOnlyOnDevice()) {
menuItemId = R.id.nav_on_device
+ } else if (menuItemId == R.id.nav_trashbin || menuItemId == R.id.nav_activity) {
+ menuItemId = R.id.nav_all_files
} else if (menuItemId == Menu.NONE) {
menuItemId = R.id.nav_all_files
}
From ef70acbcbd1a61b00306cb874a8baa48a6f599ca Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Tue, 13 Jan 2026 13:55:38 +0100
Subject: [PATCH 02/14] fix(drawer-menu): item highlight
Signed-off-by: alperozturk96
---
.../java/com/owncloud/android/ui/activity/FileDisplayActivity.kt | 1 -
1 file changed, 1 deletion(-)
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
index 97b9f9a8078a..12d9537eea72 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
@@ -813,7 +813,6 @@ class FileDisplayActivity :
protected fun resetScrollingAndUpdateActionBar() {
updateActionBarTitleAndHomeButton(file)
- binding.appbar.appbar.setExpanded(true, false)
resetScrolling(true)
}
From 4d26a88aee1a9554b90595eb4c9ea34a28699364 Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Tue, 13 Jan 2026 16:15:33 +0100
Subject: [PATCH 03/14] fix(drawer-menu): item highlight
Signed-off-by: alperozturk96
---
.../extensions/DrawerActivityExtensions.kt | 18 ++++++++++++
.../android/ui/activity/DrawerActivity.java | 25 ++++-------------
.../ui/activity/FileDisplayActivity.kt | 2 --
.../theme/FilesSpecificViewThemeUtils.kt | 28 +++++++++++++++++++
4 files changed, 51 insertions(+), 22 deletions(-)
diff --git a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
index 899d9ed5a241..b0bb16decb88 100644
--- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
+++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
@@ -8,10 +8,13 @@
package com.nextcloud.utils.extensions
import android.content.Intent
+import android.view.Menu
import com.owncloud.android.MainApp
import com.owncloud.android.R
import com.owncloud.android.ui.activity.DrawerActivity
import com.owncloud.android.ui.activity.FileDisplayActivity
+import androidx.core.view.get
+import androidx.core.view.size
fun DrawerActivity.navigateToAllFiles() {
DrawerActivity.menuItemId = R.id.nav_all_files
@@ -27,3 +30,18 @@ fun DrawerActivity.navigateToAllFiles() {
startActivity(this)
}
}
+
+fun DrawerActivity.unsetAllNavigationItems() {
+ fun uncheckMenu(menu: Menu) {
+ for (i in 0 until menu.size) {
+ val item = menu[i]
+ item.isChecked = false
+
+ // recursively uncheck submenu items
+ item.subMenu?.let { uncheckMenu(it) }
+ }
+ }
+
+ drawerNavigationView?.menu?.let { uncheckMenu(it) }
+ bottomNavigationView?.menu?.let { uncheckMenu(it) }
+}
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 4f089971528f..90e937aa435b 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
@@ -65,6 +65,7 @@
import com.nextcloud.utils.GlideHelper;
import com.nextcloud.utils.LinkHelper;
import com.nextcloud.utils.extensions.ActivityExtensionsKt;
+import com.nextcloud.utils.extensions.DrawerActivityExtensionsKt;
import com.nextcloud.utils.extensions.ViewExtensionsKt;
import com.nextcloud.utils.mdm.MDMConfig;
import com.owncloud.android.MainApp;
@@ -162,7 +163,7 @@ public abstract class DrawerActivity extends ToolbarActivity
/**
* Reference to the navigation view.
*/
- private NavigationView drawerNavigationView;
+ public NavigationView drawerNavigationView;
/**
* Reference to the navigation view header.
@@ -229,6 +230,7 @@ protected void setupDrawer() {
drawerNavigationView = findViewById(R.id.nav_view);
if (drawerNavigationView != null) {
+ viewThemeUtils.files.colorNavigationView(drawerNavigationView);
// Setting up drawer header
mNavigationViewHeader = drawerNavigationView.getHeaderView(0);
@@ -893,22 +895,6 @@ private void setQuotaInformation(long usedSpace, long totalSpace, int relative,
showQuota(true);
}
- private void unsetAllDrawerMenuItems() {
- if (drawerNavigationView != null) {
- Menu menu = drawerNavigationView.getMenu();
- for (int i = 0; i < menu.size(); i++) {
- menu.getItem(i).setChecked(false);
- }
- }
-
- if (bottomNavigationView != null) {
- Menu menu = bottomNavigationView.getMenu();
- for (int i = 0; i < menu.size(); i++) {
- menu.getItem(i).setChecked(false);
- }
- }
- }
-
private void updateQuotaLink() {
if (mQuotaTextLink != null) {
if (MDMConfig.INSTANCE.externalSiteSupport(this)) {
@@ -976,13 +962,12 @@ public void onLoadFailed(@Nullable Drawable errorDrawable) {
};
}
-
/**
* Sets the menu item as checked in both the drawer and bottom navigation views, if applicable.
*/
@SuppressFBWarnings("RV")
public void setNavigationViewItemChecked() {
- unsetAllDrawerMenuItems();
+ DrawerActivityExtensionsKt.unsetAllNavigationItems(this);
// Don't check any items
if (menuItemId == Menu.NONE) {
@@ -994,7 +979,6 @@ public void setNavigationViewItemChecked() {
if (menuItem != null && !menuItem.isChecked()) {
menuItem.setChecked(true);
- viewThemeUtils.platform.colorNavigationView(drawerNavigationView);
}
}
@@ -1461,6 +1445,7 @@ protected void handleDeepLink(@NonNull Uri uri) {
private void handleNavItemClickEvent(@IdRes int menuItemId) {
if (drawerNavigationView == null) {
drawerNavigationView = findViewById(R.id.nav_view);
+ viewThemeUtils.files.colorNavigationView(drawerNavigationView);
}
Menu navMenu = drawerNavigationView.getMenu();
onNavigationItemClicked(navMenu.findItem(menuItemId));
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
index 12d9537eea72..c599740c49fb 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
@@ -1392,8 +1392,6 @@ class FileDisplayActivity :
menuItemId = R.id.nav_personal_files
} else if (MainApp.isOnlyOnDevice()) {
menuItemId = R.id.nav_on_device
- } else if (menuItemId == R.id.nav_trashbin || menuItemId == R.id.nav_activity) {
- menuItemId = R.id.nav_all_files
} else if (menuItemId == Menu.NONE) {
menuItemId = R.id.nav_all_files
}
diff --git a/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt b/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt
index 4fb2d277c0cd..22c853ae9226 100644
--- a/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt
+++ b/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt
@@ -27,15 +27,18 @@ import androidx.appcompat.widget.AppCompatAutoCompleteTextView
import androidx.appcompat.widget.SearchView
import androidx.core.content.res.ResourcesCompat
import com.google.android.material.card.MaterialCardView
+import com.google.android.material.navigation.NavigationView
import com.nextcloud.android.common.ui.color.ColorUtil
import com.nextcloud.android.common.ui.theme.MaterialSchemes
import com.nextcloud.android.common.ui.theme.ViewThemeUtilsBase
import com.nextcloud.android.common.ui.theme.utils.AndroidViewThemeUtils
import com.nextcloud.android.common.ui.theme.utils.AndroidXViewThemeUtils
+import com.nextcloud.android.common.ui.util.buildColorStateList
import com.nextcloud.utils.view.FastScrollPopupBackground
import com.owncloud.android.R
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.resources.shares.ShareType
+import dynamiccolor.MaterialDynamicColors
import me.zhanghai.android.fastscroll.FastScrollerBuilder
import me.zhanghai.android.fastscroll.PopupStyles
import javax.inject.Inject
@@ -47,6 +50,8 @@ class FilesSpecificViewThemeUtils @Inject constructor(
private val androidViewThemeUtils: AndroidViewThemeUtils,
private val androidXViewThemeUtils: AndroidXViewThemeUtils
) : ViewThemeUtilsBase(schemes) {
+ private val dynamicColor = MaterialDynamicColors()
+
// not ported to common lib because PreferenceCategory is deprecated
fun themePreferenceCategory(category: PreferenceCategory) {
withScheme(category.context) {
@@ -279,6 +284,29 @@ class FilesSpecificViewThemeUtils @Inject constructor(
}
}
+ @JvmOverloads
+ fun colorNavigationView(navigationView: NavigationView, colorIcons: Boolean = true) {
+ withScheme(navigationView) { scheme ->
+ navigationView.run {
+ itemBackground?.setTintList(
+ buildColorStateList(
+ android.R.attr.state_checked to dynamicColor.secondaryContainer().getArgb(scheme),
+ -android.R.attr.state_checked to Color.TRANSPARENT
+ )
+ )
+
+ background.setTintList(ColorStateList.valueOf(dynamicColor.surface().getArgb(scheme)))
+
+ if (colorIcons) {
+ itemIconTintList = buildColorStateList(
+ android.R.attr.state_checked to dynamicColor.onSecondaryContainer().getArgb(scheme),
+ -android.R.attr.state_checked to dynamicColor.onSurfaceVariant().getArgb(scheme)
+ )
+ }
+ }
+ }
+ }
+
companion object {
private val TAG = FilesSpecificViewThemeUtils::class.simpleName
From fa4b4017a62368d6d007b2d8304aa7572de5c845 Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Wed, 14 Jan 2026 09:59:36 +0100
Subject: [PATCH 04/14] use for each for menu
Signed-off-by: alperozturk96
---
.../nextcloud/utils/extensions/DrawerActivityExtensions.kt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
index b0bb16decb88..fdf2646c1350 100644
--- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
+++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
@@ -9,6 +9,7 @@ package com.nextcloud.utils.extensions
import android.content.Intent
import android.view.Menu
+import androidx.core.view.forEach
import com.owncloud.android.MainApp
import com.owncloud.android.R
import com.owncloud.android.ui.activity.DrawerActivity
@@ -33,8 +34,7 @@ fun DrawerActivity.navigateToAllFiles() {
fun DrawerActivity.unsetAllNavigationItems() {
fun uncheckMenu(menu: Menu) {
- for (i in 0 until menu.size) {
- val item = menu[i]
+ menu.forEach { item ->
item.isChecked = false
// recursively uncheck submenu items
From 9d5b73a149dffffe3b99640d36c547eded48c7a6 Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Wed, 14 Jan 2026 09:59:44 +0100
Subject: [PATCH 05/14] use for each for menu
Signed-off-by: alperozturk96
---
.../com/nextcloud/utils/extensions/DrawerActivityExtensions.kt | 2 --
1 file changed, 2 deletions(-)
diff --git a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
index fdf2646c1350..c9e92d30fdc4 100644
--- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
+++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
@@ -14,8 +14,6 @@ import com.owncloud.android.MainApp
import com.owncloud.android.R
import com.owncloud.android.ui.activity.DrawerActivity
import com.owncloud.android.ui.activity.FileDisplayActivity
-import androidx.core.view.get
-import androidx.core.view.size
fun DrawerActivity.navigateToAllFiles() {
DrawerActivity.menuItemId = R.id.nav_all_files
From 1cdce5132e7ee40dd9a58029c28baad0d8766222 Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Fri, 16 Jan 2026 16:02:08 +0100
Subject: [PATCH 06/14] centralize menu item id usage
Signed-off-by: alperozturk96
# Conflicts:
# app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
---
.../ui/composeActivity/ComposeActivity.kt | 9 +-
.../extensions/DrawerActivityExtensions.kt | 20 ---
.../java/com/owncloud/android/MainApp.java | 12 ++
.../ui/activities/ActivitiesActivity.java | 8 +-
.../android/ui/activity/CommunityActivity.kt | 9 +-
.../android/ui/activity/DrawerActivity.java | 162 ++++++++----------
.../ui/activity/ExternalSiteWebView.java | 2 +-
.../ui/activity/FileDisplayActivity.kt | 31 +---
.../android/ui/activity/SettingsActivity.java | 2 -
.../ui/activity/SyncedFoldersActivity.kt | 9 +-
.../android/ui/activity/ToolbarActivity.java | 17 +-
.../ui/activity/UploadListActivity.java | 9 +-
.../android/ui/fragment/GalleryFragment.java | 1 +
.../ui/preview/PreviewImageActivity.kt | 6 +-
.../android/ui/trashbin/TrashbinActivity.kt | 11 +-
15 files changed, 151 insertions(+), 157 deletions(-)
diff --git a/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt b/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt
index d7d1c0a75bc4..4a337915ea41 100644
--- a/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt
+++ b/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt
@@ -80,9 +80,16 @@ class ComposeActivity : DrawerActivity() {
composeViewModel.updateSelectedText(text.toString())
}
+ override fun getCurrentActivityMenuItemId(): Int = R.id.nav_assistant
+
+ override fun onResume() {
+ super.onResume()
+ setNavigationViewItemChecked(currentActivityMenuItemId)
+ }
+
private fun setupActivityUIFor(destination: ComposeDestination) {
if (destination is ComposeDestination.AssistantScreen) {
- setupDrawer()
+ setupDrawer(R.id.nav_assistant)
setupToolbarShowOnlyMenuButtonAndTitle(destination.title) {
openDrawer()
}
diff --git a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
index c9e92d30fdc4..a4ded92ca8b3 100644
--- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
+++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
@@ -8,17 +8,11 @@
package com.nextcloud.utils.extensions
import android.content.Intent
-import android.view.Menu
-import androidx.core.view.forEach
import com.owncloud.android.MainApp
-import com.owncloud.android.R
import com.owncloud.android.ui.activity.DrawerActivity
import com.owncloud.android.ui.activity.FileDisplayActivity
fun DrawerActivity.navigateToAllFiles() {
- DrawerActivity.menuItemId = R.id.nav_all_files
- setNavigationViewItemChecked()
-
MainApp.showOnlyFilesOnDevice(false)
MainApp.showOnlyPersonalFiles(false)
@@ -29,17 +23,3 @@ fun DrawerActivity.navigateToAllFiles() {
startActivity(this)
}
}
-
-fun DrawerActivity.unsetAllNavigationItems() {
- fun uncheckMenu(menu: Menu) {
- menu.forEach { item ->
- item.isChecked = false
-
- // recursively uncheck submenu items
- item.subMenu?.let { uncheckMenu(it) }
- }
- }
-
- drawerNavigationView?.menu?.let { uncheckMenu(it) }
- bottomNavigationView?.menu?.let { uncheckMenu(it) }
-}
diff --git a/app/src/main/java/com/owncloud/android/MainApp.java b/app/src/main/java/com/owncloud/android/MainApp.java
index e1b946e2781e..5f564a23ac5a 100644
--- a/app/src/main/java/com/owncloud/android/MainApp.java
+++ b/app/src/main/java/com/owncloud/android/MainApp.java
@@ -803,6 +803,18 @@ public static boolean isOnlyPersonFiles() {
return mOnlyPersonalFiles;
}
+ public static Integer getMenuItemId() {
+ if (MainApp.isOnlyPersonFiles()) {
+ return R.id.nav_personal_files;
+ }
+
+ if (MainApp.isOnlyOnDevice()) {
+ return R.id.nav_on_device;
+ }
+
+ return null;
+ }
+
public static String getUserAgent() {
// Mozilla/5.0 (Android) Nextcloud-android/2.1.0
return getUserAgent(R.string.nextcloud_user_agent);
diff --git a/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java b/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
index f61121e8721e..8e1caa3c439c 100644
--- a/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
@@ -77,7 +77,7 @@ protected void onCreate(Bundle savedInstanceState) {
viewThemeUtils.androidx.themeSwipeRefreshLayout(binding.swipeContainingList);
// setup drawer
- setupDrawer();
+ setupDrawer(R.id.nav_activity);
updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_activities));
binding.swipeContainingList.setOnRefreshListener(() -> {
@@ -88,6 +88,11 @@ protected void onCreate(Bundle savedInstanceState) {
});
}
+ @Override
+ protected int getCurrentActivityMenuItemId() {
+ return R.id.nav_activity;
+ }
+
@VisibleForTesting
public ActivityListLayoutBinding getBinding() {
return binding;
@@ -153,6 +158,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
@Override
protected void onResume() {
super.onResume();
+ setNavigationViewItemChecked(getCurrentActivityMenuItemId());
actionListener.onResume();
setupContent();
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt
index 308d7eb99340..280534f99a9a 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt
@@ -30,7 +30,7 @@ open class CommunityActivity : DrawerActivity() {
setupToolbar()
updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_community))
- setupDrawer()
+ setupDrawer(R.id.nav_community)
binding.communityReleaseCandidateText.movementMethod = LinkMovementMethod.getInstance()
setupContributeForumView()
setupContributeTranslationView()
@@ -39,6 +39,13 @@ open class CommunityActivity : DrawerActivity() {
setOnClickListeners()
}
+ override fun getCurrentActivityMenuItemId(): Int = R.id.nav_community
+
+ override fun onResume() {
+ super.onResume()
+ setNavigationViewItemChecked(currentActivityMenuItemId)
+ }
+
private fun setupContributeForumView() {
val htmlContent = getString(R.string.community_contribute_forum_text) + " " +
getString(
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 90e937aa435b..3d1aea026150 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
@@ -160,11 +160,6 @@ public abstract class DrawerActivity extends ToolbarActivity
*/
protected ActionBarDrawerToggle mDrawerToggle;
- /**
- * Reference to the navigation view.
- */
- public NavigationView drawerNavigationView;
-
/**
* Reference to the navigation view header.
*/
@@ -175,13 +170,6 @@ public abstract class DrawerActivity extends ToolbarActivity
*/
private boolean mIsAccountChooserActive;
- /**
- * Id of the checked menu item.
- */
- public static int menuItemId = Menu.NONE;
-
- private static int previousMenuItemId = Menu.NONE;
-
/**
* container layout of the quota view.
*/
@@ -207,6 +195,11 @@ public abstract class DrawerActivity extends ToolbarActivity
private ArbitraryDataProvider arbitraryDataProvider;
private BottomNavigationView bottomNavigationView;
+ private NavigationView drawerNavigationView;
+
+ protected int getCurrentActivityMenuItemId() {
+ return R.id.nav_all_files;
+ }
private EcosystemManager ecosystemManager;
@@ -225,10 +218,15 @@ public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableB
/**
* Initializes the drawer and its content. This method needs to be called after the content view has been set.
*/
- protected void setupDrawer() {
- mDrawerLayout = findViewById(R.id.drawer_layout);
+ protected void setupDrawer(int id) {
+ if (mDrawerLayout == null) {
+ mDrawerLayout = findViewById(R.id.drawer_layout);
+ }
+
+ if (drawerNavigationView == null) {
+ drawerNavigationView = findViewById(R.id.nav_view);
+ }
- drawerNavigationView = findViewById(R.id.nav_view);
if (drawerNavigationView != null) {
viewThemeUtils.files.colorNavigationView(drawerNavigationView);
@@ -239,6 +237,7 @@ protected void setupDrawer() {
setupDrawerMenu(drawerNavigationView);
getAndDisplayUserQuota();
setupQuotaElement();
+ setNavigationViewItemChecked(id);
}
setupDrawerToggle();
@@ -247,14 +246,37 @@ protected void setupDrawer() {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
- bottomNavigationView = findViewById(R.id.bottom_navigation);
+ if (bottomNavigationView == null) {
+ bottomNavigationView = findViewById(R.id.bottom_navigation);
+ }
+
if (bottomNavigationView != null) {
themeBottomNavigationMenu();
checkAssistantBottomNavigationMenu();
handleBottomNavigationViewClicks();
+ setNavigationViewItemChecked(id);
}
+ }
+
+ protected void setNavigationViewItemChecked(int menuItemId) {
+ if (drawerNavigationView != null) {
+ MenuItem menuItem = drawerNavigationView.getMenu().findItem(menuItemId);
- setNavigationViewItemChecked();
+ if (menuItem != null && !menuItem.isChecked()) {
+ menuItem.setChecked(true);
+ }
+ }
+
+ if (bottomNavigationView != null) {
+ 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);
+ }
+ }
+
+ Log_OC.d(TAG, "New menu item is: " + menuItemId);
}
private void themeBottomNavigationMenu() {
@@ -443,10 +465,7 @@ private void showTopBanner(ConstraintLayout banner) {
}
moreView.setOnClickListener(v -> LinkHelper.INSTANCE.openAppStore("Nextcloud", true, this));
- assistantView.setOnClickListener(v -> {
- DrawerActivity.menuItemId = Menu.NONE;
- startAssistantScreen();
- });
+ assistantView.setOnClickListener(v -> startAssistantScreen());
if (getCapabilities() != null && getCapabilities().getAssistant().isTrue()) {
assistantView.setVisibility(View.VISIBLE);
} else {
@@ -530,16 +549,8 @@ private void filterDrawerMenu(final Menu menu, @NonNull final User user) {
// region navigation item click
private void onNavigationItemClicked(final MenuItem menuItem) {
- setPreviousMenuItemId(menuItemId);
int itemId = menuItem.getItemId();
- // Settings screen cannot display drawer menu thus no need to highlight
- if (itemId != R.id.nav_settings) {
- menuItemId = itemId;
- }
-
- setNavigationViewItemChecked();
-
if (itemId == R.id.nav_all_files || itemId == R.id.nav_personal_files) {
if (this instanceof FileDisplayActivity fda &&
!(fda.getLeftFragment() instanceof GalleryFragment) &&
@@ -585,7 +596,6 @@ private void onNavigationItemClicked(final MenuItem menuItem) {
startActivity(CommunityActivity.class);
} else if (itemId == R.id.nav_logout) {
resetOnlyPersonalAndOnDevice();
- menuItemId = Menu.NONE;
MenuItem isNewMenuItemChecked = menuItem.setChecked(false);
Log_OC.d(TAG,"onNavigationItemClicked nav_logout setChecked " + isNewMenuItemChecked);
final Optional optionalUser = getUser();
@@ -616,15 +626,14 @@ private void onNavigationItemClicked(final MenuItem menuItem) {
}
}
- resetFileDepthAndConfigureMenuItem();
+ resetFileDepth();
+ setNavigationViewItemChecked(itemId);
}
@SuppressFBWarnings("RV")
private void handleBottomNavigationViewClicks() {
bottomNavigationView.setOnItemSelectedListener(menuItem -> {
- setPreviousMenuItemId(menuItemId);
- menuItemId = menuItem.getItemId();
-
+ int menuItemId = menuItem.getItemId();
exitSelectionMode();
resetOnlyPersonalAndOnDevice();
@@ -649,23 +658,13 @@ private void handleBottomNavigationViewClicks() {
getSupportActionBar().setIcon(null);
}
- setNavigationViewItemChecked();
- resetFileDepthAndConfigureMenuItem();
-
+ resetFileDepth();
+ setNavigationViewItemChecked(menuItemId);
return false;
});
}
// endregion
- private void resetFileDepthAndConfigureMenuItem() {
- // from navigation user always sees root level
- resetFileDepth();
-
- if (this instanceof FileDisplayActivity fda) {
- fda.configureMenuItem();
- }
- }
-
private void startAssistantScreen() {
final var destination = ComposeDestination.Companion.getAssistantScreen(this);
Intent composeActivity = new Intent(getApplicationContext(), ComposeActivity.class);
@@ -733,7 +732,6 @@ public void startPhotoSearch(int id) {
}
private void launchActivityForSearch(SearchEvent searchEvent, int menuItemId) {
- DrawerActivity.menuItemId = menuItemId;
Intent intent = new Intent(getApplicationContext(), FileDisplayActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setAction(Intent.ACTION_SEARCH);
@@ -913,7 +911,6 @@ private void updateQuotaLink() {
externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE, firstQuota.getName());
externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_URL, firstQuota.getUrl());
externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_SHOW_SIDEBAR, true);
- menuItemId = Menu.NONE;
startActivity(externalWebViewIntent);
});
@@ -962,37 +959,6 @@ public void onLoadFailed(@Nullable Drawable errorDrawable) {
};
}
- /**
- * Sets the menu item as checked in both the drawer and bottom navigation views, if applicable.
- */
- @SuppressFBWarnings("RV")
- public void setNavigationViewItemChecked() {
- DrawerActivityExtensionsKt.unsetAllNavigationItems(this);
-
- // Don't check any items
- if (menuItemId == Menu.NONE) {
- return;
- }
-
- if (drawerNavigationView != null) {
- MenuItem menuItem = drawerNavigationView.getMenu().findItem(menuItemId);
-
- if (menuItem != null && !menuItem.isChecked()) {
- menuItem.setChecked(true);
- }
- }
-
- if (bottomNavigationView != null) {
- 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);
- }
- }
-
- Log_OC.d(TAG, "New menu item is: " + menuItemId);
- }
/**
* Retrieves and shows the user quota if available
@@ -1139,6 +1105,7 @@ protected void onCreate(Bundle savedInstanceState) {
ecosystemManager = new EcosystemManager(this);
}
+
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
@@ -1149,7 +1116,6 @@ protected void onSaveInstanceState(@NonNull Bundle outState) {
public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mIsAccountChooserActive = savedInstanceState.getBoolean(KEY_IS_ACCOUNT_CHOOSER_ACTIVE, false);
- setNavigationViewItemChecked();
}
@Override
@@ -1443,10 +1409,6 @@ protected void handleDeepLink(@NonNull Uri uri) {
}
private void handleNavItemClickEvent(@IdRes int menuItemId) {
- if (drawerNavigationView == null) {
- drawerNavigationView = findViewById(R.id.nav_view);
- viewThemeUtils.files.colorNavigationView(drawerNavigationView);
- }
Menu navMenu = drawerNavigationView.getMenu();
onNavigationItemClicked(navMenu.findItem(menuItemId));
}
@@ -1467,25 +1429,37 @@ private void checkStoragePermissionWarningBannerVisibility() {
}
}
- public static boolean isToolbarStyleSearch() {
+ private int getSelectedMenuItemId() {
+ if (drawerNavigationView == null) {
+ return R.id.nav_all_files;
+ }
+
+ Menu menu = drawerNavigationView.getMenu();
+ for (int i = 0; i < menu.size(); i++) {
+ MenuItem item = menu.getItem(i);
+ if (item.isChecked()) {
+ return item.getItemId();
+ }
+ }
+
+ return Menu.NONE;
+ }
+
+ public boolean isToolbarStyleSearch() {
+ int menuItemId = getSelectedMenuItemId();
+
return menuItemId == Menu.NONE ||
menuItemId == R.id.nav_all_files ||
menuItemId == R.id.nav_personal_files;
}
- public static boolean isMenuItemIdBelongsToSearchType() {
+ public boolean isMenuItemIdBelongsToSearchType() {
+ int menuItemId = getSelectedMenuItemId();
+
return menuItemId == R.id.nav_favorites ||
menuItemId == R.id.nav_shared ||
menuItemId == R.id.nav_on_device ||
menuItemId == R.id.nav_recently_modified ||
menuItemId == R.id.nav_gallery;
}
-
- public static int getPreviousMenuItemId() {
- return previousMenuItemId;
- }
-
- public static void setPreviousMenuItemId(int menuItemId) {
- previousMenuItemId = menuItemId;
- }
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java
index dad57adc3398..fe1107d1b140 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java
@@ -104,7 +104,7 @@ protected void postOnCreate() {
}
}
- setupDrawer();
+ setupDrawer(R.id.nav_view);
if (!showSidebar) {
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
index c599740c49fb..c6fd8e304913 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
@@ -279,8 +279,12 @@ class FileDisplayActivity :
observeWorkerState()
startMetadataSyncForRoot()
handleBackPress()
+ setupDrawer(R.id.nav_all_files)
}
+ override fun getCurrentActivityMenuItemId(): Int =
+ MainApp.getMenuItemId() ?: listOfFilesFragment?.menuItemId ?: R.id.nav_all_files
+
private fun loadSavedInstanceState(savedInstanceState: Bundle?) {
if (savedInstanceState != null) {
mWaitingToPreview =
@@ -311,8 +315,6 @@ class FileDisplayActivity :
// reset ui states when file display activity created/recrated
listOfFilesFragment?.resetSearchAttributes()
- menuItemId = R.id.nav_all_files
- setNavigationViewItemChecked()
}
private fun initTaskRetainerFragment() {
@@ -391,7 +393,6 @@ class FileDisplayActivity :
) != null
) {
switchToSearchFragment(savedInstanceState)
- setupDrawer()
} else {
createMinFragments(savedInstanceState)
}
@@ -566,7 +567,6 @@ class FileDisplayActivity :
ALL_FILES == action -> {
Log_OC.d(this, "Switch to oc file fragment")
- menuItemId = R.id.nav_all_files
// Replace only if the fragment is NOT exactly OCFileListFragment
// Using `is OCFileListFragment` would also match subclasses,
@@ -583,7 +583,6 @@ class FileDisplayActivity :
LIST_GROUPFOLDERS == action -> {
Log_OC.d(this, "Switch to list groupfolders fragment")
- menuItemId = R.id.nav_groupfolders
leftFragment = GroupfolderListFragment()
supportFragmentManager.executePendingTransactions()
}
@@ -1265,7 +1264,6 @@ class FileDisplayActivity :
}
resetScrollingAndUpdateActionBar()
- configureMenuItem()
startMetadataSyncForCurrentDir()
}
@@ -1331,6 +1329,9 @@ class FileDisplayActivity :
Log_OC.v(TAG, "onResume() start")
super.onResume()
+
+ setNavigationViewItemChecked(currentActivityMenuItemId)
+
if (SettingsActivity.isBackPressed) {
Log_OC.d(TAG, "User returned from settings activity, skipping reset content logic")
return
@@ -1368,8 +1369,6 @@ class FileDisplayActivity :
updateActionBarTitleAndHomeButton(startFile)
}
- configureMenuItem()
-
// show in-app review dialog to user
inAppReviewHelper.showInAppReview(this)
@@ -1387,21 +1386,6 @@ class FileDisplayActivity :
?: intent?.getStringExtra(EXTRA_FILE_REMOTE_PATH)
?.let { fileDataStorageManager.getFileByDecryptedRemotePath(it) }
- private fun checkAndSetMenuItemId() {
- if (MainApp.isOnlyPersonFiles()) {
- menuItemId = R.id.nav_personal_files
- } else if (MainApp.isOnlyOnDevice()) {
- menuItemId = R.id.nav_on_device
- } else if (menuItemId == Menu.NONE) {
- menuItemId = R.id.nav_all_files
- }
- }
-
- fun configureMenuItem() {
- checkAndSetMenuItemId()
- setNavigationViewItemChecked()
- }
-
// region local broadcast manager receivers
private fun registerReceivers() {
Log_OC.d(TAG, "registering receivers")
@@ -2866,7 +2850,6 @@ class FileDisplayActivity :
}
setFile(file)
- setupDrawer()
val existingAccountName = existingUser.accountName
mSwitchAccountButton.tag = existingAccountName
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
index 53b3a9496627..ba6db7333a81 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
@@ -316,7 +316,6 @@ private void setupAboutCategory(String appVersion) {
getResources().getString(R.string.privacy));
intent.putExtra(ExternalSiteWebView.EXTRA_URL, privacyUrl.toString());
intent.putExtra(ExternalSiteWebView.EXTRA_SHOW_SIDEBAR, false);
- DrawerActivity.menuItemId = Menu.NONE;
}
startActivity(intent);
@@ -1185,7 +1184,6 @@ private void loadExternalSettingLinks(PreferenceCategory preferenceCategory) {
externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE, link.getName());
externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_URL, link.getUrl());
externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_SHOW_SIDEBAR, false);
- DrawerActivity.menuItemId = link.getId();
startActivity(externalWebViewIntent);
return true;
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
index a25d0a23402c..b1263d7b1cae 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
@@ -183,7 +183,7 @@ class SyncedFoldersActivity :
// setup toolbar
setupToolbar()
updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_synced_folders))
- setupDrawer()
+ setupDrawer(R.id.nav_settings)
setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
if (supportActionBar != null) {
supportActionBar!!.setDisplayHomeAsUpEnabled(true)
@@ -200,6 +200,13 @@ class SyncedFoldersActivity :
setupStoragePermissionWarningBanner()
}
+ override fun getCurrentActivityMenuItemId(): Int = R.id.nav_settings
+
+ override fun onResume() {
+ super.onResume()
+ setNavigationViewItemChecked(currentActivityMenuItemId)
+ }
+
fun setupStoragePermissionWarningBanner() {
val storagePermissionWarningBanner = binding.storagePermissionWarningBanner.root
StoragePermissionWarningBannerBinding.bind(storagePermissionWarningBanner).apply {
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
index 63489451c7db..1b77bdc1d0c4 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
@@ -186,12 +186,14 @@ private SearchType getSearchType() {
final OCFileListFragment fragment = getOCFileListFragment();
// if current navigation not matches, reset search event
- if (!DrawerActivity.isMenuItemIdBelongsToSearchType()) {
- if (fragment != null) {
- fragment.resetSearchAttributes();
- }
+ if (this instanceof DrawerActivity drawerActivity) {
+ if (!drawerActivity.isMenuItemIdBelongsToSearchType()) {
+ if (fragment != null) {
+ fragment.resetSearchAttributes();
+ }
- return SearchType.NO_SEARCH;
+ return SearchType.NO_SEARCH;
+ }
}
if (fragment != null) {
@@ -232,7 +234,10 @@ protected void updateActionBarTitleAndHomeButton(OCFile file) {
final String title = getActionBarTitle(file, isRoot);
updateActionBarTitleAndHomeButtonByString(title);
- final boolean isToolbarStyleSearch = DrawerActivity.isToolbarStyleSearch();
+ boolean isToolbarStyleSearch = false;
+ if (this instanceof DrawerActivity drawerActivity) {
+ isToolbarStyleSearch = drawerActivity.isToolbarStyleSearch();
+ }
final boolean canShowSearchBar = (isHomeSearchToolbarShow && isRoot && isToolbarStyleSearch);
showHomeSearchToolbar(canShowSearchBar);
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
index f66a279a44a2..b0723c5b99bf 100755
--- a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
@@ -123,7 +123,7 @@ protected void onCreate(Bundle savedInstanceState) {
updateActionBarTitleAndHomeButtonByString(getString(R.string.uploads_view_title));
// setup drawer
- setupDrawer();
+ setupDrawer(R.id.nav_uploads);
setupContent();
observeWorkerState();
@@ -141,6 +141,11 @@ private void observeWorkerState() {
});
}
+ @Override
+ protected int getCurrentActivityMenuItemId() {
+ return R.id.nav_uploads;
+ }
+
private void setupContent() {
binding.list.setEmptyView(binding.emptyList.getRoot());
binding.emptyList.getRoot().setVisibility(View.GONE);
@@ -197,6 +202,8 @@ protected void onResume() {
Log_OC.v(TAG, "onResume() start");
super.onResume();
+ setNavigationViewItemChecked(getCurrentActivityMenuItemId());
+
// Listen for upload messages
uploadMessagesReceiver = new UploadMessagesReceiver();
IntentFilter uploadIntentFilter = new IntentFilter();
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java
index cf1a649c2dc0..3f6574233840 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java
@@ -96,6 +96,7 @@ public void onCreate(Bundle savedInstanceState) {
}
registerRefreshSearchEventReceiver();
+
}
private void registerRefreshSearchEventReceiver() {
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt
index 505951c20993..10a64ae5828b 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt
@@ -10,7 +10,6 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
-import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.MenuItem
import android.view.View
@@ -100,7 +99,7 @@ class PreviewImageActivity :
livePhotoFile = intent.getParcelableArgument(EXTRA_LIVE_PHOTO_FILE, OCFile::class.java)
- setupDrawer()
+ setupDrawer(R.id.nav_gallery)
val chosenFile = intent.getParcelableArgument(EXTRA_FILE, OCFile::class.java)
@@ -125,6 +124,8 @@ class PreviewImageActivity :
handleBackPress()
}
+ override fun getCurrentActivityMenuItemId(): Int = R.id.nav_gallery
+
private fun applyDisplayCutOutTopPadding() {
window.decorView.setOnApplyWindowInsetsListener { view, insets ->
val displayCutout = insets.displayCutout
@@ -383,6 +384,7 @@ class PreviewImageActivity :
override fun onResume() {
super.onResume()
+ setNavigationViewItemChecked(currentActivityMenuItemId)
downloadFinishReceiver = DownloadFinishReceiver()
val downloadIntentFilter = IntentFilter(getDownloadFinishMessage())
localBroadcastManager.registerReceiver(downloadFinishReceiver!!, downloadIntentFilter)
diff --git a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt
index 3f770ebdebff..9ff1acaaeb0a 100644
--- a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt
@@ -127,10 +127,17 @@ class TrashbinActivity :
View.GONE
updateActionBarTitleAndHomeButtonByString(getString(R.string.trashbin_activity_title))
- setupDrawer()
+ setupDrawer(R.id.nav_trashbin)
handleBackPress()
}
+ override fun getCurrentActivityMenuItemId(): Int = R.id.nav_trashbin
+
+ override fun onResume() {
+ super.onResume()
+ setNavigationViewItemChecked(currentActivityMenuItemId)
+ }
+
override fun onStart() {
super.onStart()
@@ -293,8 +300,6 @@ class TrashbinActivity :
}
override fun onPause() {
- menuItemId = getPreviousMenuItemId()
- setNavigationViewItemChecked()
super.onPause()
active = false
trashbinListAdapter?.cancelAllPendingTasks()
From 8e416f6959ebfdbdd1c319e40e30a59552d58c91 Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Fri, 16 Jan 2026 16:21:06 +0100
Subject: [PATCH 07/14] add docs
Signed-off-by: alperozturk96
---
.../extensions/DrawerActivityExtensions.kt | 2 +
.../extensions/NavigationViewExtensions.kt | 21 +++++++
.../android/ui/activity/DrawerActivity.java | 55 +++++++++++++++----
.../ui/activity/FileDisplayActivity.kt | 8 +++
4 files changed, 75 insertions(+), 11 deletions(-)
create mode 100644 app/src/main/java/com/nextcloud/utils/extensions/NavigationViewExtensions.kt
diff --git a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
index a4ded92ca8b3..ec8e1fd4989d 100644
--- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
+++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
@@ -9,12 +9,14 @@ package com.nextcloud.utils.extensions
import android.content.Intent
import com.owncloud.android.MainApp
+import com.owncloud.android.R
import com.owncloud.android.ui.activity.DrawerActivity
import com.owncloud.android.ui.activity.FileDisplayActivity
fun DrawerActivity.navigateToAllFiles() {
MainApp.showOnlyFilesOnDevice(false)
MainApp.showOnlyPersonalFiles(false)
+ setNavigationViewItemChecked(R.id.nav_all_files)
Intent(applicationContext, FileDisplayActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
diff --git a/app/src/main/java/com/nextcloud/utils/extensions/NavigationViewExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/NavigationViewExtensions.kt
new file mode 100644
index 000000000000..1d9d2c58219d
--- /dev/null
+++ b/app/src/main/java/com/nextcloud/utils/extensions/NavigationViewExtensions.kt
@@ -0,0 +1,21 @@
+/*
+ * Nextcloud - Android Client
+ *
+ * SPDX-FileCopyrightText: 2026 Alper Ozturk
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+package com.nextcloud.utils.extensions
+
+import android.view.Menu
+import androidx.core.view.forEach
+import com.google.android.material.navigation.NavigationView
+
+fun NavigationView.getSelectedMenuItemId(): Int {
+ menu.forEach {
+ if (it.isChecked) {
+ return it.itemId
+ }
+ }
+ return Menu.NONE
+}
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 3d1aea026150..5459fa7b2cac 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
@@ -65,7 +65,7 @@
import com.nextcloud.utils.GlideHelper;
import com.nextcloud.utils.LinkHelper;
import com.nextcloud.utils.extensions.ActivityExtensionsKt;
-import com.nextcloud.utils.extensions.DrawerActivityExtensionsKt;
+import com.nextcloud.utils.extensions.NavigationViewExtensionsKt;
import com.nextcloud.utils.extensions.ViewExtensionsKt;
import com.nextcloud.utils.mdm.MDMConfig;
import com.owncloud.android.MainApp;
@@ -197,6 +197,28 @@ public abstract class DrawerActivity extends ToolbarActivity
private BottomNavigationView bottomNavigationView;
private NavigationView drawerNavigationView;
+ /**
+ * Returns the navigation drawer menu item ID that represents
+ * the current activity.
+ *
+ *
+ * This method is used by the DrawerActivity to determine
+ * which drawer item should be highlighted (checked) when the
+ * activity is visible.
+ *
+ *
+ *
+ * Subclasses that are displayed within the drawer must override
+ * this method and return their corresponding menu item ID
+ * (e.g. R.id.nav_gallery, R.id.nav_settings).
+ *
+ *
+ *
+ * The default implementation returns {@link R.id#nav_all_files}.
+ *
+ *
+ * @return the menu item ID to be marked as selected in the drawer
+ */
protected int getCurrentActivityMenuItemId() {
return R.id.nav_all_files;
}
@@ -258,7 +280,26 @@ protected void setupDrawer(int id) {
}
}
- protected void setNavigationViewItemChecked(int menuItemId) {
+ /**
+ * Highlights (checks) the given menu item ID in the app's navigation bars.
+ *
+ *
+ * This method updates both the navigation drawer (`drawerNavigationView`) and
+ * the bottom navigation bar (`bottomNavigationView`).
+ *
+ *
+ *
+ * This method is needs to be called from onResume() of child activities with all possible menu item ids.
+ * This fixes:
+ *
+ * - When navigating back from another activity (e.g., Activity B → Activity A),
+ * the previously selected menu item remains highlighted.
+ *
+ *
+ *
+ * @param menuItemId the ID of the menu item to mark as selected/highlighted
+ */
+ public void setNavigationViewItemChecked(int menuItemId) {
if (drawerNavigationView != null) {
MenuItem menuItem = drawerNavigationView.getMenu().findItem(menuItemId);
@@ -1434,15 +1475,7 @@ private int getSelectedMenuItemId() {
return R.id.nav_all_files;
}
- Menu menu = drawerNavigationView.getMenu();
- for (int i = 0; i < menu.size(); i++) {
- MenuItem item = menu.getItem(i);
- if (item.isChecked()) {
- return item.getItemId();
- }
- }
-
- return Menu.NONE;
+ return NavigationViewExtensionsKt.getSelectedMenuItemId(drawerNavigationView);
}
public boolean isToolbarStyleSearch() {
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
index c6fd8e304913..555b52fb9616 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
@@ -282,6 +282,14 @@ class FileDisplayActivity :
setupDrawer(R.id.nav_all_files)
}
+ /**
+ * Determines which navigation drawer item should be selected.
+ *
+ * Resolution order:
+ * 1) Global app state (static flags in MainApp nav_personal and nav_on_device)
+ * 2) Currently visible fragment (and its active child)
+ * 3) Fallback to All Files
+ */
override fun getCurrentActivityMenuItemId(): Int =
MainApp.getMenuItemId() ?: listOfFilesFragment?.menuItemId ?: R.id.nav_all_files
From d734ce5e34daf9fbbb83e2c12666b81d5ca837a7 Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Fri, 16 Jan 2026 16:41:04 +0100
Subject: [PATCH 08/14] simplify
Signed-off-by: alperozturk96
---
.../ui/composeActivity/ComposeActivity.kt | 4 ++--
.../extensions/DrawerActivityExtensions.kt | 2 +-
.../extensions/NavigationViewExtensions.kt | 18 ++++++++++++++++++
.../ui/activities/ActivitiesActivity.java | 4 ++--
.../android/ui/activity/CommunityActivity.kt | 4 ++--
.../android/ui/activity/DrawerActivity.java | 19 +++++++++++++------
.../ui/activity/FileDisplayActivity.kt | 5 ++---
.../ui/activity/SyncedFoldersActivity.kt | 4 ++--
.../android/ui/activity/ToolbarActivity.java | 12 +++++-------
.../ui/activity/UploadListActivity.java | 4 ++--
.../ui/preview/PreviewImageActivity.kt | 4 ++--
.../android/ui/trashbin/TrashbinActivity.kt | 4 ++--
12 files changed, 53 insertions(+), 31 deletions(-)
diff --git a/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt b/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt
index 4a337915ea41..0b81a298e4d1 100644
--- a/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt
+++ b/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt
@@ -80,11 +80,11 @@ class ComposeActivity : DrawerActivity() {
composeViewModel.updateSelectedText(text.toString())
}
- override fun getCurrentActivityMenuItemId(): Int = R.id.nav_assistant
+ override fun getMenuItemId(): Int = R.id.nav_assistant
override fun onResume() {
super.onResume()
- setNavigationViewItemChecked(currentActivityMenuItemId)
+ highlightNavigationViewItem(menuItemId)
}
private fun setupActivityUIFor(destination: ComposeDestination) {
diff --git a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
index ec8e1fd4989d..05fa689ea6b5 100644
--- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
+++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
@@ -16,7 +16,7 @@ import com.owncloud.android.ui.activity.FileDisplayActivity
fun DrawerActivity.navigateToAllFiles() {
MainApp.showOnlyFilesOnDevice(false)
MainApp.showOnlyPersonalFiles(false)
- setNavigationViewItemChecked(R.id.nav_all_files)
+ highlightNavigationViewItem(R.id.nav_all_files)
Intent(applicationContext, FileDisplayActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
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 1d9d2c58219d..0cd6bbb3c2a7 100644
--- a/app/src/main/java/com/nextcloud/utils/extensions/NavigationViewExtensions.kt
+++ b/app/src/main/java/com/nextcloud/utils/extensions/NavigationViewExtensions.kt
@@ -9,6 +9,7 @@ package com.nextcloud.utils.extensions
import android.view.Menu
import androidx.core.view.forEach
+import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.navigation.NavigationView
fun NavigationView.getSelectedMenuItemId(): Int {
@@ -19,3 +20,20 @@ fun NavigationView.getSelectedMenuItemId(): Int {
}
return Menu.NONE
}
+
+fun NavigationView.unsetAllNavigationItems() {
+ uncheckMenu(menu)
+}
+
+fun BottomNavigationView.unsetAllNavigationItems() {
+ uncheckMenu(menu)
+}
+
+private fun uncheckMenu(menu: Menu) {
+ menu.forEach { item ->
+ item.isChecked = false
+
+ // recursively uncheck submenu items
+ item.subMenu?.let { uncheckMenu(it) }
+ }
+}
diff --git a/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java b/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
index 8e1caa3c439c..df740eec674e 100644
--- a/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
@@ -89,7 +89,7 @@ protected void onCreate(Bundle savedInstanceState) {
}
@Override
- protected int getCurrentActivityMenuItemId() {
+ protected int getMenuItemId() {
return R.id.nav_activity;
}
@@ -158,7 +158,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
@Override
protected void onResume() {
super.onResume();
- setNavigationViewItemChecked(getCurrentActivityMenuItemId());
+ highlightNavigationViewItem(getMenuItemId());
actionListener.onResume();
setupContent();
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt
index 280534f99a9a..6985fe889789 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt
@@ -39,11 +39,11 @@ open class CommunityActivity : DrawerActivity() {
setOnClickListeners()
}
- override fun getCurrentActivityMenuItemId(): Int = R.id.nav_community
+ override fun getMenuItemId(): Int = R.id.nav_community
override fun onResume() {
super.onResume()
- setNavigationViewItemChecked(currentActivityMenuItemId)
+ highlightNavigationViewItem(menuItemId)
}
private fun setupContributeForumView() {
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 5459fa7b2cac..d65a85407d77 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
@@ -219,7 +219,7 @@ public abstract class DrawerActivity extends ToolbarActivity
*
* @return the menu item ID to be marked as selected in the drawer
*/
- protected int getCurrentActivityMenuItemId() {
+ protected int getMenuItemId() {
return R.id.nav_all_files;
}
@@ -259,7 +259,7 @@ protected void setupDrawer(int id) {
setupDrawerMenu(drawerNavigationView);
getAndDisplayUserQuota();
setupQuotaElement();
- setNavigationViewItemChecked(id);
+ highlightNavigationViewItem(id);
}
setupDrawerToggle();
@@ -276,7 +276,7 @@ protected void setupDrawer(int id) {
themeBottomNavigationMenu();
checkAssistantBottomNavigationMenu();
handleBottomNavigationViewClicks();
- setNavigationViewItemChecked(id);
+ highlightNavigationViewItem(id);
}
}
@@ -299,8 +299,9 @@ protected void setupDrawer(int id) {
*
* @param menuItemId the ID of the menu item to mark as selected/highlighted
*/
- public void setNavigationViewItemChecked(int menuItemId) {
+ public void highlightNavigationViewItem(int menuItemId) {
if (drawerNavigationView != null) {
+ NavigationViewExtensionsKt.unsetAllNavigationItems(drawerNavigationView);
MenuItem menuItem = drawerNavigationView.getMenu().findItem(menuItemId);
if (menuItem != null && !menuItem.isChecked()) {
@@ -309,6 +310,7 @@ public void setNavigationViewItemChecked(int menuItemId) {
}
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
@@ -667,8 +669,10 @@ private void onNavigationItemClicked(final MenuItem menuItem) {
}
}
+ // from navigation user always sees root level
resetFileDepth();
- setNavigationViewItemChecked(itemId);
+
+ highlightNavigationViewItem(itemId);
}
@SuppressFBWarnings("RV")
@@ -699,8 +703,10 @@ private void handleBottomNavigationViewClicks() {
getSupportActionBar().setIcon(null);
}
+ // from navigation user always sees root level
resetFileDepth();
- setNavigationViewItemChecked(menuItemId);
+
+ highlightNavigationViewItem(menuItemId);
return false;
});
}
@@ -1157,6 +1163,7 @@ protected void onSaveInstanceState(@NonNull Bundle outState) {
public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mIsAccountChooserActive = savedInstanceState.getBoolean(KEY_IS_ACCOUNT_CHOOSER_ACTIVE, false);
+ highlightNavigationViewItem(getSelectedMenuItemId());
}
@Override
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
index 555b52fb9616..184a53c06529 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
@@ -290,8 +290,7 @@ class FileDisplayActivity :
* 2) Currently visible fragment (and its active child)
* 3) Fallback to All Files
*/
- override fun getCurrentActivityMenuItemId(): Int =
- MainApp.getMenuItemId() ?: listOfFilesFragment?.menuItemId ?: R.id.nav_all_files
+ override fun getMenuItemId(): Int = MainApp.getMenuItemId() ?: listOfFilesFragment?.menuItemId ?: R.id.nav_all_files
private fun loadSavedInstanceState(savedInstanceState: Bundle?) {
if (savedInstanceState != null) {
@@ -1338,7 +1337,7 @@ class FileDisplayActivity :
super.onResume()
- setNavigationViewItemChecked(currentActivityMenuItemId)
+ highlightNavigationViewItem(menuItemId)
if (SettingsActivity.isBackPressed) {
Log_OC.d(TAG, "User returned from settings activity, skipping reset content logic")
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
index b1263d7b1cae..952fcf9f4b0e 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
@@ -200,11 +200,11 @@ class SyncedFoldersActivity :
setupStoragePermissionWarningBanner()
}
- override fun getCurrentActivityMenuItemId(): Int = R.id.nav_settings
+ override fun getMenuItemId(): Int = R.id.nav_settings
override fun onResume() {
super.onResume()
- setNavigationViewItemChecked(currentActivityMenuItemId)
+ highlightNavigationViewItem(menuItemId)
}
fun setupStoragePermissionWarningBanner() {
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
index 1b77bdc1d0c4..3ca1b561941e 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
@@ -186,14 +186,12 @@ private SearchType getSearchType() {
final OCFileListFragment fragment = getOCFileListFragment();
// if current navigation not matches, reset search event
- if (this instanceof DrawerActivity drawerActivity) {
- if (!drawerActivity.isMenuItemIdBelongsToSearchType()) {
- if (fragment != null) {
- fragment.resetSearchAttributes();
- }
-
- return SearchType.NO_SEARCH;
+ if (this instanceof DrawerActivity drawerActivity && !drawerActivity.isMenuItemIdBelongsToSearchType()) {
+ if (fragment != null) {
+ fragment.resetSearchAttributes();
}
+
+ return SearchType.NO_SEARCH;
}
if (fragment != null) {
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
index b0723c5b99bf..e5a70064fe57 100755
--- a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
@@ -142,7 +142,7 @@ private void observeWorkerState() {
}
@Override
- protected int getCurrentActivityMenuItemId() {
+ protected int getMenuItemId() {
return R.id.nav_uploads;
}
@@ -202,7 +202,7 @@ protected void onResume() {
Log_OC.v(TAG, "onResume() start");
super.onResume();
- setNavigationViewItemChecked(getCurrentActivityMenuItemId());
+ highlightNavigationViewItem(getMenuItemId());
// Listen for upload messages
uploadMessagesReceiver = new UploadMessagesReceiver();
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt
index 10a64ae5828b..bec627f7f774 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt
@@ -124,7 +124,7 @@ class PreviewImageActivity :
handleBackPress()
}
- override fun getCurrentActivityMenuItemId(): Int = R.id.nav_gallery
+ override fun getMenuItemId(): Int = R.id.nav_gallery
private fun applyDisplayCutOutTopPadding() {
window.decorView.setOnApplyWindowInsetsListener { view, insets ->
@@ -384,7 +384,7 @@ class PreviewImageActivity :
override fun onResume() {
super.onResume()
- setNavigationViewItemChecked(currentActivityMenuItemId)
+ highlightNavigationViewItem(menuItemId)
downloadFinishReceiver = DownloadFinishReceiver()
val downloadIntentFilter = IntentFilter(getDownloadFinishMessage())
localBroadcastManager.registerReceiver(downloadFinishReceiver!!, downloadIntentFilter)
diff --git a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt
index 9ff1acaaeb0a..99457a849cef 100644
--- a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt
@@ -131,11 +131,11 @@ class TrashbinActivity :
handleBackPress()
}
- override fun getCurrentActivityMenuItemId(): Int = R.id.nav_trashbin
+ override fun getMenuItemId(): Int = R.id.nav_trashbin
override fun onResume() {
super.onResume()
- setNavigationViewItemChecked(currentActivityMenuItemId)
+ highlightNavigationViewItem(menuItemId)
}
override fun onStart() {
From 1dbf7ba1934d72fa29214e25baf0070b2e8fc85e Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Mon, 19 Jan 2026 14:33:18 +0100
Subject: [PATCH 09/14] fix(oc-file-list-fragment): bundle to display correct
file list
Signed-off-by: alperozturk96
---
.../ui/activity/FileDisplayActivity.kt | 15 +++----------
.../owncloud/android/ui/events/SearchEvent.kt | 22 +++++++++++++++++--
.../ui/fragment/OCFileListFragment.java | 2 +-
3 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
index 184a53c06529..da458a3839ab 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
@@ -631,31 +631,22 @@ class FileDisplayActivity :
when (searchEvent.searchType) {
SearchRemoteOperation.SearchType.PHOTO_SEARCH -> {
Log_OC.d(this, "Switch to photo search fragment")
- val bundle = Bundle().apply {
- putParcelable(OCFileListFragment.SEARCH_EVENT, searchEvent)
- }
leftFragment = GalleryFragment().apply {
- arguments = bundle
+ arguments = searchEvent.getBundle()
}
}
SearchRemoteOperation.SearchType.SHARED_FILTER -> {
Log_OC.d(this, "Switch to shared fragment")
- val bundle = Bundle().apply {
- putParcelable(OCFileListFragment.SEARCH_EVENT, searchEvent)
- }
leftFragment = SharedListFragment().apply {
- arguments = bundle
+ arguments = searchEvent.getBundle()
}
}
else -> {
Log_OC.d(this, "Switch to oc file search fragment")
- val bundle = Bundle().apply {
- putParcelable(OCFileListFragment.SEARCH_EVENT, searchEvent)
- }
leftFragment = OCFileListFragment().apply {
- arguments = bundle
+ arguments = searchEvent.getBundle()
}
}
}
diff --git a/app/src/main/java/com/owncloud/android/ui/events/SearchEvent.kt b/app/src/main/java/com/owncloud/android/ui/events/SearchEvent.kt
index 7fd6aab7cdab..c0baa03e7f64 100644
--- a/app/src/main/java/com/owncloud/android/ui/events/SearchEvent.kt
+++ b/app/src/main/java/com/owncloud/android/ui/events/SearchEvent.kt
@@ -7,15 +7,25 @@
*/
package com.owncloud.android.ui.events
+import android.os.Bundle
import android.os.Parcelable
import com.owncloud.android.lib.resources.files.SearchRemoteOperation
+import com.owncloud.android.ui.fragment.OCFileListFragment
import com.owncloud.android.ui.fragment.SearchType
import kotlinx.parcelize.Parcelize
/**
- * Search event
+ * Represents a search or filter request for [com.owncloud.android.ui.fragment.OCFileListFragment].
+ *
+ * Used to pass search state via fragment arguments and to keep the UI
+ * (navigation drawer, empty states) in sync with search behavior.
+ *
+ * This class bridges {@link SearchRemoteOperation.SearchType} values
+ * with UI-level {@link SearchType} used by the file list and drawer highlighting.
+ *
+ * @property searchQuery the query string for the search (may be empty)
+ * @property searchType the search type defining the search behavior
*/
-
@Parcelize
data class SearchEvent(val searchQuery: String, val searchType: SearchRemoteOperation.SearchType) : Parcelable {
fun toSearchType(): SearchType? = when (searchType) {
@@ -25,4 +35,12 @@ data class SearchEvent(val searchQuery: String, val searchType: SearchRemoteOper
SearchRemoteOperation.SearchType.SHARED_FILTER -> SearchType.SHARED_FILTER
else -> null
}
+
+ /**
+ * Creates a bundle for initializing {@link OCFileListFragment} with this search.
+ */
+ fun getBundle(): Bundle = Bundle().apply {
+ putParcelable(OCFileListFragment.SEARCH_EVENT, this@SearchEvent)
+ putParcelable(OCFileListFragment.KEY_CURRENT_SEARCH_TYPE, toSearchType())
+ }
}
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
index cfe5f17f3f57..45bc80ea099e 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
@@ -186,7 +186,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
public static final String SEARCH_EVENT = "SEARCH_EVENT";
private static final String KEY_FILE = MY_PACKAGE + ".extra.FILE";
- protected static final String KEY_CURRENT_SEARCH_TYPE = "CURRENT_SEARCH_TYPE";
+ public static final String KEY_CURRENT_SEARCH_TYPE = "CURRENT_SEARCH_TYPE";
private static final String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER";
private static final String DIALOG_CREATE_DOCUMENT = "DIALOG_CREATE_DOCUMENT";
From d0e6f7845ac26f471f6c9ec9d78dc350f11a09bf Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Wed, 21 Jan 2026 10:54:50 +0100
Subject: [PATCH 10/14] fix git conflict
Signed-off-by: alperozturk96
---
.../ui/fragment/OCFileListFragment.java | 35 +++++++++++++++++--
1 file changed, 33 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
index 45bc80ea099e..4d3d5b4e72a3 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
@@ -2218,6 +2218,38 @@ public void setFabEnabled(final boolean enabled) {
}
}
+ /**
+ * Returns the navigation drawer menu item corresponding to this fragment.
+ *
+ *
+ * OCFileListFragment is the parent for GalleryFragment, SharedListFragment,
+ * and GroupfolderListFragment. It also internally handles listing favorites,
+ * shared files, or recently modified items via search events. This method
+ * checks the current fragment type and search state to give correct drawer menu ID.
+ *
+ *
+ * @return the menu item ID to highlight in the navigation drawer
+ */
+ public int getMenuItemId() {
+ // getMenuItemId will be called from onResume of FileDisplayActivity before checking menu item id
+ // search argument needs to be set if exists
+ setSearchArgs(getArguments());
+
+ if (getClass() == GalleryFragment.class) {
+ return R.id.nav_gallery;
+ } else if (getClass() == SharedListFragment.class || isSearchEventShared() || currentSearchType == SHARED_FILTER) {
+ return R.id.nav_shared;
+ } else if (getClass() == GroupfolderListFragment.class || currentSearchType == SearchType.GROUPFOLDER) {
+ return R.id.nav_groupfolders;
+ } else if (isSearchEventFavorite() || currentSearchType == FAVORITE_SEARCH) {
+ return R.id.nav_favorites;
+ } else if (currentSearchType == RECENTLY_MODIFIED_SEARCH) {
+ return R.id.nav_recently_modified;
+ } else {
+ return R.id.nav_all_files;
+ }
+ }
+
public boolean isEmpty() {
return mAdapter == null || mAdapter.isEmpty();
}
@@ -2244,7 +2276,6 @@ private boolean isSearchEvent(SearchRemoteOperation.SearchType givenEvent) {
public boolean shouldNavigateBackToAllFiles() {
return this instanceof GalleryFragment ||
isSearchEventFavorite() ||
- isSearchEventShared() ||
- DrawerActivity.menuItemId == R.id.nav_favorites;
+ isSearchEventShared();
}
}
From c9ceb9ba896d2c46d17e39ca44a7dc3cc639d35d Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Wed, 28 Jan 2026 16:32:12 +0100
Subject: [PATCH 11/14] fix multiple list directory calls when switching
fragments
Signed-off-by: alperozturk96
---
.../android/ui/activity/DrawerActivity.java | 9 +++---
.../ui/activity/FileDisplayActivity.kt | 2 +-
.../android/ui/adapter/OCFileListAdapter.java | 7 +++++
.../ui/fragment/OCFileListFragment.java | 29 ++++++++++++++++---
4 files changed, 37 insertions(+), 10 deletions(-)
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 d65a85407d77..4cdfb4d939ad 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
@@ -65,6 +65,7 @@
import com.nextcloud.utils.GlideHelper;
import com.nextcloud.utils.LinkHelper;
import com.nextcloud.utils.extensions.ActivityExtensionsKt;
+import com.nextcloud.utils.extensions.DrawerActivityExtensionsKt;
import com.nextcloud.utils.extensions.NavigationViewExtensionsKt;
import com.nextcloud.utils.extensions.ViewExtensionsKt;
import com.nextcloud.utils.mdm.MDMConfig;
@@ -682,12 +683,10 @@ private void handleBottomNavigationViewClicks() {
exitSelectionMode();
resetOnlyPersonalAndOnDevice();
+ // TODO: remove duplication of all files logic
if (menuItemId == R.id.nav_all_files) {
- showFiles(false,false);
- if (this instanceof FileDisplayActivity fda) {
- fda.browseToRoot();
- }
- EventBus.getDefault().post(new ChangeMenuEvent());
+ DrawerActivityExtensionsKt.navigateToAllFiles(this);
+ EventBus.getDefault().post(new ChangeMenuEvent()); // TODO: menu event already sets action bar style?
setupHomeSearchToolbarWithSortAndListButtons();
updateActionBarTitleAndHomeButton(null);
} else if (menuItemId == R.id.nav_favorites) {
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
index da458a3839ab..2d3cce893125 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
@@ -1805,7 +1805,7 @@ class FileDisplayActivity :
val listOfFiles = this.listOfFilesFragment
if (listOfFiles != null) { // should never be null, indeed
val root = storageManager.getFileByPath(OCFile.ROOT_PATH)
- listOfFiles.listDirectory(root, MainApp.isOnlyOnDevice())
+ listOfFiles.resetSearchAttributes()
file = listOfFiles.currentFile
startSyncFolderOperation(root, false)
}
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java
index 603a4f864ec0..e4454da0f579 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java
@@ -1051,6 +1051,13 @@ public void cleanup() {
helper.cleanup();
}
+ @SuppressLint("NotifyDataSetChanged")
+ public void removeAllFiles() {
+ mFiles.clear();
+ mFilesAll.clear();
+ notifyDataSetChanged();
+ }
+
public void insertFile(@NonNull OCFile file) {
mFiles.add(file);
mFilesAll.add(file);
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
index 4d3d5b4e72a3..9e281b9b27f8 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
@@ -119,6 +119,7 @@
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
+import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.ArrayList;
@@ -128,6 +129,7 @@
import java.util.List;
import java.util.Objects;
import java.util.Set;
+import java.util.function.Consumer;
import javax.inject.Inject;
@@ -386,7 +388,11 @@ public void onPause() {
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log_OC.i(TAG, "onActivityCreated() start");
+ prepareOCFileList(savedInstanceState);
+ //listDirectory(MainApp.isOnlyOnDevice());
+ }
+ public void prepareOCFileList(Bundle savedInstanceState) {
if (savedInstanceState != null) {
mFile = BundleExtensionsKt.getParcelableArgument(savedInstanceState, KEY_FILE, OCFile.class);
}
@@ -442,7 +448,6 @@ public void onActivityCreated(Bundle savedInstanceState) {
if (getActivity() instanceof FileDisplayActivity fda) {
fda.updateActionBarTitleAndHomeButton(fda.getCurrentDir());
}
- listDirectory(MainApp.isOnlyOnDevice());
}
protected void setAdapter(Bundle args) {
@@ -1476,6 +1481,14 @@ public void refreshDirectory() {
}
public void listDirectory(@Nullable OCFile directory, boolean onlyOnDevice) {
+ for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
+ Log_OC.d("TEKNOLOJI",
+ element.getClassName() + "." + element.getMethodName() +
+ " (" + element.getLineNumber() + ")"
+ );
+
+ }
+
listDirectory(directory, null, onlyOnDevice);
}
@@ -1513,17 +1526,17 @@ public void listDirectory(@Nullable OCFile directory, OCFile file, boolean onlyO
directory = getDirectoryForListDirectory(directory, storageManager);
if (directory == null) {
- Log_OC.d(TAG, "directory is null, no files, wait for sync");
+ Log_OC.e(TAG, "directory is null, no files, wait for sync");
return;
}
if (mLimitToMimeType == null) {
- Log_OC.d(TAG, "mLimitToMimeType is null");
+ Log_OC.w(TAG, "mLimitToMimeType is null");
return;
}
if (mAdapter == null) {
- Log_OC.d(TAG, "mAdapter is null");
+ Log_OC.e(TAG, "❗" + "oc file list adapter is null, cannot list directory" + "❗");
return;
}
@@ -1863,6 +1876,14 @@ protected void handleSearchEvent(SearchEvent event) {
return;
}
+ final var activity = getActivity();
+ if (activity != null) {
+ activity.runOnUiThread(() -> {{
+ getAdapter().removeAllFiles();
+ setEmptyListMessage(EmptyListState.LOADING);
+ }});
+ }
+
prepareCurrentSearch(event);
searchFragment = true;
setFabVisible(false);
From 1c1c6a7cd8709014f260d324fab8995531f7bd52 Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Thu, 29 Jan 2026 09:23:46 +0100
Subject: [PATCH 12/14] fix multiple list directory calls when switching
fragments
Signed-off-by: alperozturk96
---
.../extensions/DrawerActivityExtensions.kt | 5 ++--
.../android/ui/activity/DrawerActivity.java | 30 ++-----------------
.../ui/fragment/OCFileListFragment.java | 14 ++-------
3 files changed, 9 insertions(+), 40 deletions(-)
diff --git a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
index 05fa689ea6b5..93f5c8cceb54 100644
--- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
+++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt
@@ -13,9 +13,10 @@ import com.owncloud.android.R
import com.owncloud.android.ui.activity.DrawerActivity
import com.owncloud.android.ui.activity.FileDisplayActivity
-fun DrawerActivity.navigateToAllFiles() {
+@JvmOverloads
+fun DrawerActivity.navigateToAllFiles(onlyPersonal: Boolean = false) {
MainApp.showOnlyFilesOnDevice(false)
- MainApp.showOnlyPersonalFiles(false)
+ MainApp.showOnlyPersonalFiles(onlyPersonal)
highlightNavigationViewItem(R.id.nav_all_files)
Intent(applicationContext, FileDisplayActivity::class.java).apply {
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 4cdfb4d939ad..280f576728db 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
@@ -94,11 +94,7 @@
import com.owncloud.android.ui.events.ChangeMenuEvent;
import com.owncloud.android.ui.events.SearchEvent;
import com.owncloud.android.ui.fragment.FileDetailsSharingProcessFragment;
-import com.owncloud.android.ui.fragment.GalleryFragment;
-import com.owncloud.android.ui.fragment.GroupfolderListFragment;
import com.owncloud.android.ui.fragment.OCFileListFragment;
-import com.owncloud.android.ui.fragment.SharedListFragment;
-import com.owncloud.android.ui.preview.PreviewTextStringFragment;
import com.owncloud.android.ui.trashbin.TrashbinActivity;
import com.owncloud.android.utils.BitmapUtils;
import com.owncloud.android.utils.DisplayUtils;
@@ -596,26 +592,9 @@ private void onNavigationItemClicked(final MenuItem menuItem) {
int itemId = menuItem.getItemId();
if (itemId == R.id.nav_all_files || itemId == R.id.nav_personal_files) {
- if (this instanceof FileDisplayActivity fda &&
- !(fda.getLeftFragment() instanceof GalleryFragment) &&
- !(fda.getLeftFragment() instanceof SharedListFragment) &&
- !(fda.getLeftFragment() instanceof GroupfolderListFragment) &&
- !(fda.getLeftFragment() instanceof PreviewTextStringFragment)) {
- showFiles(false, itemId == R.id.nav_personal_files);
- fda.browseToRoot();
- EventBus.getDefault().post(new ChangeMenuEvent());
- } else {
- MainApp.showOnlyFilesOnDevice(false);
- MainApp.showOnlyPersonalFiles(itemId == R.id.nav_personal_files);
- Intent intent = new Intent(getApplicationContext(), FileDisplayActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- intent.setAction(FileDisplayActivity.ALL_FILES);
- startActivity(intent);
- }
-
closeDrawer();
- setupHomeSearchToolbarWithSortAndListButtons();
- updateActionBarTitleAndHomeButton(null);
+ DrawerActivityExtensionsKt.navigateToAllFiles(this);
+ EventBus.getDefault().post(new ChangeMenuEvent());
} else if (itemId == R.id.nav_favorites) {
openFavoritesTab();
} else if (itemId == R.id.nav_gallery) {
@@ -683,12 +662,9 @@ private void handleBottomNavigationViewClicks() {
exitSelectionMode();
resetOnlyPersonalAndOnDevice();
- // TODO: remove duplication of all files logic
if (menuItemId == R.id.nav_all_files) {
DrawerActivityExtensionsKt.navigateToAllFiles(this);
- EventBus.getDefault().post(new ChangeMenuEvent()); // TODO: menu event already sets action bar style?
- setupHomeSearchToolbarWithSortAndListButtons();
- updateActionBarTitleAndHomeButton(null);
+ EventBus.getDefault().post(new ChangeMenuEvent());
} else if (menuItemId == R.id.nav_favorites) {
openFavoritesTab();
} else if (menuItemId == R.id.nav_assistant && !(this instanceof ComposeActivity)) {
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
index 9e281b9b27f8..feaf40df117a 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
@@ -119,7 +119,6 @@
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
-import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.ArrayList;
@@ -129,7 +128,6 @@
import java.util.List;
import java.util.Objects;
import java.util.Set;
-import java.util.function.Consumer;
import javax.inject.Inject;
@@ -389,7 +387,6 @@ public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log_OC.i(TAG, "onActivityCreated() start");
prepareOCFileList(savedInstanceState);
- //listDirectory(MainApp.isOnlyOnDevice());
}
public void prepareOCFileList(Bundle savedInstanceState) {
@@ -1481,14 +1478,6 @@ public void refreshDirectory() {
}
public void listDirectory(@Nullable OCFile directory, boolean onlyOnDevice) {
- for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
- Log_OC.d("TEKNOLOJI",
- element.getClassName() + "." + element.getMethodName() +
- " (" + element.getLineNumber() + ")"
- );
-
- }
-
listDirectory(directory, null, onlyOnDevice);
}
@@ -1791,12 +1780,15 @@ protected void setEmptyView(SearchEvent event) {
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(ChangeMenuEvent changeMenuEvent) {
+ Log_OC.d(TAG, "event bus --- change menu event triggered");
+
resetSearchAttributes();
resetMenuItems();
if (getActivity() instanceof FileDisplayActivity fda) {
fda.invalidateOptionsMenu();
fda.getIntent().removeExtra(OCFileListFragment.SEARCH_EVENT);
+ fda.setupHomeSearchToolbarWithSortAndListButtons();
fda.updateActionBarTitleAndHomeButton(null);
}
From b9a66154a834bdab7535e9923da895ca153c8683 Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Thu, 29 Jan 2026 09:33:49 +0100
Subject: [PATCH 13/14] fix multiple list directory calls when switching
fragments
Signed-off-by: alperozturk96
---
.../com/owncloud/android/ui/fragment/OCFileListFragment.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
index feaf40df117a..21ee7513118c 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
@@ -387,6 +387,7 @@ public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log_OC.i(TAG, "onActivityCreated() start");
prepareOCFileList(savedInstanceState);
+ listDirectory(MainApp.isOnlyOnDevice());
}
public void prepareOCFileList(Bundle savedInstanceState) {
From 00597b06795e5b474e6545d58373e7a7863313fe Mon Sep 17 00:00:00 2001
From: alperozturk96
Date: Thu, 29 Jan 2026 09:34:35 +0100
Subject: [PATCH 14/14] fix multiple list directory calls when switching
fragments
Signed-off-by: alperozturk96
---
.../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
index 2d3cce893125..dfabc91e21db 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt
@@ -83,6 +83,7 @@ import com.nextcloud.utils.extensions.lastFragment
import com.nextcloud.utils.extensions.logFileSize
import com.nextcloud.utils.extensions.navigateToAllFiles
import com.nextcloud.utils.extensions.observeWorker
+import com.nextcloud.utils.extensions.showToast
import com.nextcloud.utils.fileNameValidator.FileNameValidator.checkFolderPath
import com.nextcloud.utils.view.FastScrollUtils
import com.owncloud.android.MainApp
@@ -280,6 +281,7 @@ class FileDisplayActivity :
startMetadataSyncForRoot()
handleBackPress()
setupDrawer(R.id.nav_all_files)
+ showToast("TEST APK")
}
/**