From 27edad846aefecd9aa19aa3e9e4b282d4d0ac593 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Tue, 28 Mar 2023 12:57:04 +0200 Subject: [PATCH 1/6] Show "(read only)" in open with when file has no write permission, and send it to external apps without writing permission --- .../android/extensions/ActivityExt.kt | 10 ++++++---- .../android/files/FileMenuFilter.java | 9 ++++++++- .../files/details/FileDetailsFragment.kt | 3 ++- .../files/filelist/MainFileListFragment.kt | 2 ++ .../ui/helpers/FileOperationsHelper.java | 20 +++++++++++++------ .../ui/preview/PreviewAudioFragment.kt | 3 ++- .../ui/preview/PreviewImageFragment.kt | 9 ++++++++- .../ui/preview/PreviewTextFragment.java | 2 +- .../ui/preview/PreviewVideoFragment.java | 2 +- .../src/main/res/menu/file_actions_menu.xml | 4 ++-- owncloudApp/src/main/res/values/strings.xml | 1 + .../android/domain/files/model/OCFile.kt | 6 ++++++ 12 files changed, 53 insertions(+), 18 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt b/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt index 1d6ad69fe2a..e5171ef72a3 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt @@ -57,7 +57,6 @@ import com.owncloud.android.presentation.settings.security.SettingsSecurityFragm import com.owncloud.android.ui.activity.FileDisplayActivity.Companion.ALL_FILES_SAF_REGEX import com.owncloud.android.ui.dialog.ShareLinkToDialog import com.owncloud.android.utils.MimetypeIconUtil -import com.owncloud.android.utils.UriUtilsKt import com.owncloud.android.utils.UriUtilsKt.getExposedFileUriForOCFile import timber.log.Timber import java.io.File @@ -374,10 +373,10 @@ fun FragmentActivity.sendDownloadedFilesByShareSheet(ocFiles: List) { val sendIntent = if (ocFiles.size == 1) { Intent(Intent.ACTION_SEND).apply { type = ocFiles.first().mimeType - putExtra(Intent.EXTRA_STREAM, UriUtilsKt.getExposedFileUriForOCFile(this@sendDownloadedFilesByShareSheet, ocFiles.first())) + putExtra(Intent.EXTRA_STREAM, getExposedFileUriForOCFile(this@sendDownloadedFilesByShareSheet, ocFiles.first())) } } else { - val fileUris = ocFiles.map { UriUtilsKt.getExposedFileUriForOCFile(this@sendDownloadedFilesByShareSheet, it) } + val fileUris = ocFiles.map { getExposedFileUriForOCFile(this@sendDownloadedFilesByShareSheet, it) } Intent(Intent.ACTION_SEND_MULTIPLE).apply { type = ALL_FILES_SAF_REGEX putParcelableArrayListExtra(Intent.EXTRA_STREAM, ArrayList(fileUris)) @@ -402,7 +401,10 @@ fun FragmentActivity.sendDownloadedFilesByShareSheet(ocFiles: List) { fun Activity.openOCFile(ocFile: OCFile) { val intentForSavedMimeType = Intent(Intent.ACTION_VIEW).apply { setDataAndType(getExposedFileUriForOCFile(this@openOCFile, ocFile), ocFile.mimeType) - flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + flags = Intent.FLAG_GRANT_READ_URI_PERMISSION + if (ocFile.hasWritePermission) { + flags = flags or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + } } try { diff --git a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 3b160c9dd4d..8efa9e4b07e 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -117,7 +117,7 @@ public FileMenuFilter(List targetFiles, Account account, ComponentsGette * @param menu Options or context menu to filter. */ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInverse, - boolean onlyAvailableOffline, boolean sharedByLinkFiles) { + boolean onlyAvailableOffline, boolean sharedByLinkFiles, boolean hasWritePermission) { if (mFiles == null || mFiles.size() <= 0) { hideAll(menu); @@ -133,6 +133,13 @@ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInv if (item != null) { item.setVisible(true); item.setEnabled(true); + if (i == R.id.action_open_file_with) { + if (!hasWritePermission) { + item.setTitle(R.string.actionbar_open_with_read_only); + } else { + item.setTitle(R.string.actionbar_open_with); + } + } } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt index 8fb1246a59b..0079f7f254f 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt @@ -207,7 +207,8 @@ class FileDetailsFragment : FileFragment() { false, false, false, - false + false, + fileDetailsViewModel.getCurrentFile()?.hasWritePermission == true, ) menu.findItem(R.id.action_see_details)?.apply { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt index 2086eb73e0f..b233b15e619 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt @@ -748,12 +748,14 @@ class MainFileListFragment : Fragment(), checkedFilesSync ) + val hasWritePermission = if (checkedCount == 1) checkedFiles.first().hasWritePermission else false fileMenuFilter.filter( menu, checkedCount != fileListAdapter.itemCount - 1, // -1 because one of them is the footer :S true, mainFileListViewModel.fileListOption.value.isAvailableOffline(), mainFileListViewModel.fileListOption.value.isSharedByLink(), + hasWritePermission ) return true diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/owncloudApp/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 45ee51ad9b6..1966aab4c14 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -64,14 +64,18 @@ public FileOperationsHelper(FileActivity fileActivity) { mFileActivity = fileActivity; } - private Intent getIntentForSavedMimeType(Uri data, String type) { + private Intent getIntentForSavedMimeType(Uri data, String type, boolean hasWritePermission) { Intent intentForSavedMimeType = new Intent(Intent.ACTION_VIEW); intentForSavedMimeType.setDataAndType(data, type); - intentForSavedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION; + if (hasWritePermission) { + flags = flags | Intent.FLAG_GRANT_WRITE_URI_PERMISSION; + } + intentForSavedMimeType.setFlags(flags); return intentForSavedMimeType; } - private Intent getIntentForGuessedMimeType(String storagePath, String type, Uri data) { + private Intent getIntentForGuessedMimeType(String storagePath, String type, Uri data, boolean hasWritePermission) { Intent intentForGuessedMimeType = null; if (storagePath != null && storagePath.lastIndexOf('.') >= 0) { @@ -80,7 +84,11 @@ private Intent getIntentForGuessedMimeType(String storagePath, String type, Uri if (guessedMimeType != null && !guessedMimeType.equals(type)) { intentForGuessedMimeType = new Intent(Intent.ACTION_VIEW); intentForGuessedMimeType.setDataAndType(data, guessedMimeType); - intentForGuessedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION; + if (hasWritePermission) { + flags = flags | Intent.FLAG_GRANT_WRITE_URI_PERMISSION; + } + intentForGuessedMimeType.setFlags(flags); } } return intentForGuessedMimeType; @@ -89,10 +97,10 @@ private Intent getIntentForGuessedMimeType(String storagePath, String type, Uri public void openFile(OCFile ocFile) { if (ocFile != null) { Intent intentForSavedMimeType = getIntentForSavedMimeType(UriUtilsKt.INSTANCE.getExposedFileUriForOCFile(mFileActivity, ocFile), - ocFile.getMimeType()); + ocFile.getMimeType(), ocFile.getHasWritePermission()); Intent intentForGuessedMimeType = getIntentForGuessedMimeType(ocFile.getStoragePath(), ocFile.getMimeType(), - UriUtilsKt.INSTANCE.getExposedFileUriForOCFile(mFileActivity, ocFile)); + UriUtilsKt.INSTANCE.getExposedFileUriForOCFile(mFileActivity, ocFile), ocFile.getHasWritePermission()); openFileWithIntent(intentForSavedMimeType, intentForGuessedMimeType); diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index 4bd6c735805..c9c1f9585d1 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -245,7 +245,8 @@ class PreviewAudioFragment : FileFragment() { false, false, false, - false + false, + file.hasWritePermission, ) // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index 011d8aa655e..4760d9611f2 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -199,7 +199,14 @@ class PreviewImageFragment : FileFragment() { mContainerActivity, activity ) - fileMenuFilter.filter(menu, false, false, false, false) + fileMenuFilter.filter( + menu, + false, + false, + false, + false, + file.hasWritePermission, + ) } // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index f1bdb632216..d1a36d9f012 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -313,7 +313,7 @@ public void onPrepareOptionsMenu(Menu menu) { mContainerActivity, getActivity() ); - mf.filter(menu, false, false, false, false); + mf.filter(menu, false, false, false, false, getFile().getHasWritePermission()); } // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java index 0b8eea33302..7cb12be4397 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java @@ -313,7 +313,7 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) { mContainerActivity, getActivity() ); - mf.filter(menu, false, false, false, false); + mf.filter(menu, false, false, false, false, getFile().getHasWritePermission()); // additional restrictions for this fragment diff --git a/owncloudApp/src/main/res/menu/file_actions_menu.xml b/owncloudApp/src/main/res/menu/file_actions_menu.xml index f4b14c5bbdd..679cc5976c2 100644 --- a/owncloudApp/src/main/res/menu/file_actions_menu.xml +++ b/owncloudApp/src/main/res/menu/file_actions_menu.xml @@ -92,13 +92,13 @@ android:id="@+id/action_move" android:title="@string/actionbar_move" android:icon="@drawable/ic_action_move" - app:showAsAction="ifRoom" + app:showAsAction="never" android:orderInCategory="1" /> Content from other apps Files Open with + Open with (read only) New folder Settings Details diff --git a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt index 824acef3462..7afac33170b 100644 --- a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt +++ b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt @@ -105,6 +105,12 @@ data class OCFile( val isText: Boolean get() = isOfType(MIME_PREFIX_TEXT) + /** + * @return 'True' if the file has the 'W' (can write) within its group of permissions + */ + val hasWritePermission: Boolean + get() = permissions?.contains(char = 'W', ignoreCase = true) ?: false + /** * @return 'True' if the file has the 'C' (can add file) within its group of permissions */ From c51e4faac828fc07fe59dc193fbe4dc93607284d Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Wed, 29 Mar 2023 10:54:40 +0200 Subject: [PATCH 2/6] Hide remove option when a file or folder has no remove permission --- .../com/owncloud/android/files/FileMenuFilter.java | 12 +++++++----- .../files/details/FileDetailsFragment.kt | 1 + .../files/filelist/MainFileListFragment.kt | 5 ++++- .../android/ui/preview/PreviewAudioFragment.kt | 1 + .../android/ui/preview/PreviewImageFragment.kt | 1 + .../android/ui/preview/PreviewTextFragment.java | 3 ++- .../android/ui/preview/PreviewVideoFragment.java | 3 ++- .../owncloud/android/domain/files/model/OCFile.kt | 6 ++++++ 8 files changed, 24 insertions(+), 8 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 8efa9e4b07e..b2a6d8fef04 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -117,7 +117,8 @@ public FileMenuFilter(List targetFiles, Account account, ComponentsGette * @param menu Options or context menu to filter. */ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInverse, - boolean onlyAvailableOffline, boolean sharedByLinkFiles, boolean hasWritePermission) { + boolean onlyAvailableOffline, boolean sharedByLinkFiles, boolean hasWritePermission, + boolean hasDeletePermission) { if (mFiles == null || mFiles.size() <= 0) { hideAll(menu); @@ -125,7 +126,8 @@ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInv List toShow = new ArrayList<>(); List toHide = new ArrayList<>(); - filter(toShow, toHide, displaySelectAll, displaySelectInverse, onlyAvailableOffline, sharedByLinkFiles); + filter(toShow, toHide, displaySelectAll, displaySelectInverse, onlyAvailableOffline, sharedByLinkFiles, + hasDeletePermission); MenuItem item; for (int i : toShow) { @@ -172,7 +174,8 @@ private void hideAll(Menu menu) { */ private void filter(List toShow, List toHide, boolean displaySelectAll, - boolean displaySelectInverse, boolean onlyAvailableOffline, boolean sharedByLinkFiles) { + boolean displaySelectInverse, boolean onlyAvailableOffline, boolean sharedByLinkFiles, + boolean hasDeletePermission) { boolean synchronizing; if (mFilesSync.isEmpty()) { @@ -226,9 +229,8 @@ private void filter(List toShow, List toHide, boolean displayS } // REMOVE - if (mFiles.isEmpty() || synchronizing || onlyAvailableOffline || sharedByLinkFiles) { + if (mFiles.isEmpty() || synchronizing || onlyAvailableOffline || sharedByLinkFiles || !hasDeletePermission) { toHide.add(R.id.action_remove_file); - } else { toShow.add(R.id.action_remove_file); } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt index 0079f7f254f..f570057e8e8 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt @@ -209,6 +209,7 @@ class FileDetailsFragment : FileFragment() { false, false, fileDetailsViewModel.getCurrentFile()?.hasWritePermission == true, + fileDetailsViewModel.getCurrentFile()?.hasDeletePermission == true, ) menu.findItem(R.id.action_see_details)?.apply { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt index b233b15e619..681cc17d62f 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt @@ -749,13 +749,16 @@ class MainFileListFragment : Fragment(), ) val hasWritePermission = if (checkedCount == 1) checkedFiles.first().hasWritePermission else false + val hasDeletePermission = checkedFiles.all { it.hasDeletePermission } + fileMenuFilter.filter( menu, checkedCount != fileListAdapter.itemCount - 1, // -1 because one of them is the footer :S true, mainFileListViewModel.fileListOption.value.isAvailableOffline(), mainFileListViewModel.fileListOption.value.isSharedByLink(), - hasWritePermission + hasWritePermission, + hasDeletePermission, ) return true diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index c9c1f9585d1..b2f4f6a1731 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -247,6 +247,7 @@ class PreviewAudioFragment : FileFragment() { false, false, file.hasWritePermission, + file.hasDeletePermission, ) // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index 4760d9611f2..5a69beb8c02 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -206,6 +206,7 @@ class PreviewImageFragment : FileFragment() { false, false, file.hasWritePermission, + file.hasDeletePermission, ) } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index d1a36d9f012..7b0ffb2e50f 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -313,7 +313,8 @@ public void onPrepareOptionsMenu(Menu menu) { mContainerActivity, getActivity() ); - mf.filter(menu, false, false, false, false, getFile().getHasWritePermission()); + mf.filter(menu, false, false, false, + false, getFile().getHasWritePermission(), getFile().getHasDeletePermission()); } // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java index 7cb12be4397..20f40205b22 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java @@ -313,7 +313,8 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) { mContainerActivity, getActivity() ); - mf.filter(menu, false, false, false, false, getFile().getHasWritePermission()); + mf.filter(menu, false, false, false, + false, getFile().getHasWritePermission(), getFile().getHasDeletePermission()); // additional restrictions for this fragment diff --git a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt index 7afac33170b..f063a534a08 100644 --- a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt +++ b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt @@ -111,6 +111,12 @@ data class OCFile( val hasWritePermission: Boolean get() = permissions?.contains(char = 'W', ignoreCase = true) ?: false + /** + * @return 'True' if the file has the 'D' (can delete) within its group of permissions + */ + val hasDeletePermission: Boolean + get() = permissions?.contains(char = 'D', ignoreCase = true) ?: false + /** * @return 'True' if the file has the 'C' (can add file) within its group of permissions */ From 27d1cfdf4d7f3e4016b6db591cc8626690a2c46b Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Wed, 29 Mar 2023 11:43:32 +0200 Subject: [PATCH 3/6] Hide rename option when a file or folder has no rename permission --- .../java/com/owncloud/android/files/FileMenuFilter.java | 9 ++++----- .../presentation/files/details/FileDetailsFragment.kt | 1 + .../presentation/files/filelist/MainFileListFragment.kt | 2 ++ .../owncloud/android/ui/preview/PreviewAudioFragment.kt | 1 + .../owncloud/android/ui/preview/PreviewImageFragment.kt | 1 + .../owncloud/android/ui/preview/PreviewTextFragment.java | 3 ++- .../android/ui/preview/PreviewVideoFragment.java | 3 ++- .../com/owncloud/android/domain/files/model/OCFile.kt | 6 ++++++ 8 files changed, 19 insertions(+), 7 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java index b2a6d8fef04..06bcd9cfdf4 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -118,7 +118,7 @@ public FileMenuFilter(List targetFiles, Account account, ComponentsGette */ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInverse, boolean onlyAvailableOffline, boolean sharedByLinkFiles, boolean hasWritePermission, - boolean hasDeletePermission) { + boolean hasDeletePermission, boolean hasRenamePermission) { if (mFiles == null || mFiles.size() <= 0) { hideAll(menu); @@ -127,7 +127,7 @@ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInv List toHide = new ArrayList<>(); filter(toShow, toHide, displaySelectAll, displaySelectInverse, onlyAvailableOffline, sharedByLinkFiles, - hasDeletePermission); + hasDeletePermission, hasRenamePermission); MenuItem item; for (int i : toShow) { @@ -175,7 +175,7 @@ private void hideAll(Menu menu) { private void filter(List toShow, List toHide, boolean displaySelectAll, boolean displaySelectInverse, boolean onlyAvailableOffline, boolean sharedByLinkFiles, - boolean hasDeletePermission) { + boolean hasDeletePermission, boolean hasRenamePermission) { boolean synchronizing; if (mFilesSync.isEmpty()) { @@ -211,9 +211,8 @@ private void filter(List toShow, List toHide, boolean displayS } // RENAME - if (!isSingleSelection() || synchronizing || videoPreviewing || onlyAvailableOffline || sharedByLinkFiles) { + if (!isSingleSelection() || synchronizing || videoPreviewing || onlyAvailableOffline || sharedByLinkFiles || !hasRenamePermission) { toHide.add(R.id.action_rename_file); - } else { toShow.add(R.id.action_rename_file); } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt index f570057e8e8..3db2330e789 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt @@ -210,6 +210,7 @@ class FileDetailsFragment : FileFragment() { false, fileDetailsViewModel.getCurrentFile()?.hasWritePermission == true, fileDetailsViewModel.getCurrentFile()?.hasDeletePermission == true, + fileDetailsViewModel.getCurrentFile()?.hasRenamePermission == true, ) menu.findItem(R.id.action_see_details)?.apply { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt index 681cc17d62f..a83d6b2a629 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt @@ -750,6 +750,7 @@ class MainFileListFragment : Fragment(), val hasWritePermission = if (checkedCount == 1) checkedFiles.first().hasWritePermission else false val hasDeletePermission = checkedFiles.all { it.hasDeletePermission } + val hasRenamePermission = if (checkedCount == 1) checkedFiles.first().hasRenamePermission else false fileMenuFilter.filter( menu, @@ -759,6 +760,7 @@ class MainFileListFragment : Fragment(), mainFileListViewModel.fileListOption.value.isSharedByLink(), hasWritePermission, hasDeletePermission, + hasRenamePermission, ) return true diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index b2f4f6a1731..24e1ae9bedd 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -248,6 +248,7 @@ class PreviewAudioFragment : FileFragment() { false, file.hasWritePermission, file.hasDeletePermission, + file.hasRenamePermission ) // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index 5a69beb8c02..d0862d2020c 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -207,6 +207,7 @@ class PreviewImageFragment : FileFragment() { false, file.hasWritePermission, file.hasDeletePermission, + file.hasRenamePermission, ) } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index 7b0ffb2e50f..400265e5021 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -314,7 +314,8 @@ public void onPrepareOptionsMenu(Menu menu) { getActivity() ); mf.filter(menu, false, false, false, - false, getFile().getHasWritePermission(), getFile().getHasDeletePermission()); + false, getFile().getHasWritePermission(), getFile().getHasDeletePermission(), + getFile().getHasRenamePermission()); } // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java index 20f40205b22..6568706a45d 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java @@ -314,7 +314,8 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) { getActivity() ); mf.filter(menu, false, false, false, - false, getFile().getHasWritePermission(), getFile().getHasDeletePermission()); + false, getFile().getHasWritePermission(), getFile().getHasDeletePermission(), + getFile().getHasRenamePermission()); // additional restrictions for this fragment diff --git a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt index f063a534a08..ef1443d25da 100644 --- a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt +++ b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt @@ -117,6 +117,12 @@ data class OCFile( val hasDeletePermission: Boolean get() = permissions?.contains(char = 'D', ignoreCase = true) ?: false + /** + * @return 'True' if the file has the 'N' (can rename) within its group of permissions + */ + val hasRenamePermission: Boolean + get() = permissions?.contains(char = 'N', ignoreCase = true) ?: false + /** * @return 'True' if the file has the 'C' (can add file) within its group of permissions */ From dafe03020c1015cd8a6640b99e68cec8ff014ce2 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Wed, 29 Mar 2023 11:54:08 +0200 Subject: [PATCH 4/6] Hide move option when a file or folder has no move permission --- .../owncloud/android/files/FileMenuFilter.java | 18 +++++++++++------- .../files/details/FileDetailsFragment.kt | 1 + .../files/filelist/MainFileListFragment.kt | 2 ++ .../android/ui/preview/PreviewAudioFragment.kt | 3 ++- .../android/ui/preview/PreviewImageFragment.kt | 1 + .../ui/preview/PreviewTextFragment.java | 2 +- .../ui/preview/PreviewVideoFragment.java | 2 +- .../android/domain/files/model/OCFile.kt | 6 ++++++ 8 files changed, 25 insertions(+), 10 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 06bcd9cfdf4..6fbff582fc1 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -118,7 +118,7 @@ public FileMenuFilter(List targetFiles, Account account, ComponentsGette */ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInverse, boolean onlyAvailableOffline, boolean sharedByLinkFiles, boolean hasWritePermission, - boolean hasDeletePermission, boolean hasRenamePermission) { + boolean hasDeletePermission, boolean hasRenamePermission, boolean hasMovePermission) { if (mFiles == null || mFiles.size() <= 0) { hideAll(menu); @@ -127,7 +127,7 @@ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInv List toHide = new ArrayList<>(); filter(toShow, toHide, displaySelectAll, displaySelectInverse, onlyAvailableOffline, sharedByLinkFiles, - hasDeletePermission, hasRenamePermission); + hasDeletePermission, hasRenamePermission, hasMovePermission); MenuItem item; for (int i : toShow) { @@ -175,7 +175,7 @@ private void hideAll(Menu menu) { private void filter(List toShow, List toHide, boolean displaySelectAll, boolean displaySelectInverse, boolean onlyAvailableOffline, boolean sharedByLinkFiles, - boolean hasDeletePermission, boolean hasRenamePermission) { + boolean hasDeletePermission, boolean hasRenamePermission, boolean hasMovePermission) { boolean synchronizing; if (mFilesSync.isEmpty()) { @@ -217,13 +217,17 @@ private void filter(List toShow, List toHide, boolean displayS toShow.add(R.id.action_rename_file); } - // MOVE & COPY - if (mFiles.isEmpty() || synchronizing || videoPreviewing || onlyAvailableOffline || sharedByLinkFiles) { + // MOVE + if (mFiles.isEmpty() || synchronizing || videoPreviewing || onlyAvailableOffline || sharedByLinkFiles || !hasMovePermission) { toHide.add(R.id.action_move); - toHide.add(R.id.action_copy); - } else { toShow.add(R.id.action_move); + } + + // COPY + if (mFiles.isEmpty() || synchronizing || videoPreviewing || onlyAvailableOffline || sharedByLinkFiles) { + toHide.add(R.id.action_copy); + } else { toShow.add(R.id.action_copy); } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt index 3db2330e789..3276f94de83 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt @@ -211,6 +211,7 @@ class FileDetailsFragment : FileFragment() { fileDetailsViewModel.getCurrentFile()?.hasWritePermission == true, fileDetailsViewModel.getCurrentFile()?.hasDeletePermission == true, fileDetailsViewModel.getCurrentFile()?.hasRenamePermission == true, + false, ) menu.findItem(R.id.action_see_details)?.apply { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt index a83d6b2a629..abdd8e26518 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt @@ -751,6 +751,7 @@ class MainFileListFragment : Fragment(), val hasWritePermission = if (checkedCount == 1) checkedFiles.first().hasWritePermission else false val hasDeletePermission = checkedFiles.all { it.hasDeletePermission } val hasRenamePermission = if (checkedCount == 1) checkedFiles.first().hasRenamePermission else false + val hasMovePermission = checkedFiles.all { it.hasMovePermission } fileMenuFilter.filter( menu, @@ -761,6 +762,7 @@ class MainFileListFragment : Fragment(), hasWritePermission, hasDeletePermission, hasRenamePermission, + hasMovePermission, ) return true diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index 24e1ae9bedd..680b21a8428 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -248,7 +248,8 @@ class PreviewAudioFragment : FileFragment() { false, file.hasWritePermission, file.hasDeletePermission, - file.hasRenamePermission + file.hasRenamePermission, + false ) // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index d0862d2020c..85a6345ab81 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -208,6 +208,7 @@ class PreviewImageFragment : FileFragment() { file.hasWritePermission, file.hasDeletePermission, file.hasRenamePermission, + false, ) } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index 400265e5021..fce6c828913 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -315,7 +315,7 @@ public void onPrepareOptionsMenu(Menu menu) { ); mf.filter(menu, false, false, false, false, getFile().getHasWritePermission(), getFile().getHasDeletePermission(), - getFile().getHasRenamePermission()); + getFile().getHasRenamePermission(), false); } // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java index 6568706a45d..7c00cca8837 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java @@ -315,7 +315,7 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) { ); mf.filter(menu, false, false, false, false, getFile().getHasWritePermission(), getFile().getHasDeletePermission(), - getFile().getHasRenamePermission()); + getFile().getHasRenamePermission(), false); // additional restrictions for this fragment diff --git a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt index ef1443d25da..f02cd2ff972 100644 --- a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt +++ b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt @@ -123,6 +123,12 @@ data class OCFile( val hasRenamePermission: Boolean get() = permissions?.contains(char = 'N', ignoreCase = true) ?: false + /** + * @return 'True' if the file has the 'V' (can move) within its group of permissions + */ + val hasMovePermission: Boolean + get() = permissions?.contains(char = 'V', ignoreCase = true) ?: false + /** * @return 'True' if the file has the 'C' (can add file) within its group of permissions */ From a827f5b82839659749c0a563a50b11a12b773e45 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Wed, 29 Mar 2023 12:12:32 +0200 Subject: [PATCH 5/6] Hide share option when a file or folder has no reshare permission --- .../com/owncloud/android/files/FileMenuFilter.java | 10 ++++++---- .../presentation/files/details/FileDetailsFragment.kt | 1 + .../files/filelist/MainFileListFragment.kt | 2 ++ .../android/ui/preview/PreviewAudioFragment.kt | 3 ++- .../android/ui/preview/PreviewImageFragment.kt | 1 + .../android/ui/preview/PreviewTextFragment.java | 2 +- .../android/ui/preview/PreviewVideoFragment.java | 2 +- .../com/owncloud/android/domain/files/model/OCFile.kt | 6 ++++++ 8 files changed, 20 insertions(+), 7 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 6fbff582fc1..d7429c8a46e 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -118,7 +118,8 @@ public FileMenuFilter(List targetFiles, Account account, ComponentsGette */ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInverse, boolean onlyAvailableOffline, boolean sharedByLinkFiles, boolean hasWritePermission, - boolean hasDeletePermission, boolean hasRenamePermission, boolean hasMovePermission) { + boolean hasDeletePermission, boolean hasRenamePermission, boolean hasMovePermission, + boolean hasResharePermission) { if (mFiles == null || mFiles.size() <= 0) { hideAll(menu); @@ -127,7 +128,7 @@ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInv List toHide = new ArrayList<>(); filter(toShow, toHide, displaySelectAll, displaySelectInverse, onlyAvailableOffline, sharedByLinkFiles, - hasDeletePermission, hasRenamePermission, hasMovePermission); + hasDeletePermission, hasRenamePermission, hasMovePermission, hasResharePermission); MenuItem item; for (int i : toShow) { @@ -175,7 +176,8 @@ private void hideAll(Menu menu) { private void filter(List toShow, List toHide, boolean displaySelectAll, boolean displaySelectInverse, boolean onlyAvailableOffline, boolean sharedByLinkFiles, - boolean hasDeletePermission, boolean hasRenamePermission, boolean hasMovePermission) { + boolean hasDeletePermission, boolean hasRenamePermission, boolean hasMovePermission, + boolean hasResharePermission) { boolean synchronizing; if (mFilesSync.isEmpty()) { @@ -276,7 +278,7 @@ private void filter(List toShow, List toHide, boolean displayS boolean notPersonalSpace = space != null && !space.isPersonal(); if ((!shareViaLinkAllowed && !shareWithUsersAllowed) || !isSingleSelection() || - notAllowResharing || onlyAvailableOffline || notPersonalSpace) { + notAllowResharing || onlyAvailableOffline || notPersonalSpace || !hasResharePermission) { toHide.add(R.id.action_share_file); } else { toShow.add(R.id.action_share_file); diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt index 3276f94de83..5c4ccb21844 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt @@ -212,6 +212,7 @@ class FileDetailsFragment : FileFragment() { fileDetailsViewModel.getCurrentFile()?.hasDeletePermission == true, fileDetailsViewModel.getCurrentFile()?.hasRenamePermission == true, false, + fileDetailsViewModel.getCurrentFile()?.hasResharePermission == true, ) menu.findItem(R.id.action_see_details)?.apply { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt index abdd8e26518..33133ae1bae 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt @@ -752,6 +752,7 @@ class MainFileListFragment : Fragment(), val hasDeletePermission = checkedFiles.all { it.hasDeletePermission } val hasRenamePermission = if (checkedCount == 1) checkedFiles.first().hasRenamePermission else false val hasMovePermission = checkedFiles.all { it.hasMovePermission } + val hasResharePermission = if (checkedCount == 1) checkedFiles.first().hasResharePermission else false fileMenuFilter.filter( menu, @@ -763,6 +764,7 @@ class MainFileListFragment : Fragment(), hasDeletePermission, hasRenamePermission, hasMovePermission, + hasResharePermission, ) return true diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index 680b21a8428..10f17b57b8c 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -249,7 +249,8 @@ class PreviewAudioFragment : FileFragment() { file.hasWritePermission, file.hasDeletePermission, file.hasRenamePermission, - false + false, + file.hasResharePermission, ) // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index 85a6345ab81..bb2a825c741 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -209,6 +209,7 @@ class PreviewImageFragment : FileFragment() { file.hasDeletePermission, file.hasRenamePermission, false, + file.hasResharePermission, ) } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index fce6c828913..a1efc336f89 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -315,7 +315,7 @@ public void onPrepareOptionsMenu(Menu menu) { ); mf.filter(menu, false, false, false, false, getFile().getHasWritePermission(), getFile().getHasDeletePermission(), - getFile().getHasRenamePermission(), false); + getFile().getHasRenamePermission(), false, getFile().getHasResharePermission()); } // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java index 7c00cca8837..0025b5b1227 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java @@ -315,7 +315,7 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) { ); mf.filter(menu, false, false, false, false, getFile().getHasWritePermission(), getFile().getHasDeletePermission(), - getFile().getHasRenamePermission(), false); + getFile().getHasRenamePermission(), false, getFile().getHasResharePermission()); // additional restrictions for this fragment diff --git a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt index f02cd2ff972..ea0b035fbaf 100644 --- a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt +++ b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/model/OCFile.kt @@ -141,6 +141,12 @@ data class OCFile( val hasAddSubdirectoriesPermission: Boolean get() = permissions?.contains(char = 'K', ignoreCase = true) ?: false + /** + * @return 'True' if the file has the 'R' (can reshare) within its group of permissions + */ + val hasResharePermission: Boolean + get() = permissions?.contains(char = 'R', ignoreCase = true) ?: false + /** * get remote path of parent file * @return remote path From 277ede36e1ca9c0ed7bef0ef0027d525932a2ef9 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Fri, 31 Mar 2023 11:25:10 +0200 Subject: [PATCH 6/6] Access file and folder permissions directly from the filter --- .../android/files/FileMenuFilter.java | 33 ++++++++++++++----- .../files/details/FileDetailsFragment.kt | 5 --- .../files/filelist/MainFileListFragment.kt | 11 ------- .../ui/preview/PreviewAudioFragment.kt | 5 --- .../ui/preview/PreviewImageFragment.kt | 5 --- .../ui/preview/PreviewTextFragment.java | 10 ++++-- .../ui/preview/PreviewVideoFragment.java | 10 ++++-- 7 files changed, 38 insertions(+), 41 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java index d7429c8a46e..4f68f486475 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/owncloudApp/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -34,6 +34,7 @@ import androidx.fragment.app.FragmentActivity; import androidx.work.WorkInfo; import androidx.work.WorkManager; +import com.google.common.collect.Iterables; import com.owncloud.android.R; import com.owncloud.android.domain.availableoffline.model.AvailableOfflineStatus; import com.owncloud.android.domain.capabilities.model.OCCapability; @@ -117,19 +118,21 @@ public FileMenuFilter(List targetFiles, Account account, ComponentsGette * @param menu Options or context menu to filter. */ public void filter(Menu menu, boolean displaySelectAll, boolean displaySelectInverse, - boolean onlyAvailableOffline, boolean sharedByLinkFiles, boolean hasWritePermission, - boolean hasDeletePermission, boolean hasRenamePermission, boolean hasMovePermission, - boolean hasResharePermission) { + boolean onlyAvailableOffline, boolean sharedByLinkFiles) { if (mFiles == null || mFiles.size() <= 0) { hideAll(menu); - } else { List toShow = new ArrayList<>(); List toHide = new ArrayList<>(); - filter(toShow, toHide, displaySelectAll, displaySelectInverse, onlyAvailableOffline, sharedByLinkFiles, - hasDeletePermission, hasRenamePermission, hasMovePermission, hasResharePermission); + filter(toShow, toHide, displaySelectAll, displaySelectInverse, onlyAvailableOffline, sharedByLinkFiles); + boolean hasWritePermission; + if (mFiles.size() == 1) { + hasWritePermission = mFiles.get(0).getHasWritePermission(); + } else { + hasWritePermission = false; + } MenuItem item; for (int i : toShow) { item = menu.findItem(i); @@ -175,9 +178,7 @@ private void hideAll(Menu menu) { */ private void filter(List toShow, List toHide, boolean displaySelectAll, - boolean displaySelectInverse, boolean onlyAvailableOffline, boolean sharedByLinkFiles, - boolean hasDeletePermission, boolean hasRenamePermission, boolean hasMovePermission, - boolean hasResharePermission) { + boolean displaySelectInverse, boolean onlyAvailableOffline, boolean sharedByLinkFiles) { boolean synchronizing; if (mFilesSync.isEmpty()) { @@ -213,6 +214,12 @@ private void filter(List toShow, List toHide, boolean displayS } // RENAME + boolean hasRenamePermission; + if (mFiles.size() == 1) { + hasRenamePermission = mFiles.get(0).getHasRenamePermission(); + } else { + hasRenamePermission = false; + } if (!isSingleSelection() || synchronizing || videoPreviewing || onlyAvailableOffline || sharedByLinkFiles || !hasRenamePermission) { toHide.add(R.id.action_rename_file); } else { @@ -220,6 +227,7 @@ private void filter(List toShow, List toHide, boolean displayS } // MOVE + boolean hasMovePermission = Iterables.all(mFiles, OCFile::getHasMovePermission); if (mFiles.isEmpty() || synchronizing || videoPreviewing || onlyAvailableOffline || sharedByLinkFiles || !hasMovePermission) { toHide.add(R.id.action_move); } else { @@ -234,6 +242,7 @@ private void filter(List toShow, List toHide, boolean displayS } // REMOVE + boolean hasDeletePermission = Iterables.all(mFiles, OCFile::getHasDeletePermission); if (mFiles.isEmpty() || synchronizing || onlyAvailableOffline || sharedByLinkFiles || !hasDeletePermission) { toHide.add(R.id.action_remove_file); } else { @@ -277,6 +286,12 @@ private void filter(List toShow, List toHide, boolean displayS OCSpace space = mComponentsGetter.getStorageManager().getSpace(mFiles.get(0).getSpaceId(), mAccount.name); boolean notPersonalSpace = space != null && !space.isPersonal(); + boolean hasResharePermission; + if (mFiles.size() == 1) { + hasResharePermission = mFiles.get(0).getHasResharePermission(); + } else { + hasResharePermission = false; + } if ((!shareViaLinkAllowed && !shareWithUsersAllowed) || !isSingleSelection() || notAllowResharing || onlyAvailableOffline || notPersonalSpace || !hasResharePermission) { toHide.add(R.id.action_share_file); diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt index 5c4ccb21844..74ca99c089b 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt @@ -208,11 +208,6 @@ class FileDetailsFragment : FileFragment() { false, false, false, - fileDetailsViewModel.getCurrentFile()?.hasWritePermission == true, - fileDetailsViewModel.getCurrentFile()?.hasDeletePermission == true, - fileDetailsViewModel.getCurrentFile()?.hasRenamePermission == true, - false, - fileDetailsViewModel.getCurrentFile()?.hasResharePermission == true, ) menu.findItem(R.id.action_see_details)?.apply { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt index 33133ae1bae..2086eb73e0f 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt @@ -748,23 +748,12 @@ class MainFileListFragment : Fragment(), checkedFilesSync ) - val hasWritePermission = if (checkedCount == 1) checkedFiles.first().hasWritePermission else false - val hasDeletePermission = checkedFiles.all { it.hasDeletePermission } - val hasRenamePermission = if (checkedCount == 1) checkedFiles.first().hasRenamePermission else false - val hasMovePermission = checkedFiles.all { it.hasMovePermission } - val hasResharePermission = if (checkedCount == 1) checkedFiles.first().hasResharePermission else false - fileMenuFilter.filter( menu, checkedCount != fileListAdapter.itemCount - 1, // -1 because one of them is the footer :S true, mainFileListViewModel.fileListOption.value.isAvailableOffline(), mainFileListViewModel.fileListOption.value.isSharedByLink(), - hasWritePermission, - hasDeletePermission, - hasRenamePermission, - hasMovePermission, - hasResharePermission, ) return true diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt index 10f17b57b8c..b66389b4a49 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewAudioFragment.kt @@ -246,11 +246,6 @@ class PreviewAudioFragment : FileFragment() { false, false, false, - file.hasWritePermission, - file.hasDeletePermission, - file.hasRenamePermission, - false, - file.hasResharePermission, ) // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt index bb2a825c741..af6261fc507 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt @@ -205,11 +205,6 @@ class PreviewImageFragment : FileFragment() { false, false, false, - file.hasWritePermission, - file.hasDeletePermission, - file.hasRenamePermission, - false, - file.hasResharePermission, ) } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index a1efc336f89..3983a4f854f 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -313,9 +313,13 @@ public void onPrepareOptionsMenu(Menu menu) { mContainerActivity, getActivity() ); - mf.filter(menu, false, false, false, - false, getFile().getHasWritePermission(), getFile().getHasDeletePermission(), - getFile().getHasRenamePermission(), false, getFile().getHasResharePermission()); + mf.filter( + menu, + false, + false, + false, + false + ); } // additional restriction for this fragment diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java index 0025b5b1227..0c25c531017 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFragment.java @@ -313,9 +313,13 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) { mContainerActivity, getActivity() ); - mf.filter(menu, false, false, false, - false, getFile().getHasWritePermission(), getFile().getHasDeletePermission(), - getFile().getHasRenamePermission(), false, getFile().getHasResharePermission()); + mf.filter( + menu, + false, + false, + false, + false + ); // additional restrictions for this fragment