TF-1900 Auto sync Sending Queue after work manager completed
(cherry picked from commit e68a8fdc49c600224b93e25f60ed6b8ecf1afe84)
This commit is contained in:
@@ -254,9 +254,9 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName) {
|
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName, {bool needToReopen = false}) {
|
||||||
return Future.sync(() async {
|
return Future.sync(() async {
|
||||||
final sendingEmailsCache = await _sendingEmailCacheManager.getAllSendingEmails(accountId, userName);
|
final sendingEmailsCache = await _sendingEmailCacheManager.getAllSendingEmails(accountId, userName, needToReopen: needToReopen);
|
||||||
return sendingEmailsCache.toSendingEmails();
|
return sendingEmailsCache.toSendingEmails();
|
||||||
}).catchError(_exceptionThrower.throwException);
|
}).catchError(_exceptionThrower.throwException);
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-6
@@ -443,7 +443,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
_getVacationResponse();
|
_getVacationResponse();
|
||||||
spamReportController.getSpamReportStateAction();
|
spamReportController.getSpamReportStateAction();
|
||||||
if (PlatformInfo.isMobile) {
|
if (PlatformInfo.isMobile) {
|
||||||
_getAllSendingEmails();
|
getAllSendingEmails();
|
||||||
}
|
}
|
||||||
if (!BuildUtils.isWeb && !_notificationManager.isNotificationClickedOnTerminate) {
|
if (!BuildUtils.isWeb && !_notificationManager.isNotificationClickedOnTerminate) {
|
||||||
_handleClickLocalNotificationOnTerminated();
|
_handleClickLocalNotificationOnTerminated();
|
||||||
@@ -1225,7 +1225,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
_getVacationResponse();
|
_getVacationResponse();
|
||||||
spamReportController.getSpamReportStateAction();
|
spamReportController.getSpamReportStateAction();
|
||||||
if (PlatformInfo.isMobile) {
|
if (PlatformInfo.isMobile) {
|
||||||
_getAllSendingEmails();
|
getAllSendingEmails();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1830,7 +1830,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_addSendingEmailToSendingQueue(success.sendingEmail);
|
_addSendingEmailToSendingQueue(success.sendingEmail);
|
||||||
_getAllSendingEmails();
|
getAllSendingEmails();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _addSendingEmailToSendingQueue(SendingEmail sendingEmail) async {
|
void _addSendingEmailToSendingQueue(SendingEmail sendingEmail) async {
|
||||||
@@ -1853,12 +1853,13 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _getAllSendingEmails() {
|
void getAllSendingEmails({bool needToReopen = false}) {
|
||||||
if (accountId.value != null && sessionCurrent != null) {
|
if (accountId.value != null && sessionCurrent != null) {
|
||||||
log('MailboxDashBoardController::_getAllSendingEmails():accountId: ${accountId.value} | userName: ${sessionCurrent?.username}');
|
log('MailboxDashBoardController::getAllSendingEmails():accountId: ${accountId.value} | userName: ${sessionCurrent?.username}');
|
||||||
consumeState(_getAllSendingEmailInteractor.execute(
|
consumeState(_getAllSendingEmailInteractor.execute(
|
||||||
accountId.value!,
|
accountId.value!,
|
||||||
sessionCurrent!.username
|
sessionCurrent!.username,
|
||||||
|
needToReopen: needToReopen
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1866,6 +1867,15 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
void _handleGetAllSendingEmailsSuccess(GetAllSendingEmailSuccess success) {
|
void _handleGetAllSendingEmailsSuccess(GetAllSendingEmailSuccess success) {
|
||||||
log('MailboxDashBoardController::_handleGetAllSendingEmailsSuccess():COUNT: ${success.sendingEmails.length}');
|
log('MailboxDashBoardController::_handleGetAllSendingEmailsSuccess():COUNT: ${success.sendingEmails.length}');
|
||||||
listSendingEmails.value = success.sendingEmails;
|
listSendingEmails.value = success.sendingEmails;
|
||||||
|
|
||||||
|
if (success.sendingEmails.isEmpty && dashboardRoute.value == DashboardRoutes.sendingQueue) {
|
||||||
|
_openDefaultMailbox();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _openDefaultMailbox() {
|
||||||
|
dispatchRoute(DashboardRoutes.thread);
|
||||||
|
dispatchMailboxUIAction(SelectMailboxDefaultAction());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -1 +1,3 @@
|
|||||||
class SendingEmailFromWorkmanagerException implements Exception {}
|
class UnableToGetDataFromInWorkManagerException implements Exception {}
|
||||||
|
|
||||||
|
class UnableBindingInWorkManagerException implements Exception {}
|
||||||
@@ -24,8 +24,15 @@ class SendingEmailCacheManager {
|
|||||||
return _hiveCacheClient.insertItem(keyCache, sendingEmailHiveCache);
|
return _hiveCacheClient.insertItem(keyCache, sendingEmailHiveCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<SendingEmailHiveCache>> getAllSendingEmails(AccountId accountId, UserName userName) async {
|
Future<List<SendingEmailHiveCache>> getAllSendingEmails(
|
||||||
final sendingEmailsCache = await _hiveCacheClient.getListByTupleKey(accountId.asString, userName.value);
|
AccountId accountId,
|
||||||
|
UserName userName,
|
||||||
|
{bool needToReopen = false}
|
||||||
|
) async {
|
||||||
|
final sendingEmailsCache = await _hiveCacheClient.getListByTupleKey(
|
||||||
|
accountId.asString,
|
||||||
|
userName.value,
|
||||||
|
needToReopen: needToReopen);
|
||||||
log('SendingEmailCacheManager::getAllSendingEmails():COUNT: ${sendingEmailsCache.length}');
|
log('SendingEmailCacheManager::getAllSendingEmails():COUNT: ${sendingEmailsCache.length}');
|
||||||
sendingEmailsCache.sortByLatestTime();
|
sendingEmailsCache.sortByLatestTime();
|
||||||
return sendingEmailsCache;
|
return sendingEmailsCache;
|
||||||
|
|||||||
@@ -26,8 +26,10 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/m
|
|||||||
import 'package:tmail_ui_user/features/offline_mode/biding/sending_email_biding.dart';
|
import 'package:tmail_ui_user/features/offline_mode/biding/sending_email_biding.dart';
|
||||||
import 'package:tmail_ui_user/features/offline_mode/exceptions/workmanager_exception.dart';
|
import 'package:tmail_ui_user/features/offline_mode/exceptions/workmanager_exception.dart';
|
||||||
import 'package:tmail_ui_user/features/offline_mode/observer/work_observer.dart';
|
import 'package:tmail_ui_user/features/offline_mode/observer/work_observer.dart';
|
||||||
|
import 'package:tmail_ui_user/features/offline_mode/scheduler/worker_state.dart';
|
||||||
import 'package:tmail_ui_user/features/push_notification/presentation/notification/local_notification_config.dart';
|
import 'package:tmail_ui_user/features/push_notification/presentation/notification/local_notification_config.dart';
|
||||||
import 'package:tmail_ui_user/features/push_notification/presentation/notification/local_notification_manager.dart';
|
import 'package:tmail_ui_user/features/push_notification/presentation/notification/local_notification_manager.dart';
|
||||||
|
import 'package:tmail_ui_user/features/sending_queue/presentation/utils/sending_queue_isolate_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart';
|
import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart';
|
||||||
import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart';
|
import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart';
|
||||||
import 'package:tmail_ui_user/main/bindings/main_bindings.dart';
|
import 'package:tmail_ui_user/main/bindings/main_bindings.dart';
|
||||||
@@ -46,6 +48,7 @@ class SendingEmailObserver extends WorkObserver {
|
|||||||
AuthorizationInterceptors? _authorizationInterceptors;
|
AuthorizationInterceptors? _authorizationInterceptors;
|
||||||
GetSessionInteractor? _getSessionInteractor;
|
GetSessionInteractor? _getSessionInteractor;
|
||||||
DeleteSendingEmailInteractor? _deleteSendingEmailInteractor;
|
DeleteSendingEmailInteractor? _deleteSendingEmailInteractor;
|
||||||
|
SendingQueueIsolateManager? _sendingQueueIsolateManager;
|
||||||
|
|
||||||
Completer<bool>? _completer;
|
Completer<bool>? _completer;
|
||||||
|
|
||||||
@@ -115,9 +118,10 @@ class SendingEmailObserver extends WorkObserver {
|
|||||||
_getSessionInteractor = getBinding<GetSessionInteractor>();
|
_getSessionInteractor = getBinding<GetSessionInteractor>();
|
||||||
_sendEmailInteractor = getBinding<SendEmailInteractor>();
|
_sendEmailInteractor = getBinding<SendEmailInteractor>();
|
||||||
_deleteSendingEmailInteractor = getBinding<DeleteSendingEmailInteractor>();
|
_deleteSendingEmailInteractor = getBinding<DeleteSendingEmailInteractor>();
|
||||||
|
_sendingQueueIsolateManager = getBinding<SendingQueueIsolateManager>();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logError('SendingEmailObserver::_getInteractorBindings(): ${e.toString()}');
|
logError('SendingEmailObserver::_getInteractorBindings(): ${e.toString()}');
|
||||||
return _completer?.completeError(false);
|
_completer?.completeError(UnableBindingInWorkManagerException());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,12 +231,15 @@ class SendingEmailObserver extends WorkObserver {
|
|||||||
void _handleDeleteSendingEmailSuccess() async {
|
void _handleDeleteSendingEmailSuccess() async {
|
||||||
log('SendingEmailObserver::_handleDeleteSendingEmailSuccess(): Success');
|
log('SendingEmailObserver::_handleDeleteSendingEmailSuccess(): Success');
|
||||||
_showLocalNotification();
|
_showLocalNotification();
|
||||||
return _completer?.complete(true);
|
_sendingQueueIsolateManager?.addEvent(WorkerState.success.name);
|
||||||
|
_completer?.complete(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _clearDataQueue() async {
|
void _clearDataQueue() async {
|
||||||
|
log('SendingEmailObserver::_clearDataQueue():');
|
||||||
_sendingEmail = null;
|
_sendingEmail = null;
|
||||||
_completer?.completeError(SendingEmailFromWorkmanagerException());
|
_sendingQueueIsolateManager?.addEvent(WorkerState.failed.name);
|
||||||
|
_completer?.completeError(UnableToGetDataFromInWorkManagerException());
|
||||||
}
|
}
|
||||||
|
|
||||||
void _showLocalNotification() {
|
void _showLocalNotification() {
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
enum WorkerState {
|
||||||
|
success,
|
||||||
|
failed;
|
||||||
|
}
|
||||||
@@ -11,7 +11,7 @@ class SendingQueueRepositoryImpl extends SendingQueueRepository {
|
|||||||
SendingQueueRepositoryImpl(this._emailHiveCacheDataSourceImpl);
|
SendingQueueRepositoryImpl(this._emailHiveCacheDataSourceImpl);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName) {
|
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName, {bool needToReopen = false}) {
|
||||||
return _emailHiveCacheDataSourceImpl.getAllSendingEmails(accountId, userName);
|
return _emailHiveCacheDataSourceImpl.getAllSendingEmails(accountId, userName, needToReopen: needToReopen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,5 +4,5 @@ import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
|||||||
import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart';
|
||||||
|
|
||||||
abstract class SendingQueueRepository {
|
abstract class SendingQueueRepository {
|
||||||
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName);
|
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName, {bool needToReopen = false});
|
||||||
}
|
}
|
||||||
@@ -11,10 +11,10 @@ class GetAllSendingEmailInteractor {
|
|||||||
|
|
||||||
GetAllSendingEmailInteractor(this._sendingQueueRepository);
|
GetAllSendingEmailInteractor(this._sendingQueueRepository);
|
||||||
|
|
||||||
Stream<Either<Failure, Success>> execute(AccountId accountId, UserName userName) async* {
|
Stream<Either<Failure, Success>> execute(AccountId accountId, UserName userName, {bool needToReopen = false}) async* {
|
||||||
try {
|
try {
|
||||||
yield Right<Failure, Success>(GetAllSendingEmailLoading());
|
yield Right<Failure, Success>(GetAllSendingEmailLoading());
|
||||||
final sendingEmails = await _sendingQueueRepository.getAllSendingEmails(accountId, userName);
|
final sendingEmails = await _sendingQueueRepository.getAllSendingEmails(accountId, userName, needToReopen: needToReopen);
|
||||||
yield Right<Failure, Success>(GetAllSendingEmailSuccess(sendingEmails));
|
yield Right<Failure, Success>(GetAllSendingEmailSuccess(sendingEmails));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left<Failure, Success>(GetAllSendingEmailFailure(e));
|
yield Left<Failure, Success>(GetAllSendingEmailFailure(e));
|
||||||
|
|||||||
@@ -1,22 +1,54 @@
|
|||||||
|
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||||
|
import 'package:tmail_ui_user/features/offline_mode/scheduler/worker_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/sending_queue/presentation/utils/sending_queue_isolate_manager.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||||
|
|
||||||
class SendingQueueController extends BaseController {
|
class SendingQueueController extends BaseController {
|
||||||
|
|
||||||
final dashboardController = getBinding<MailboxDashBoardController>();
|
final dashboardController = getBinding<MailboxDashBoardController>();
|
||||||
|
final sendingQueueIsolateManager = getBinding<SendingQueueIsolateManager>();
|
||||||
|
|
||||||
final listSendingEmailController = ScrollController();
|
final listSendingEmailController = ScrollController();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
sendingQueueIsolateManager?.initial(
|
||||||
|
onData: _handleSendingQueueEvent,
|
||||||
|
onError: (error, stackTrace) {
|
||||||
|
logError('SendingQueueController::onInit():onError:error: $error | stackTrace: $stackTrace');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleSendingQueueEvent(Object? event) {
|
||||||
|
log('SendingQueueController::_handleSendingQueueEvent():event: $event');
|
||||||
|
if (event is String) {
|
||||||
|
final workState = WorkerState.values.firstWhereOrNull((state) => state.name == event);
|
||||||
|
log('SendingQueueController::_handleSendingQueueEvent():workState: $workState');
|
||||||
|
if (workState != null) {
|
||||||
|
_refreshSendingQueue(needToReopen: true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _refreshSendingQueue({bool needToReopen = false}) {
|
||||||
|
dashboardController?.getAllSendingEmails(needToReopen: needToReopen);
|
||||||
|
}
|
||||||
|
|
||||||
void openMailboxMenu() {
|
void openMailboxMenu() {
|
||||||
dashboardController!.openMailboxMenuDrawer();
|
dashboardController?.openMailboxMenuDrawer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
listSendingEmailController.dispose();
|
listSendingEmailController.dispose();
|
||||||
|
sendingQueueIsolateManager?.release();
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,10 +5,12 @@ import 'package:core/presentation/utils/app_toast.dart';
|
|||||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
import 'package:core/presentation/utils/responsive_utils.dart';
|
||||||
import 'package:core/utils/config/app_config_loader.dart';
|
import 'package:core/utils/config/app_config_loader.dart';
|
||||||
import 'package:core/utils/file_utils.dart';
|
import 'package:core/utils/file_utils.dart';
|
||||||
|
import 'package:core/utils/platform_info.dart';
|
||||||
import 'package:device_info_plus/device_info_plus.dart';
|
import 'package:device_info_plus/device_info_plus.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
|
import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
|
||||||
|
import 'package:tmail_ui_user/features/sending_queue/presentation/utils/sending_queue_isolate_manager.dart';
|
||||||
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
|
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
@@ -24,6 +26,7 @@ class CoreBindings extends Bindings {
|
|||||||
_bindingDeviceManager();
|
_bindingDeviceManager();
|
||||||
_bindingReceivingSharingStream();
|
_bindingReceivingSharingStream();
|
||||||
_bindingUtils();
|
_bindingUtils();
|
||||||
|
_bindingIsolate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _bindingAppImagePaths() {
|
void _bindingAppImagePaths() {
|
||||||
@@ -61,4 +64,10 @@ class CoreBindings extends Bindings {
|
|||||||
Get.put(AppConfigLoader());
|
Get.put(AppConfigLoader());
|
||||||
Get.put(FileUtils());
|
Get.put(FileUtils());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _bindingIsolate() {
|
||||||
|
if (PlatformInfo.isMobile) {
|
||||||
|
Get.put(SendingQueueIsolateManager());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user