From ead7adb36c51dbd4ba46e578b65ddae195d42d54 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Mon, 1 Jul 2024 22:48:52 +0200 Subject: [PATCH] about: clearing cache also removes external cache --- .../thibault/aves/channel/calls/StorageHandler.kt | 11 +++++++++-- lib/services/storage_service.dart | 13 +++++++++++++ lib/widgets/about/data_usage.dart | 1 + lib/widgets/viewer/debug/debug_page.dart | 2 +- 4 files changed, 24 insertions(+), 3 deletions(-) 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 4d0001ce0..baee7c5e8 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 @@ -39,6 +39,7 @@ class StorageHandler(private val context: Context) : MethodCallHandler { "revokeDirectoryAccess" -> safe(call, result, ::revokeDirectoryAccess) "deleteEmptyDirectories" -> ioScope.launch { safe(call, result, ::deleteEmptyDirectories) } "deleteTempDirectory" -> ioScope.launch { safe(call, result, ::deleteTempDirectory) } + "deleteExternalCache" -> ioScope.launch { safe(call, result, ::deleteExternalCache) } "canRequestMediaFileBulkAccess" -> safe(call, result, ::canRequestMediaFileBulkAccess) "canInsertMedia" -> safe(call, result, ::canInsertMedia) else -> result.notImplemented() @@ -49,16 +50,17 @@ class StorageHandler(private val context: Context) : MethodCallHandler { var internalCache = getFolderSize(context.cacheDir) internalCache += getFolderSize(context.codeCacheDir) val externalCache = context.externalCacheDirs.map(::getFolderSize).sum() + val externalFilesDirs = context.getExternalFilesDirs(null) 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 trash = externalFilesDirs.mapNotNull { StorageUtils.trashDirFor(context, it.path) }.map(::getFolderSize).sum() val internalData = getFolderSize(dataDir) - internalCache - val externalData = context.getExternalFilesDirs(null).map(::getFolderSize).sum() + val externalData = externalFilesDirs.map(::getFolderSize).sum() val miscData = internalData + externalData - (database + flutter + vaults + trash) result.success( @@ -224,6 +226,11 @@ class StorageHandler(private val context: Context) : MethodCallHandler { result.success(StorageUtils.deleteTempDirectory(context)) } + private fun deleteExternalCache(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + context.externalCacheDirs.filter { it.exists() }.forEach { it.deleteRecursively() } + result.success(true) + } + private fun canRequestMediaFileBulkAccess(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { result.success(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) } diff --git a/lib/services/storage_service.dart b/lib/services/storage_service.dart index 6bf1b681d..78ac5cf97 100644 --- a/lib/services/storage_service.dart +++ b/lib/services/storage_service.dart @@ -33,6 +33,8 @@ abstract class StorageService { Future deleteTempDirectory(); + Future deleteExternalCache(); + // returns whether user granted access to a directory of his choosing Future requestDirectoryAccess(String path); @@ -202,6 +204,17 @@ class PlatformStorageService implements StorageService { return false; } + @override + Future deleteExternalCache() async { + try { + final result = await _platform.invokeMethod('deleteExternalCache'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + @override Future canRequestMediaFileBulkAccess() async { try { diff --git a/lib/widgets/about/data_usage.dart b/lib/widgets/about/data_usage.dart index 39a523762..9ab3dd2b7 100644 --- a/lib/widgets/about/data_usage.dart +++ b/lib/widgets/about/data_usage.dart @@ -87,6 +87,7 @@ class _AboutDataUsageState extends State with FeedbackMixin { label: context.l10n.aboutDataUsageClearCache, onPressed: () async { await storageService.deleteTempDirectory(); + await storageService.deleteExternalCache(); await mediaFetchService.clearSizedThumbnailDiskCache(); imageCache.clear(); _reload(); diff --git a/lib/widgets/viewer/debug/debug_page.dart b/lib/widgets/viewer/debug/debug_page.dart index 7dc76d47d..ef7d1497a 100644 --- a/lib/widgets/viewer/debug/debug_page.dart +++ b/lib/widgets/viewer/debug/debug_page.dart @@ -113,7 +113,7 @@ class ViewerDebugPage extends StatelessWidget { 'isRotated': '${entry.isRotated}', 'isFlipped': '${entry.isFlipped}', 'displayAspectRatio': '${entry.displayAspectRatio}', - 'displaySize': '${entry.displaySize}', + 'displaySize': '${entry.displaySize.width}x${entry.displaySize.height}', }, ), const Divider(),