From ed4a26d348535704ef899500a4bdb600dbf9fd5b Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 5 Nov 2022 23:25:19 -0400 Subject: [PATCH] Switch to AlarmManager plugin from WorkManager for more reliable update checking (for #87) (#97) --- android/app/src/main/AndroidManifest.xml | 18 ++++++++ lib/main.dart | 57 ++++++++++-------------- lib/pages/settings.dart | 11 ----- lib/providers/settings_provider.dart | 2 +- pubspec.lock | 18 ++++---- pubspec.yaml | 4 +- 6 files changed, 53 insertions(+), 57 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ccee49f..535a429 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -30,7 +30,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 667e243..21a814a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -10,18 +11,21 @@ import 'package:obtainium/providers/settings_provider.dart'; import 'package:obtainium/providers/source_provider.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; -import 'package:workmanager/workmanager.dart'; import 'package:dynamic_color/dynamic_color.dart'; import 'package:device_info_plus/device_info_plus.dart'; +import 'package:android_alarm_manager_plus/android_alarm_manager_plus.dart'; -const String currentVersion = '0.6.6'; +const String currentVersion = '0.6.7'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES -const String bgUpdateCheckTaskName = 'bg-update-check'; +const int bgUpdateCheckAlarmId = 666; -bgUpdateCheck(int? ignoreAfterMicroseconds) async { +@pragma('vm:entry-point') +Future bgUpdateCheck(int taskId, Map? params) async { + int? ignoreAfterMicroseconds = params?['ignoreAfterMicroseconds']; WidgetsFlutterBinding.ensureInitialized(); + await AndroidAlarmManager.initialize(); DateTime? ignoreAfter = ignoreAfterMicroseconds != null ? DateTime.fromMicrosecondsSinceEpoch(ignoreAfterMicroseconds) : null; @@ -43,13 +47,13 @@ bgUpdateCheck(int? ignoreAfterMicroseconds) async { shouldCorrectInstallStatus: false); } catch (e) { if (e is RateLimitError || e is SocketException) { - String nextTaskName = - '$bgUpdateCheckTaskName-${nextIgnoreAfter.microsecondsSinceEpoch.toString()}'; - Workmanager().registerOneOffTask(nextTaskName, nextTaskName, - constraints: Constraints(networkType: NetworkType.connected), - initialDelay: Duration( - minutes: e is RateLimitError ? e.remainingMinutes : 15), - inputData: {'ignoreAfter': nextIgnoreAfter.microsecondsSinceEpoch}); + AndroidAlarmManager.oneShot( + Duration(minutes: e is RateLimitError ? e.remainingMinutes : 15), + Random().nextInt(pow(2, 31) as int), + bgUpdateCheck, + params: { + 'ignoreAfterMicroseconds': nextIgnoreAfter.microsecondsSinceEpoch + }); } else { err = e.toString(); } @@ -80,24 +84,14 @@ bgUpdateCheck(int? ignoreAfterMicroseconds) async { if (err != null) { throw err; } - return Future.value(true); } catch (e) { notificationsProvider .notify(ErrorCheckingUpdatesNotification(e.toString())); - return Future.error(false); } finally { await notificationsProvider.cancel(checkingUpdatesNotification.id); } } -@pragma('vm:entry-point') -void bgTaskCallback() { - // Background process callback - Workmanager().executeTask((task, inputData) async { - return await bgUpdateCheck(inputData?['ignoreAfter']); - }); -} - void main() async { WidgetsFlutterBinding.ensureInitialized(); if ((await DeviceInfoPlugin().androidInfo).version.sdkInt >= 29) { @@ -106,9 +100,7 @@ void main() async { ); SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); } - Workmanager().initialize( - bgTaskCallback, - ); + await AndroidAlarmManager.initialize(); runApp(MultiProvider( providers: [ ChangeNotifierProvider( @@ -165,17 +157,14 @@ class _ObtainiumState extends State { if (existingUpdateInterval != settingsProvider.updateInterval) { existingUpdateInterval = settingsProvider.updateInterval; if (existingUpdateInterval == 0) { - Workmanager().cancelByUniqueName(bgUpdateCheckTaskName); + AndroidAlarmManager.cancel(bgUpdateCheckAlarmId); } else { - Workmanager().registerPeriodicTask( - bgUpdateCheckTaskName, bgUpdateCheckTaskName, - frequency: Duration(minutes: existingUpdateInterval), - initialDelay: Duration(minutes: existingUpdateInterval), - constraints: Constraints(networkType: NetworkType.connected), - existingWorkPolicy: ExistingWorkPolicy.replace, - backoffPolicy: BackoffPolicy.linear, - backoffPolicyDelay: - const Duration(minutes: minUpdateIntervalMinutes)); + AndroidAlarmManager.periodic( + Duration(minutes: existingUpdateInterval), + bgUpdateCheckAlarmId, + bgUpdateCheck, + rescheduleOnReboot: true, + wakeup: true); } } } diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index f788914..c855657 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -209,17 +209,6 @@ class _SettingsPageState extends State { settingsProvider.updateInterval = value; } }), - const SizedBox( - height: 8, - ), - Text( - 'Longer intervals may result in less reliable behaviour', - style: Theme.of(context) - .textTheme - .labelMedium! - .merge(const TextStyle( - fontStyle: FontStyle.italic)), - ), const Divider( height: 48, ), diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index 09f089a..acf373d 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -55,7 +55,7 @@ class SettingsProvider with ChangeNotifier { } int get updateInterval { - var min = prefs?.getInt('updateInterval') ?? 60; + var min = prefs?.getInt('updateInterval') ?? 360; if (!updateIntervals.contains(min)) { var temp = updateIntervals[0]; for (var i in updateIntervals) { diff --git a/pubspec.lock b/pubspec.lock index 1cfbb76..a0f54de 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + android_alarm_manager_plus: + dependency: "direct main" + description: + name: android_alarm_manager_plus + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" animations: dependency: "direct main" description: @@ -358,7 +365,7 @@ packages: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.20" + version: "2.0.21" path_provider_ios: dependency: transitive description: @@ -470,7 +477,7 @@ packages: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "6.1.0" + version: "6.2.0" share_plus_platform_interface: dependency: transitive description: @@ -700,13 +707,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.1" - workmanager: - dependency: "direct main" - description: - name: workmanager - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 83f2468..788dd29 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 0.6.6+50 # When changing this, update the tag in main() accordingly +version: 0.6.7+51 # When changing this, update the tag in main() accordingly environment: sdk: '>=2.18.2 <3.0.0' @@ -42,7 +42,6 @@ dependencies: provider: ^6.0.3 http: ^0.13.5 webview_flutter: ^3.0.4 - workmanager: ^0.5.0 dynamic_color: ^1.5.4 html: ^0.15.0 shared_preferences: ^2.0.15 @@ -56,6 +55,7 @@ dependencies: share_plus: ^6.0.1 installed_apps: ^1.3.1 package_archive_info: ^0.1.0 + android_alarm_manager_plus: ^2.1.0 dev_dependencies: