diff --git a/.flutter b/.flutter
index f92f44110..efbf63d9c 160000
--- a/.flutter
+++ b/.flutter
@@ -1 +1 @@
-Subproject commit f92f44110e87bad5ff168335c36da6f6053036e6
+Subproject commit efbf63d9c66b9f6ec30e9ad4611189aa80003d31
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 02327bea3..4f2fd27f2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,27 @@ All notable changes to this project will be documented in this file.
## [Unreleased]
+## [v1.9.0] - 2023-08-21
+
+### Added
+
+- Video: improved seek accuracy, HDR support, AV1 support, playback speed from x0.25 to x4
+- support for animated AVIF (requires rescan)
+- Collection: filtering by rating range
+- Viewer: optionally show histogram on overlay
+- Viewer: external export actions available as quick actions
+- About: data usage
+
+### Changed
+
+- Accessibility: removing animations also removes the overscroll stretch effect
+- target Android 14 (API 34)
+- upgraded Flutter to stable v3.13.0
+
+### Fixed
+
+- flickering when starting videos
+
## [v1.8.9] - 2023-06-04
### Changed
diff --git a/android/app/build.gradle b/android/app/build.gradle
index b48594695..9d9ca5a1c 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -2,6 +2,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'com.android.application'
+ id 'com.google.devtools.ksp' version "$ksp_version"
id 'kotlin-android'
id 'kotlin-kapt'
}
@@ -48,7 +49,7 @@ if (keystorePropertiesFile.exists()) {
android {
namespace 'deckers.thibault.aves'
- compileSdk 33
+ compileSdk 34
ndkVersion flutter.ndkVersion
compileOptions {
@@ -75,7 +76,7 @@ android {
// which implementation `DocumentBuilderImpl` is provided by the OS and is not customizable on Android,
// but the implementation on API <19 is not robust enough and fails to build XMP documents
minSdkVersion 19
- targetSdkVersion 33
+ targetSdkVersion 34
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
manifestPlaceholders = [googleApiKey: keystoreProperties["googleApiKey"] ?: "",
@@ -175,10 +176,10 @@ android {
tasks.withType(KotlinCompile).configureEach {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
+}
- kotlinOptions {
- jvmTarget = '1.8'
- }
+kotlin {
+ jvmToolchain(8)
}
flutter {
@@ -202,7 +203,7 @@ repositories {
}
dependencies {
- implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1'
+ 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'
@@ -224,7 +225,7 @@ dependencies {
// - https://jitpack.io/p/deckerst/Android-TiffBitmapFactory
// - https://jitpack.io/p/deckerst/mp4parser
// - https://jitpack.io/p/deckerst/pixymeta-android
- implementation 'com.github.deckerst:Android-TiffBitmapFactory:876e53870a'
+ implementation 'com.github.deckerst:Android-TiffBitmapFactory:90c06eebf4'
implementation 'com.github.deckerst.mp4parser:isoparser:4cc0c5d06c'
implementation 'com.github.deckerst.mp4parser:muxer:4cc0c5d06c'
implementation 'com.github.deckerst:pixymeta-android:706bd73d6e'
@@ -232,10 +233,10 @@ dependencies {
// huawei flavor only
huaweiImplementation "com.huawei.agconnect:agconnect-core:$huawei_agconnect_version"
- testImplementation "org.junit.jupiter:junit-jupiter-engine:5.9.2"
+ testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.0'
kapt 'androidx.annotation:annotation:1.6.0'
- kapt "com.github.bumptech.glide:compiler:$glide_version"
+ ksp "com.github.bumptech.glide:ksp:$glide_version"
compileOnly rootProject.findProject(':streams_channel')
}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index a8084c988..d5193fd09 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -15,6 +15,7 @@
TODO TLAD [Android 14 (API 34)] request/handle READ_MEDIA_VISUAL_USER_SELECTED permission
cf https://developer.android.com/about/versions/14/changes/partial-photo-video-access
-->
+
-
+
@@ -295,7 +297,8 @@
-
+
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt
index 1dcc4bd32..ed5d4a2ad 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt
@@ -9,11 +9,13 @@ import deckers.thibault.aves.channel.calls.Coresult.Companion.safe
import deckers.thibault.aves.model.FieldMap
import deckers.thibault.aves.utils.PermissionManager
import deckers.thibault.aves.utils.StorageUtils
+import deckers.thibault.aves.utils.StorageUtils.getFolderSize
import deckers.thibault.aves.utils.StorageUtils.getPrimaryVolumePath
import deckers.thibault.aves.utils.StorageUtils.getVolumePaths
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
+import io.flutter.util.PathUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
@@ -25,6 +27,7 @@ class StorageHandler(private val context: Context) : MethodCallHandler {
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
when (call.method) {
+ "getDataUsage" -> ioScope.launch { safe(call, result, ::getDataUsage) }
"getStorageVolumes" -> ioScope.launch { safe(call, result, ::getStorageVolumes) }
"getVaultRoot" -> ioScope.launch { safe(call, result, ::getVaultRoot) }
"getFreeSpace" -> ioScope.launch { safe(call, result, ::getFreeSpace) }
@@ -39,6 +42,37 @@ class StorageHandler(private val context: Context) : MethodCallHandler {
}
}
+ private fun getDataUsage(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) {
+ var internalCache = getFolderSize(context.cacheDir)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ internalCache += getFolderSize(context.codeCacheDir)
+ }
+ val externalCache = context.externalCacheDirs.map(::getFolderSize).sum()
+
+ val dataDir = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) context.dataDir else File(context.applicationInfo.dataDir)
+
+ val database = getFolderSize(File(dataDir, "databases"))
+ val flutter = getFolderSize(File(PathUtils.getDataDirectory(context)))
+ val vaults = getFolderSize(File(StorageUtils.getVaultRoot(context)))
+ val trash = context.getExternalFilesDirs(null).mapNotNull { StorageUtils.trashDirFor(context, it.path) }.map(::getFolderSize).sum()
+
+ val internalData = getFolderSize(dataDir) - internalCache
+ val externalData = context.getExternalFilesDirs(null).map(::getFolderSize).sum()
+ val miscData = internalData + externalData - (database + flutter + vaults + trash)
+
+ result.success(
+ hashMapOf(
+ "database" to database,
+ "flutter" to flutter,
+ "vaults" to vaults,
+ "trash" to trash,
+ "miscData" to miscData,
+ "internalCache" to internalCache,
+ "externalCache" to externalCache,
+ )
+ )
+ }
+
private fun getStorageVolumes(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) {
val volumes = ArrayList