65 lines
2.2 KiB
Dart
65 lines
2.2 KiB
Dart
import 'dart:developer';
|
|
|
|
import 'package:background_fetch/background_fetch.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
import '../app.dart';
|
|
import '../homescreen_widgets/timetable/timetableHomeWidget.dart';
|
|
|
|
class ScheduledTask {
|
|
static final String fetchApiLastRunTimestampKey = 'fetchApiLastRunTimestamp';
|
|
|
|
static Future<void> configure() async {
|
|
var status = await BackgroundFetch.configure(BackgroundFetchConfig(
|
|
minimumFetchInterval: 15,
|
|
stopOnTerminate: false,
|
|
enableHeadless: true,
|
|
requiresBatteryNotLow: false,
|
|
requiresCharging: false,
|
|
requiresStorageNotLow: false,
|
|
requiresDeviceIdle: false,
|
|
requiredNetworkType: NetworkType.ANY,
|
|
startOnBoot: true,
|
|
), (String taskId) async {
|
|
log('Background fetch started with id $taskId');
|
|
await ScheduledTask.backgroundFetch();
|
|
BackgroundFetch.finish(taskId);
|
|
}, (String taskId) async {
|
|
log('Background fetch stopped because of an timeout with id $taskId');
|
|
BackgroundFetch.finish(taskId);
|
|
});
|
|
|
|
log('Background Fetch-API status: $status');
|
|
}
|
|
|
|
// called periodically, iOS and Android
|
|
static Future<void> backgroundFetch() async {
|
|
var sp = await SharedPreferences.getInstance();
|
|
var history = sp.getStringList(fetchApiLastRunTimestampKey) ?? List.empty(growable: true);
|
|
history.add(DateTime.now().toIso8601String());
|
|
try {
|
|
TimetableHomeWidget.update(App.appContext.currentContext!);
|
|
} on Exception catch(e) {
|
|
history.add('Got Error:');
|
|
history.add(e.toString());
|
|
history.add('--- EXCEPTION END ---');
|
|
}
|
|
sp.setStringList(fetchApiLastRunTimestampKey, history.take(100).toList());
|
|
}
|
|
|
|
// only Android, starts when app is terminated
|
|
@pragma('vm:entry-point')
|
|
static Future<void> headless(HeadlessTask task) async {
|
|
var taskId = task.taskId;
|
|
var isTimeout = task.timeout;
|
|
if (isTimeout) {
|
|
log('Background fetch headless task timed-out: $taskId');
|
|
BackgroundFetch.finish(taskId);
|
|
return;
|
|
}
|
|
log('Background fetch headless event received.');
|
|
await backgroundFetch();
|
|
BackgroundFetch.finish(taskId);
|
|
}
|
|
}
|