From c12a670e925ba241dc070258fcffdcb174454876 Mon Sep 17 00:00:00 2001 From: poppingmoon <63451158+poppingmoon@users.noreply.github.com> Date: Sun, 12 Jan 2025 07:56:53 +0900 Subject: [PATCH] feat: clear cache --- lib/i18n/aria/aria.i18n.yaml | 2 ++ lib/i18n/strings.g.dart | 2 +- lib/i18n/strings_en_US.g.dart | 2 ++ lib/provider/api/endpoints_provider.dart | 2 +- lib/provider/api/endpoints_provider.g.dart | 2 +- lib/provider/cache_size_provider.dart | 12 ++++++++++ lib/provider/cache_size_provider.g.dart | 26 ++++++++++++++++++++++ lib/provider/theme_data_provider.dart | 1 + lib/provider/theme_data_provider.g.dart | 2 +- lib/view/page/settings/behavior_page.dart | 26 ++++++++++++++++++++++ pubspec.lock | 2 +- pubspec.yaml | 1 + 12 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 lib/provider/cache_size_provider.dart create mode 100644 lib/provider/cache_size_provider.g.dart diff --git a/lib/i18n/aria/aria.i18n.yaml b/lib/i18n/aria/aria.i18n.yaml index 79205bc68..5a7260643 100644 --- a/lib/i18n/aria/aria.i18n.yaml +++ b/lib/i18n/aria/aria.i18n.yaml @@ -12,6 +12,8 @@ authenticated: "Authenticated" avatarSize: "Avatar size" background: "Background" buttonTypes: "Button types" +calculating: "Calculating..." +clearCache: "Clear cache" confirmBeforeFollow: "Confirm before follow" confirmBeforePost: "Confirm before post" confirmBeforeReact: "Confirm before react" diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index bdf725499..4e8723e98 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,7 +4,7 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 31 -/// Strings: 55899 (1803 per locale) +/// Strings: 55901 (1803 per locale) // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_en_US.g.dart b/lib/i18n/strings_en_US.g.dart index 30f18a3f9..def599bef 100644 --- a/lib/i18n/strings_en_US.g.dart +++ b/lib/i18n/strings_en_US.g.dart @@ -64,6 +64,8 @@ class TranslationsAriaEnUs { String get avatarSize => 'Avatar size'; String get background => 'Background'; String get buttonTypes => 'Button types'; + String get calculating => 'Calculating...'; + String get clearCache => 'Clear cache'; String get confirmBeforeFollow => 'Confirm before follow'; String get confirmBeforePost => 'Confirm before post'; String get confirmBeforeReact => 'Confirm before react'; diff --git a/lib/provider/api/endpoints_provider.dart b/lib/provider/api/endpoints_provider.dart index 4c848acac..f85ee5730 100644 --- a/lib/provider/api/endpoints_provider.dart +++ b/lib/provider/api/endpoints_provider.dart @@ -17,7 +17,7 @@ Stream> endpoints(Ref ref, String host) async* { if (file != null) { try { final s = await file.file.readAsString(); - yield jsonDecode(s) as List; + yield (jsonDecode(s) as List).whereType().toList(); } catch (_) {} } try { diff --git a/lib/provider/api/endpoints_provider.g.dart b/lib/provider/api/endpoints_provider.g.dart index 20f88c30d..bd9cc6d76 100644 --- a/lib/provider/api/endpoints_provider.g.dart +++ b/lib/provider/api/endpoints_provider.g.dart @@ -6,7 +6,7 @@ part of 'endpoints_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$endpointsHash() => r'fc03613363f3b924a991b48bc26784ced45f06ba'; +String _$endpointsHash() => r'2374401fbabe9f83b8e27fc8b5cae40abe46dc06'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/provider/cache_size_provider.dart b/lib/provider/cache_size_provider.dart new file mode 100644 index 000000000..4ae5cffee --- /dev/null +++ b/lib/provider/cache_size_provider.dart @@ -0,0 +1,12 @@ +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'cache_size_provider.g.dart'; + +@riverpod +FutureOr cacheSize(Ref ref) async { + return (await getApplicationCacheDirectory()) + .list(recursive: true) + .fold(0, (acc, entity) => acc + entity.statSync().size); +} diff --git a/lib/provider/cache_size_provider.g.dart b/lib/provider/cache_size_provider.g.dart new file mode 100644 index 000000000..be4fb5bcf --- /dev/null +++ b/lib/provider/cache_size_provider.g.dart @@ -0,0 +1,26 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'cache_size_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$cacheSizeHash() => r'b0ca671e2da6877ebd701406cfedc7fb01174822'; + +/// See also [cacheSize]. +@ProviderFor(cacheSize) +final cacheSizeProvider = AutoDisposeFutureProvider.internal( + cacheSize, + name: r'cacheSizeProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') ? null : _$cacheSizeHash, + dependencies: null, + allTransitiveDependencies: null, +); + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +typedef CacheSizeRef = AutoDisposeFutureProviderRef; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/provider/theme_data_provider.dart b/lib/provider/theme_data_provider.dart index 07c8d58d3..5f026a795 100644 --- a/lib/provider/theme_data_provider.dart +++ b/lib/provider/theme_data_provider.dart @@ -40,6 +40,7 @@ ThemeData themeData(Ref ref, Brightness brightness) { primaryColor: colors.accent, dividerColor: colors.divider, canvasColor: colors.bg, + disabledColor: colors.fg.withValues(alpha: 0.5), scaffoldBackgroundColor: colors.bg, textTheme: ThemeData(brightness: brightness) .textTheme diff --git a/lib/provider/theme_data_provider.g.dart b/lib/provider/theme_data_provider.g.dart index b5318b9dd..8c24c7db6 100644 --- a/lib/provider/theme_data_provider.g.dart +++ b/lib/provider/theme_data_provider.g.dart @@ -6,7 +6,7 @@ part of 'theme_data_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$themeDataHash() => r'd450ca18931f3b7d9c02ee4a0ec5d8dd8a885080'; +String _$themeDataHash() => r'38f8a94e7115801d70a546ebfd35ff2d7e595dcd'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/view/page/settings/behavior_page.dart b/lib/view/page/settings/behavior_page.dart index 0a8eff9e8..8d400b8ba 100644 --- a/lib/view/page/settings/behavior_page.dart +++ b/lib/view/page/settings/behavior_page.dart @@ -1,12 +1,16 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:path_provider/path_provider.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; import '../../../i18n/strings.g.dart'; import '../../../model/general_settings.dart'; +import '../../../provider/cache_size_provider.dart'; import '../../../provider/general_settings_notifier_provider.dart'; +import '../../../util/future_with_dialog.dart'; +import '../../../util/pretty_bytes.dart'; import '../../dialog/radio_dialog.dart'; import '../../widget/general_settings_scaffold.dart'; @@ -16,6 +20,7 @@ class BehaviorPage extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final settings = ref.watch(generalSettingsNotifierProvider); + final cacheSize = ref.watch(cacheSizeProvider); return GeneralSettingsScaffold( appBar: AppBar(title: Text(t.misskey.behavior)), @@ -231,6 +236,27 @@ class BehaviorPage extends ConsumerWidget { .read(generalSettingsNotifierProvider.notifier) .setEnablePredictiveBack(value), ), + ListTile( + title: Text(t.aria.clearCache), + subtitle: Text( + switch (cacheSize) { + AsyncValue(valueOrNull: final cacheSize?) => + prettyBytes(cacheSize), + AsyncValue(error: final _?) => t.misskey.unknown, + _ => t.aria.calculating, + }, + ), + trailing: const Icon(Icons.navigate_next), + enabled: cacheSize.valueOrNull != 0, + onTap: () async { + await futureWithDialog( + context, + getApplicationCacheDirectory() + .then((cacheDir) => cacheDir.delete(recursive: true)), + ); + ref.invalidate(cacheSizeProvider); + }, + ), ], ), selectedDestination: GeneralSettingsDestination.behavior, diff --git a/pubspec.lock b/pubspec.lock index a871f19dc..616e2f9f6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1361,7 +1361,7 @@ packages: source: hosted version: "1.1.0" path_provider: - dependency: transitive + dependency: "direct main" description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" diff --git a/pubspec.yaml b/pubspec.yaml index b172b49aa..ed6f3bcfa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -85,6 +85,7 @@ dependencies: ref: 3f007c360d848c390982e8e739e1ce052091b3aa multi_split_view: ^3.6.0 package_info_plus: ^8.1.2 + path_provider: ^2.1.5 photo_view: ^0.15.0 punycode: ^1.0.0 receive_sharing_intent: