Added BG update check interval + bugfixes

This commit is contained in:
Imran Remtulla
2022-08-26 17:15:16 -04:00
parent 2aca9d680b
commit 9459c96d48
4 changed files with 80 additions and 36 deletions

View File

@@ -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) {
return DynamicColorBuilder(
builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) {
AppsProvider appsProvider = context.read<AppsProvider>();
appsProvider.deleteSavedAPKs();
// Initialize the settings provider (if needed) and perform first-run actions if needed
SettingsProvider settingsProvider = context.watch<SettingsProvider>();
AppsProvider appsProvider = context.read<AppsProvider>();
if (settingsProvider.prefs == null) {
settingsProvider.initializeSettings().then((_) {
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) {
appsProvider.downloaderNotifications
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()!
.requestPermission();
Permission.notification.request();
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',
CURRENT_RELEASE_TAG,
CURRENT_RELEASE_TAG,
''));
}
});
appsProvider.deleteSavedAPKs();
appsProvider.checkUpdates();
}
return DynamicColorBuilder(
builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) {
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(

View File

@@ -14,7 +14,6 @@ class _AppsPageState extends State<AppsPage> {
@override
Widget build(BuildContext context) {
var appsProvider = context.watch<AppsProvider>();
appsProvider.checkUpdates();
var existingUpdateAppIds = appsProvider.getExistingUpdates();
return Scaffold(

View File

@@ -66,6 +66,44 @@ class _SettingsPageState extends State<SettingsPage> {
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,

View File

@@ -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) {