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 1d6ad69fe2a4..e5171ef72a3b 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 3b160c9dd4da..8efa9e4b07e6 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 8fb1246a59ba..0079f7f254fd 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 2086eb73e0fe..b233b15e6191 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 45ee51ad9b6a..1966aab4c149 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 4bd6c735805c..c9c1f9585d1a 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 011d8aa655ef..4760d9611f23 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 f1bdb6322163..d1a36d9f0122 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 0b8eea33302d..7cb12be43970 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 f4b14c5bbddf..679cc5976c28 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 824acef34627..7afac33170bc 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 */