From 45cd1c3613642d17a7d98c93fba1275b84740ff9 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 18 Jun 2025 00:57:30 +0700 Subject: [PATCH] Use `Hive CE` database to replace `Hive` database Signed-off-by: dab246 --- docs/adr/0066-synchronize-caching.md | 33 +++++++++++++++++ .../upgrade_hive_database_steps_v17.dart | 17 +++++++++ lib/features/caching/caching_manager.dart | 17 --------- .../caching/config/cache_version.dart | 2 +- .../config/fcm_isolate_nam_server.dart | 19 ++++++++++ .../caching/config/hive_cache_client.dart | 36 ++++++++++--------- .../caching/config/hive_cache_config.dart | 27 ++++++++------ .../home/data/model/session_hive_obj.dart | 2 +- .../login/data/model/account_cache.dart | 2 +- .../data/model/authentication_info_cache.dart | 2 +- .../data/model/encryption_key_cache.dart | 2 +- .../data/model/oidc_configuration_cache.dart | 2 +- .../data/model/recent_login_url_cache.dart | 2 +- .../model/recent_login_username_cache.dart | 2 +- .../login/data/model/token_oidc_cache.dart | 2 +- .../mailbox/data/model/mailbox_cache.dart | 2 +- .../data/model/mailbox_rights_cache.dart | 2 +- .../mailbox/data/model/state_cache.dart | 2 +- .../mailbox/data/model/state_type.dart | 2 +- .../data/model/recent_search_cache.dart | 2 +- .../hive_worker/hive_worker_queue.dart | 2 +- .../manager/new_email_cache_manager.dart | 4 +-- .../model/attachment_hive_cache.dart | 2 +- .../model/detailed_email_hive_cache.dart | 2 +- .../model/email_header_hive_cache.dart | 2 +- .../model/sending_email_hive_cache.dart | 2 +- .../model/firebase_registration_cache.dart | 2 +- .../controller/web_socket_controller.dart | 3 ++ .../extensions/email_cache_extension.dart | 4 --- .../data/model/email_address_hive_cache.dart | 2 +- .../thread/data/model/email_cache.dart | 2 +- .../localizations/localization_service.dart | 1 - pubspec.lock | 23 ++++++++++-- pubspec.yaml | 10 +++++- .../local/memory_account_cache_client.dart | 6 ++-- 35 files changed, 163 insertions(+), 81 deletions(-) create mode 100644 docs/adr/0066-synchronize-caching.md create mode 100644 lib/features/base/upgradeable/upgrade_hive_database_steps_v17.dart create mode 100644 lib/features/caching/config/fcm_isolate_nam_server.dart diff --git a/docs/adr/0066-synchronize-caching.md b/docs/adr/0066-synchronize-caching.md new file mode 100644 index 000000000..5eab91f97 --- /dev/null +++ b/docs/adr/0066-synchronize-caching.md @@ -0,0 +1,33 @@ +# 66. Synchronize caching + +Date: 2025-06-18 + +## Status + +Accepted + +## Context + +Synchronizing server and database data is quite troublesome, +when we use many protocols to receive mails (FCM, WebSocket, Memory operator). +In addition, we are using `Hive` database to store data, +it does not support multiple isolate to access the database. +This leads to inconsistent database data, sometimes corrupted and lost data. + +## Decision + +To overcome this problem we need a database that can support multiple isolate. +So we need to use [Hive_CE](https://pub.dev/packages/hive_ce) to replace `Hive` database. +Hive CE is a spiritual continuation of Hive v2 with the following new features, such as: + + - Isolate support through IsolatedHive + - Automatic type adapter generation using the GenerateAdapters annotation + - No more manually adding annotations to every type and field + - Generate adapters for classes outside the current package + - A HiveRegistrar extension that lets you register all your generated adapters in one call + - Extends the maximum type ID from 223 to 65439 + ... + +## Consequences + +- Data is always synchronized with the latest diff --git a/lib/features/base/upgradeable/upgrade_hive_database_steps_v17.dart b/lib/features/base/upgradeable/upgrade_hive_database_steps_v17.dart new file mode 100644 index 000000000..f551abceb --- /dev/null +++ b/lib/features/base/upgradeable/upgrade_hive_database_steps_v17.dart @@ -0,0 +1,17 @@ + +import 'package:tmail_ui_user/features/base/upgradeable/upgrade_database_steps.dart'; +import 'package:tmail_ui_user/features/caching/caching_manager.dart'; + +class UpgradeHiveDatabaseStepsV16 extends UpgradeDatabaseSteps { + + final CachingManager _cachingManager; + + UpgradeHiveDatabaseStepsV16(this._cachingManager); + + @override + Future onUpgrade(int oldVersion, int newVersion) async { + if (oldVersion > 0 && oldVersion < newVersion && newVersion == 17) { + await _cachingManager.clearAll(); + } + } +} \ No newline at end of file diff --git a/lib/features/caching/caching_manager.dart b/lib/features/caching/caching_manager.dart index 34250e2c8..34583d654 100644 --- a/lib/features/caching/caching_manager.dart +++ b/lib/features/caching/caching_manager.dart @@ -87,23 +87,6 @@ class CachingManager { ], eagerError: true); } - Future clearData() async { - await Future.wait([ - _stateCacheClient.clearAllData(), - _mailboxCacheClient.clearAllData(), - _emailCacheClient.clearAllData(), - _fcmCacheClient.clearAllData(), - _firebaseRegistrationCacheClient.clearAllData(), - _localSpamReportManager.clear(), - if (PlatformInfo.isMobile) - ...[ - _newEmailHiveCacheClient.clearAllData(), - _openedEmailHiveCacheClient.clearAllData(), - _sendingEmailCacheManager.clearAllSendingEmails(), - ] - ], eagerError: true); - } - Future clearEmailAndStateCache({AccountId? accountId, UserName? userName}) { log('CachingManager::clearEmailAndStateCache:userName = $userName'); if (accountId != null && userName != null) { diff --git a/lib/features/caching/config/cache_version.dart b/lib/features/caching/config/cache_version.dart index e5cee9e79..c79ad831a 100644 --- a/lib/features/caching/config/cache_version.dart +++ b/lib/features/caching/config/cache_version.dart @@ -1,4 +1,4 @@ class CacheVersion { - static const int hiveDBVersion = 16; + static const int hiveDBVersion = 17; } \ No newline at end of file diff --git a/lib/features/caching/config/fcm_isolate_nam_server.dart b/lib/features/caching/config/fcm_isolate_nam_server.dart new file mode 100644 index 000000000..6ffe5547e --- /dev/null +++ b/lib/features/caching/config/fcm_isolate_nam_server.dart @@ -0,0 +1,19 @@ +import 'dart:ui' as flutter; + +import 'package:hive_ce/hive.dart'; + +class FcmIsolateNameServer extends IsolateNameServer { + const FcmIsolateNameServer(); + + @override + dynamic lookupPortByName(String name) => + flutter.IsolateNameServer.lookupPortByName(name); + + @override + bool registerPortWithName(dynamic port, String name) => + flutter.IsolateNameServer.registerPortWithName(port, name); + + @override + bool removePortNameMapping(String name) => + flutter.IsolateNameServer.removePortNameMapping(name); +} diff --git a/lib/features/caching/config/hive_cache_client.dart b/lib/features/caching/config/hive_cache_client.dart index 9eb485bce..568d67c13 100644 --- a/lib/features/caching/config/hive_cache_client.dart +++ b/lib/features/caching/config/hive_cache_client.dart @@ -2,7 +2,7 @@ import 'dart:typed_data'; import 'package:core/presentation/extensions/map_extensions.dart'; import 'package:core/utils/app_logger.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart'; @@ -14,20 +14,20 @@ abstract class HiveCacheClient { Future _getEncryptionKey() => HiveCacheConfig.instance.getEncryptionKey(); - Future> openBox() async { - if (Hive.isBoxOpen(tableName)) { - return Hive.box(tableName); + Future> openBox() async { + if (IsolatedHive.isBoxOpen(tableName)) { + return IsolatedHive.box(tableName); } else { - return Hive.openBox(tableName); + return IsolatedHive.openBox(tableName); } } - Future> openBoxEncryption() async { + Future> openBoxEncryption() async { final encryptionKey = await _getEncryptionKey(); - if (Hive.isBoxOpen(tableName)) { - return Hive.box(tableName); + if (IsolatedHive.isBoxOpen(tableName)) { + return IsolatedHive.box(tableName); } else { - return Hive.openBox(tableName, + return IsolatedHive.openBox(tableName, encryptionCipher: encryptionKey != null ? HiveAesCipher(encryptionKey) : null); } @@ -66,7 +66,8 @@ abstract class HiveCacheClient { Future> getAll() { return Future.sync(() async { final boxItem = encryption ? await openBoxEncryption() : await openBox(); - return boxItem.values.toList(); + final items = await boxItem.values; + return items.toList(); }).catchError((error) { throw error; }); @@ -75,7 +76,8 @@ abstract class HiveCacheClient { Future> getListByNestedKey(String nestedKey) { return Future.sync(() async { final boxItem = encryption ? await openBoxEncryption() : await openBox(); - final listItem = boxItem.toMap() + final mapItems = await boxItem.toMap(); + final listItem = mapItems .where((key, value) => _matchedNestedKey(key, nestedKey)) .values .toList(); @@ -89,7 +91,8 @@ abstract class HiveCacheClient { Future> getValuesByListKey(List listKeys) { return Future.sync(() async { final boxItem = encryption ? await openBoxEncryption() : await openBox(); - return boxItem.toMap() + final mapItems = await boxItem.toMap(); + return mapItems .where((key, value) => listKeys.contains(key)) .values .toList(); @@ -154,7 +157,7 @@ abstract class HiveCacheClient { } Future deleteBox() { - return Hive.deleteBoxFromDisk(tableName); + return IsolatedHive.deleteBoxFromDisk(tableName); } Future clearAllData() { @@ -171,7 +174,8 @@ abstract class HiveCacheClient { Future clearAllDataContainKey(String nestedKey) { return Future.sync(() async { final boxItem = encryption ? await openBoxEncryption() : await openBox(); - final listKeys = boxItem.toMap() + final mapItems = await boxItem.toMap(); + final listKeys = mapItems .where((key, value) => _matchedNestedKey(key, nestedKey)) .keys; log('$runtimeType::clearAllDataContainKey:listKeys: ${listKeys.length}'); @@ -182,8 +186,8 @@ abstract class HiveCacheClient { } Future closeBox() async { - if (Hive.isBoxOpen(tableName)) { - await Hive.box(tableName).close(); + if (IsolatedHive.isBoxOpen(tableName)) { + await IsolatedHive.box(tableName).close(); } return Future.value(); } diff --git a/lib/features/caching/config/hive_cache_config.dart b/lib/features/caching/config/hive_cache_config.dart index a8762f9b9..327135cfd 100644 --- a/lib/features/caching/config/hive_cache_config.dart +++ b/lib/features/caching/config/hive_cache_config.dart @@ -4,7 +4,7 @@ import 'dart:typed_data'; import 'package:core/utils/app_logger.dart'; import 'package:core/utils/platform_info.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:path_provider/path_provider.dart' as path_provider; import 'package:tmail_ui_user/features/base/upgradeable/upgrade_hive_database_steps_v10.dart'; import 'package:tmail_ui_user/features/base/upgradeable/upgrade_hive_database_steps_v11.dart'; @@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/base/upgradeable/upgrade_hive_database_st import 'package:tmail_ui_user/features/base/upgradeable/upgrade_hive_database_steps_v7.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/caching/config/fcm_isolate_nam_server.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/home/data/model/session_hive_obj.dart'; import 'package:tmail_ui_user/features/login/data/local/encryption_key_cache_manager.dart'; @@ -55,14 +56,17 @@ class HiveCacheConfig { } Future initializeDatabase({String? databasePath}) async { - if (databasePath != null) { - Hive.init(databasePath); - } else { - if (PlatformInfo.isMobile) { - Directory directory = await path_provider.getApplicationDocumentsDirectory(); - Hive.init(directory.path); - } + if (databasePath == null && PlatformInfo.isMobile) { + Directory directory = await path_provider.getApplicationDocumentsDirectory(); + databasePath = directory.path; } + + if (databasePath == null) return; + + await IsolatedHive.init( + databasePath, + isolateNameServer: const FcmIsolateNameServer(), + ); } Future onUpgradeDatabase(CachingManager cachingManager) async { @@ -78,6 +82,7 @@ class HiveCacheConfig { await UpgradeHiveDatabaseStepsV14(cachingManager).onUpgrade(oldVersion, newVersion); await UpgradeHiveDatabaseStepsV15(cachingManager).onUpgrade(oldVersion, newVersion); await UpgradeHiveDatabaseStepsV16(cachingManager).onUpgrade(oldVersion, newVersion); + await UpgradeHiveDatabaseStepsV16(cachingManager).onUpgrade(oldVersion, newVersion); if (oldVersion != newVersion) { await cachingManager.storeCacheVersion(newVersion); @@ -201,12 +206,12 @@ class HiveCacheConfig { } void registerCacheAdapter(TypeAdapter typeAdapter, int typeId) { - if (!Hive.isAdapterRegistered(typeId)) { - Hive.registerAdapter(typeAdapter); + if (!IsolatedHive.isAdapterRegistered(typeId)) { + IsolatedHive.registerAdapter(typeAdapter); } } Future closeHive() async { - return await Hive.close(); + return await IsolatedHive.close(); } } \ No newline at end of file diff --git a/lib/features/home/data/model/session_hive_obj.dart b/lib/features/home/data/model/session_hive_obj.dart index 3d0e8b51f..8fb61f309 100644 --- a/lib/features/home/data/model/session_hive_obj.dart +++ b/lib/features/home/data/model/session_hive_obj.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'session_hive_obj.g.dart'; diff --git a/lib/features/login/data/model/account_cache.dart b/lib/features/login/data/model/account_cache.dart index 5553d78b5..052beae5d 100644 --- a/lib/features/login/data/model/account_cache.dart +++ b/lib/features/login/data/model/account_cache.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'account_cache.g.dart'; diff --git a/lib/features/login/data/model/authentication_info_cache.dart b/lib/features/login/data/model/authentication_info_cache.dart index 6dd9ac7b9..ae16c8f22 100644 --- a/lib/features/login/data/model/authentication_info_cache.dart +++ b/lib/features/login/data/model/authentication_info_cache.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'authentication_info_cache.g.dart'; diff --git a/lib/features/login/data/model/encryption_key_cache.dart b/lib/features/login/data/model/encryption_key_cache.dart index 2d3752ac1..86c6143ca 100644 --- a/lib/features/login/data/model/encryption_key_cache.dart +++ b/lib/features/login/data/model/encryption_key_cache.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'encryption_key_cache.g.dart'; diff --git a/lib/features/login/data/model/oidc_configuration_cache.dart b/lib/features/login/data/model/oidc_configuration_cache.dart index 4ba5afac7..086abfa17 100644 --- a/lib/features/login/data/model/oidc_configuration_cache.dart +++ b/lib/features/login/data/model/oidc_configuration_cache.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'oidc_configuration_cache.g.dart'; diff --git a/lib/features/login/data/model/recent_login_url_cache.dart b/lib/features/login/data/model/recent_login_url_cache.dart index ade8336b5..78f8207b6 100644 --- a/lib/features/login/data/model/recent_login_url_cache.dart +++ b/lib/features/login/data/model/recent_login_url_cache.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:jmap_dart_client/jmap/core/extensions/date_time_extension.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart'; diff --git a/lib/features/login/data/model/recent_login_username_cache.dart b/lib/features/login/data/model/recent_login_username_cache.dart index d6a74b72a..9845df52d 100644 --- a/lib/features/login/data/model/recent_login_username_cache.dart +++ b/lib/features/login/data/model/recent_login_username_cache.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:jmap_dart_client/jmap/core/extensions/date_time_extension.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/login/domain/model/recent_login_username.dart'; diff --git a/lib/features/login/data/model/token_oidc_cache.dart b/lib/features/login/data/model/token_oidc_cache.dart index 26b738bf9..a1924a6c5 100644 --- a/lib/features/login/data/model/token_oidc_cache.dart +++ b/lib/features/login/data/model/token_oidc_cache.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'token_oidc_cache.g.dart'; diff --git a/lib/features/mailbox/data/model/mailbox_cache.dart b/lib/features/mailbox/data/model/mailbox_cache.dart index 4463e7e45..a40b5aa7f 100644 --- a/lib/features/mailbox/data/model/mailbox_cache.dart +++ b/lib/features/mailbox/data/model/mailbox_cache.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_rights_cache.dart'; diff --git a/lib/features/mailbox/data/model/mailbox_rights_cache.dart b/lib/features/mailbox/data/model/mailbox_rights_cache.dart index 5baeacbd1..3b78810c4 100644 --- a/lib/features/mailbox/data/model/mailbox_rights_cache.dart +++ b/lib/features/mailbox/data/model/mailbox_rights_cache.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'mailbox_rights_cache.g.dart'; diff --git a/lib/features/mailbox/data/model/state_cache.dart b/lib/features/mailbox/data/model/state_cache.dart index f31ed5f3d..fd641718d 100644 --- a/lib/features/mailbox/data/model/state_cache.dart +++ b/lib/features/mailbox/data/model/state_cache.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart'; diff --git a/lib/features/mailbox/data/model/state_type.dart b/lib/features/mailbox/data/model/state_type.dart index c182774df..a799b94df 100644 --- a/lib/features/mailbox/data/model/state_type.dart +++ b/lib/features/mailbox/data/model/state_type.dart @@ -1,5 +1,5 @@ -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:model/extensions/account_id_extensions.dart'; diff --git a/lib/features/mailbox_dashboard/data/model/recent_search_cache.dart b/lib/features/mailbox_dashboard/data/model/recent_search_cache.dart index b183b997f..f65758ebb 100644 --- a/lib/features/mailbox_dashboard/data/model/recent_search_cache.dart +++ b/lib/features/mailbox_dashboard/data/model/recent_search_cache.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:jmap_dart_client/jmap/core/extensions/date_time_extension.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; diff --git a/lib/features/offline_mode/hive_worker/hive_worker_queue.dart b/lib/features/offline_mode/hive_worker/hive_worker_queue.dart index f1188ce4d..1b52c7d7c 100644 --- a/lib/features/offline_mode/hive_worker/hive_worker_queue.dart +++ b/lib/features/offline_mode/hive_worker/hive_worker_queue.dart @@ -36,7 +36,7 @@ abstract class WorkerQueue { } void _handleTaskExecuteCompleted(dynamic value) { - log('WorkerQueue<$workerName>::_handleTaskExecuteCompleted(): $value'); + log('WorkerQueue<$workerName>::_handleTaskExecuteCompleted():'); completer?.complete(); _releaseCompleter(); if (queue.isNotEmpty) { diff --git a/lib/features/offline_mode/manager/new_email_cache_manager.dart b/lib/features/offline_mode/manager/new_email_cache_manager.dart index 5a143df0b..14855f6b2 100644 --- a/lib/features/offline_mode/manager/new_email_cache_manager.dart +++ b/lib/features/offline_mode/manager/new_email_cache_manager.dart @@ -25,7 +25,7 @@ class NewEmailCacheManager { DetailedEmailHiveCache detailedEmailCache ) async { final listDetailedEmails = await getAllDetailedEmails(accountId, userName); - log('NewEmailCacheManager::storeDetailedNewEmail():listDetailedEmails: $listDetailedEmails'); + log('NewEmailCacheManager::storeDetailedNewEmail(): length of listDetailedEmails is ${listDetailedEmails.length}'); if (listDetailedEmails.length >= CachingConstants.maxNumberNewEmailsForOffline) { final lastElementsListEmail = listDetailedEmails.sublist(CachingConstants.maxNumberNewEmailsForOffline - 1); for (var email in lastElementsListEmail) { @@ -34,10 +34,8 @@ class NewEmailCacheManager { } await removeDetailedEmail(accountId, userName, email.emailId); } - log('NewEmailCacheManager::storeDetailedNewEmail(): DELETE COMPLETED'); } await insertDetailedEmail(accountId, userName, detailedEmailCache); - log('NewEmailCacheManager::storeDetailedNewEmail(): INSERT COMPLETED'); return detailedEmailCache; } diff --git a/lib/features/offline_mode/model/attachment_hive_cache.dart b/lib/features/offline_mode/model/attachment_hive_cache.dart index 2d0985d8a..0210841dd 100644 --- a/lib/features/offline_mode/model/attachment_hive_cache.dart +++ b/lib/features/offline_mode/model/attachment_hive_cache.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'attachment_hive_cache.g.dart'; diff --git a/lib/features/offline_mode/model/detailed_email_hive_cache.dart b/lib/features/offline_mode/model/detailed_email_hive_cache.dart index a69da37c1..38712295a 100644 --- a/lib/features/offline_mode/model/detailed_email_hive_cache.dart +++ b/lib/features/offline_mode/model/detailed_email_hive_cache.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/offline_mode/model/email_header_hive_cache.dart'; diff --git a/lib/features/offline_mode/model/email_header_hive_cache.dart b/lib/features/offline_mode/model/email_header_hive_cache.dart index 09db0f6e6..7b17fc42c 100644 --- a/lib/features/offline_mode/model/email_header_hive_cache.dart +++ b/lib/features/offline_mode/model/email_header_hive_cache.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'email_header_hive_cache.g.dart'; diff --git a/lib/features/offline_mode/model/sending_email_hive_cache.dart b/lib/features/offline_mode/model/sending_email_hive_cache.dart index 34cdce08d..273c154e7 100644 --- a/lib/features/offline_mode/model/sending_email_hive_cache.dart +++ b/lib/features/offline_mode/model/sending_email_hive_cache.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'sending_email_hive_cache.g.dart'; diff --git a/lib/features/push_notification/data/model/firebase_registration_cache.dart b/lib/features/push_notification/data/model/firebase_registration_cache.dart index f91c21b6b..83413e2c5 100644 --- a/lib/features/push_notification/data/model/firebase_registration_cache.dart +++ b/lib/features/push_notification/data/model/firebase_registration_cache.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'firebase_registration_cache.g.dart'; diff --git a/lib/features/push_notification/presentation/controller/web_socket_controller.dart b/lib/features/push_notification/presentation/controller/web_socket_controller.dart index 68566ba0c..5589a230c 100644 --- a/lib/features/push_notification/presentation/controller/web_socket_controller.dart +++ b/lib/features/push_notification/presentation/controller/web_socket_controller.dart @@ -183,6 +183,7 @@ class WebSocketController extends PushBaseController { } void _enableWebSocketPush() { + log('WebSocketController::_enableWebSocketPush:'); _webSocketChannel?.sink.add(jsonEncode(WebSocketPushEnableRequest.toJson( dataTypes: [TypeName.emailType, TypeName.mailboxType] ))); @@ -197,6 +198,7 @@ class WebSocketController extends PushBaseController { } void _listenToWebSocket() { + log('WebSocketController::_listenToWebSocket:'); _webSocketSubscription = _webSocketChannel?.stream.listen( (data) { log('WebSocketController::_listenToWebSocket(): $data'); @@ -225,6 +227,7 @@ class WebSocketController extends PushBaseController { } void _initStateChangeDeouncerTimer() { + log('WebSocketController::_initStateChangeDeouncerTimer:'); _stateChangeDebouncer = Debouncer( const Duration(milliseconds: FcmUtils.durationMessageComing), initialValue: null, diff --git a/lib/features/thread/data/extensions/email_cache_extension.dart b/lib/features/thread/data/extensions/email_cache_extension.dart index 9c8ab6de7..31d6f9fe7 100644 --- a/lib/features/thread/data/extensions/email_cache_extension.dart +++ b/lib/features/thread/data/extensions/email_cache_extension.dart @@ -56,16 +56,12 @@ extension EmailCacheExtension on EmailCache { bool expireTimeCaching(EmailCleanupRule cleanupRule) { final currentTime = DateTime.now(); - log('EmailCacheExtension::expireTimeCaching():currentTime: $currentTime | receivedAt: $receivedAt'); if (receivedAt != null) { final countDay = currentTime.daysBetween(receivedAt!.toLocal()); - log('EmailCacheExtension::expireTimeCaching():countDay: $countDay | cleanupRule.cachingEmailPeriod.countDay: ${cleanupRule.cachingEmailPeriod.countDay}'); if (countDay >= cleanupRule.cachingEmailPeriod.countDay) { - log('EmailCacheExtension::expireTimeCaching():true'); return true; } } - log('EmailCacheExtension::expireTimeCaching():false'); return false; } } \ No newline at end of file diff --git a/lib/features/thread/data/model/email_address_hive_cache.dart b/lib/features/thread/data/model/email_address_hive_cache.dart index c44732201..7ceed76ad 100644 --- a/lib/features/thread/data/model/email_address_hive_cache.dart +++ b/lib/features/thread/data/model/email_address_hive_cache.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'email_address_hive_cache.g.dart'; diff --git a/lib/features/thread/data/model/email_cache.dart b/lib/features/thread/data/model/email_cache.dart index 989628ca4..de5fc69e1 100644 --- a/lib/features/thread/data/model/email_cache.dart +++ b/lib/features/thread/data/model/email_cache.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_address_hive_cache.dart'; diff --git a/lib/main/localizations/localization_service.dart b/lib/main/localizations/localization_service.dart index 4a8b4f529..b500d20a9 100644 --- a/lib/main/localizations/localization_service.dart +++ b/lib/main/localizations/localization_service.dart @@ -43,7 +43,6 @@ class LocalizationService extends Translations { static Locale getLocaleFromLanguage({String? langCode}) { try { final languageCacheManager = getBinding(); - log('LocalizationService::_getLocaleFromLanguage:languageCacheManager: $languageCacheManager'); final localeStored = languageCacheManager?.getStoredLanguage(); log('LocalizationService::_getLocaleFromLanguage():localeStored: $localeStored'); final localeSelected = supportedLocales.firstWhereOrNull( diff --git a/pubspec.lock b/pubspec.lock index e3216d186..8daa6fa39 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1224,13 +1224,22 @@ packages: source: hosted version: "2.1.0" hive: + dependency: "direct overridden" + description: + path: "overrides/hive" + ref: "18f92b53295e9eb77ebd4830d905a72cd404a126" + resolved-ref: "18f92b53295e9eb77ebd4830d905a72cd404a126" + url: "https://github.com/IO-Design-Team/hive_ce" + source: git + version: "0.0.0" + hive_ce: dependency: "direct main" description: - name: hive - sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + name: hive_ce + sha256: "708bb39050998707c5d422752159f91944d3c81ab42d80e1bd0ee37d8e130658" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.11.3" hive_generator: dependency: "direct dev" description: @@ -1344,6 +1353,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + isolate_channel: + dependency: transitive + description: + name: isolate_channel + sha256: f3d36f783b301e6b312c3450eeb2656b0e7d1db81331af2a151d9083a3f6b18d + url: "https://pub.dev" + source: hosted + version: "0.2.2+1" jmap_dart_client: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 2774ead42..dac2c8779 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -154,7 +154,7 @@ dependencies: share_plus: 7.2.1 - hive: 2.2.3 + hive_ce: 2.11.3 pointer_interceptor: 0.10.1+2 @@ -309,6 +309,14 @@ dependency_overrides: url: https://github.com/linagora/flutter_file_picker.git ref: v0.8.5-twake-mail + # TODO: Due conflict version of hive_ce_generator with other dependencies + # So we will remove it when found the appropriate version + hive: + git: + url: https://github.com/IO-Design-Team/hive_ce + ref: 18f92b53295e9eb77ebd4830d905a72cd404a126 + path: overrides/hive + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/test/features/login/data/local/memory_account_cache_client.dart b/test/features/login/data/local/memory_account_cache_client.dart index 1005ba1d2..82a8a3bd0 100644 --- a/test/features/login/data/local/memory_account_cache_client.dart +++ b/test/features/login/data/local/memory_account_cache_client.dart @@ -1,4 +1,4 @@ -import 'package:hive/hive.dart'; +import 'package:hive_ce/hive.dart'; import 'package:tmail_ui_user/features/caching/clients/account_cache_client.dart'; import 'package:tmail_ui_user/features/login/data/model/account_cache.dart'; @@ -83,12 +83,12 @@ class MemoryAccountCacheClient implements AccountCacheClient { } @override - Future> openBox() { + Future> openBox() { throw UnimplementedError(); } @override - Future> openBoxEncryption() { + Future> openBoxEncryption() { throw UnimplementedError(); }