TF-1933 Trigger to handle hive database in main isolate when work manager changed

(cherry picked from commit 714806a751859ec9d37416a51e48ad3300ac6f73)
This commit is contained in:
dab246
2023-06-27 22:04:00 +07:00
committed by Dat Vu
parent 9b735ebf59
commit d5cac4058a
21 changed files with 318 additions and 312 deletions
@@ -2,59 +2,56 @@ import 'dart:async';
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';
import 'package:tmail_ui_user/features/offline_mode/scheduler/worker_type.dart';
import 'package:tmail_ui_user/features/offline_mode/exceptions/workmanager_exception.dart';
import 'package:tmail_ui_user/features/offline_mode/work_manager/one_time_work_request.dart';
import 'package:tmail_ui_user/features/offline_mode/work_manager/periodic_work_request.dart';
import 'package:tmail_ui_user/features/offline_mode/work_manager/work_request.dart';
import 'package:tmail_ui_user/features/offline_mode/work_manager/worker_type.dart';
import 'package:workmanager/workmanager.dart';
class WorkSchedulerController {
class WorkManagerController {
static WorkSchedulerController? _instance;
static WorkManagerController? _instance;
WorkSchedulerController._();
WorkManagerController._();
factory WorkSchedulerController() => _instance ??= WorkSchedulerController._();
factory WorkManagerController() => _instance ??= WorkManagerController._();
Future<void> enqueue(WorkRequest workRequest) {
Future<void> enqueue(WorkRequest workRequest) async {
try {
log('WorkSchedulerController::enqueue():workRequest: $workRequest');
if (workRequest is OneTimeWorkRequest) {
return Workmanager().registerOneOffTask(
workRequest.worker.uniqueId,
workRequest.worker.id,
tag: workRequest.worker.type.name,
await Workmanager().registerOneOffTask(
workRequest.uniqueId,
workRequest.taskId,
tag: workRequest.tag,
initialDelay: workRequest.initialDelay,
constraints: workRequest.constraints,
backoffPolicy: workRequest.backoffPolicy,
backoffPolicyDelay: workRequest.backoffPolicyDelay,
outOfQuotaPolicy: workRequest.outOfQuotaPolicy,
inputData: workRequest.worker.inputData
inputData: workRequest.inputData
);
} if (workRequest is PeriodicWorkRequest) {
return Workmanager().registerPeriodicTask(
workRequest.worker.uniqueId,
workRequest.worker.id,
await Workmanager().registerPeriodicTask(
workRequest.uniqueId,
workRequest.taskId,
tag: workRequest.tag,
frequency: workRequest.frequency,
tag: workRequest.worker.type.name,
initialDelay: workRequest.initialDelay,
constraints: workRequest.constraints,
backoffPolicy: workRequest.backoffPolicy,
backoffPolicyDelay: workRequest.backoffPolicyDelay,
outOfQuotaPolicy: workRequest.outOfQuotaPolicy,
inputData: workRequest.worker.inputData
inputData: workRequest.inputData
);
} else {
return Future.value();
}
} catch (e) {
logError('WorkSchedulerController::enqueue(): EXCEPTION: $e');
return Future.value();
}
}
Future<bool> handleBackgroundTask(String taskName, Map<String, dynamic>? inputData) async {
final completer = Completer<bool>();
log('WorkSchedulerController::handleBackgroundTask():taskName: $taskName | inputData: $inputData');
try {
if (inputData != null && inputData.isNotEmpty) {
@@ -64,15 +61,20 @@ class WorkSchedulerController {
final matchedType = WorkerType.values.firstWhereOrNull((type) => type.name == workerType);
if (matchedType != null) {
await matchedType.usingObserver().bindDI();
await matchedType.usingObserver().observe(taskName, dataObject, completer);
final worker = matchedType.getWorker();
await worker.bindDI();
final result = await worker.doWork(taskName, dataObject);
return result;
} else {
return Future.error(CanNotFoundWorkerType());
}
} else {
return Future.error(CanNotFoundInputData());
}
} catch (e) {
completer.completeError(e);
logError('WorkSchedulerController::handleBackgroundTask():EXCEPTION: $e');
return Future.error(e);
}
return completer.future;
}
Future<void> cancelByWorkType(WorkerType type) => Workmanager().cancelByTag(type.name);