From 607f92b296bee554553b7a73f1ce7804a819bb04 Mon Sep 17 00:00:00 2001 From: Dev Date: Thu, 5 Nov 2026 13:20:03 +0530 Subject: [PATCH] feat(files): add recommendations visibility setting Signed-off-by: Dev Assisted-by: Codex:GPT-6 --- .../client/preferences/AppPreferences.java | 7 +++- .../preferences/AppPreferencesImpl.java | 11 ++++++ .../ui/activity/FileDisplayActivity.kt | 18 ++++++++- .../android/ui/activity/SettingsActivity.java | 10 +++++ .../ui/adapter/filelist/OCFileListAdapter.kt | 15 +++++++- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/preferences.xml | 4 ++ .../preferences/TestAppPreferences.java | 26 +++++++++++++ .../RecommendedFilesVisibilityTest.kt | 38 +++++++++++++++++++ 9 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 app/src/test/java/com/owncloud/android/ui/adapter/filelist/RecommendedFilesVisibilityTest.kt diff --git a/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java b/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java index 4f4e85599480..f097db726efd 100644 --- a/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java +++ b/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java @@ -64,10 +64,13 @@ default void onDarkThemeModeChanged(DarkMode mode) { boolean isShowHiddenFilesEnabled(); void setShowHiddenFilesEnabled(boolean enabled); - + + boolean isShowRecommendationsEnabled(); + void setShowRecommendationsEnabled(boolean enabled); + boolean isSortFoldersBeforeFiles(); void setSortFoldersBeforeFiles(boolean enabled); - + boolean isSortFavoritesFirst(); void setSortFavoritesFirst(boolean enabled); diff --git a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java index 07d50e6f48c1..18555fa390e2 100644 --- a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java +++ b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java @@ -72,6 +72,7 @@ public final class AppPreferencesImpl implements AppPreferences { private static final String PREF__INSTANT_UPLOADING = "instant_uploading"; private static final String PREF__INSTANT_VIDEO_UPLOADING = "instant_video_uploading"; private static final String PREF__SHOW_HIDDEN_FILES = "show_hidden_files_pref"; + private static final String PREF__SHOW_RECOMMENDATIONS = "show_recommendations_pref"; private static final String PREF__SORT_FOLDERS_BEFORE_FILES = "sort_folders_before_files"; private static final String PREF__SORT_FAVORITES_FIRST = "sort_favorites_first"; private static final String PREF__SHOW_ECOSYSTEM_APPS = "show_ecosystem_apps"; @@ -236,6 +237,16 @@ public void setShowHiddenFilesEnabled(boolean enabled) { preferences.edit().putBoolean(PREF__SHOW_HIDDEN_FILES, enabled).apply(); } + @Override + public boolean isShowRecommendationsEnabled() { + return preferences.getBoolean(PREF__SHOW_RECOMMENDATIONS, true); + } + + @Override + public void setShowRecommendationsEnabled(boolean enabled) { + preferences.edit().putBoolean(PREF__SHOW_RECOMMENDATIONS, enabled).apply(); + } + @Override public boolean isSortFoldersBeforeFiles() { return preferences.getBoolean(PREF__SORT_FOLDERS_BEFORE_FILES, true); 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 76c59ec251e5..2c5ecc977185 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 @@ -341,6 +341,7 @@ class FileDisplayActivity : if (SettingsActivity.isBackPressed) { Log_OC.d(TAG, "User returned from settings activity, skipping reset content logic") + updateRecommendationsVisibilityAfterSettings() return } @@ -1710,7 +1711,12 @@ class FileDisplayActivity : private fun fetchRecommendedFilesIfNeeded(ignoreETag: Boolean, folder: OCFile?) { val capability = capabilities.orElse(null) ?: return - if (folder?.isRootDirectory == false || capability.recommendations.isFalse) return + if (!preferences.isShowRecommendationsEnabled || + folder?.isRootDirectory == false || + capability.recommendations.isFalse + ) { + return + } val accountName = user.orElse(null)?.accountName ?: return val fileList = listOfFilesFragment @@ -1722,6 +1728,16 @@ class FileDisplayActivity : } } + private fun updateRecommendationsVisibilityAfterSettings() { + val fileList = listOfFilesFragment ?: return + val folder = fileList.currentFile ?: return + if (preferences.isShowRecommendationsEnabled) { + fetchRecommendedFilesIfNeeded(ignoreETag = false, folder = folder) + } else { + fileList.adapter?.updateRecommendedFiles(emptyList()) + } + } + private fun startMetadataSyncForRoot() { backgroundJobManager.startMetadataSyncJob(OCFile.ROOT_PATH, folderAlreadySynced = true) } 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 0b8c51755f78..493c7b1d3092 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 @@ -785,10 +785,20 @@ private void setupFilesCategory() { boolean fShowHiddenFilesEnabled = getResources().getBoolean(R.bool.show_hidden_files_enabled); setupHiddenFilesPreference(preferenceCategoryDetails, fShowHiddenFilesEnabled); + setupShowRecommendationsPreference(); setupFoldersBeforeFilesPreference(); setupSortFavoritesFirstPreference(); } + private void setupShowRecommendationsPreference() { + ThemeableSwitchPreference showRecommendations = + (ThemeableSwitchPreference) findPreference("show_recommendations_pref"); + showRecommendations.setOnPreferenceClickListener(preference -> { + preferences.setShowRecommendationsEnabled(showRecommendations.isChecked()); + return true; + }); + } + private void setupShowMediaScanNotifications(PreferenceCategory preferenceCategoryDetails, boolean fShowMediaScanNotifications) { ThemeableSwitchPreference mShowMediaScanNotifications = diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/filelist/OCFileListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/filelist/OCFileListAdapter.kt index ffc32e108c7b..e93c95f55036 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/filelist/OCFileListAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/filelist/OCFileListAdapter.kt @@ -654,8 +654,11 @@ class OCFileListAdapter( } } - private fun shouldShowRecommendedFiles(): Boolean = - recommendedFiles.isNotEmpty() && currentDirectory?.isRootDirectory == true + private fun shouldShowRecommendedFiles(): Boolean = shouldDisplayRecommendedFiles( + preferences.isShowRecommendationsEnabled, + recommendedFiles, + currentDirectory + ) private fun visibleRecommendedFilesAdapterFor(file: OCFile): RecommendedFilesAdapter? = recommendedFilesAdapter?.takeIf { shouldShowRecommendedFiles() && file.isRecommendedFile } @@ -674,3 +677,11 @@ class OCFileListAdapter( private const val FOOTER_ITEM_COUNT = 1 } } + +internal fun shouldDisplayRecommendedFiles( + showRecommendations: Boolean, + recommendations: List, + currentDirectory: OCFile? +): Boolean = showRecommendations && + recommendations.isNotEmpty() && + currentDirectory?.isRootDirectory == true diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 31901ff1e355..97bd26f2f2a1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -170,6 +170,7 @@ Device credentials enabled No device credentials have been set up. Show hidden files + Show recommendations Show app switcher Nextcloud app suggestions in navigation heading Show media scan notifications diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index aa73c18f2f11..af43fbb24e5a 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -40,6 +40,10 @@ +