From 4f0c78ab451102beb7bff4f0b110fe38022fe883 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 13 Jan 2026 13:04:49 +0100 Subject: [PATCH 01/23] 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 79925570bbac..e3df5d399539 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 @@ -812,6 +812,7 @@ class FileDisplayActivity : protected fun resetScrollingAndUpdateActionBar() { updateActionBarTitleAndHomeButton(file) + binding.appbar.appbar.setExpanded(true, false) resetScrolling(true) } @@ -1391,6 +1392,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 71d7edc529d23872ef7daadd665c4507b1ebf952 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 13 Jan 2026 13:55:38 +0100 Subject: [PATCH 02/23] 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 e3df5d399539..90976b5f71b3 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 @@ -812,7 +812,6 @@ class FileDisplayActivity : protected fun resetScrollingAndUpdateActionBar() { updateActionBarTitleAndHomeButton(file) - binding.appbar.appbar.setExpanded(true, false) resetScrolling(true) } From ff6ac72693d2bcc4c7e4f4d6c6a22eafb3099ff1 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 13 Jan 2026 16:15:33 +0100 Subject: [PATCH 03/23] 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 90976b5f71b3..79925570bbac 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 @@ -1391,8 +1391,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 fa338e576804fef110de9d6a4613071bd4965a58 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 14 Jan 2026 09:59:36 +0100 Subject: [PATCH 04/23] 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 2ec6eaae371db12d6bfe216979701261dc1db3ad Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 14 Jan 2026 09:59:44 +0100 Subject: [PATCH 05/23] 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 7e4b1e7447af54222a086244821b2a1abea34ac8 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 16 Jan 2026 16:02:08 +0100 Subject: [PATCH 06/23] centralize menu item id usage Signed-off-by: alperozturk96 # Conflicts: # app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java # Conflicts: # app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt --- .../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 + .../android/ui/trashbin/TrashbinActivity.kt | 11 +- 14 files changed, 147 insertions(+), 155 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 79925570bbac..cb0a0d3e6d04 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 @@ -278,8 +278,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 = @@ -310,8 +314,6 @@ class FileDisplayActivity : // reset ui states when file display activity created/recrated listOfFilesFragment?.resetSearchAttributes() - menuItemId = R.id.nav_all_files - setNavigationViewItemChecked() } private fun initTaskRetainerFragment() { @@ -390,7 +392,6 @@ class FileDisplayActivity : ) != null ) { switchToSearchFragment(savedInstanceState) - setupDrawer() } else { createMinFragments(savedInstanceState) } @@ -565,7 +566,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, @@ -582,7 +582,6 @@ class FileDisplayActivity : LIST_GROUPFOLDERS == action -> { Log_OC.d(this, "Switch to list groupfolders fragment") - menuItemId = R.id.nav_groupfolders leftFragment = GroupfolderListFragment() supportFragmentManager.executePendingTransactions() } @@ -1264,7 +1263,6 @@ class FileDisplayActivity : } resetScrollingAndUpdateActionBar() - configureMenuItem() startMetadataSyncForCurrentDir() } @@ -1330,6 +1328,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 @@ -1367,8 +1368,6 @@ class FileDisplayActivity : updateActionBarTitleAndHomeButton(startFile) } - configureMenuItem() - // show in-app review dialog to user inAppReviewHelper.showInAppReview(this) @@ -1386,21 +1385,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") @@ -2857,7 +2841,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 7cd2b526c49b..2960c923ba40 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 @@ -120,11 +120,16 @@ protected void onCreate(Bundle savedInstanceState) { updateActionBarTitleAndHomeButtonByString(getString(R.string.uploads_view_title)); // setup drawer - setupDrawer(); + setupDrawer(R.id.nav_uploads); setupContent(); } + @Override + protected int getCurrentActivityMenuItemId() { + return R.id.nav_uploads; + } + private void setupContent() { binding.list.setEmptyView(binding.emptyList.getRoot()); binding.emptyList.getRoot().setVisibility(View.GONE); @@ -181,6 +186,8 @@ protected void onStart() { Log_OC.v(TAG, "onStart() start"); super.onStart(); + setNavigationViewItemChecked(getCurrentActivityMenuItemId()); + // Listen for upload messages uploadFinishReceiver = new UploadFinishReceiver(); 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/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 4e57d6ddc9e3419f0aef45b99a3984a00e3d3822 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 16 Jan 2026 16:21:06 +0100 Subject: [PATCH 07/23] 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 cb0a0d3e6d04..7ce03a2b7fe1 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 @@ -281,6 +281,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 6fb301c7286ad3330eff65ffe00678effa2672bc Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 16 Jan 2026 16:41:04 +0100 Subject: [PATCH 08/23] 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 ++-- .../android/ui/trashbin/TrashbinActivity.kt | 4 ++-- 11 files changed, 51 insertions(+), 29 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 7ce03a2b7fe1..0ae83ac23e3a 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 @@ -289,8 +289,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) { @@ -1337,7 +1336,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 2960c923ba40..eb7ed31a12ec 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 @@ -126,7 +126,7 @@ protected void onCreate(Bundle savedInstanceState) { } @Override - protected int getCurrentActivityMenuItemId() { + protected int getMenuItemId() { return R.id.nav_uploads; } @@ -186,7 +186,7 @@ protected void onStart() { Log_OC.v(TAG, "onStart() start"); super.onStart(); - setNavigationViewItemChecked(getCurrentActivityMenuItemId()); + highlightNavigationViewItem(getMenuItemId()); // Listen for upload messages uploadFinishReceiver = new UploadFinishReceiver(); 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 bfd73bae5bc8cd021e09c9b66fc4812b5b421cce Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Mon, 19 Jan 2026 14:33:18 +0100 Subject: [PATCH 09/23] 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 0ae83ac23e3a..a5a818d0f6e0 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 @@ -630,31 +630,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 a37f2915731f03dd1bfc4dba64f3e4a8680925e8 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 21 Jan 2026 10:54:50 +0100 Subject: [PATCH 10/23] 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 84a877ba02408b1ab085b5d576682e2df3db34c3 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 28 Jan 2026 16:32:12 +0100 Subject: [PATCH 11/23] fix multiple list directory calls when switching fragments Signed-off-by: alperozturk96 --- .../android/ui/activity/DrawerActivity.java | 9 +++--- .../ui/activity/FileDisplayActivity.kt | 2 +- .../ui/fragment/OCFileListFragment.java | 29 ++++++++++++++++--- 3 files changed, 30 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 a5a818d0f6e0..e9a9a0c8ade2 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 @@ -1802,7 +1802,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/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 96196702bb940fdfcf527f101a80750ab9383aee Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 29 Jan 2026 09:23:46 +0100 Subject: [PATCH 12/23] 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 bda3b4755754fc9c7ff7c4142a5e8245219d0d47 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 29 Jan 2026 09:33:49 +0100 Subject: [PATCH 13/23] 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 a90618245aa0da80761f068cc84e488c98a79564 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 29 Jan 2026 09:34:35 +0100 Subject: [PATCH 14/23] 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 e9a9a0c8ade2..04c4a6c8d488 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 @@ -82,6 +82,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 @@ -279,6 +280,7 @@ class FileDisplayActivity : startMetadataSyncForRoot() handleBackPress() setupDrawer(R.id.nav_all_files) + showToast("TEST APK") } /** From db7aa2b35a62f2b4a38973b19509b29c28d924a1 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 08:41:03 +0100 Subject: [PATCH 15/23] fix git conflict Signed-off-by: alperozturk96 --- .../com/owncloud/android/ui/adapter/OCFileListAdapter.java | 7 +++++++ .../owncloud/android/ui/preview/PreviewImageActivity.kt | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) 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 db46f3dc607c..4ae18d7564b9 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 @@ -1050,4 +1050,11 @@ public void cleanup() { ocFileListDelegate.cleanup(); helper.cleanup(); } + + @SuppressLint("NotifyDataSetChanged") + public void removeAllFiles() { + mFiles.clear(); + mFilesAll.clear(); + notifyDataSetChanged(); + } } 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 3ebde7fb9324..018fdccc6001 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 @@ -99,7 +99,7 @@ class PreviewImageActivity : livePhotoFile = intent.getParcelableArgument(EXTRA_LIVE_PHOTO_FILE, OCFile::class.java) - setupDrawer() + setupDrawer(menuItemId) val chosenFile = intent.getParcelableArgument(EXTRA_FILE, OCFile::class.java) @@ -124,6 +124,8 @@ class PreviewImageActivity : handleBackPress() } + override fun getMenuItemId(): Int = R.id.nav_gallery + private fun applyDisplayCutOutTopPadding() { window.decorView.setOnApplyWindowInsetsListener { view, insets -> val displayCutout = insets.displayCutout From f559bacd080877d939fdca0524db656cec6dd4ae Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 08:52:22 +0100 Subject: [PATCH 16/23] fix git conflict Signed-off-by: alperozturk96 --- .../java/com/nextcloud/ui/composeActivity/ComposeActivity.kt | 2 +- .../com/owncloud/android/ui/activities/ActivitiesActivity.java | 2 +- .../java/com/owncloud/android/ui/activity/CommunityActivity.kt | 2 +- .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 3 +-- .../com/owncloud/android/ui/activity/SyncedFoldersActivity.kt | 2 +- .../com/owncloud/android/ui/activity/UploadListActivity.java | 2 +- .../java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt | 2 +- 7 files changed, 7 insertions(+), 8 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 0b81a298e4d1..c35f8fa6a506 100644 --- a/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt +++ b/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt @@ -89,7 +89,7 @@ class ComposeActivity : DrawerActivity() { private fun setupActivityUIFor(destination: ComposeDestination) { if (destination is ComposeDestination.AssistantScreen) { - setupDrawer(R.id.nav_assistant) + setupDrawer(menuItemId) setupToolbarShowOnlyMenuButtonAndTitle(destination.title) { openDrawer() } 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 df740eec674e..2e3a13a6dabd 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(R.id.nav_activity); + setupDrawer(getMenuItemId()); updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_activities)); binding.swipeContainingList.setOnRefreshListener(() -> { 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 6985fe889789..bc2d8379ad5d 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(R.id.nav_community) + setupDrawer(menuItemId) binding.communityReleaseCandidateText.movementMethod = LinkMovementMethod.getInstance() setupContributeForumView() setupContributeTranslationView() 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 04c4a6c8d488..47cdb6d91c46 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,7 @@ class FileDisplayActivity : observeWorkerState() startMetadataSyncForRoot() handleBackPress() - setupDrawer(R.id.nav_all_files) - showToast("TEST APK") + setupDrawer(menuItemId) } /** 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 952fcf9f4b0e..c12acc61e2c5 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(R.id.nav_settings) + setupDrawer(menuItemId) setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) if (supportActionBar != null) { supportActionBar!!.setDisplayHomeAsUpEnabled(true) 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 eb7ed31a12ec..dbd70b68b0f9 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 @@ -120,7 +120,7 @@ protected void onCreate(Bundle savedInstanceState) { updateActionBarTitleAndHomeButtonByString(getString(R.string.uploads_view_title)); // setup drawer - setupDrawer(R.id.nav_uploads); + setupDrawer(getMenuItemId()); setupContent(); } 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 99457a849cef..b583708c478a 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,7 +127,7 @@ class TrashbinActivity : View.GONE updateActionBarTitleAndHomeButtonByString(getString(R.string.trashbin_activity_title)) - setupDrawer(R.id.nav_trashbin) + setupDrawer(menuItemId) handleBackPress() } From f5005e547a3c51fd0c71acec4074cea9830f46dc Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 09:01:07 +0100 Subject: [PATCH 17/23] fixes Signed-off-by: alperozturk96 --- .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 1 - .../com/owncloud/android/ui/fragment/OCFileListFragment.java | 4 ---- 2 files changed, 5 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 47cdb6d91c46..7bca0c704668 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 @@ -82,7 +82,6 @@ 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 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 21ee7513118c..39cfc52aded5 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 @@ -2245,10 +2245,6 @@ public void setFabEnabled(final boolean enabled) { * @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) { From dc4f8206d3f856b6f6fd503b81b7c6574b197604 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 09:02:40 +0100 Subject: [PATCH 18/23] fixes Signed-off-by: alperozturk96 --- .../com/nextcloud/utils/extensions/DrawerActivityExtensions.kt | 1 + 1 file changed, 1 insertion(+) 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 93f5c8cceb54..95acef0970ef 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt @@ -18,6 +18,7 @@ fun DrawerActivity.navigateToAllFiles(onlyPersonal: Boolean = false) { MainApp.showOnlyFilesOnDevice(false) MainApp.showOnlyPersonalFiles(onlyPersonal) highlightNavigationViewItem(R.id.nav_all_files) + setupHomeSearchToolbarWithSortAndListButtons() Intent(applicationContext, FileDisplayActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) From 267fd10ed8ba0410f0d19b5de3136dfbbbabf89e Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 09:40:57 +0100 Subject: [PATCH 19/23] fixes Signed-off-by: alperozturk96 --- .../owncloud/android/ui/activity/FileDisplayActivity.kt | 7 ++++++- .../owncloud/android/ui/fragment/OCFileListFragment.java | 6 +++++- 2 files changed, 11 insertions(+), 2 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 7bca0c704668..f7c19052306a 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 @@ -1346,6 +1346,8 @@ class FileDisplayActivity : } val ocFileListFragment = leftFragment + + syncAndUpdateFolder(ignoreETag = true, ignoreFocus = true) // Try to get the OCFile from the intent, if one was provided when launching this activity. @@ -1355,17 +1357,20 @@ class FileDisplayActivity : file = it } + ocFileListFragment.setSearchArgs(ocFileListFragment.arguments) + // refresh list of files if (searchView != null && !TextUtils.isEmpty(searchQuery)) { searchView?.setQuery(searchQuery, false) } else if (!ocFileListFragment.isSearchFragment && startFile == null) { - updateListOfFilesFragment() + ocFileListFragment.listDirectory(MainApp.isOnlyOnDevice()) ocFileListFragment.registerFabListener() } else { ocFileListFragment.listDirectory(startFile, false) updateActionBarTitleAndHomeButton(startFile) } + // show in-app review dialog to user inAppReviewHelper.showInAppReview(this) 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 39cfc52aded5..17b5ef3e07dc 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 @@ -309,7 +309,7 @@ public void onAttach(@NonNull Context context) { } } - private void setSearchArgs(Bundle state) { + public void setSearchArgs(Bundle state) { SearchType argSearchType = NO_SEARCH; SearchEvent argSearchEvent = null; @@ -1783,6 +1783,10 @@ protected void setEmptyView(SearchEvent event) { public void onMessageEvent(ChangeMenuEvent changeMenuEvent) { Log_OC.d(TAG, "event bus --- change menu event triggered"); + final var arguments = getArguments(); + if (arguments != null) { + arguments.clear(); + } resetSearchAttributes(); resetMenuItems(); From 5ff349a6b9fb0f3f7806114bc3528134fb2cf1c4 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 09:59:30 +0100 Subject: [PATCH 20/23] fixes Signed-off-by: alperozturk96 --- .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 6 +++++- 1 file changed, 5 insertions(+), 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 f7c19052306a..8be0860b2676 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 @@ -650,6 +650,7 @@ class FileDisplayActivity : } } + listOfFilesFragment?.isSearchFragment = true listOfFilesFragment?.setCurrentSearchType(searchEvent) } // endregion @@ -1327,6 +1328,9 @@ class FileDisplayActivity : super.onResume() + if (ocFileListFragment is SharedListFragment || ocFileListFragment?.isSearchFragment == true) { + ocFileListFragment?.setSearchArgs(ocFileListFragment?.arguments) + } highlightNavigationViewItem(menuItemId) if (SettingsActivity.isBackPressed) { @@ -1357,7 +1361,7 @@ class FileDisplayActivity : file = it } - ocFileListFragment.setSearchArgs(ocFileListFragment.arguments) + // refresh list of files if (searchView != null && !TextUtils.isEmpty(searchQuery)) { From ef796e9c872403cf10cdb24ffec699f338aacea3 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 10:07:18 +0100 Subject: [PATCH 21/23] fixes Signed-off-by: alperozturk96 --- .../owncloud/android/ui/activity/FileDisplayActivity.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 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 8be0860b2676..83f65a60b6f8 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 @@ -1333,6 +1333,7 @@ class FileDisplayActivity : } highlightNavigationViewItem(menuItemId) + if (SettingsActivity.isBackPressed) { Log_OC.d(TAG, "User returned from settings activity, skipping reset content logic") return @@ -1349,9 +1350,10 @@ class FileDisplayActivity : return } + if (isToolbarStyleSearch) { + setupHomeSearchToolbarWithSortAndListButtons() + } val ocFileListFragment = leftFragment - - syncAndUpdateFolder(ignoreETag = true, ignoreFocus = true) // Try to get the OCFile from the intent, if one was provided when launching this activity. @@ -1361,8 +1363,6 @@ class FileDisplayActivity : file = it } - - // refresh list of files if (searchView != null && !TextUtils.isEmpty(searchQuery)) { searchView?.setQuery(searchQuery, false) @@ -1374,7 +1374,6 @@ class FileDisplayActivity : updateActionBarTitleAndHomeButton(startFile) } - // show in-app review dialog to user inAppReviewHelper.showInAppReview(this) From e148f648b2987eef9e6c2d2ce46a58009d89a423 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 10:15:53 +0100 Subject: [PATCH 22/23] fixes Signed-off-by: alperozturk96 --- .../java/com/owncloud/android/ui/activity/DrawerActivity.java | 2 +- .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 1 - 2 files changed, 1 insertion(+), 2 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 280f576728db..6fb5f421af7c 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 @@ -593,7 +593,7 @@ private void onNavigationItemClicked(final MenuItem menuItem) { if (itemId == R.id.nav_all_files || itemId == R.id.nav_personal_files) { closeDrawer(); - DrawerActivityExtensionsKt.navigateToAllFiles(this); + DrawerActivityExtensionsKt.navigateToAllFiles(this,itemId == R.id.nav_personal_files); EventBus.getDefault().post(new ChangeMenuEvent()); } else if (itemId == R.id.nav_favorites) { openFavoritesTab(); 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 83f65a60b6f8..9d278aac2267 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 @@ -1333,7 +1333,6 @@ class FileDisplayActivity : } highlightNavigationViewItem(menuItemId) - if (SettingsActivity.isBackPressed) { Log_OC.d(TAG, "User returned from settings activity, skipping reset content logic") return From e9f715ed1fbeb63945bdd5cdc0b6f8092319e52e Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 12:27:23 +0100 Subject: [PATCH 23/23] fixes Signed-off-by: alperozturk96 --- .../android/ui/activity/FileDisplayActivity.kt | 2 +- .../owncloud/android/ui/activity/ToolbarActivity.java | 11 ----------- 2 files changed, 1 insertion(+), 12 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 9d278aac2267..595cce67eb80 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 @@ -1328,7 +1328,7 @@ class FileDisplayActivity : super.onResume() - if (ocFileListFragment is SharedListFragment || ocFileListFragment?.isSearchFragment == true) { + if (ocFileListFragment?.isSearchFragment == true) { ocFileListFragment?.setSearchArgs(ocFileListFragment?.arguments) } highlightNavigationViewItem(menuItemId) 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 3ca1b561941e..7db6c88e12bb 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 @@ -184,20 +184,9 @@ private OCFileDepth getCurrentDirDepth() { private SearchType getSearchType() { final OCFileListFragment fragment = getOCFileListFragment(); - - // if current navigation not matches, reset search event - if (this instanceof DrawerActivity drawerActivity && !drawerActivity.isMenuItemIdBelongsToSearchType()) { - if (fragment != null) { - fragment.resetSearchAttributes(); - } - - return SearchType.NO_SEARCH; - } - if (fragment != null) { return fragment.getCurrentSearchType(); } - return SearchType.NO_SEARCH; }