diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0fbb12dc1..a83e49cd4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,10 @@ All notable changes to this project will be documented in this file.
## [v1.8.9] - 2023-06-04
+### Added
+
+- About: data usage
+
### Changed
- target Android 14 (API 34)
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