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) {
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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,25 +78,23 @@ 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 (fetchFrom(context, alwaysValid, onSuccess, contentUri, VIDEO_PROJECTION) > 0) return;
|
||||
}
|
||||
if (entryCount == 0) {
|
||||
callback.onFailure(new Exception("failed to fetch entry at uri=" + uri));
|
||||
}
|
||||
}
|
||||
|
||||
public List<Integer> getObsoleteContentIds(Context context, List<Integer> knownContentIds) {
|
||||
final ArrayList<Integer> current = new ArrayList<>();
|
||||
|
|
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue