Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions fastlane/metadata/android/en-US/changelogs/1169.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Full and more detailed release notes are always available at the GitHub repository!

v0.19.1

* Added a new batch expiration setting.
* Optimized battery usage by tracker.
46 changes: 46 additions & 0 deletions lib/core/background/schedulers/tracking_watchdog_scheduler.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import 'package:dawarich/core/background/workmanager/tracker_watchdog_worker.dart';
import 'package:flutter/foundation.dart';
import 'package:workmanager/workmanager.dart';

final class TrackingWatchdogWorkScheduler {
static bool _initialized = false;

static Future<void> initialize() async {
if (_initialized) {
return;
}

await Workmanager().initialize(
TrackingWatchdogWorker.callbackDispatcher,
);

_initialized = true;
}

static Future<void> register() async {
await initialize();

if (kDebugMode) {
debugPrint('[TrackingWatchdog] Registering periodic watchdog.');
}

await Workmanager().registerPeriodicTask(
TrackingWatchdogWorker.uniqueWorkName,
TrackingWatchdogWorker.uniqueWorkName,
frequency: const Duration(minutes: 15),
existingWorkPolicy: ExistingPeriodicWorkPolicy.update,
);
}

static Future<void> cancel() async {
await initialize();

if (kDebugMode) {
debugPrint('[TrackingWatchdog] Cancelling periodic watchdog.');
}

await Workmanager().cancelByUniqueName(
TrackingWatchdogWorker.uniqueWorkName,
);
}
}
79 changes: 79 additions & 0 deletions lib/core/background/workmanager/tracker_watchdog_worker.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import 'package:dawarich/core/di/providers/core_providers.dart';
import 'package:dawarich/core/di/providers/session_providers.dart';
import 'package:dawarich/core/di/providers/usecase_providers.dart';
import 'package:dawarich/features/tracking/application/services/background_tracking_service.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:workmanager/workmanager.dart';

final class TrackingWatchdogWorker {
static const String uniqueWorkName = 'tracking-watchdog';

@pragma('vm:entry-point')
static void callbackDispatcher() {
Workmanager().executeTask((task, inputData) async {
if (task != uniqueWorkName) {
return true;
}

ProviderContainer? container;

try {
if (kDebugMode) {
debugPrint('[TrackingWatchdog] Worker started.');
}

container = ProviderContainer();
await container.read(coreProvider.future);

final session = await container.read(sessionBoxProvider.future);
final user = await session.refreshSession();

if (user == null) {
if (kDebugMode) {
debugPrint('[TrackingWatchdog] No user session, skipping.');
}
return true;
}

final getSettings =
await container.read(getTrackerSettingsUseCaseProvider.future);

final settings = await getSettings(user.id);

if (!settings.automaticTracking) {
if (kDebugMode) {
debugPrint('[TrackingWatchdog] Automatic tracking disabled, skipping.');
}
return true;
}

final isRunning = await BackgroundTrackingService.isRunning();

if (isRunning) {
if (kDebugMode) {
debugPrint('[TrackingWatchdog] Service already running.');
}
return true;
}

if (kDebugMode) {
debugPrint('[TrackingWatchdog] Service not running, restarting...');
}

final result = await BackgroundTrackingService.start();

if (kDebugMode) {
debugPrint('[TrackingWatchdog] Restart result: $result');
}

return true;
} catch (e, s) {
debugPrint('[TrackingWatchdog] Worker failed: $e\n$s');
return true;
} finally {
container?.dispose();
}
});
}
}
20 changes: 20 additions & 0 deletions lib/core/startup/startup_service.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:async';

import 'package:dawarich/core/background/schedulers/tracking_watchdog_scheduler.dart';
import 'package:dawarich/core/background/workmanager/stats_refresh_worker.dart';
import 'package:dawarich/core/di/providers/session_providers.dart';
import 'package:dawarich/core/di/providers/usecase_providers.dart';
Expand Down Expand Up @@ -68,6 +69,25 @@ final class StartupService {
// and expiration uploads when the foreground service isn't running).
await registerBatchUploadWorker();

final getSettings =
await container.read(getTrackerSettingsUseCaseProvider.future);

final settings = await getSettings(refreshedSessionUser.id);

if (settings.automaticTracking) {
if (kDebugMode) {
debugPrint('[StartupService] Registering tracking watchdog (startup sync).');
}

await TrackingWatchdogWorkScheduler.register();
} else {
if (kDebugMode) {
debugPrint('[StartupService] Cancelling tracking watchdog (startup sync).');
}

await TrackingWatchdogWorkScheduler.cancel();
}


final pendingRoute = InitializeTrackerNotificationServiceUseCase.pendingNotificationRoute;
if (pendingRoute != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,10 @@ final class BackgroundTrackingService {
: Err("Failed to start background service.");
}

static Future<bool> isRunning() async {
return FlutterBackgroundService().isRunning();
}

static Future<void> stop() async {
final service = FlutterBackgroundService();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:io';
import 'package:dawarich/core/background/schedulers/expired_batch_work_scheduler.dart';
import 'package:dawarich/core/background/schedulers/tracking_watchdog_scheduler.dart';
import 'package:dawarich/core/presentation/safe_change_notifier.dart';
import 'package:dawarich/features/tracking/application/services/background_tracking_service.dart';
import 'package:dawarich/features/tracking/application/usecases/point_creation/create_point_from_gps_workflow.dart';
Expand Down Expand Up @@ -501,8 +502,11 @@ final class TrackerPageViewModel extends ChangeNotifier with SafeChangeNotifier
return Err("Failed to start background service: $message");
}

await TrackingWatchdogWorkScheduler.register();

} else {
BackgroundTrackingService.stop();
await TrackingWatchdogWorkScheduler.cancel();
}

setIsUpdatingTracking(false);
Expand Down
Loading