viewer: handle view action without mime type

This commit is contained in:
Thibault Deckers 2020-10-18 09:55:23 +09:00
parent aaa4bc684f
commit 723caebcae
6 changed files with 28 additions and 17 deletions

View file

@ -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;
}

View file

@ -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<String, Object> map = new HashMap<>();
map.put("uri", uri.toString());
map.put("sourceMimeType", mimeType);

View file

@ -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();

View file

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

View file

@ -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<Integer> getObsoleteContentIds(Context context, List<Integer> knownContentIds) {

View file

@ -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
)
}
}