diff --git a/lib/features/caching/cache_version_client.dart b/lib/features/caching/cache_version_client.dart new file mode 100644 index 000000000..d1501abcb --- /dev/null +++ b/lib/features/caching/cache_version_client.dart @@ -0,0 +1,9 @@ + +abstract class CacheVersionClient { + + String get versionKey; + + Future storeVersion(int newVersion); + + Future getLatestVersion(); +} \ No newline at end of file diff --git a/lib/features/caching/caching_manager.dart b/lib/features/caching/caching_manager.dart index 117b46ab9..3cae1d02e 100644 --- a/lib/features/caching/caching_manager.dart +++ b/lib/features/caching/caching_manager.dart @@ -1,6 +1,7 @@ -import 'package:flutter/foundation.dart'; import 'package:tmail_ui_user/features/caching/account_cache_client.dart'; +import 'package:tmail_ui_user/features/caching/config/cache_version.dart'; import 'package:tmail_ui_user/features/caching/email_cache_client.dart'; +import 'package:tmail_ui_user/features/caching/hive_cache_version_client.dart'; import 'package:tmail_ui_user/features/caching/mailbox_cache_client.dart'; import 'package:tmail_ui_user/features/caching/recent_search_cache_client.dart'; import 'package:tmail_ui_user/features/caching/state_cache_client.dart'; @@ -18,6 +19,7 @@ class CachingManager { final AccountCacheClient _accountCacheClient; final FCMCacheManager _fcmCacheManager; final FCMSubscriptionCacheClient _fcmSubscriptionCacheClient; + final HiveCacheVersionClient _hiveCacheVersionClient; CachingManager( this._mailboxCacheClient, @@ -27,6 +29,7 @@ class CachingManager { this._accountCacheClient, this._fcmCacheManager, this._fcmSubscriptionCacheClient, + this._hiveCacheVersionClient, ); Future clearAll() async { @@ -41,18 +44,26 @@ class CachingManager { ]); } - Future cleanEmailCache() async { - if (kIsWeb) { - await Future.wait([ - _stateCacheClient.deleteItem(StateType.email.value), - _emailCacheClient.clearAllData(), - ]); - } else { - await Future.wait([ - _stateCacheClient.deleteItem(StateType.email.value), - _emailCacheClient.deleteBox(), - ]); - } + Future clearEmailCache() async { + await Future.wait([ + _stateCacheClient.deleteItem(StateType.email.value), + _emailCacheClient.clearAllData(), + ]); + } + + Future clearMailboxCache() async { + await Future.wait([ + _stateCacheClient.deleteItem(StateType.mailbox.value), + _mailboxCacheClient.clearAllData(), + ]); + } + + Future storeCacheVersion() async { + return _hiveCacheVersionClient.storeVersion(CacheVersion.hiveDBVersion); + } + + Future getLatestHiveCacheVersion() { + return _hiveCacheVersionClient.getLatestVersion(); } Future closeHive() async { diff --git a/lib/features/caching/config/cache_version.dart b/lib/features/caching/config/cache_version.dart new file mode 100644 index 000000000..b70541711 --- /dev/null +++ b/lib/features/caching/config/cache_version.dart @@ -0,0 +1,4 @@ + +class CacheVersion { + static const int hiveDBVersion = 1; +} \ No newline at end of file diff --git a/lib/features/caching/hive_cache_version_client.dart b/lib/features/caching/hive_cache_version_client.dart new file mode 100644 index 000000000..fa2cdb534 --- /dev/null +++ b/lib/features/caching/hive_cache_version_client.dart @@ -0,0 +1,33 @@ +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tmail_ui_user/features/caching/cache_version_client.dart'; +import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; + +class HiveCacheVersionClient extends CacheVersionClient { + + final SharedPreferences _sharedPreferences; + final ExceptionThrower _exceptionThrower; + + HiveCacheVersionClient(this._sharedPreferences, this._exceptionThrower); + + @override + String get versionKey => 'HiveCacheVersion'; + + @override + Future getLatestVersion() { + return Future.sync(() { + final latestVersion = _sharedPreferences.getInt(versionKey); + return latestVersion; + }).catchError((error) { + _exceptionThrower.throwException(error); + }); + } + + @override + Future storeVersion(int newVersion) { + return Future.sync(() async { + return await _sharedPreferences.setInt(versionKey, newVersion); + }).catchError((error) { + _exceptionThrower.throwException(error); + }); + } +} \ No newline at end of file diff --git a/lib/features/home/presentation/home_controller.dart b/lib/features/home/presentation/home_controller.dart index 832546d8a..44204dc1b 100644 --- a/lib/features/home/presentation/home_controller.dart +++ b/lib/features/home/presentation/home_controller.dart @@ -8,6 +8,7 @@ import 'package:model/model.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; +import 'package:tmail_ui_user/features/caching/config/cache_version.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/email_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart'; @@ -91,6 +92,8 @@ class HomeController extends BaseController { static void downloadCallback(String id, DownloadTaskStatus status, int progress) {} void _cleanupCache() async { + await _checkCacheVersion(); + await Future.wait([ _cleanupEmailCacheInteractor.execute(EmailCleanupRule(Duration.defaultCacheInternal)), _cleanupRecentSearchCacheInteractor.execute(RecentSearchCleanupRule()), @@ -99,6 +102,19 @@ class HomeController extends BaseController { ]).then((value) => _getAuthenticatedAccount()); } + Future _checkCacheVersion() async { + final latestHiveCacheVersion = await _cachingManager.getLatestHiveCacheVersion(); + log('HomeController::_checkCacheVersion():latestHiveCacheVersion: $latestHiveCacheVersion'); + if (latestHiveCacheVersion == null || latestHiveCacheVersion < CacheVersion.hiveDBVersion) { + await Future.wait([ + _cachingManager.clearMailboxCache(), + _cachingManager.clearEmailCache() + ]); + await _cachingManager.storeCacheVersion(); + } + return Future.value(null); + } + void _getAuthenticatedAccount() async { log('HomeController::_getAuthenticatedAccount()'); consumeState(_getAuthenticatedAccountInteractor.execute()); diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index be4699f81..6c0b90d9f 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -339,7 +339,7 @@ class ThreadController extends BaseController with EmailActionController { void _handleErrorGetAllOrRefreshChangesEmail(dynamic error) async { logError('ThreadController::_handleErrorGetAllOrRefreshChangesEmail():Error: $error'); if (error is CannotCalculateChangesMethodResponseException) { - await _cachingManager.cleanEmailCache(); + await _cachingManager.clearEmailCache(); _getAllEmail(); } else { super.onError(error); diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index 91cfcaed1..514e9a4f6 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -6,6 +6,7 @@ import 'package:tmail_ui_user/features/caching/authentication_info_cache_client. import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/caching/email_cache_client.dart'; import 'package:tmail_ui_user/features/caching/encryption_key_cache_client.dart'; +import 'package:tmail_ui_user/features/caching/hive_cache_version_client.dart'; import 'package:tmail_ui_user/features/caching/mailbox_cache_client.dart'; import 'package:tmail_ui_user/features/caching/recent_login_url_cache_client.dart'; import 'package:tmail_ui_user/features/caching/recent_login_username_cache_client.dart'; @@ -32,8 +33,8 @@ class LocalBindings extends Bindings { @override void dependencies() { - _bindingCaching(); _bindingException(); + _bindingCaching(); } void _bindingCaching() { @@ -60,6 +61,7 @@ class LocalBindings extends Bindings { Get.put(RecentLoginUsernameCacheManager(Get.find())); Get.put(FCMSubscriptionCacheClient()); Get.put(FCMCacheManager(Get.find(),Get.find())); + Get.put(HiveCacheVersionClient(Get.find(), Get.find())); Get.put(CachingManager( Get.find(), Get.find(), @@ -68,6 +70,7 @@ class LocalBindings extends Bindings { Get.find(), Get.find(), Get.find(), + Get.find() )); Get.put(SharePreferenceSpamReportDataSource(Get.find())); }