diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 62ba85dab3..e955f3897f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -673,6 +673,11 @@
android:exported="false"
android:authorities="${applicationId}.part" />
+
+
= 26);
+
if (cameFromAllMedia) {
menu.findItem(R.id.media_preview__overview).setVisible(false);
}
@@ -464,16 +492,17 @@ public final class MediaPreviewActivity extends PassphraseRequiredActivity
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
super.onOptionsItemSelected(item);
- switch (item.getItemId()) {
- case R.id.media_preview__overview: showOverview(); return true;
- case R.id.media_preview__forward: forward(); return true;
- case R.id.save: saveToDisk(); return true;
- case R.id.delete: deleteMedia(); return true;
- case android.R.id.home: finish(); return true;
- }
+ int itemId = item.getItemId();
+
+ if (itemId == R.id.media_preview__overview) { showOverview(); return true; }
+ if (itemId == R.id.media_preview__forward) { forward(); return true; }
+ if (itemId == R.id.media_preview__share) { share(); return true; }
+ if (itemId == R.id.save) { saveToDisk(); return true; }
+ if (itemId == R.id.delete) { deleteMedia(); return true; }
+ if (itemId == android.R.id.home) { finish(); return true; }
return false;
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/providers/BaseContentProvider.java b/app/src/main/java/org/thoughtcrime/securesms/providers/BaseContentProvider.java
new file mode 100644
index 0000000000..5e4c6c287a
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/providers/BaseContentProvider.java
@@ -0,0 +1,62 @@
+package org.thoughtcrime.securesms.providers;
+
+import android.content.ContentProvider;
+import android.content.Context;
+import android.content.pm.ProviderInfo;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.provider.OpenableColumns;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.ArrayList;
+
+abstract class BaseContentProvider extends ContentProvider {
+
+ private static final String[] COLUMNS = {OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE};
+
+ /**
+ * Sanity checks the security like FileProvider does.
+ */
+ @Override
+ public void attachInfo(@NonNull Context context, @NonNull ProviderInfo info) {
+ super.attachInfo(context, info);
+
+ if (info.exported) {
+ throw new SecurityException("Provider must not be exported");
+ }
+ if (!info.grantUriPermissions) {
+ throw new SecurityException("Provider must grant uri permissions");
+ }
+ }
+
+ protected static Cursor createCursor(@Nullable String[] projection, @NonNull String fileName, long fileSize) {
+ if (projection == null || projection.length == 0) {
+ projection = COLUMNS;
+ }
+
+ ArrayList cols = new ArrayList<>(projection.length);
+ ArrayList
%1$s to %2$s
Media no longer available.
+ Can\'t find an app able to share this media.
%1$d new messages in %2$d conversations
@@ -2438,6 +2439,7 @@
Save
Forward
+ Share
All media