Skip to content

Commit

Permalink
Close hive boxes in Background (notificaiton)
Browse files Browse the repository at this point in the history
  • Loading branch information
hoangdat committed Jul 16, 2024
1 parent 6af7e03 commit e7b546c
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 30 deletions.
28 changes: 14 additions & 14 deletions lib/features/base/base_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ abstract class BaseController extends GetxController
(failure) {
if (failure is FeatureFailure) {
final exception = _performFilterExceptionInError(failure.exception);
logError('BaseController::onData:exception: $exception');
logError('$runtimeType::onData:exception: $exception');
if (exception != null) {
handleExceptionAction(failure: failure, exception: exception);
} else {
Expand All @@ -120,7 +120,7 @@ abstract class BaseController extends GetxController
}

void onError(Object error, StackTrace stackTrace) {
logError('BaseController::onError():error: $error | stackTrace: $stackTrace');
logError('$runtimeType::onError():error: $error | stackTrace: $stackTrace');
final exception = _performFilterExceptionInError(error);
if (exception != null) {
handleExceptionAction(exception: exception);
Expand All @@ -132,7 +132,7 @@ abstract class BaseController extends GetxController
void onDone() {}

Exception? _performFilterExceptionInError(dynamic error) {
logError('BaseController::_performFilterExceptionInError(): $error');
logError('$runtimeType::_performFilterExceptionInError(): $error');
if (error is NoNetworkError || error is ConnectionTimeout || error is InternalServerError) {
if (PlatformInfo.isWeb && currentOverlayContext != null && currentContext != null) {
appToast.showToastMessage(
Expand All @@ -157,7 +157,7 @@ abstract class BaseController extends GetxController
void handleErrorViewState(Object error, StackTrace stackTrace) {}

void handleExceptionAction({Failure? failure, Exception? exception}) {
logError('BaseController::handleExceptionAction():failure: $failure | exception: $exception');
logError('$runtimeType::handleExceptionAction():failure: $failure | exception: $exception');
if (exception is ConnectionError) {
if (currentOverlayContext != null && currentContext != null) {
appToast.showToastErrorMessage(
Expand All @@ -183,7 +183,7 @@ abstract class BaseController extends GetxController
}

void handleFailureViewState(Failure failure) async {
logError('BaseController::handleFailureViewState(): ${failure.runtimeType}');
logError('$runtimeType::handleFailureViewState(): ${failure.runtimeType}');
if (failure is LogoutOidcFailure) {
if (_isFcmEnabled) {
_getStoredFirebaseRegistrationFromCache();
Expand All @@ -197,7 +197,7 @@ abstract class BaseController extends GetxController
}

void handleSuccessViewState(Success success) async {
log('BaseController::handleSuccessViewState(): ${success.runtimeType}');
log('$runtimeType::handleSuccessViewState(): ${success.runtimeType}');
if (success is LogoutOidcSuccess) {
if (_isFcmEnabled) {
_getStoredFirebaseRegistrationFromCache();
Expand All @@ -214,7 +214,7 @@ abstract class BaseController extends GetxController
void startFpsMeter() {
FpsManager().start();
fpsCallback = (fpsInfo) {
log('BaseController::startFpsMeter(): $fpsInfo');
log('$runtimeType::startFpsMeter(): $fpsInfo');
};
if (fpsCallback != null) {
FpsManager().addFpsCallback(fpsCallback!);
Expand All @@ -234,7 +234,7 @@ abstract class BaseController extends GetxController
requireCapability(session!, accountId!, [tmailContactCapabilityIdentifier]);
TMailAutoCompleteBindings().dependencies();
} catch (e) {
logError('BaseController::injectAutoCompleteBindings(): exception: $e');
logError('$runtimeType::injectAutoCompleteBindings(): exception: $e');
}
}

Expand All @@ -243,7 +243,7 @@ abstract class BaseController extends GetxController
requireCapability(session!, accountId!, [CapabilityIdentifier.jmapMdn]);
MdnInteractorBindings().dependencies();
} catch(e) {
logError('BaseController::injectMdnBindings(): exception: $e');
logError('$runtimeType::injectMdnBindings(): exception: $e');
}
}

Expand All @@ -252,7 +252,7 @@ abstract class BaseController extends GetxController
requireCapability(session!, accountId!, [capabilityForward]);
ForwardingInteractorsBindings().dependencies();
} catch(e) {
logError('BaseController::injectForwardBindings(): exception: $e');
logError('$runtimeType::injectForwardBindings(): exception: $e');
}
}

Expand All @@ -261,14 +261,14 @@ abstract class BaseController extends GetxController
requireCapability(session!, accountId!, [capabilityRuleFilter]);
EmailRulesInteractorBindings().dependencies();
} catch(e) {
logError('BaseController::injectRuleFilterBindings(): exception: $e');
logError('$runtimeType::injectRuleFilterBindings(): exception: $e');
}
}

Future<void> injectFCMBindings(Session? session, AccountId? accountId) async {
try {
requireCapability(session!, accountId!, [FirebaseCapability.fcmIdentifier]);
log('BaseController::injectFCMBindings: fcmAvailable = ${AppConfig.fcmAvailable}');
log('$runtimeType::injectFCMBindings: fcmAvailable = ${AppConfig.fcmAvailable}');
if (AppConfig.fcmAvailable) {
final mapEnvData = Map<String, String>.from(dotenv.env);
await AppUtils.loadFcmConfigFileToEnv(currentMapEnvData: mapEnvData);
Expand All @@ -285,7 +285,7 @@ abstract class BaseController extends GetxController
throw NotSupportFCMException();
}
} catch(e) {
logError('BaseController::injectFCMBindings(): exception: $e');
logError('$runtimeType::injectFCMBindings(): exception: $e');
}
}

Expand Down Expand Up @@ -348,7 +348,7 @@ abstract class BaseController extends GetxController
}

Future<void> clearDataAndGoToLoginPage() async {
log('BaseController::clearDataAndGoToLoginPage:');
log('$runtimeType::clearDataAndGoToLoginPage:');
await clearAllData();
goToLogin();
}
Expand Down
27 changes: 12 additions & 15 deletions lib/features/caching/config/hive_cache_client.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

import 'dart:typed_data';

import 'package:core/presentation/extensions/map_extensions.dart';
Expand Down Expand Up @@ -28,19 +27,16 @@ abstract class HiveCacheClient<T> {
if (Hive.isBoxOpen(tableName)) {
return Hive.box<T>(tableName);
} else {
return Hive.openBox<T>(
tableName,
encryptionCipher: encryptionKey != null
? HiveAesCipher(encryptionKey)
: null);
return Hive.openBox<T>(tableName,
encryptionCipher:
encryptionKey != null ? HiveAesCipher(encryptionKey) : null);
}
}

Future<void> insertItem(String key, T newObject) {
log('$runtimeType::insertItem:encryption: $encryption - key = $key');
return Future.sync(() async {
final boxItem = encryption
? await openBoxEncryption()
: await openBox();
final boxItem = encryption ? await openBoxEncryption() : await openBox();
return boxItem.put(key, newObject);
}).catchError((error) {
throw error;
Expand All @@ -49,16 +45,15 @@ abstract class HiveCacheClient<T> {

Future<void> insertMultipleItem(Map<String, T> mapObject) {
return Future.sync(() async {
final boxItem = encryption
? await openBoxEncryption()
: await openBox();
final boxItem = encryption ? await openBoxEncryption() : await openBox();
return boxItem.putAll(mapObject);
}).catchError((error) {
throw error;
});
}

Future<T?> getItem(String key, {bool needToReopen = false}) {
log('$runtimeType::getItem() key: $encryption - needToReopen: $needToReopen');
return Future.sync(() async {
if (needToReopen) {
await closeBox();
Expand Down Expand Up @@ -88,7 +83,7 @@ abstract class HiveCacheClient<T> {
.where((key, value) => _matchedNestedKey(key, nestedKey))
.values
.toList();
log('HiveCacheClient::getListByNestedKey:listItem: ${listItem.length}');
log('$runtimeType::getListByNestedKey:listItem: ${listItem.length}');
return listItem;
}).catchError((error) {
throw error;
Expand Down Expand Up @@ -180,8 +175,10 @@ abstract class HiveCacheClient<T> {
Future<void> clearAllDataContainKey(String nestedKey) {
return Future.sync(() async {
final boxItem = encryption ? await openBoxEncryption() : await openBox();
final listKeys = boxItem.toMap().where((key, value) => _matchedNestedKey(key, nestedKey)).keys;
log('HiveCacheClient::clearAllDataContainKey:listKeys: ${listKeys.length}');
final listKeys = boxItem.toMap()
.where((key, value) => _matchedNestedKey(key, nestedKey))
.keys;
log('$runtimeType::clearAllDataContainKey:listKeys: ${listKeys.length}');
return boxItem.deleteAll(listKeys);
}).catchError((error) {
throw error;
Expand Down
4 changes: 3 additions & 1 deletion lib/features/login/data/local/account_cache_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class AccountCacheManager {
log('AccountCacheManager::setCurrentAccount(): $newAccount');
final newAccountCache = newAccount.toCache();
final allAccounts = await _accountCacheClient.getAll();
log('AccountCacheManager::setCurrentAccount::allAccounts(): $allAccounts');
log('AccountCacheManager::setCurrentAccount::allAccounts(): length: ${allAccounts.length}, $allAccounts');
if (allAccounts.isNotEmpty) {
final newAllAccounts = allAccounts
.unselected()
Expand All @@ -47,4 +47,6 @@ class AccountCacheManager {
log('AccountCacheManager::deleteCurrentAccount(): $hashId');
return _accountCacheClient.deleteItem(hashId);
}

Future<void> closeAccountHiveCacheBox() => _accountCacheClient.closeBox();
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,6 @@ class AuthenticationInfoCacheManager {
Future<void> removeAuthenticationInfo() {
return _authenticationInfoCacheClient.deleteItem(AuthenticationInfoCache.keyCacheValue);
}

Future<void> closeAuthenticationInfoHiveCacheBox() => _authenticationInfoCacheClient.closeBox();
}
4 changes: 4 additions & 0 deletions lib/features/login/data/local/token_oidc_cache_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class TokenOidcCacheManager {
TokenOidcCacheManager(this._tokenOidcCacheClient);

Future<TokenOIDC> getTokenOidc(String tokenIdHash) async {
log('TokenOidcCacheManager::getTokenOidc(): tokenIdHash: $tokenIdHash');
final tokenCache = await _tokenOidcCacheClient.getItem(tokenIdHash);
log('TokenOidcCacheManager::getTokenOidc(): tokenCache: $tokenCache');
if (tokenCache == null) {
Expand All @@ -27,9 +28,12 @@ class TokenOidcCacheManager {
log('TokenOidcCacheManager::persistOneTokenOidc(): key\'s hash: ${tokenOIDC.tokenIdHash}');
log('TokenOidcCacheManager::persistOneTokenOidc(): token: ${tokenOIDC.token}');
await _tokenOidcCacheClient.insertItem(tokenOIDC.tokenIdHash, tokenOIDC.toTokenOidcCache());
log('TokenOidcCacheManager::persistOneTokenOidc(): done');
}

Future<void> deleteTokenOidc() async {
await _tokenOidcCacheClient.clearAllData();
}

Future<void> closeTokenOIDCHiveCacheBox() => _tokenOidcCacheClient.closeBox();
}
2 changes: 2 additions & 0 deletions lib/features/mailbox/data/local/state_cache_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ class StateCacheManager {
final stateKey = TupleKey(stateCache.type.name, accountId.asString, userName.value).encodeKey;
return await _stateCacheClient.insertItem(stateKey, stateCache);
}

Future<void> closeStateHiveCacheBox() => _stateCacheClient.closeBox();
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,14 @@ import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions
import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart';
import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart';
import 'package:tmail_ui_user/features/home/presentation/home_bindings.dart';
import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart';
import 'package:tmail_ui_user/features/login/data/local/authentication_info_cache_manager.dart';
import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart';
import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/data/local/state_cache_manager.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart';
import 'package:tmail_ui_user/features/push_notification/presentation/action/fcm_action.dart';
import 'package:tmail_ui_user/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart';
Expand All @@ -49,6 +53,11 @@ class FcmMessageController extends FcmBaseController {
AuthorizationInterceptors? _authorizationInterceptors;
GetSessionInteractor? _getSessionInteractor;

AccountCacheManager? _accountCacheManager;
TokenOidcCacheManager? _tokenOidcCacheManager;
StateCacheManager? _stateCacheManager;
AuthenticationInfoCacheManager? _authenticationInfoCacheManager;

FcmMessageController._internal();

static final FcmMessageController _instance = FcmMessageController._internal();
Expand Down Expand Up @@ -187,13 +196,28 @@ class FcmMessageController extends FcmBaseController {
});

_getInteractorBindings();

await Future.wait([
if (_accountCacheManager != null)
_accountCacheManager!.closeAccountHiveCacheBox(),
if (_tokenOidcCacheManager != null)
_tokenOidcCacheManager!.closeTokenOIDCHiveCacheBox(),
if (_stateCacheManager != null)
_stateCacheManager!.closeStateHiveCacheBox(),
if (_authenticationInfoCacheManager != null)
_authenticationInfoCacheManager!.closeAuthenticationInfoHiveCacheBox(),
]);
}

void _getInteractorBindings() {
_getAuthenticatedAccountInteractor = getBinding<GetAuthenticatedAccountInteractor>();
_dynamicUrlInterceptors = getBinding<DynamicUrlInterceptors>();
_authorizationInterceptors = getBinding<AuthorizationInterceptors>();
_getSessionInteractor = getBinding<GetSessionInteractor>();
_accountCacheManager = getBinding<AccountCacheManager>();
_tokenOidcCacheManager = getBinding<TokenOidcCacheManager>();
_stateCacheManager = getBinding<StateCacheManager>();
_authenticationInfoCacheManager = getBinding<AuthenticationInfoCacheManager>();

FcmTokenController.instance.initialBindingInteractor();
}
Expand Down

0 comments on commit e7b546c

Please sign in to comment.