// Exposes functions used to save/load app settings import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:shared_preferences/shared_preferences.dart'; enum ThemeSettings { system, light, dark } enum ColourSettings { basic, materialYou } enum SortColumnSettings { added, nameAuthor, authorName } enum SortOrderSettings { ascending, descending } const maxAPIRateLimitMinutes = 30; const minUpdateIntervalMinutes = maxAPIRateLimitMinutes + 30; const maxUpdateIntervalMinutes = 4320; List updateIntervals = [15, 30, 60, 120, 180, 360, 720, 1440, 4320, 0] .where((element) => (element >= minUpdateIntervalMinutes && element <= maxUpdateIntervalMinutes) || element == 0) .toList(); class SettingsProvider with ChangeNotifier { SharedPreferences? prefs; String sourceUrl = 'https://github.com/ImranR98/Obtainium'; // Not done in constructor as we want to be able to await it Future initializeSettings() async { prefs = await SharedPreferences.getInstance(); notifyListeners(); } ThemeSettings get theme { return ThemeSettings .values[prefs?.getInt('theme') ?? ThemeSettings.system.index]; } set theme(ThemeSettings t) { prefs?.setInt('theme', t.index); notifyListeners(); } ColourSettings get colour { return ColourSettings .values[prefs?.getInt('colour') ?? ColourSettings.basic.index]; } set colour(ColourSettings t) { prefs?.setInt('colour', t.index); notifyListeners(); } int get updateInterval { var min = prefs?.getInt('updateInterval') ?? 180; if (!updateIntervals.contains(min)) { var temp = updateIntervals[0]; for (var i in updateIntervals) { if (min > i && i != 0) { temp = i; } } min = temp; } return min; } set updateInterval(int min) { prefs?.setInt('updateInterval', (min < 15 && min != 0) ? 15 : min); notifyListeners(); } SortColumnSettings get sortColumn { return SortColumnSettings .values[prefs?.getInt('sortColumn') ?? SortColumnSettings.added.index]; } set sortColumn(SortColumnSettings s) { prefs?.setInt('sortColumn', s.index); notifyListeners(); } SortOrderSettings get sortOrder { return SortOrderSettings.values[ prefs?.getInt('sortOrder') ?? SortOrderSettings.descending.index]; } set sortOrder(SortOrderSettings s) { prefs?.setInt('sortOrder', s.index); notifyListeners(); } bool checkAndFlipFirstRun() { bool result = prefs?.getBool('firstRun') ?? true; if (result) { prefs?.setBool('firstRun', false); } return result; } Future getInstallPermission() async { while (!(await Permission.requestInstallPackages.isGranted)) { // Explicit request as InstallPlugin request sometimes bugged Fluttertoast.showToast( msg: 'Please allow Obtainium to install Apps', toastLength: Toast.LENGTH_LONG); if ((await Permission.requestInstallPackages.request()) == PermissionStatus.granted) { break; } } } bool get showAppWebpage { return prefs?.getBool('showAppWebpage') ?? false; } set showAppWebpage(bool show) { prefs?.setBool('showAppWebpage', show); notifyListeners(); } String? getSettingString(String settingId) { return prefs?.getString(settingId); } void setSettingString(String settingId, String value) { prefs?.setString(settingId, value); notifyListeners(); } }