TF-1861 Config and abstraction work manager

(cherry picked from commit ee2dca9b34a907c8356ceccf0b23efba2893a01c)
This commit is contained in:
dab246
2023-05-23 12:56:21 +07:00
committed by Dat Vu
parent 9f402b9ec1
commit b1af1d8533
15 changed files with 329 additions and 4 deletions
@@ -0,0 +1,25 @@
import 'package:tmail_ui_user/features/offline_mode/scheduler/work_request.dart';
import 'package:tmail_ui_user/features/offline_mode/scheduler/worker.dart';
import 'package:workmanager/workmanager.dart';
/// A WorkRequest for non-repeating work.
class OneTimeWorkRequest extends WorkRequest {
OneTimeWorkRequest(
Worker worker, {
Duration initialDelay = Duration.zero,
Duration backoffPolicyDelay = Duration.zero,
ExistingWorkPolicy? existingWorkPolicy,
BackoffPolicy? backoffPolicy,
OutOfQuotaPolicy? outOfQuotaPolicy,
Constraints? constraints
}) : super(
worker,
initialDelay: initialDelay,
backoffPolicyDelay: backoffPolicyDelay,
existingWorkPolicy: existingWorkPolicy,
backoffPolicy: backoffPolicy,
outOfQuotaPolicy: outOfQuotaPolicy,
constraints: constraints
);
}
@@ -0,0 +1,31 @@
import 'package:tmail_ui_user/features/offline_mode/scheduler/work_request.dart';
import 'package:tmail_ui_user/features/offline_mode/scheduler/worker.dart';
import 'package:workmanager/workmanager.dart';
/// A WorkRequest for repeating work.
class PeriodicWorkRequest extends WorkRequest {
final Duration? frequency;
PeriodicWorkRequest(
Worker worker, {
Duration initialDelay = Duration.zero,
Duration backoffPolicyDelay = Duration.zero,
ExistingWorkPolicy? existingWorkPolicy,
BackoffPolicy? backoffPolicy,
OutOfQuotaPolicy? outOfQuotaPolicy,
Constraints? constraints,
this.frequency
}) : super(
worker,
initialDelay: initialDelay,
backoffPolicyDelay: backoffPolicyDelay,
existingWorkPolicy: existingWorkPolicy,
backoffPolicy: backoffPolicy,
outOfQuotaPolicy: outOfQuotaPolicy,
constraints: constraints
);
@override
List<Object?> get props => [super.props, frequency];
}
@@ -0,0 +1,38 @@
import 'package:equatable/equatable.dart';
import 'package:tmail_ui_user/features/offline_mode/scheduler/worker.dart';
import 'package:workmanager/workmanager.dart';
/// Represents the scheduling of requests
abstract class WorkRequest with EquatableMixin {
final Worker worker;
final Duration initialDelay;
final Duration backoffPolicyDelay;
final ExistingWorkPolicy? existingWorkPolicy;
final BackoffPolicy? backoffPolicy;
final OutOfQuotaPolicy? outOfQuotaPolicy;
final Constraints? constraints;
WorkRequest(
this.worker,
{
this.initialDelay = Duration.zero,
this.backoffPolicyDelay = Duration.zero,
this.existingWorkPolicy,
this.backoffPolicy,
this.outOfQuotaPolicy,
this.constraints
}
);
@override
List<Object?> get props => [
worker,
initialDelay,
backoffPolicyDelay,
existingWorkPolicy,
backoffPolicy,
outOfQuotaPolicy,
constraints
];
}
@@ -0,0 +1,6 @@
enum WorkStatus {
success,
retry,
failure;
}
@@ -0,0 +1,29 @@
import 'package:core/utils/platform_info.dart';
import 'package:equatable/equatable.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
class Worker with EquatableMixin {
final String id;
final WorkerType type;
final Map<String, dynamic> data;
Worker(this.id, this.type, this.data);
String get uniqueId {
if (PlatformInfo.isIOS) {
return type.iOSUniqueId;
}
return id;
}
Map<String, dynamic> get inputData {
data['workerType'] = type;
return data;
}
@override
List<Object?> get props => [id, type, data];
}
@@ -0,0 +1,22 @@
import 'package:tmail_ui_user/features/offline_mode/config/work_manager_constants.dart';
import 'package:tmail_ui_user/features/offline_mode/observer/sending_email_observer.dart';
import 'package:tmail_ui_user/features/offline_mode/observer/work_observer.dart';
enum WorkerType {
sendingEmail;
WorkObserver usingObserver() {
switch(this) {
case WorkerType.sendingEmail:
return SendingEmailObserver();
}
}
String get iOSUniqueId {
switch(this) {
case WorkerType.sendingEmail:
return WorkManagerConstants.sendingEmailUniqueId;
}
}
}