diff --git a/CHANGELOG.md b/CHANGELOG.md index cd0870327..7a6a7d4d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +## [v1.9.6] - 2023-09-25 + +### Fixed + +- editing some image EXIF corrupting them (by failing instead) + ## [v1.9.5] - 2023-09-17 ### Fixed diff --git a/android/app/build.gradle b/android/app/build.gradle index b2ca6c651..d05b5cb13 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -213,9 +213,9 @@ dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3' implementation "androidx.appcompat:appcompat:1.6.1" - implementation 'androidx.core:core-ktx:1.10.1' + implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.exifinterface:exifinterface:1.3.6' - implementation 'androidx.lifecycle:lifecycle-process:2.6.1' + implementation 'androidx.lifecycle:lifecycle-process:2.6.2' implementation 'androidx.media:media:1.6.0' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.security:security-crypto:1.1.0-alpha06' @@ -226,7 +226,7 @@ dependencies { implementation 'com.drewnoakes:metadata-extractor:2.18.0' implementation "com.github.bumptech.glide:glide:$glide_version" // SLF4J implementation for `mp4parser` - implementation 'org.slf4j:slf4j-simple:2.0.7' + implementation 'org.slf4j:slf4j-simple:2.0.9' // forked, built by JitPack: // - https://jitpack.io/p/deckerst/Android-TiffBitmapFactory @@ -242,7 +242,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.0' - kapt 'androidx.annotation:annotation:1.6.0' + kapt 'androidx.annotation:annotation:1.7.0' ksp "com.github.bumptech.glide:ksp:$glide_version" compileOnly rootProject.findProject(':streams_channel') diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt index 98616d0bc..cb523ad4f 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt @@ -30,10 +30,16 @@ import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch import java.util.concurrent.CompletableFuture import java.util.concurrent.ConcurrentHashMap open class MainActivity : FlutterFragmentActivity() { + private val defaultScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + private lateinit var mediaStoreChangeStreamHandler: MediaStoreChangeStreamHandler private lateinit var settingsChangeStreamHandler: SettingsChangeStreamHandler private lateinit var intentStreamHandler: IntentStreamHandler @@ -149,7 +155,7 @@ open class MainActivity : FlutterFragmentActivity() { } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { - setupShortcuts() + defaultScope.launch { setupShortcuts() } } } @@ -432,7 +438,9 @@ open class MainActivity : FlutterFragmentActivity() { ) .build() - ShortcutManagerCompat.setDynamicShortcuts(this, listOf(videos, search, safeMode)) + val shortcutInfoList = listOf(videos, search, safeMode) + ShortcutManagerCompat.setDynamicShortcuts(this, shortcutInfoList) + Log.i(LOG_TAG, "set shortcuts: ${shortcutInfoList.joinToString(", ") { v -> v.id }}") } private fun onAnalysisCompleted() { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt index 30348d57b..a6843a95a 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt @@ -14,13 +14,19 @@ import deckers.thibault.aves.model.FieldMap import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch import java.util.* class DeviceHandler(private val context: Context) : MethodCallHandler { + private val defaultScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { "canManageMedia" -> safe(call, result, ::canManageMedia) - "getCapabilities" -> safe(call, result, ::getCapabilities) + "getCapabilities" -> defaultScope.launch { safe(call, result, ::getCapabilities) } "getDefaultTimeZoneRawOffsetMillis" -> safe(call, result, ::getDefaultTimeZoneRawOffsetMillis) "getLocales" -> safe(call, result, ::getLocales) "getPerformanceClass" -> safe(call, result, ::getPerformanceClass) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ContentImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ContentImageProvider.kt index 4e86af1e8..ef2e87410 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ContentImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ContentImageProvider.kt @@ -57,7 +57,7 @@ internal class ContentImageProvider : ImageProvider() { cursor.close() } } catch (e: Exception) { - callback.onFailure(e) + callback.onFailure(Exception("Failed to query content, error=${e.message}")) return } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt index e73b2326f..20fa622af 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt @@ -685,11 +685,13 @@ abstract class ImageProvider { throw Exception("editing Exif changes mimeType=$mimeType -> $editedMimeType for uri=$uri path=$path") } - if (mimeType == MimeTypes.WEBP && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - // as of androidx.exifinterface:exifinterface:1.3.6, editing some specific WEBP + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + // 1) as of androidx.exifinterface:exifinterface:1.3.6, editing some specific WEBP // makes them undecodable by some decoders (including Android's and Chrome's) // even though `BitmapFactory` successfully decodes their bounds, // so we check whether decoding it throws an exception + // 2) some users have reported corruption when editing JPEG as well, + // but conditions are unknown (specific image, custom ROM, low storage, race condition, etc.) ImageDecoder.decodeBitmap(ImageDecoder.createSource(editableFile)) } diff --git a/fastlane/metadata/android/en-US/changelogs/107.txt b/fastlane/metadata/android/en-US/changelogs/107.txt new file mode 100644 index 000000000..f1cd4d847 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/107.txt @@ -0,0 +1,5 @@ +In v1.9.6: +- play your animated AVIF, AV1, and HDR videos +- filter by rating ranges +- judge tonal distributions with the viewer histogram +Full changelog available on GitHub \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/10701.txt b/fastlane/metadata/android/en-US/changelogs/10701.txt new file mode 100644 index 000000000..f1cd4d847 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/10701.txt @@ -0,0 +1,5 @@ +In v1.9.6: +- play your animated AVIF, AV1, and HDR videos +- filter by rating ranges +- judge tonal distributions with the viewer histogram +Full changelog available on GitHub \ No newline at end of file diff --git a/plugins/aves_report_crashlytics/pubspec.lock b/plugins/aves_report_crashlytics/pubspec.lock index 79bd884cd..2730933b8 100644 --- a/plugins/aves_report_crashlytics/pubspec.lock +++ b/plugins/aves_report_crashlytics/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "1a5e13736d59235ce0139621b4bbe29bc89839e202409081bc667eb3cd20674c" + sha256: "2d8e8e123ca3675625917f535fcc0d3a50092eef44334168f9b18adc050d4c6e" url: "https://pub.dev" source: hosted - version: "1.3.5" + version: "1.3.6" async: dependency: transitive description: @@ -68,10 +68,10 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: c78132175edda4bc532a71e01a32964e4b4fcf53de7853a422d96dac3725f389 + sha256: "675c209c94a1817649137cbd113fc4c9ae85e48d03dd578629abbec6d8a4d93d" url: "https://pub.dev" source: hosted - version: "2.15.1" + version: "2.16.0" firebase_core_platform_interface: dependency: transitive description: @@ -84,26 +84,26 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: "4cf4d2161530332ddc3c562f19823fb897ff37a9a774090d28df99f47370e973" + sha256: e8c408923cd3a25bd342c576a114f2126769cd1a57106a4edeaa67ea4a84e962 url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.8.0" firebase_crashlytics: dependency: "direct main" description: name: firebase_crashlytics - sha256: fd9e1a1cb7cce3f9dd2358d8363d235f25f056981e23a333db1e57eca693913f + sha256: f4a4b046606e306b589bef5c1e268afbfab2e5fddde6de7e4340400465c8d231 url: "https://pub.dev" source: hosted - version: "3.3.5" + version: "3.3.6" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface - sha256: "0d19ef23cf7a917a357d2eb1807338ec536ec3232e729ebd769f5bb2aba9e085" + sha256: "8666b935e29b143297e2923dc8112663854f828d10954a92b8215e7249b55d59" url: "https://pub.dev" source: hosted - version: "3.6.5" + version: "3.6.6" flutter: dependency: "direct main" description: flutter diff --git a/plugins/aves_services_google/pubspec.lock b/plugins/aves_services_google/pubspec.lock index 2945b77e2..5456c5255 100644 --- a/plugins/aves_services_google/pubspec.lock +++ b/plugins/aves_services_google/pubspec.lock @@ -449,18 +449,18 @@ packages: dependency: transitive description: name: win32 - sha256: "9e82a402b7f3d518fb9c02d0e9ae45952df31b9bf34d77baf19da2de03fc2aaa" + sha256: c97defd418eef4ec88c0d1652cdce84b9f7b63dd7198e266d06ac1710d527067 url: "https://pub.dev" source: hosted - version: "5.0.7" + version: "5.0.8" win32_registry: dependency: transitive description: name: win32_registry - sha256: e4506d60b7244251bc59df15656a3093501c37fb5af02105a944d73eb95be4c9 + sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" wkt_parser: dependency: transitive description: diff --git a/plugins/aves_video_mpv/pubspec.lock b/plugins/aves_video_mpv/pubspec.lock index f4f95ed18..025d9682a 100644 --- a/plugins/aves_video_mpv/pubspec.lock +++ b/plugins/aves_video_mpv/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: archive - sha256: e0902a06f0e00414e4e3438a084580161279f137aeb862274710f29ec10cf01e + sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765" url: "https://pub.dev" source: hosted - version: "3.3.9" + version: "3.4.2" args: dependency: transitive description: @@ -140,10 +140,10 @@ packages: dependency: transitive description: name: image - sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf + sha256: "6e703d5e2f8c63fb31a77753915c1ec8baebde8088844e0d29f71b8f0b108888" url: "https://pub.dev" source: hosted - version: "4.0.17" + version: "4.1.0" js: dependency: transitive description: @@ -425,10 +425,10 @@ packages: dependency: transitive description: name: win32 - sha256: "9e82a402b7f3d518fb9c02d0e9ae45952df31b9bf34d77baf19da2de03fc2aaa" + sha256: c97defd418eef4ec88c0d1652cdce84b9f7b63dd7198e266d06ac1710d527067 url: "https://pub.dev" source: hosted - version: "5.0.7" + version: "5.0.8" xml: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index 72c14bdbe..422e2d069 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "1a5e13736d59235ce0139621b4bbe29bc89839e202409081bc667eb3cd20674c" + sha256: "2d8e8e123ca3675625917f535fcc0d3a50092eef44334168f9b18adc050d4c6e" url: "https://pub.dev" source: hosted - version: "1.3.5" + version: "1.3.6" analyzer: dependency: transitive description: @@ -29,10 +29,10 @@ packages: dependency: transitive description: name: archive - sha256: e0902a06f0e00414e4e3438a084580161279f137aeb862274710f29ec10cf01e + sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765" url: "https://pub.dev" source: hosted - version: "3.3.9" + version: "3.4.2" args: dependency: transitive description: @@ -152,10 +152,10 @@ packages: dependency: transitive description: name: bidi - sha256: "2c162a66885167f1f92c41583efea9a435cb268d58322ba266613b9582440f87" + sha256: "1a7d0c696324b2089f72e7671fd1f1f64fef44c980f3cebc84e803967c597b63" url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.0.10" boolean_selector: dependency: transitive description: @@ -380,10 +380,10 @@ packages: dependency: transitive description: name: firebase_core - sha256: c78132175edda4bc532a71e01a32964e4b4fcf53de7853a422d96dac3725f389 + sha256: "675c209c94a1817649137cbd113fc4c9ae85e48d03dd578629abbec6d8a4d93d" url: "https://pub.dev" source: hosted - version: "2.15.1" + version: "2.16.0" firebase_core_platform_interface: dependency: transitive description: @@ -396,26 +396,26 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: "4cf4d2161530332ddc3c562f19823fb897ff37a9a774090d28df99f47370e973" + sha256: e8c408923cd3a25bd342c576a114f2126769cd1a57106a4edeaa67ea4a84e962 url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.8.0" firebase_crashlytics: dependency: transitive description: name: firebase_crashlytics - sha256: fd9e1a1cb7cce3f9dd2358d8363d235f25f056981e23a333db1e57eca693913f + sha256: f4a4b046606e306b589bef5c1e268afbfab2e5fddde6de7e4340400465c8d231 url: "https://pub.dev" source: hosted - version: "3.3.5" + version: "3.3.6" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface - sha256: "0d19ef23cf7a917a357d2eb1807338ec536ec3232e729ebd769f5bb2aba9e085" + sha256: "8666b935e29b143297e2923dc8112663854f828d10954a92b8215e7249b55d59" url: "https://pub.dev" source: hosted - version: "3.6.5" + version: "3.6.6" flex_color_picker: dependency: "direct main" description: @@ -691,10 +691,10 @@ packages: dependency: transitive description: name: image - sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf + sha256: "6e703d5e2f8c63fb31a77753915c1ec8baebde8088844e0d29f71b8f0b108888" url: "https://pub.dev" source: hosted - version: "4.0.17" + version: "4.1.0" intl: dependency: "direct main" description: @@ -1045,10 +1045,10 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: f23cfe9af0d49c6b9fd8a8b09f7b3301ca7e346204939b5afef4404d36d2608f + sha256: f2543a236584a5e8be79076f858022f100ce690e31530e6fa4c32ac94f276d3a url: "https://pub.dev" source: hosted - version: "11.0.1" + version: "11.0.3" permission_handler_apple: dependency: transitive description: @@ -1667,18 +1667,18 @@ packages: dependency: transitive description: name: win32 - sha256: "9e82a402b7f3d518fb9c02d0e9ae45952df31b9bf34d77baf19da2de03fc2aaa" + sha256: c97defd418eef4ec88c0d1652cdce84b9f7b63dd7198e266d06ac1710d527067 url: "https://pub.dev" source: hosted - version: "5.0.7" + version: "5.0.8" win32_registry: dependency: transitive description: name: win32_registry - sha256: e4506d60b7244251bc59df15656a3093501c37fb5af02105a944d73eb95be4c9 + sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" wkt_parser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 391828667..d083ffe3e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ repository: https://github.com/deckerst/aves # - play changelog: /whatsnew/whatsnew-en-US # - izzy changelog: /fastlane/metadata/android/en-US/changelogs/XXX01.txt # - libre changelog: /fastlane/metadata/android/en-US/changelogs/XXX.txt -version: 1.9.5+106 +version: 1.9.6+107 publish_to: none environment: diff --git a/whatsnew/whatsnew-en-US b/whatsnew/whatsnew-en-US index 30de5ad44..f1cd4d847 100644 --- a/whatsnew/whatsnew-en-US +++ b/whatsnew/whatsnew-en-US @@ -1,4 +1,4 @@ -In v1.9.5: +In v1.9.6: - play your animated AVIF, AV1, and HDR videos - filter by rating ranges - judge tonal distributions with the viewer histogram