From 723caebcae6beaf292c2495bc0d6f51f2850cf31 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 18 Oct 2020 09:55:23 +0900 Subject: [PATCH] viewer: handle view action without mime type --- .../aves/channel/calls/ImageFileHandler.java | 4 ++-- .../model/provider/ContentImageProvider.java | 8 +++++++- .../aves/model/provider/FileImageProvider.java | 8 +++++++- .../aves/model/provider/ImageProvider.java | 3 ++- .../model/provider/MediaStoreImageProvider.java | 17 ++++++++--------- .../deckers/thibault/aves/MainActivity.kt | 5 ++--- 6 files changed, 28 insertions(+), 17 deletions(-) diff --git a/android/app/src/main/java/deckers/thibault/aves/channel/calls/ImageFileHandler.java b/android/app/src/main/java/deckers/thibault/aves/channel/calls/ImageFileHandler.java index 79887396c..c8119a736 100644 --- a/android/app/src/main/java/deckers/thibault/aves/channel/calls/ImageFileHandler.java +++ b/android/app/src/main/java/deckers/thibault/aves/channel/calls/ImageFileHandler.java @@ -101,10 +101,10 @@ public class ImageFileHandler implements MethodChannel.MethodCallHandler { } private void getImageEntry(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { - String mimeType = call.argument("mimeType"); + String mimeType = call.argument("mimeType"); // MIME type is optional Uri uri = Uri.parse(call.argument("uri")); - if (uri == null || mimeType == null) { + if (uri == null) { result.error("getImageEntry-args", "failed because of missing arguments", null); return; } diff --git a/android/app/src/main/java/deckers/thibault/aves/model/provider/ContentImageProvider.java b/android/app/src/main/java/deckers/thibault/aves/model/provider/ContentImageProvider.java index 68e328d9d..3ecaeb767 100644 --- a/android/app/src/main/java/deckers/thibault/aves/model/provider/ContentImageProvider.java +++ b/android/app/src/main/java/deckers/thibault/aves/model/provider/ContentImageProvider.java @@ -6,6 +6,7 @@ import android.net.Uri; import android.provider.MediaStore; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.util.HashMap; import java.util.Map; @@ -14,7 +15,12 @@ import deckers.thibault.aves.model.SourceImageEntry; class ContentImageProvider extends ImageProvider { @Override - public void fetchSingle(@NonNull final Context context, @NonNull final Uri uri, @NonNull final String mimeType, @NonNull final ImageOpCallback callback) { + public void fetchSingle(@NonNull final Context context, @NonNull final Uri uri, @Nullable final String mimeType, @NonNull final ImageOpCallback callback) { + if (mimeType == null) { + callback.onFailure(new Exception("MIME type is null for uri=" + uri)); + return; + } + Map map = new HashMap<>(); map.put("uri", uri.toString()); map.put("sourceMimeType", mimeType); diff --git a/android/app/src/main/java/deckers/thibault/aves/model/provider/FileImageProvider.java b/android/app/src/main/java/deckers/thibault/aves/model/provider/FileImageProvider.java index 43e00d7c1..5d6bc46b0 100644 --- a/android/app/src/main/java/deckers/thibault/aves/model/provider/FileImageProvider.java +++ b/android/app/src/main/java/deckers/thibault/aves/model/provider/FileImageProvider.java @@ -4,6 +4,7 @@ import android.content.Context; import android.net.Uri; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.io.File; @@ -11,7 +12,12 @@ import deckers.thibault.aves.model.SourceImageEntry; class FileImageProvider extends ImageProvider { @Override - public void fetchSingle(@NonNull final Context context, @NonNull final Uri uri, @NonNull final String mimeType, @NonNull final ImageOpCallback callback) { + public void fetchSingle(@NonNull final Context context, @NonNull final Uri uri, @Nullable final String mimeType, @NonNull final ImageOpCallback callback) { + if (mimeType == null) { + callback.onFailure(new Exception("MIME type is null for uri=" + uri)); + return; + } + SourceImageEntry entry = new SourceImageEntry(uri, mimeType); String path = uri.getPath(); diff --git a/android/app/src/main/java/deckers/thibault/aves/model/provider/ImageProvider.java b/android/app/src/main/java/deckers/thibault/aves/model/provider/ImageProvider.java index d8f60d198..41c83f18c 100644 --- a/android/app/src/main/java/deckers/thibault/aves/model/provider/ImageProvider.java +++ b/android/app/src/main/java/deckers/thibault/aves/model/provider/ImageProvider.java @@ -9,6 +9,7 @@ import android.provider.MediaStore; import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.exifinterface.media.ExifInterface; import com.commonsware.cwac.document.DocumentFileCompat; @@ -40,7 +41,7 @@ import deckers.thibault.aves.utils.StorageUtils; public abstract class ImageProvider { private static final String LOG_TAG = LogUtils.createTag(ImageProvider.class); - public void fetchSingle(@NonNull final Context context, @NonNull final Uri uri, @NonNull final String mimeType, @NonNull final ImageOpCallback callback) { + public void fetchSingle(@NonNull final Context context, @NonNull final Uri uri, @Nullable final String mimeType, @NonNull final ImageOpCallback callback) { callback.onFailure(new UnsupportedOperationException()); } diff --git a/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java b/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java index 98ea4c551..c1335add8 100644 --- a/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java +++ b/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java @@ -13,6 +13,7 @@ import android.provider.MediaStore; import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.commonsware.cwac.document.DocumentFileCompat; @@ -77,24 +78,22 @@ public class MediaStoreImageProvider extends ImageProvider { } @Override - public void fetchSingle(@NonNull final Context context, @NonNull final Uri uri, @NonNull final String mimeType, @NonNull final ImageOpCallback callback) { + public void fetchSingle(@NonNull final Context context, @NonNull final Uri uri, @Nullable final String mimeType, @NonNull final ImageOpCallback callback) { long id = ContentUris.parseId(uri); - int entryCount = 0; NewEntryHandler onSuccess = (entry) -> { entry.put("uri", uri.toString()); callback.onSuccess(entry); }; NewEntryChecker alwaysValid = (contentId, dateModifiedSecs) -> true; - if (MimeTypes.isImage(mimeType)) { + if (mimeType == null || MimeTypes.isImage(mimeType)) { Uri contentUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id); - entryCount = fetchFrom(context, alwaysValid, onSuccess, contentUri, IMAGE_PROJECTION); - } else if (MimeTypes.isVideo(mimeType)) { + if (fetchFrom(context, alwaysValid, onSuccess, contentUri, IMAGE_PROJECTION) > 0) return; + } + if (mimeType == null || MimeTypes.isVideo(mimeType)) { Uri contentUri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id); - entryCount = fetchFrom(context, alwaysValid, onSuccess, contentUri, VIDEO_PROJECTION); - } - if (entryCount == 0) { - callback.onFailure(new Exception("failed to fetch entry at uri=" + uri)); + if (fetchFrom(context, alwaysValid, onSuccess, contentUri, VIDEO_PROJECTION) > 0) return; } + callback.onFailure(new Exception("failed to fetch entry at uri=" + uri)); } public List getObsoleteContentIds(Context context, List knownContentIds) { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt index 11fdca71d..dd6e432f3 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt @@ -120,12 +120,11 @@ class MainActivity : FlutterActivity() { } Intent.ACTION_VIEW -> { val uri = intent.data - val mimeType = intent.type - if (uri != null && mimeType != null) { + if (uri != null) { intentDataMap = hashMapOf( "action" to "view", "uri" to uri.toString(), - "mimeType" to mimeType, + "mimeType" to intent.type, // MIME type is optional ) } }