diff --git a/lib/main.dart b/lib/main.dart index 9776824..6f81b8f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,17 +1,20 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:obtainium/pages/home.dart'; import 'package:obtainium/services/apps_provider.dart'; import 'package:obtainium/services/settings_provider.dart'; import 'package:obtainium/services/source_service.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'; +const String CURRENT_RELEASE_TAG = + 'v0.1.2-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES + @pragma('vm:entry-point') -void backgroundUpdateCheck() { - Workmanager().executeTask((task, inputData) async { +void bgTaskCallback() { + Workmanager().executeTask((task, taskName) async { var appsProvider = AppsProvider(bg: true); await appsProvider.notify( 4, @@ -62,14 +65,8 @@ void main() async { ); SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); Workmanager().initialize( - backgroundUpdateCheck, + bgTaskCallback, ); - await Workmanager().cancelByUniqueName('update-apps-task'); - await Workmanager().registerPeriodicTask( - 'update-apps-task', 'backgroundUpdateCheck', - frequency: const Duration(minutes: 15), - initialDelay: const Duration(minutes: 15), - constraints: Constraints(networkType: NetworkType.connected)); runApp(MultiProvider( providers: [ ChangeNotifierProvider(create: (context) => AppsProvider()), @@ -86,32 +83,34 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { + SettingsProvider settingsProvider = context.watch(); + AppsProvider appsProvider = context.read(); + if (settingsProvider.prefs == null) { + settingsProvider.initializeSettings(); + } else { + Workmanager().registerPeriodicTask('bg-update-check', 'bg-update-check', + frequency: Duration(minutes: settingsProvider.updateInterval), + initialDelay: Duration(minutes: settingsProvider.updateInterval), + constraints: Constraints(networkType: NetworkType.connected), + existingWorkPolicy: ExistingWorkPolicy.replace); + bool isFirstRun = settingsProvider.checkAndFlipFirstRun(); + if (isFirstRun) { + Permission.notification.request(); + appsProvider.saveApp(App( + 'imranr98_obtainium_github', + 'https://github.com/ImranR98/Obtainium', + 'ImranR98', + 'Obtainium', + CURRENT_RELEASE_TAG, + CURRENT_RELEASE_TAG, + '')); + } + appsProvider.deleteSavedAPKs(); + appsProvider.checkUpdates(); + } + return DynamicColorBuilder( builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) { - AppsProvider appsProvider = context.read(); - appsProvider.deleteSavedAPKs(); - // Initialize the settings provider (if needed) and perform first-run actions if needed - SettingsProvider settingsProvider = context.watch(); - if (settingsProvider.prefs == null) { - settingsProvider.initializeSettings().then((_) { - bool isFirstRun = settingsProvider.checkAndFlipFirstRun(); - if (isFirstRun) { - appsProvider.downloaderNotifications - .resolvePlatformSpecificImplementation< - AndroidFlutterLocalNotificationsPlugin>()! - .requestPermission(); - appsProvider.saveApp(App( - 'imranr98_obtainium_github', - 'https://github.com/ImranR98/Obtainium', - 'ImranR98', - 'Obtainium', - 'v0.1.2-beta', // KEEP THIS IN SYNC WITH GITHUB RELEASES - 'v0.1.2-beta', - '')); - } - }); - } - ColorScheme lightColorScheme; ColorScheme darkColorScheme; if (lightDynamic != null && @@ -124,7 +123,6 @@ class MyApp extends StatelessWidget { darkColorScheme = ColorScheme.fromSeed( seedColor: defaultThemeColour, brightness: Brightness.dark); } - return MaterialApp( title: 'Obtainium', theme: ThemeData( diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index d382709..0ad433a 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -14,7 +14,6 @@ class _AppsPageState extends State { @override Widget build(BuildContext context) { var appsProvider = context.watch(); - appsProvider.checkUpdates(); var existingUpdateAppIds = appsProvider.getExistingUpdates(); return Scaffold( diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index d0ab394..237dcd1 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -66,6 +66,44 @@ class _SettingsPageState extends State { settingsProvider.colour = value; } }), + const SizedBox( + height: 16, + ), + DropdownButtonFormField( + decoration: const InputDecoration( + labelText: 'Background Update Checking Interval'), + value: settingsProvider.updateInterval, + items: const [ + DropdownMenuItem( + value: 15, + child: Text('15 Minutes'), + ), + DropdownMenuItem( + value: 30, + child: Text('30 Minutes'), + ), + DropdownMenuItem( + value: 60, + child: Text('1 Hour'), + ), + DropdownMenuItem( + value: 360, + child: Text('6 Hours'), + ), + DropdownMenuItem( + value: 720, + child: Text('12 Hours'), + ), + DropdownMenuItem( + value: 1440, + child: Text('1 Day'), + ), + ], + onChanged: (value) { + if (value != null) { + settingsProvider.updateInterval = value; + } + }), const Spacer(), Row( mainAxisAlignment: MainAxisAlignment.end, diff --git a/lib/services/settings_provider.dart b/lib/services/settings_provider.dart index 0d897d6..eddee41 100644 --- a/lib/services/settings_provider.dart +++ b/lib/services/settings_provider.dart @@ -37,6 +37,15 @@ class SettingsProvider with ChangeNotifier { notifyListeners(); } + int get updateInterval { + return prefs?.getInt('updateInterval') ?? 1440; + } + + set updateInterval(int min) { + prefs?.setInt('updateInterval', min < 15 ? 15 : min); + notifyListeners(); + } + checkAndFlipFirstRun() { bool result = prefs?.getBool('firstRun') ?? true; if (result) {