From fa738b6a55f94f83f1b2c33c6fbcacb3b0f8955f Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 16 Oct 2020 16:43:47 +0900 Subject: [PATCH] viewer: get title & size for entries from generic content providers --- .../model/provider/ContentImageProvider.java | 30 +++++++++++++++++-- .../model/provider/FileImageProvider.java | 2 +- .../thibault/aves/model/AvesImageEntry.kt | 15 ---------- .../thibault/aves/model/SourceImageEntry.kt | 11 +++---- 4 files changed, 33 insertions(+), 25 deletions(-) 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 b7912001b..68e328d9d 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 @@ -1,18 +1,44 @@ package deckers.thibault.aves.model.provider; import android.content.Context; +import android.database.Cursor; import android.net.Uri; +import android.provider.MediaStore; import androidx.annotation.NonNull; +import java.util.HashMap; +import java.util.Map; + 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) { - SourceImageEntry entry = new SourceImageEntry(uri, mimeType).fillPreCatalogMetadata(context); + Map map = new HashMap<>(); + map.put("uri", uri.toString()); + map.put("sourceMimeType", mimeType); - if (entry.getHasSize() || entry.isSvg()) { + String[] projection = { + MediaStore.MediaColumns.SIZE, + MediaStore.MediaColumns.DISPLAY_NAME, + }; + try { + Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); + if (cursor != null) { + if (cursor.moveToNext()) { + map.put("sizeBytes", cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE))); + map.put("title", cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME))); + } + cursor.close(); + } + } catch (Exception e) { + callback.onFailure(e); + return; + } + + SourceImageEntry entry = new SourceImageEntry(map).fillPreCatalogMetadata(context); + if (entry.isSized() || entry.isSvg()) { callback.onSuccess(entry.toMap()); } else { callback.onFailure(new Exception("entry has no size")); 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 b4b1de9f4..43e00d7c1 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 @@ -27,7 +27,7 @@ class FileImageProvider extends ImageProvider { } entry.fillPreCatalogMetadata(context); - if (entry.getHasSize() || entry.isSvg()) { + if (entry.isSized() || entry.isSvg()) { callback.onSuccess(entry.toMap()); } else { callback.onFailure(new Exception("entry has no size")); diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesImageEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesImageEntry.kt index a9b6856e7..617fd56d2 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesImageEntry.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesImageEntry.kt @@ -1,7 +1,6 @@ package deckers.thibault.aves.model import android.net.Uri -import deckers.thibault.aves.utils.MimeTypes class AvesImageEntry(map: Map) { @JvmField @@ -21,18 +20,4 @@ class AvesImageEntry(map: Map) { @JvmField val rotationDegrees = map["rotationDegrees"] as Int - - @JvmField - val dateModifiedSecs = toLong(map["dateModifiedSecs"]) - - val isVideo: Boolean - get() = MimeTypes.isVideo(mimeType) - - companion object { - // convenience method - private fun toLong(o: Any?): Long? = when (o) { - is Int -> o.toLong() - else -> o as? Long - } - } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceImageEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceImageEntry.kt index 115425807..bf48ab8e3 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceImageEntry.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceImageEntry.kt @@ -101,15 +101,12 @@ class SourceImageEntry { return null } - val hasSize: Boolean + val isSized: Boolean get() = width ?: 0 > 0 && height ?: 0 > 0 private val hasDuration: Boolean get() = durationMillis ?: 0 > 0 - private val isImage: Boolean - get() = MimeTypes.isImage(sourceMimeType) - private val isVideo: Boolean get() = MimeTypes.isVideo(sourceMimeType) @@ -123,15 +120,15 @@ class SourceImageEntry { if (isSvg) return this if (isVideo) { fillVideoByMediaMetadataRetriever(context) - if (hasSize && hasDuration) return this + if (isSized && hasDuration) return this } if (MimeTypes.isSupportedByMetadataExtractor(sourceMimeType)) { fillByMetadataExtractor(context) - if (hasSize && foundExif) return this + if (isSized && foundExif) return this } if (ExifInterface.isSupportedMimeType(sourceMimeType)) { fillByExifInterface(context) - if (hasSize) return this + if (isSized) return this } fillByBitmapDecode(context) return this