diff --git a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart index 89a52c2a3..3d3ffe0d1 100644 --- a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart @@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/email/domain/extensions/detailed_email_hi import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; +import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_task.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; diff --git a/lib/features/offline_mode/config/work_manager_constants.dart b/lib/features/offline_mode/config/work_manager_constants.dart index de24ee7be..4dc9a09c5 100644 --- a/lib/features/offline_mode/config/work_manager_constants.dart +++ b/lib/features/offline_mode/config/work_manager_constants.dart @@ -1,4 +1,5 @@ class WorkManagerConstants { static const String sendingEmailUniqueId = 'com.linagora.ios.teammail.sendingQueue'; + static const String workerTypeKey = 'worker_type'; } \ No newline at end of file diff --git a/lib/features/offline_mode/controller/work_scheduler_controller.dart b/lib/features/offline_mode/controller/work_scheduler_controller.dart index 9ecb7d1f7..639bb9c88 100644 --- a/lib/features/offline_mode/controller/work_scheduler_controller.dart +++ b/lib/features/offline_mode/controller/work_scheduler_controller.dart @@ -1,6 +1,7 @@ import 'package:collection/collection.dart'; import 'package:core/utils/app_logger.dart'; +import 'package:tmail_ui_user/features/offline_mode/config/work_manager_constants.dart'; import 'package:tmail_ui_user/features/offline_mode/scheduler/one_time_work_request.dart'; import 'package:tmail_ui_user/features/offline_mode/scheduler/periodic_work_request.dart'; import 'package:tmail_ui_user/features/offline_mode/scheduler/work_request.dart'; @@ -46,15 +47,23 @@ class WorkSchedulerController { } } - Future handleBackgroundTask(String taskName, Map? inputData) { - if (inputData != null && inputData.isNotEmpty) { - final typeTask = inputData['workerType']; - final dataObject = inputData['data']; - log('WorkSchedulerController::handleBackgroundTask():typeTask: $typeTask | dataObject: $dataObject'); - final workType = WorkerType.values.firstWhereOrNull((type) => type.name == typeTask); - log('WorkSchedulerController::handleBackgroundTask():workType: $workType'); - } + Future handleBackgroundTask(String taskName, Map? inputData) async { + log('WorkSchedulerController::handleBackgroundTask():taskName: $taskName | inputData: $inputData'); + try { + if (inputData != null && inputData.isNotEmpty) { + final workerType = inputData.remove(WorkManagerConstants.workerTypeKey); + final dataObject = inputData; + log('WorkSchedulerController::handleBackgroundTask():workerType: $workerType | dataObject: $dataObject'); + final matchedType = WorkerType.values.firstWhereOrNull((type) => type.name == workerType); + if (matchedType != null) { + await matchedType.usingObserver().bindDI(); + await matchedType.usingObserver().observe(taskName, dataObject); + } + } + } catch (e) { + logError('WorkSchedulerController::handleBackgroundTask():EXCEPTION: $e'); + } return Future.value(true); } diff --git a/lib/features/offline_mode/worker/hive_task.dart b/lib/features/offline_mode/hive_worker/hive_task.dart similarity index 92% rename from lib/features/offline_mode/worker/hive_task.dart rename to lib/features/offline_mode/hive_worker/hive_task.dart index d46a0100a..347087b3e 100644 --- a/lib/features/offline_mode/worker/hive_task.dart +++ b/lib/features/offline_mode/hive_worker/hive_task.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:equatable/equatable.dart'; -import 'package:tmail_ui_user/features/offline_mode/worker/hive_task_state.dart'; +import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_task_state.dart'; class HiveTask with EquatableMixin { final String? id; diff --git a/lib/features/offline_mode/worker/hive_task_state.dart b/lib/features/offline_mode/hive_worker/hive_task_state.dart similarity index 99% rename from lib/features/offline_mode/worker/hive_task_state.dart rename to lib/features/offline_mode/hive_worker/hive_task_state.dart index e957ad711..02ac85340 100644 --- a/lib/features/offline_mode/worker/hive_task_state.dart +++ b/lib/features/offline_mode/hive_worker/hive_task_state.dart @@ -1,5 +1,4 @@ - import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; diff --git a/lib/features/offline_mode/worker/hive_worker_queue.dart b/lib/features/offline_mode/hive_worker/hive_worker_queue.dart similarity index 94% rename from lib/features/offline_mode/worker/hive_worker_queue.dart rename to lib/features/offline_mode/hive_worker/hive_worker_queue.dart index 4a3b49bc8..f1188ce4d 100644 --- a/lib/features/offline_mode/worker/hive_worker_queue.dart +++ b/lib/features/offline_mode/hive_worker/hive_worker_queue.dart @@ -3,7 +3,7 @@ import 'dart:async'; import 'dart:collection'; import 'package:core/utils/app_logger.dart'; -import 'package:tmail_ui_user/features/offline_mode/worker/hive_task.dart'; +import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_task.dart'; abstract class WorkerQueue { diff --git a/lib/features/offline_mode/manager/detailed_email_cache_worker_queue.dart b/lib/features/offline_mode/manager/detailed_email_cache_worker_queue.dart index 06c7ac4a4..03b0d0f88 100644 --- a/lib/features/offline_mode/manager/detailed_email_cache_worker_queue.dart +++ b/lib/features/offline_mode/manager/detailed_email_cache_worker_queue.dart @@ -1,5 +1,5 @@ -import 'package:tmail_ui_user/features/offline_mode/worker/hive_worker_queue.dart'; +import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_worker_queue.dart'; class DetailedEmailCacheWorkerQueue extends WorkerQueue { diff --git a/lib/features/offline_mode/manager/opened_email_cache_worker_queue.dart b/lib/features/offline_mode/manager/opened_email_cache_worker_queue.dart index 997e769b8..623f15c79 100644 --- a/lib/features/offline_mode/manager/opened_email_cache_worker_queue.dart +++ b/lib/features/offline_mode/manager/opened_email_cache_worker_queue.dart @@ -1,4 +1,4 @@ -import 'package:tmail_ui_user/features/offline_mode/worker/hive_worker_queue.dart'; +import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_worker_queue.dart'; class OpenedEmailCacheWorkerQueue extends WorkerQueue { diff --git a/lib/features/offline_mode/observer/sending_email_observer.dart b/lib/features/offline_mode/observer/sending_email_observer.dart index acc40285a..f60e9c5c3 100644 --- a/lib/features/offline_mode/observer/sending_email_observer.dart +++ b/lib/features/offline_mode/observer/sending_email_observer.dart @@ -1,11 +1,7 @@ -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:tmail_ui_user/features/offline_mode/observer/work_observer.dart'; -import 'package:tmail_ui_user/features/offline_mode/scheduler/work_status.dart'; -class SendingEmailObserver extends WorkObserver { +class SendingEmailObserver extends WorkObserver { static SendingEmailObserver? _instance; @@ -14,15 +10,10 @@ class SendingEmailObserver extends WorkObserver { factory SendingEmailObserver() => _instance ??= SendingEmailObserver._(); @override - void handleFailureViewState(Failure failure) { + Future observe(String taskId, Map inputData) async { } @override - void handleSuccessViewState(Success success) { - } - - @override - WorkStatus observe(Email value) { - return WorkStatus.failure; + Future bindDI() async { } } \ No newline at end of file diff --git a/lib/features/offline_mode/observer/work_observer.dart b/lib/features/offline_mode/observer/work_observer.dart index 3119277ab..33a3c1c9b 100644 --- a/lib/features/offline_mode/observer/work_observer.dart +++ b/lib/features/offline_mode/observer/work_observer.dart @@ -3,10 +3,11 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:core/utils/app_logger.dart'; import 'package:dartz/dartz.dart'; -import 'package:tmail_ui_user/features/offline_mode/scheduler/work_status.dart'; -abstract class WorkObserver { - WorkStatus observe(T value); +abstract class WorkObserver { + Future bindDI(); + + Future observe(String taskId, Map inputData); void consumeState(Stream> newStateStream) { newStateStream.listen( @@ -22,7 +23,7 @@ abstract class WorkObserver { newState.fold(handleFailureViewState, handleSuccessViewState); } - void handleFailureViewState(Failure failure); + void handleFailureViewState(Failure failure) {} - void handleSuccessViewState(Success success); + void handleSuccessViewState(Success success) {} } \ No newline at end of file diff --git a/lib/features/offline_mode/scheduler/work_status.dart b/lib/features/offline_mode/scheduler/work_status.dart deleted file mode 100644 index 63be27783..000000000 --- a/lib/features/offline_mode/scheduler/work_status.dart +++ /dev/null @@ -1,6 +0,0 @@ - -enum WorkStatus { - success, - retry, - failure; -} \ No newline at end of file diff --git a/lib/features/offline_mode/scheduler/worker.dart b/lib/features/offline_mode/scheduler/worker.dart index 182fc289c..19dd7c2e5 100644 --- a/lib/features/offline_mode/scheduler/worker.dart +++ b/lib/features/offline_mode/scheduler/worker.dart @@ -1,6 +1,7 @@ import 'package:core/utils/platform_info.dart'; import 'package:equatable/equatable.dart'; +import 'package:tmail_ui_user/features/offline_mode/config/work_manager_constants.dart'; import 'package:tmail_ui_user/features/offline_mode/scheduler/worker_type.dart'; /// Equivalent to the task or work that needs to be done in the background @@ -20,7 +21,7 @@ class Worker with EquatableMixin { } Map get inputData { - data['workerType'] = type; + data[WorkManagerConstants.workerTypeKey] = type; return data; } diff --git a/test/features/offline_mode/mailbox_state_worker_queue.dart b/test/features/offline_mode/mailbox_state_worker_queue.dart index 125ca2761..e159daace 100644 --- a/test/features/offline_mode/mailbox_state_worker_queue.dart +++ b/test/features/offline_mode/mailbox_state_worker_queue.dart @@ -1,5 +1,6 @@ -import 'package:tmail_ui_user/features/offline_mode/worker/hive_worker_queue.dart'; + +import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_worker_queue.dart'; class MailboxStateWorkerQueue extends WorkerQueue { diff --git a/test/features/offline_mode/woker_queue_test.dart b/test/features/offline_mode/woker_queue_test.dart index 8fa07ef3e..eab62ef5e 100644 --- a/test/features/offline_mode/woker_queue_test.dart +++ b/test/features/offline_mode/woker_queue_test.dart @@ -9,7 +9,7 @@ import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; import 'package:tmail_ui_user/features/caching/clients/state_cache_client.dart'; import 'package:tmail_ui_user/features/mailbox/data/extensions/state_extension.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart'; -import 'package:tmail_ui_user/features/offline_mode/worker/hive_task.dart'; +import 'package:tmail_ui_user/features/offline_mode/hive_worker/hive_task.dart'; import 'mailbox_state_worker_queue.dart';