From be2c9ed9143922edffdb093a7bfd5cfa0d255131 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Wed, 18 Nov 2020 15:51:53 +0900 Subject: [PATCH] fixed size for videos unsupported by MediaMetadataRetriever but supported by metadata-extractor --- .../thibault/aves/model/SourceImageEntry.kt | 17 ++++++++++------- lib/widgets/collection/thumbnail/raster.dart | 19 +++++++++---------- 2 files changed, 19 insertions(+), 17 deletions(-) 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 44b153617..aaf961622 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 @@ -122,17 +122,15 @@ class SourceImageEntry { if (isVideo) { fillVideoByMediaMetadataRetriever(context) if (isSized && hasDuration) return this - } - // skip metadata-extractor for raw images because it reports the decoded dimensions instead of the raw dimensions - if (!MimeTypes.isRaw(sourceMimeType) && MimeTypes.isSupportedByMetadataExtractor(sourceMimeType)) { + fillByMetadataExtractor(context) + } else { fillByMetadataExtractor(context) if (isSized && foundExif) return this - } - if (ExifInterface.isSupportedMimeType(sourceMimeType)) { fillByExifInterface(context) - if (isSized) return this } - fillByBitmapDecode(context) + if (!isSized) { + fillByBitmapDecode(context) + } return this } @@ -156,6 +154,9 @@ class SourceImageEntry { // finds: width, height, orientation, date, duration private fun fillByMetadataExtractor(context: Context) { + // skip raw images because `metadata-extractor` reports the decoded dimensions instead of the raw dimensions + if (!MimeTypes.isSupportedByMetadataExtractor(sourceMimeType) || MimeTypes.isRaw(sourceMimeType)) return + try { StorageUtils.openInputStream(context, uri)?.use { input -> val metadata = ImageMetadataReader.readMetadata(input) @@ -206,6 +207,8 @@ class SourceImageEntry { // finds: width, height, orientation, date private fun fillByExifInterface(context: Context) { + if (!ExifInterface.isSupportedMimeType(sourceMimeType)) return; + try { StorageUtils.openInputStream(context, uri)?.use { input -> val exif = ExifInterface(input) diff --git a/lib/widgets/collection/thumbnail/raster.dart b/lib/widgets/collection/thumbnail/raster.dart index 05d7ce36f..0b70212dd 100644 --- a/lib/widgets/collection/thumbnail/raster.dart +++ b/lib/widgets/collection/thumbnail/raster.dart @@ -98,16 +98,13 @@ class _ThumbnailRasterImageState extends State { @override Widget build(BuildContext context) { if (!entry.canDecode) { - return ErrorThumbnail( - entry: entry, - extent: extent, - tooltip: '${entry.mimeType} not supported', - ); + return _buildError(context, '${entry.mimeType} not supported', null); } final fastImage = Image( key: ValueKey('LQ'), image: _fastThumbnailProvider, + errorBuilder: _buildError, width: extent, height: extent, fit: BoxFit.cover, @@ -137,11 +134,7 @@ class _ThumbnailRasterImageState extends State { child: frame == null ? fastImage : child, ); }, - errorBuilder: (context, error, stackTrace) => ErrorThumbnail( - entry: entry, - extent: extent, - tooltip: error.toString(), - ), + errorBuilder: _buildError, width: extent, height: extent, fit: BoxFit.cover, @@ -173,6 +166,12 @@ class _ThumbnailRasterImageState extends State { ); } + Widget _buildError(BuildContext context, Object error, StackTrace stackTrace) => ErrorThumbnail( + entry: entry, + extent: extent, + tooltip: error.toString(), + ); + // when the entry image itself changed (e.g. after rotation) void _onImageChanged() async { // rebuild to refresh the thumbnails