TF-1933 Trigger to handle hive database in main isolate when work manager changed
(cherry picked from commit 714806a751859ec9d37416a51e48ad3300ac6f73)
This commit is contained in:
+29
-27
@@ -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);
|
||||
Reference in New Issue
Block a user