viewer: handle view action without mime type
This commit is contained in:
parent
aaa4bc684f
commit
723caebcae
6 changed files with 28 additions and 17 deletions
|
@ -101,10 +101,10 @@ public class ImageFileHandler implements MethodChannel.MethodCallHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getImageEntry(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
|
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"));
|
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);
|
result.error("getImageEntry-args", "failed because of missing arguments", null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.net.Uri;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -14,7 +15,12 @@ import deckers.thibault.aves.model.SourceImageEntry;
|
||||||
|
|
||||||
class ContentImageProvider extends ImageProvider {
|
class ContentImageProvider extends ImageProvider {
|
||||||
@Override
|
@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<String, Object> map = new HashMap<>();
|
||||||
map.put("uri", uri.toString());
|
map.put("uri", uri.toString());
|
||||||
map.put("sourceMimeType", mimeType);
|
map.put("sourceMimeType", mimeType);
|
||||||
|
|
|
@ -4,6 +4,7 @@ import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
|
@ -11,7 +12,12 @@ import deckers.thibault.aves.model.SourceImageEntry;
|
||||||
|
|
||||||
class FileImageProvider extends ImageProvider {
|
class FileImageProvider extends ImageProvider {
|
||||||
@Override
|
@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);
|
SourceImageEntry entry = new SourceImageEntry(uri, mimeType);
|
||||||
|
|
||||||
String path = uri.getPath();
|
String path = uri.getPath();
|
||||||
|
|
|
@ -9,6 +9,7 @@ import android.provider.MediaStore;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.exifinterface.media.ExifInterface;
|
import androidx.exifinterface.media.ExifInterface;
|
||||||
|
|
||||||
import com.commonsware.cwac.document.DocumentFileCompat;
|
import com.commonsware.cwac.document.DocumentFileCompat;
|
||||||
|
@ -40,7 +41,7 @@ import deckers.thibault.aves.utils.StorageUtils;
|
||||||
public abstract class ImageProvider {
|
public abstract class ImageProvider {
|
||||||
private static final String LOG_TAG = LogUtils.createTag(ImageProvider.class);
|
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());
|
callback.onFailure(new UnsupportedOperationException());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ import android.provider.MediaStore;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
import com.commonsware.cwac.document.DocumentFileCompat;
|
import com.commonsware.cwac.document.DocumentFileCompat;
|
||||||
|
@ -77,24 +78,22 @@ public class MediaStoreImageProvider extends ImageProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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);
|
long id = ContentUris.parseId(uri);
|
||||||
int entryCount = 0;
|
|
||||||
NewEntryHandler onSuccess = (entry) -> {
|
NewEntryHandler onSuccess = (entry) -> {
|
||||||
entry.put("uri", uri.toString());
|
entry.put("uri", uri.toString());
|
||||||
callback.onSuccess(entry);
|
callback.onSuccess(entry);
|
||||||
};
|
};
|
||||||
NewEntryChecker alwaysValid = (contentId, dateModifiedSecs) -> true;
|
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);
|
Uri contentUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
|
||||||
entryCount = fetchFrom(context, alwaysValid, onSuccess, contentUri, IMAGE_PROJECTION);
|
if (fetchFrom(context, alwaysValid, onSuccess, contentUri, IMAGE_PROJECTION) > 0) return;
|
||||||
} else if (MimeTypes.isVideo(mimeType)) {
|
}
|
||||||
|
if (mimeType == null || MimeTypes.isVideo(mimeType)) {
|
||||||
Uri contentUri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id);
|
Uri contentUri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id);
|
||||||
entryCount = fetchFrom(context, alwaysValid, onSuccess, contentUri, VIDEO_PROJECTION);
|
if (fetchFrom(context, alwaysValid, onSuccess, contentUri, VIDEO_PROJECTION) > 0) return;
|
||||||
}
|
|
||||||
if (entryCount == 0) {
|
|
||||||
callback.onFailure(new Exception("failed to fetch entry at uri=" + uri));
|
|
||||||
}
|
}
|
||||||
|
callback.onFailure(new Exception("failed to fetch entry at uri=" + uri));
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Integer> getObsoleteContentIds(Context context, List<Integer> knownContentIds) {
|
public List<Integer> getObsoleteContentIds(Context context, List<Integer> knownContentIds) {
|
||||||
|
|
|
@ -120,12 +120,11 @@ class MainActivity : FlutterActivity() {
|
||||||
}
|
}
|
||||||
Intent.ACTION_VIEW -> {
|
Intent.ACTION_VIEW -> {
|
||||||
val uri = intent.data
|
val uri = intent.data
|
||||||
val mimeType = intent.type
|
if (uri != null) {
|
||||||
if (uri != null && mimeType != null) {
|
|
||||||
intentDataMap = hashMapOf(
|
intentDataMap = hashMapOf(
|
||||||
"action" to "view",
|
"action" to "view",
|
||||||
"uri" to uri.toString(),
|
"uri" to uri.toString(),
|
||||||
"mimeType" to mimeType,
|
"mimeType" to intent.type, // MIME type is optional
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue