From 1bbbbe191c6812bcfb624fbc5c63754e6b5e7041 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 24 May 2023 11:27:28 +0700 Subject: [PATCH] TF-1812 Abstract method in handle background task (cherry picked from commit 16b62ed183e32f10ce9b1002f4097144317650f1) --- .../email_hive_cache_datasource_impl.dart | 1 + .../config/work_manager_constants.dart | 1 + .../controller/work_scheduler_controller.dart | 25 +++++++++++++------ .../{worker => hive_worker}/hive_task.dart | 2 +- .../hive_task_state.dart | 1 - .../hive_worker_queue.dart | 2 +- .../detailed_email_cache_worker_queue.dart | 2 +- .../opened_email_cache_worker_queue.dart | 2 +- .../observer/sending_email_observer.dart | 15 +++-------- .../offline_mode/observer/work_observer.dart | 11 ++++---- .../offline_mode/scheduler/work_status.dart | 6 ----- .../offline_mode/scheduler/worker.dart | 3 ++- .../mailbox_state_worker_queue.dart | 3 ++- .../offline_mode/woker_queue_test.dart | 2 +- 14 files changed, 37 insertions(+), 39 deletions(-) rename lib/features/offline_mode/{worker => hive_worker}/hive_task.dart (92%) rename lib/features/offline_mode/{worker => hive_worker}/hive_task_state.dart (99%) rename lib/features/offline_mode/{worker => hive_worker}/hive_worker_queue.dart (94%) delete mode 100644 lib/features/offline_mode/scheduler/work_status.dart 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';