From b1013ad3a673b53dfad5443de3929715dd894f8a Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 3 Sep 2025 13:45:24 +0200 Subject: [PATCH 1/3] fix: toolbar inconsistency Signed-off-by: alperozturk --- .../java/com/nextcloud/model/ToolbarItem.kt | 38 ++++++++++++ .../extensions/DrawerActivityExtensions.kt | 40 ------------- .../android/ui/activity/DrawerActivity.java | 18 ------ .../ui/activity/FileDisplayActivity.kt | 60 ++++++------------- .../android/ui/activity/ToolbarActivity.java | 8 +++ .../ui/fragment/UnifiedSearchFragment.kt | 8 ++- 6 files changed, 68 insertions(+), 104 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/model/ToolbarItem.kt diff --git a/app/src/main/java/com/nextcloud/model/ToolbarItem.kt b/app/src/main/java/com/nextcloud/model/ToolbarItem.kt new file mode 100644 index 000000000000..8995acc1428b --- /dev/null +++ b/app/src/main/java/com/nextcloud/model/ToolbarItem.kt @@ -0,0 +1,38 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2025 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nextcloud.model + +import android.view.Menu +import com.owncloud.android.R + +enum class ToolbarItem(val navId: Int, val titleId: Int, val style: ToolbarStyle) { + NONE(Menu.NONE, R.string.drawer_item_all_files, ToolbarStyle.SEARCH), + ALL_FILES(R.id.nav_all_files, R.string.drawer_item_all_files, ToolbarStyle.SEARCH), + PERSONAL_FILES(R.id.nav_personal_files, R.string.drawer_item_personal_files, ToolbarStyle.SEARCH), + ACTIVITIES(R.id.nav_activity, R.string.drawer_item_activities, ToolbarStyle.PLAIN), + FAVORITES(R.id.nav_favorites, R.string.drawer_item_favorites, ToolbarStyle.PLAIN), + GALLERY(R.id.nav_gallery, R.string.drawer_item_gallery, ToolbarStyle.PLAIN), + SHARED(R.id.nav_shared, R.string.drawer_item_shared, ToolbarStyle.PLAIN), + GROUP_FOLDERS(R.id.nav_groupfolders, R.string.drawer_item_groupfolders, ToolbarStyle.PLAIN), + ON_DEVICE(R.id.nav_on_device, R.string.drawer_item_on_device, ToolbarStyle.PLAIN), + RECENTLY_MODIFIED(R.id.nav_recently_modified, R.string.drawer_item_recently_modified, ToolbarStyle.PLAIN), + ASSISTANT(R.id.nav_assistant, R.string.drawer_item_assistant, ToolbarStyle.PLAIN), + UPLOADS(R.id.nav_uploads, R.string.drawer_item_uploads_list, ToolbarStyle.PLAIN), + SETTINGS(R.id.nav_settings, R.string.actionbar_settings, ToolbarStyle.PLAIN), + COMMUNITY(R.id.nav_community, R.string.drawer_community, ToolbarStyle.PLAIN), + TRASHBIN(R.id.nav_trashbin, R.string.drawer_item_trashbin, ToolbarStyle.PLAIN); + + companion object { + fun fromNavId(navId: Int): ToolbarItem? = entries.find { it.navId == navId } + } +} + +enum class ToolbarStyle { + PLAIN, + SEARCH +} 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 3f7464cafa45..d09660301611 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt @@ -14,46 +14,6 @@ import com.owncloud.android.datamodel.OCFile import com.owncloud.android.ui.activity.DrawerActivity import com.owncloud.android.ui.activity.FileDisplayActivity -/** - * Determines the appropriate menu item ID based on the current ActionBar title. - * - * This function serves as a workaround solution because not all drawer menu item - * navigations extend from DrawerActivity and back button changes content but not the drawer menu item. - * As a result, the content and highlighted - * menu item may not always match. This function helps maintain consistency between - * the displayed content and the highlighted menu item. - * - * @return The menu item ID corresponding to the current ActionBar title, or null if - * the ActionBar is not available. - */ -fun DrawerActivity.getMenuItemIdFromTitle(): Int? { - val actionBar = supportActionBar ?: return null - - return when (actionBar.title.toString()) { - getString(R.string.drawer_item_all_files) -> R.id.nav_all_files - getString(R.string.drawer_item_personal_files) -> R.id.nav_personal_files - getString(R.string.drawer_item_activities) -> R.id.nav_activity - getString(R.string.drawer_item_favorites) -> R.id.nav_favorites - getString(R.string.drawer_item_gallery) -> R.id.nav_gallery - getString(R.string.drawer_item_shared) -> R.id.nav_shared - getString(R.string.drawer_item_groupfolders) -> R.id.nav_groupfolders - getString(R.string.drawer_item_on_device) -> R.id.nav_on_device - getString(R.string.drawer_item_recently_modified) -> R.id.nav_recently_modified - getString(R.string.drawer_item_assistant) -> R.id.nav_assistant - getString(R.string.drawer_item_uploads_list) -> R.id.nav_uploads - getString(R.string.drawer_item_trashbin) -> R.id.nav_trashbin - else -> { - if (MainApp.isOnlyPersonFiles()) { - R.id.nav_personal_files - } else if (MainApp.isOnlyOnDevice()) { - R.id.nav_on_device - } else { - DrawerActivity.menuItemId - } - } - } -} - @Suppress("ReturnCount") fun DrawerActivity.handleBackButtonEvent(currentDir: OCFile): Boolean { if (DrawerActivity.menuItemId == R.id.nav_all_files && currentDir.isRootDirectory) { 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 1b8edf686845..29aa804614f2 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 @@ -129,8 +129,6 @@ import hct.Hct; import kotlin.Unit; -import static com.nextcloud.utils.extensions.DrawerActivityExtensionsKt.getMenuItemIdFromTitle; - /** * Base class to handle setup of the drawer implementation including user switching and avatar fetching and fallback * generation. @@ -318,21 +316,6 @@ private void exitSelectionMode() { */ private void setupDrawerToggle() { mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) { - private boolean isMenuItemChecked = false; - - @Override - public void onDrawerSlide(View drawerView, float slideOffset) { - super.onDrawerSlide(drawerView, slideOffset); - if (slideOffset > 0 && !isMenuItemChecked) { - Integer menuItemIdFromTitle = getMenuItemIdFromTitle(DrawerActivity.this); - if (menuItemIdFromTitle != null && menuItemIdFromTitle != menuItemId) { - menuItemId = menuItemIdFromTitle; - } - setNavigationViewItemChecked(); - isMenuItemChecked = true; - } - } - /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { super.onDrawerClosed(view); @@ -344,7 +327,6 @@ public void onDrawerClosed(View view) { pendingRunnable = null; } - isMenuItemChecked = false; closeDrawer(); } 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 a300b5e935bc..defcc57c9789 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 @@ -70,6 +70,8 @@ import com.nextcloud.client.media.PlayerServiceConnection import com.nextcloud.client.network.ClientFactory.CreationException import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.client.utils.IntentUtil +import com.nextcloud.model.ToolbarItem +import com.nextcloud.model.ToolbarStyle import com.nextcloud.model.WorkerState import com.nextcloud.model.WorkerState.DownloadFinished import com.nextcloud.model.WorkerState.DownloadStarted @@ -1178,7 +1180,7 @@ class FileDisplayActivity : listOfFiles.setFabVisible(currentFile.canCreateFileAndFolder()) listOfFiles.registerFabListener() resetTitleBarAndScrolling() - setDrawerAllFiles() + configureToolbar() startMetadataSyncForCurrentDir() } @@ -1294,13 +1296,7 @@ class FileDisplayActivity : localBroadcastManager.registerReceiver(it, downloadIntentFilter) } - checkAndSetMenuItemId() - - if (menuItemId == Menu.NONE) { - setDrawerAllFiles() - } else { - configureToolbar() - } + configureToolbar() // show in-app review dialog to user inAppReviewHelper.showInAppReview(this) @@ -1325,43 +1321,21 @@ class FileDisplayActivity : } private fun configureToolbar() { - // Other activities menuItemIds must be excluded to show correct toolbar. - val excludedMenuItemIds = ArrayList().apply { - add(R.id.nav_community) - add(R.id.nav_trashbin) - add(R.id.nav_uploads) - add(R.id.nav_activity) - add(R.id.nav_settings) - add(R.id.nav_assistant) - } - - var isSearchEventExists = false - if (this.leftFragment is OCFileListFragment) { - isSearchEventExists = (fileListFragment?.getSearchEvent() != null) - } - - if (this.leftFragment !is GalleryFragment && - ( - !isSearchEventExists || - menuItemId == R.id.nav_all_files || - menuItemId == R.id.nav_personal_files || - excludedMenuItemIds.contains(menuItemId) - ) - ) { - setupHomeSearchToolbarWithSortAndListButtons() - } else { - setupToolbar() - } - } - - private fun setDrawerAllFiles() { checkAndSetMenuItemId() setNavigationViewItemChecked() - - if (MainApp.isOnlyOnDevice()) { - setupToolbar() - } else { - setupHomeSearchToolbarWithSortAndListButtons() + val item = ToolbarItem.fromNavId(menuItemId) + when (item?.style) { + ToolbarStyle.SEARCH -> setupHomeSearchToolbarWithSortAndListButtons() + ToolbarStyle.PLAIN -> { + if (currentDir?.isRootDirectory == true) { + updateActionBarTitleAndHomeButtonByString(getString(item.titleId)) + } else { + setupToolbar() + } + } + else -> { + setupToolbar() + } } } 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 351816c7652c..6397a1d9968a 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 @@ -134,10 +134,18 @@ public void setupToolbarShowOnlyMenuButtonAndTitle(String title, View.OnClickLis } public void setupToolbar() { + if (mHomeSearchToolbar != null && mDefaultToolbar != null && mHomeSearchToolbar.getVisibility() == View.GONE && mDefaultToolbar.getVisibility() == View.VISIBLE) { + return; + } + setupToolbar(false, false); } public void setupHomeSearchToolbarWithSortAndListButtons() { + if (mHomeSearchToolbar != null && mDefaultToolbar != null && mHomeSearchToolbar.getVisibility() == View.VISIBLE && mDefaultToolbar.getVisibility() == View.GONE) { + return; + } + setupToolbar(true, true); } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt index 64fdebbffdc5..6089e78466cf 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt @@ -34,6 +34,7 @@ import com.nextcloud.client.core.AsyncRunner import com.nextcloud.client.di.Injectable import com.nextcloud.client.di.ViewModelFactory import com.nextcloud.client.network.ClientFactory +import com.nextcloud.utils.extensions.typedActivity import com.owncloud.android.R import com.owncloud.android.databinding.ListFragmentBinding import com.owncloud.android.datamodel.FileDataStorageManager @@ -142,7 +143,6 @@ class UnifiedSearchFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setupFileDisplayActivity() setupAdapter() if (supportsOpeningCalendarContactsLocally()) { checkPermissions() @@ -337,8 +337,10 @@ class UnifiedSearchFragment : } } - private fun setupFileDisplayActivity() { - (activity as? FileDisplayActivity)?.run { + override fun onResume() { + super.onResume() + typedActivity()?.run { + setupToolbar() setMainFabVisible(false) updateActionBarTitleAndHomeButtonByString(null) } From 29a8ec164abc8cf07e08049ab6194d8cf4e8fd11 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 3 Sep 2025 13:56:36 +0200 Subject: [PATCH 2/3] chore: add comment for setup toolbar Signed-off-by: alperozturk --- .../com/owncloud/android/ui/activity/ToolbarActivity.java | 4 ++++ 1 file changed, 4 insertions(+) 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 6397a1d9968a..a4fdbf7e73c6 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 @@ -35,6 +35,7 @@ import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.utils.theme.ThemeColorUtils; import com.owncloud.android.utils.theme.ThemeUtils; import com.owncloud.android.utils.theme.ViewThemeUtils; @@ -66,6 +67,7 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable private TextView mInfoBoxMessage; protected AppCompatSpinner mToolbarSpinner; private boolean isHomeSearchToolbarShow = false; + private static final String TAG = "ToolbarActivity"; @Inject public ThemeColorUtils themeColorUtils; @Inject public ThemeUtils themeUtils; @@ -135,6 +137,7 @@ public void setupToolbarShowOnlyMenuButtonAndTitle(String title, View.OnClickLis public void setupToolbar() { if (mHomeSearchToolbar != null && mDefaultToolbar != null && mHomeSearchToolbar.getVisibility() == View.GONE && mDefaultToolbar.getVisibility() == View.VISIBLE) { + Log_OC.d(TAG, "Search toolbar already not visible, skipping to change toolbar"); return; } @@ -143,6 +146,7 @@ public void setupToolbar() { public void setupHomeSearchToolbarWithSortAndListButtons() { if (mHomeSearchToolbar != null && mDefaultToolbar != null && mHomeSearchToolbar.getVisibility() == View.VISIBLE && mDefaultToolbar.getVisibility() == View.GONE) { + Log_OC.d(TAG, "Search toolbar already visible, skipping to change toolbar"); return; } From 8d5783900b5333e59739e9a0b80d096fff2ec95e Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 3 Sep 2025 13:57:13 +0200 Subject: [PATCH 3/3] chore: add comment for setup toolbar Signed-off-by: alperozturk --- .../com/owncloud/android/ui/activity/ToolbarActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 a4fdbf7e73c6..73d51485b9d4 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 @@ -137,7 +137,7 @@ public void setupToolbarShowOnlyMenuButtonAndTitle(String title, View.OnClickLis public void setupToolbar() { if (mHomeSearchToolbar != null && mDefaultToolbar != null && mHomeSearchToolbar.getVisibility() == View.GONE && mDefaultToolbar.getVisibility() == View.VISIBLE) { - Log_OC.d(TAG, "Search toolbar already not visible, skipping to change toolbar"); + Log_OC.d(TAG, "Search toolbar is already hidden, skipping update."); return; } @@ -146,7 +146,7 @@ public void setupToolbar() { public void setupHomeSearchToolbarWithSortAndListButtons() { if (mHomeSearchToolbar != null && mDefaultToolbar != null && mHomeSearchToolbar.getVisibility() == View.VISIBLE && mDefaultToolbar.getVisibility() == View.GONE) { - Log_OC.d(TAG, "Search toolbar already visible, skipping to change toolbar"); + Log_OC.d(TAG, "Search toolbar is already visible, skipping update."); return; }