Skip to content

Commit

Permalink
Show "(read only)" in open with when file has no write permission, an…
Browse files Browse the repository at this point in the history
…d send it to external apps without writing permission
  • Loading branch information
JuancaG05 committed Mar 28, 2023
1 parent 7d40024 commit 7f3772c
Show file tree
Hide file tree
Showing 12 changed files with 53 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -374,10 +373,10 @@ fun FragmentActivity.sendDownloadedFilesByShareSheet(ocFiles: List<OCFile>) {
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))
Expand All @@ -402,7 +401,10 @@ fun FragmentActivity.sendDownloadedFilesByShareSheet(ocFiles: List<OCFile>) {
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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ public FileMenuFilter(List<OCFile> 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);

Expand All @@ -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);
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,8 @@ class FileDetailsFragment : FileFragment() {
false,
false,
false,
false
false,
fileDetailsViewModel.getCurrentFile()?.hasWritePermission == true,
)

menu.findItem(R.id.action_see_details)?.apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
Expand All @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,8 @@ class PreviewAudioFragment : FileFragment() {
false,
false,
false,
false
false,
file.hasWritePermission,
)

// additional restriction for this fragment
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions owncloudApp/src/main/res/menu/file_actions_menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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" />
<item
android:id="@+id/action_copy"
android:title="@android:string/copy"
android:icon="@drawable/ic_action_copy"
app:showAsAction="ifRoom"
app:showAsAction="never"
android:orderInCategory="1" />
<item
android:id="@+id/action_rename_file"
Expand Down
1 change: 1 addition & 0 deletions owncloudApp/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
<string name="actionbar_upload_from_apps">Content from other apps</string>
<string name="actionbar_upload_files">Files</string>
<string name="actionbar_open_with">Open with</string>
<string name="actionbar_open_with_read_only">Open with (read only)</string>
<string name="actionbar_mkdir">New folder</string>
<string name="actionbar_settings">Settings</string>
<string name="actionbar_see_details">Details</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down

0 comments on commit 7f3772c

Please sign in to comment.