diff --git a/src/cheogram/java/com/cheogram/ExportBackupService.java b/src/cheogram/java/com/cheogram/ExportBackupService.java index 493ec71341b9c111ce9f85a123f33d4e17cb3211..9a121f29bca5978f23926d9d31d1c1e2aeca6d1b 100644 --- a/src/cheogram/java/com/cheogram/ExportBackupService.java +++ b/src/cheogram/java/com/cheogram/ExportBackupService.java @@ -422,7 +422,7 @@ public class ExportBackupService extends Worker { final Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE); final ArrayList uris = new ArrayList<>(); for (final File file : files) { - uris.add(FileBackend.getUriForFile(context, file)); + uris.add(FileBackend.getUriForFile(context, file, file.getName())); } intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index 140c326591a5be06757271e34f5580e4639d4eb9..ca9fb4dffb2bc9c7c79b6d4d83a7602f6bee2674 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java @@ -235,16 +235,17 @@ public class FileBackend { public static Uri getUriForUri(Context context, Uri uri) { if ("file".equals(uri.getScheme())) { - return getUriForFile(context, new File(uri.getPath())); + final var file = new File(uri.getPath()); + return getUriForFile(context, file, file.getName()); } else { return uri; } } - public static Uri getUriForFile(Context context, File file) { + public static Uri getUriForFile(Context context, File file, final String displayName) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N || Config.ONLY_INTERNAL_STORAGE || file.toString().startsWith(context.getCacheDir().toString())) { try { - return FileProvider.getUriForFile(context, getAuthority(context), file); + return FileProvider.getUriForFile(context, getAuthority(context), file, displayName); } catch (IllegalArgumentException e) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { throw new SecurityException(e); @@ -1603,7 +1604,7 @@ public class FileBackend { } final File file = new File(directory, filename); file.getParentFile().mkdirs(); - return getUriForFile(mXmppConnectionService, file); + return getUriForFile(mXmppConnectionService, file, filename); } public Avatar getPepAvatar(Uri image, int size, Bitmap.CompressFormat format) { diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index c3513072bc75dce9cd5d5511e383b0519dd95f27..4096ce9a0a5c332f470c367d28cf03986899bfc5 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -1124,7 +1124,8 @@ public class NotificationService { private Uri fixRingtoneUri(Uri uri) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && "file".equals(uri.getScheme())) { - return FileBackend.getUriForFile(mXmppConnectionService, new File(uri.getPath())); + final var file = new File(uri.getPath()); + return FileBackend.getUriForFile(mXmppConnectionService, file, file.getName()); } else { return uri; } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index f4c49d56fedc00a0478b1490af5a4686c6735623..32cf40e7aee3646a9e64c4f739d0895fe56a6f40 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -2960,7 +2960,10 @@ public class ConversationFragment extends XmppFragment } else { final DownloadableFile file = activity.xmppConnectionService.getFileBackend().getFile(message); - ViewUtil.view(activity, file); + final var fp = message.getFileParams(); + final var name = fp == null ? null : fp.getName(); + final var displayName = name == null ? file.getName() : name; + ViewUtil.view(activity, file, displayName); } } @@ -3018,7 +3021,7 @@ public class ConversationFragment extends XmppFragment Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType(MimeUtils.guessMimeTypeFromUri(activity, activity.xmppConnectionService.getFileBackend().getUriForFile(activity, file))); + intent.setType(MimeUtils.guessMimeTypeFromUri(activity, activity.xmppConnectionService.getFileBackend().getUriForFile(activity, file, file.getName()))); intent.putExtra(Intent.EXTRA_TITLE, name); SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(activity); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 43dd8736bcfcc8e88e5d675cfa8a24ba726d4f66..ec3c0195c4c6ee4fdbb55de5acc72a2056345b14 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -1715,7 +1715,10 @@ public class MessageAdapter extends ArrayAdapter { } final DownloadableFile file = activity.xmppConnectionService.getFileBackend().getFile(message); - ViewUtil.view(activity, file); + final var fp = message.getFileParams(); + final var name = fp == null ? null : fp.getName(); + final var displayName = name == null ? file.getName() : name; + ViewUtil.view(activity, file, displayName); } private void showLocation(Message message) { diff --git a/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java b/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java index ac56b803b7397a03c3a1086fce9bce36d0becf28..9f347cef6ec82ea8f51605e9b9158a17f9b67775 100644 --- a/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java +++ b/src/main/java/eu/siacs/conversations/ui/util/ShareUtil.java @@ -65,8 +65,11 @@ public class ShareUtil { shareIntent.putExtra(ConversationsActivity.EXTRA_AS_QUOTE, message.getStatus() == Message.STATUS_RECEIVED); } else { final DownloadableFile file = activity.xmppConnectionService.getFileBackend().getFile(message); + final var fp = message.getFileParams(); + final var name = fp == null ? null : fp.getName(); + final var displayName = name == null ? file.getName() : name; try { - shareIntent.putExtra(Intent.EXTRA_STREAM, FileBackend.getUriForFile(activity, file)); + shareIntent.putExtra(Intent.EXTRA_STREAM, FileBackend.getUriForFile(activity, file, displayName)); } catch (SecurityException e) { Toast.makeText(activity, activity.getString(R.string.no_permission_to_access_x, file.getAbsolutePath()), Toast.LENGTH_SHORT).show(); return; diff --git a/src/main/java/eu/siacs/conversations/ui/util/ViewUtil.java b/src/main/java/eu/siacs/conversations/ui/util/ViewUtil.java index 1cc630ad337cb9c8ba14a3bb93e813c2bafd29b7..a4eaa075324e2f748a76b3e6346a2bf37e24f5de 100644 --- a/src/main/java/eu/siacs/conversations/ui/util/ViewUtil.java +++ b/src/main/java/eu/siacs/conversations/ui/util/ViewUtil.java @@ -20,12 +20,13 @@ import eu.siacs.conversations.persistance.FileBackend; public class ViewUtil { public static void view(Context context, Attachment attachment) { + // TODO: accept displayName File file = new File(attachment.getUri().getPath()); final String mime = attachment.getMime() == null ? "*/*" : attachment.getMime(); - view(context, file, mime); + view(context, file, mime, file.getName()); } - public static void view (Context context, DownloadableFile file) { + public static void view (Context context, DownloadableFile file, final String displayName) { if (!file.exists()) { Toast.makeText(context, R.string.file_deleted, Toast.LENGTH_SHORT).show(); return; @@ -34,15 +35,15 @@ public class ViewUtil { if (mime == null) { mime = "*/*"; } - view(context, file, mime); + view(context, file, mime, displayName); } - private static void view(Context context, File file, String mime) { + private static void view(Context context, File file, String mime, final String displayName) { Log.d(Config.LOGTAG,"viewing "+file.getAbsolutePath()+" "+mime); final Intent openIntent = new Intent(Intent.ACTION_VIEW); final Uri uri; try { - uri = FileBackend.getUriForFile(context, file); + uri = FileBackend.getUriForFile(context, file, displayName); } catch (SecurityException e) { Log.d(Config.LOGTAG, "No permission to access " + file.getAbsolutePath(), e); Toast.makeText(context, context.getString(R.string.no_permission_to_access_x, file.getAbsolutePath()), Toast.LENGTH_SHORT).show(); @@ -50,6 +51,7 @@ public class ViewUtil { } openIntent.setDataAndType(uri, mime); openIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + try { context.startActivity(openIntent); } catch (final ActivityNotFoundException e) { diff --git a/src/main/java/eu/siacs/conversations/worker/ExportBackupWorker.java b/src/main/java/eu/siacs/conversations/worker/ExportBackupWorker.java index 2ea69d78e0663d78d0c9a8935168b57bcccb1674..9e24282d1a46d49fa1dde042d3cb4b3df684aef4 100644 --- a/src/main/java/eu/siacs/conversations/worker/ExportBackupWorker.java +++ b/src/main/java/eu/siacs/conversations/worker/ExportBackupWorker.java @@ -507,7 +507,7 @@ public class ExportBackupWorker extends Worker { final Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE); final ArrayList uris = new ArrayList<>(); for (final File file : files) { - uris.add(FileBackend.getUriForFile(context, file)); + uris.add(FileBackend.getUriForFile(context, file, file.getName())); } intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);