diff --git a/.flutter b/.flutter
index abb292a07..ba3931984 160000
--- a/.flutter
+++ b/.flutter
@@ -1 +1 @@
-Subproject commit abb292a07e20d696c4568099f918f6c5f330e6b0
+Subproject commit ba393198430278b6595976de84fe170f553cc728
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 2f578ff06..62eb020b3 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -10,7 +10,7 @@ jobs:
name: Build and release artifacts.
runs-on: ubuntu-latest
steps:
- - uses: actions/setup-java@v3
+ - uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'
@@ -75,7 +75,7 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Upload app bundle
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: appbundle
path: outputs/app-play-release.aab
@@ -85,15 +85,15 @@ jobs:
needs: [ build ]
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Get appbundle from artifacts.
- uses: actions/download-artifact@v3
+ uses: actions/download-artifact@v4
with:
name: appbundle
- name: Release app to beta channel.
- uses: r0adkll/upload-google-play@v1.1.1
+ uses: r0adkll/upload-google-play@v1.1.3
with:
serviceAccountJsonPlainText: ${{ secrets.PLAYSTORE_ACCOUNT_KEY }}
packageName: deckers.thibault.aves
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 72005807b..3ca5c1d43 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.
## [Unreleased]
+## [v1.10.6] - 2024-03-11
+
+### Added
+
+- Cataloguing: detect/filter HDR videos
+
+### Changed
+
+- check Media Store changes when resuming app
+- disabling animations also applies to pop up menus
+- upgraded Flutter to stable v3.19.3
+
+### Fixed
+
+- engine leak from analysis worker
+
## [v1.10.5] - 2024-02-22
### Added
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt b/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt
index 7de3a0c49..b9ce72658 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisWorker.kt
@@ -44,11 +44,22 @@ class AnalysisWorker(context: Context, parameters: WorkerParameters) : Coroutine
workCont = cont
onStart()
}
+ dispose()
return Result.success()
}
+ private suspend fun dispose() {
+ Log.i(LOG_TAG, "Clean analysis worker $id")
+ flutterEngine?.let {
+ FlutterUtils.runOnUiThread {
+ it.destroy()
+ }
+ flutterEngine = null
+ }
+ }
+
private fun onStart() {
- Log.i(LOG_TAG, "Start analysis worker")
+ Log.i(LOG_TAG, "Start analysis worker $id")
runBlocking {
FlutterUtils.initFlutterEngine(applicationContext, SHARED_PREFERENCES_KEY, CALLBACK_HANDLE_KEY) {
flutterEngine = it
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 380e9e2c1..8fecffb9e 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt
@@ -175,6 +175,18 @@ open class MainActivity : FlutterFragmentActivity() {
}
}
+ override fun onResume() {
+ super.onResume()
+ mediaStoreChangeStreamHandler.onAppResume()
+ settingsChangeStreamHandler.onAppResume()
+ }
+
+ override fun onPause() {
+ mediaStoreChangeStreamHandler.onAppPause()
+ settingsChangeStreamHandler.onAppPause()
+ super.onPause()
+ }
+
override fun onStop() {
Log.i(LOG_TAG, "onStop")
super.onStop()
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt
index 812b86e91..3292bb715 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt
@@ -15,8 +15,12 @@ import android.util.Log
import androidx.exifinterface.media.ExifInterface
import com.drew.metadata.file.FileTypeDirectory
import deckers.thibault.aves.channel.calls.Coresult.Companion.safe
-import deckers.thibault.aves.metadata.*
+import deckers.thibault.aves.metadata.ExifInterfaceHelper
+import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper
+import deckers.thibault.aves.metadata.Metadata
+import deckers.thibault.aves.metadata.Mp4ParserHelper
import deckers.thibault.aves.metadata.Mp4ParserHelper.dumpBoxes
+import deckers.thibault.aves.metadata.PixyMetaHelper
import deckers.thibault.aves.metadata.metadataextractor.Helper
import deckers.thibault.aves.model.FieldMap
import deckers.thibault.aves.utils.LogUtils
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 6693112dd..3b1306a99 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
@@ -12,7 +12,7 @@ import androidx.core.content.pm.ShortcutManagerCompat
import com.google.android.material.color.DynamicColors
import deckers.thibault.aves.channel.calls.Coresult.Companion.safe
import deckers.thibault.aves.model.FieldMap
-import deckers.thibault.aves.utils.MimeTypes
+import deckers.thibault.aves.utils.MemoryUtils
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
@@ -35,6 +35,8 @@ class DeviceHandler(private val context: Context) : MethodCallHandler {
"getPerformanceClass" -> safe(call, result, ::getPerformanceClass)
"isSystemFilePickerEnabled" -> safe(call, result, ::isSystemFilePickerEnabled)
"requestMediaManagePermission" -> safe(call, result, ::requestMediaManagePermission)
+ "getAvailableHeapSize" -> safe(call, result, ::getAvailableHeapSize)
+ "requestGarbageCollection" -> safe(call, result, ::requestGarbageCollection)
else -> result.notImplemented()
}
}
@@ -123,6 +125,15 @@ class DeviceHandler(private val context: Context) : MethodCallHandler {
result.success(true)
}
+ private fun getAvailableHeapSize(@Suppress("unused_parameter") methodCall: MethodCall, result: MethodChannel.Result) {
+ result.success(MemoryUtils.getAvailableHeapSize())
+ }
+
+ private fun requestGarbageCollection(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) {
+ Runtime.getRuntime().gc()
+ result.success(true)
+ }
+
companion object {
const val CHANNEL = "deckers.thibault/aves/device"
}
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt
index 34db16413..cc787ef7d 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt
@@ -3,6 +3,8 @@ package deckers.thibault.aves.channel.calls
import android.content.Context
import android.media.MediaScannerConnection
import android.net.Uri
+import android.os.Build
+import android.provider.MediaStore
import deckers.thibault.aves.channel.calls.Coresult.Companion.safe
import deckers.thibault.aves.model.provider.MediaStoreImageProvider
import io.flutter.plugin.common.MethodCall
@@ -20,13 +22,15 @@ class MediaStoreHandler(private val context: Context) : MethodCallHandler {
when (call.method) {
"checkObsoleteContentIds" -> ioScope.launch { safe(call, result, ::checkObsoleteContentIds) }
"checkObsoletePaths" -> ioScope.launch { safe(call, result, ::checkObsoletePaths) }
+ "getChangedUris" -> ioScope.launch { safe(call, result, ::getChangedUris) }
+ "getGeneration" -> ioScope.launch { safe(call, result, ::getGeneration) }
"scanFile" -> ioScope.launch { safe(call, result, ::scanFile) }
else -> result.notImplemented()
}
}
private fun checkObsoleteContentIds(call: MethodCall, result: MethodChannel.Result) {
- val knownContentIds = call.argument>("knownContentIds")
+ val knownContentIds = call.argument>("knownContentIds")?.map { it?.toLong() }
if (knownContentIds == null) {
result.error("checkObsoleteContentIds-args", "missing arguments", null)
return
@@ -35,7 +39,7 @@ class MediaStoreHandler(private val context: Context) : MethodCallHandler {
}
private fun checkObsoletePaths(call: MethodCall, result: MethodChannel.Result) {
- val knownPathById = call.argument