diff --git a/CHANGELOG.md b/CHANGELOG.md index 72737e27e..290330685 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. ### Changed +- higher quality thumbnails - upgraded Flutter to stable v3.3.7 ### Fixed diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt index 2ce5db3d5..63f941171 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt @@ -19,10 +19,10 @@ import com.bumptech.glide.Glide import com.bumptech.glide.load.DecodeFormat import com.bumptech.glide.request.RequestOptions import deckers.thibault.aves.MainActivity -import deckers.thibault.aves.MainActivity.Companion.EXTRA_STRING_ARRAY_SEPARATOR import deckers.thibault.aves.MainActivity.Companion.EXTRA_KEY_FILTERS_ARRAY import deckers.thibault.aves.MainActivity.Companion.EXTRA_KEY_FILTERS_STRING import deckers.thibault.aves.MainActivity.Companion.EXTRA_KEY_PAGE +import deckers.thibault.aves.MainActivity.Companion.EXTRA_STRING_ARRAY_SEPARATOR import deckers.thibault.aves.R import deckers.thibault.aves.channel.calls.Coresult.Companion.safe import deckers.thibault.aves.channel.calls.Coresult.Companion.safeSuspend @@ -159,7 +159,7 @@ class AppAdapterHandler(private val context: Context) : MethodCallHandler { .build() val options = RequestOptions() - .format(DecodeFormat.PREFER_RGB_565) + .format(DecodeFormat.PREFER_ARGB_8888) .override(size, size) val target = Glide.with(context) .asBitmap() diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt index 4d99242ea..2c96888b6 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt @@ -42,8 +42,9 @@ class MediaFetchBytesHandler(private val context: Context) : MethodCallHandler { val heightDip = call.argument("heightDip")?.toDouble() val pageId = call.argument("pageId") val defaultSizeDip = call.argument("defaultSizeDip")?.toDouble() + val quality = call.argument("quality") - if (uri == null || mimeType == null || dateModifiedSecs == null || rotationDegrees == null || isFlipped == null || widthDip == null || heightDip == null || defaultSizeDip == null) { + if (uri == null || mimeType == null || dateModifiedSecs == null || rotationDegrees == null || isFlipped == null || widthDip == null || heightDip == null || defaultSizeDip == null || quality == null) { result.error("getThumbnail-args", "missing arguments", null) return } @@ -60,6 +61,7 @@ class MediaFetchBytesHandler(private val context: Context) : MethodCallHandler { height = (heightDip * density).roundToInt(), pageId = pageId, defaultSize = (defaultSizeDip * density).roundToInt(), + quality = quality, result = result, ).fetch() } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt index b518cd15a..3086708ad 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt @@ -39,6 +39,7 @@ class ThumbnailFetcher internal constructor( height: Int?, private val pageId: Int?, private val defaultSize: Int, + private val quality: Int, private val result: MethodChannel.Result, ) { private val uri: Uri = Uri.parse(uri) @@ -79,7 +80,7 @@ class ThumbnailFetcher internal constructor( } if (bitmap != null) { - result.success(bitmap.getBytes(MimeTypes.canHaveAlpha(mimeType), recycle = false)) + result.success(bitmap.getBytes(MimeTypes.canHaveAlpha(mimeType), recycle = false, quality = quality)) } else { var errorDetails: String? = exception?.message if (errorDetails?.isNotEmpty() == true) { @@ -119,7 +120,7 @@ class ThumbnailFetcher internal constructor( private fun getByGlide(): Bitmap? { // add signature to ignore cache for images which got modified but kept the same URI var options = RequestOptions() - .format(DecodeFormat.PREFER_RGB_565) + .format(if (quality == 100) DecodeFormat.PREFER_ARGB_8888 else DecodeFormat.PREFER_RGB_565) .signature(ObjectKey("$dateModifiedSecs-$rotationDegrees-$isFlipped-$width-$pageId")) .override(width, height) diff --git a/lib/services/media/media_fetch_service.dart b/lib/services/media/media_fetch_service.dart index a746e4de5..e50f161d8 100644 --- a/lib/services/media/media_fetch_service.dart +++ b/lib/services/media/media_fetch_service.dart @@ -227,6 +227,7 @@ class PlatformMediaFetchService implements MediaFetchService { 'heightDip': extent, 'pageId': pageId, 'defaultSizeDip': _thumbnailDefaultSize, + 'quality': 100, }); if (result != null) return result as Uint8List; } on PlatformException catch (e, stack) { diff --git a/lib/widgets/about/bug_report.dart b/lib/widgets/about/bug_report.dart index 027bc904a..8903e6a1e 100644 --- a/lib/widgets/about/bug_report.dart +++ b/lib/widgets/about/bug_report.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:aves/app_flavor.dart'; import 'package:aves/flutter_version.dart'; +import 'package:aves/model/device.dart'; import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/ref/mime_types.dart'; @@ -149,6 +150,7 @@ class _BugReportState extends State with FeedbackMixin { 'Android version: ${androidInfo.version.release} (SDK ${androidInfo.version.sdkInt})', 'Android build: ${androidInfo.display}', 'Device: ${androidInfo.manufacturer} ${androidInfo.model}', + 'Geocoder: ${device.hasGeocoder ? 'ready' : 'not available'}', 'Mobile services: ${mobileServices.isServiceAvailable ? 'ready' : 'not available'}', 'System locales: ${WidgetsBinding.instance.window.locales.join(', ')}', 'Aves locale: ${settings.locale ?? 'system'} -> ${settings.appliedLocale}',