Save settings on shared preferences

This commit is contained in:
Juan Gilsanz Polo 2024-02-02 20:37:27 +01:00
parent 3eaf7143f2
commit 794b690c91
7 changed files with 242 additions and 465 deletions

View file

@ -10,6 +10,7 @@ import 'package:dynamic_color/dynamic_color.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:store_checker/store_checker.dart';
import 'package:window_size/window_size.dart';
@ -31,8 +32,8 @@ import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/constants/colors.dart';
import 'package:adguard_home_manager/config/globals.dart';
import 'package:adguard_home_manager/config/theme.dart';
import 'package:adguard_home_manager/classes/http_override.dart';
import 'package:adguard_home_manager/services/db/database.dart';
import 'package:adguard_home_manager/classes/http_override.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
@ -49,7 +50,11 @@ void main() async {
await dotenv.load(fileName: '.env');
final AppConfigProvider appConfigProvider = AppConfigProvider();
final sharedPreferences = await SharedPreferences.getInstance();
final AppConfigProvider appConfigProvider = AppConfigProvider(
sharedPreferencesInstance: sharedPreferences
);
final ServersProvider serversProvider = ServersProvider();
final StatusProvider statusProvider = StatusProvider();
final ClientsProvider clientsProvider = ClientsProvider();
@ -69,9 +74,7 @@ void main() async {
appConfigProvider.setIosInfo(iosInfo);
}
final dbData = await loadDb(appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31);
if (dbData['appConfig']['overrideSslCheck'] == 1) {
if (sharedPreferences.getBool('overrideSslCheck') == true) {
HttpOverrides.global = MyHttpOverrides();
}
@ -80,10 +83,12 @@ void main() async {
appConfigProvider.setInstallationSource(installationSource);
}
final dbData = await loadDb();
serversProvider.setDbInstance(dbData['dbInstance']);
appConfigProvider.saveFromDb(dbData['dbInstance'], dbData['appConfig']);
serversProvider.saveFromDb(dbData['servers']);
appConfigProvider.saveFromSharedPreferences();
PackageInfo appInfo = await PackageInfo.fromPlatform();
appConfigProvider.setAppInfo(appInfo);
@ -208,42 +213,45 @@ class _MainState extends State<Main> {
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return DynamicColorBuilder(
builder: (lightDynamic, darkDynamic) => MaterialApp(
title: 'AdGuard Home Manager',
theme: appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31
? appConfigProvider.useDynamicColor == true
? lightTheme(lightDynamic)
: lightThemeOldVersions(colors[appConfigProvider.staticColor])
: lightThemeOldVersions(colors[appConfigProvider.staticColor]),
darkTheme: appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31
? appConfigProvider.useDynamicColor == true
? darkTheme(darkDynamic)
: darkThemeOldVersions(colors[appConfigProvider.staticColor])
: darkThemeOldVersions(colors[appConfigProvider.staticColor]),
themeMode: appConfigProvider.selectedTheme,
debugShowCheckedModeBanner: false,
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
AppLocalizations.delegate,
],
supportedLocales: const [
Locale('en', ''),
Locale('es', ''),
Locale('zh', ''),
Locale('zh', 'CN'),
Locale('pl', ''),
Locale('tr', ''),
Locale('ru', '')
],
scaffoldMessengerKey: scaffoldMessengerKey,
navigatorKey: globalNavigatorKey,
builder: (context, child) => CustomMenuBar(
child: child!,
),
home: const Layout(),
),
builder: (lightDynamic, darkDynamic) {
appConfigProvider.setSupportsDynamicTheme(lightDynamic != null && darkDynamic != null);
return MaterialApp(
title: 'AdGuard Home Manager',
theme: lightDynamic != null
? appConfigProvider.useDynamicColor == true
? lightTheme(lightDynamic)
: lightThemeOldVersions(colors[appConfigProvider.staticColor])
: lightThemeOldVersions(colors[appConfigProvider.staticColor]),
darkTheme: darkDynamic != null
? appConfigProvider.useDynamicColor == true
? darkTheme(darkDynamic)
: darkThemeOldVersions(colors[appConfigProvider.staticColor])
: darkThemeOldVersions(colors[appConfigProvider.staticColor]),
themeMode: appConfigProvider.selectedTheme,
debugShowCheckedModeBanner: false,
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
AppLocalizations.delegate,
],
supportedLocales: const [
Locale('en', ''),
Locale('es', ''),
Locale('zh', ''),
Locale('zh', 'CN'),
Locale('pl', ''),
Locale('tr', ''),
Locale('ru', '')
],
scaffoldMessengerKey: scaffoldMessengerKey,
navigatorKey: globalNavigatorKey,
builder: (context, child) => CustomMenuBar(
child: child!,
),
home: const Layout(),
);
}
);
}
}

View file

@ -1,22 +1,23 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/scheduler.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:store_checker/store_checker.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:sqflite/sqlite_api.dart';
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/config/home_top_items_default_order.dart';
import 'package:adguard_home_manager/models/github_release.dart';
import 'package:adguard_home_manager/services/db/queries.dart';
import 'package:adguard_home_manager/functions/conversions.dart';
import 'package:adguard_home_manager/models/app_log.dart';
class AppConfigProvider with ChangeNotifier {
Database? _dbInstance;
final SharedPreferences sharedPreferencesInstance;
AppConfigProvider({
required this.sharedPreferencesInstance
});
PackageInfo? _appInfo;
AndroidDeviceInfo? _androidDeviceInfo;
@ -28,6 +29,7 @@ class AppConfigProvider with ChangeNotifier {
bool _showingSnackbar = false;
bool _supportsDynamicTheme = true;
int _selectedTheme = 0;
bool _useDynamicColor = true;
int _staticColor = 0;
@ -38,19 +40,19 @@ class AppConfigProvider with ChangeNotifier {
List<HomeTopItems> _homeTopItemsOrder = homeTopItemsDefaultOrder;
int _hideServerAddress = 0;
bool _hideServerAddress = false;
final List<AppLog> _logs = [];
int _overrideSslCheck = 0;
bool _overrideSslCheck = false;
int _hideZeroValues = 0;
bool _hideZeroValues = false;
int _showTimeLogs = 0;
bool _showTimeLogs = false;
int _showIpLogs = 0;
bool _showIpLogs = false;
int _combinedChartHome = 0;
bool _combinedChartHome = false;
String? _doNotRememberVersion;
@ -88,6 +90,10 @@ class AppConfigProvider with ChangeNotifier {
}
}
bool get supportsDynamicTheme {
return _supportsDynamicTheme;
}
int get selectedThemeNumber {
return _selectedTheme;
}
@ -105,11 +111,11 @@ class AppConfigProvider with ChangeNotifier {
}
bool get overrideSslCheck {
return _overrideSslCheck == 1 ? true : false;
return _overrideSslCheck;
}
bool get hideZeroValues {
return _hideZeroValues == 1 ? true : false;
return _hideZeroValues;
}
int get selectedScreen {
@ -133,15 +139,15 @@ class AppConfigProvider with ChangeNotifier {
}
bool get showTimeLogs {
return _showTimeLogs == 1 ? true : false;
return _showTimeLogs;
}
bool get showIpLogs {
return _showIpLogs == 1 ? true : false;
return _showIpLogs;
}
bool get combinedChartHome {
return _combinedChartHome == 1 ? true : false;
return _combinedChartHome;
}
String? get doNotRememberVersion {
@ -165,11 +171,11 @@ class AppConfigProvider with ChangeNotifier {
}
bool get hideServerAddress {
return _hideServerAddress == 1 ? true : false;
return _hideServerAddress;
}
void setDbInstance(Database db) {
_dbInstance = db;
void setSupportsDynamicTheme(bool value) {
_supportsDynamicTheme = value;
}
void setAppInfo(PackageInfo appInfo) {
@ -227,206 +233,145 @@ class AppConfigProvider with ChangeNotifier {
}
Future<bool> setOverrideSslCheck(bool status) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'overrideSslCheck',
value: status == true ? 1 : 0
);
if (updated == true) {
_overrideSslCheck = status == true ? 1 : 0;
try {
sharedPreferencesInstance.setBool('overrideSslCheck', status);
_overrideSslCheck = status;
notifyListeners();
return true;
}
else {
} catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return false;
}
}
Future<bool> setHideZeroValues(bool status) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'hideZeroValues',
value: status == true ? 1 : 0
);
if (updated == true) {
_hideZeroValues = status == true ? 1 : 0;
try {
sharedPreferencesInstance.setBool('hideZeroValues', status);
_hideZeroValues = status;
notifyListeners();
return true;
}
else {
} catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return false;
}
}
Future<bool> setshowTimeLogs(bool status) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'showTimeLogs',
value: status == true ? 1 : 0
);
if (updated == true) {
_showTimeLogs = status == true ? 1 : 0;
try {
sharedPreferencesInstance.setBool('showTimeLogs', status);
_showTimeLogs = status;
notifyListeners();
return true;
}
else {
} catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return false;
}
}
Future<bool> setShowIpLogs(bool status) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'showIpLogs',
value: status == true ? 1 : 0
);
if (updated == true) {
_showIpLogs = status == true ? 1 : 0;
try {
sharedPreferencesInstance.setBool('showIpLogs', status);
_showIpLogs = status;
notifyListeners();
return true;
}
else {
} catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return false;
}
}
Future<bool> setSelectedTheme(int value) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'theme',
value: value
);
if (updated == true) {
try {
sharedPreferencesInstance.setInt('selectedTheme', value);
_selectedTheme = value;
notifyListeners();
return true;
}
else {
} catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return false;
}
}
Future<bool> setUseDynamicColor(bool value) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'useDynamicColor',
value: value == true ? 1 : 0
);
if (updated == true) {
try {
sharedPreferencesInstance.setBool('useDynamicColor', value);
_useDynamicColor = value;
notifyListeners();
return true;
}
else {
return false;
}
}
Future<bool> setUseThemeColorForStatus(bool value) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'useThemeColorForStatus',
value: value == true ? 1 : 0
);
if (updated == true) {
_useThemeColorForStatus = value;
notifyListeners();
return true;
}
else {
} catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return false;
}
}
Future<bool> setCombinedChartHome(bool value) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'combinedChart',
value: value == true ? 1 : 0
);
if (updated == true) {
_combinedChartHome = value == true ? 1 : 0;
try {
sharedPreferencesInstance.setBool('combinedChart', value);
_combinedChartHome = value;
notifyListeners();
return true;
}
else {
} catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return false;
}
}
Future<bool> setStaticColor(int value) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'staticColor',
value: value
);
if (updated == true) {
try {
sharedPreferencesInstance.setInt('staticColor', value);
_staticColor = value;
notifyListeners();
return true;
}
else {
} catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return false;
}
}
Future<bool> setHomeTopItemsOrder(List<HomeTopItems> order) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'homeTopItemsOrder',
value: jsonEncode(List<String>.from(order.map((e) => e.name)))
);
if (updated == true) {
try {
sharedPreferencesInstance.setStringList('homeTopItemsOrder', List<String>.from(order.map((e) => e.name)));
_homeTopItemsOrder = order;
notifyListeners();
return true;
}
else {
} catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return false;
}
}
Future<bool> setHideServerAddress(bool value) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'hideServerAddress',
value: value == true ? 1 : 0
);
if (updated == true) {
_hideServerAddress = value == true ? 1 : 0;
try {
sharedPreferencesInstance.setBool('hideServerAddress', value);
_hideServerAddress = value;
notifyListeners();
return true;
}
else {
} catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return false;
}
}
Future<bool> setDoNotRememberVersion(String value) async {
final updated = await updateConfigQuery(
db: _dbInstance!,
column: 'doNotRememberVersion',
value: value
);
final updated = await sharedPreferencesInstance.setString('hideServerAddress', value);
return updated;
}
void saveFromDb(Database dbInstance, Map<String, dynamic> dbData) {
_selectedTheme = dbData['theme'] ?? 0;
_overrideSslCheck = dbData['overrideSslCheck'] ?? 0;
_hideZeroValues = dbData['hideZeroValues'];
_useDynamicColor = convertFromIntToBool(dbData['useDynamicColor'])!;
_staticColor = dbData['staticColor'] ?? 0;
_useThemeColorForStatus = dbData['useThemeColorForStatus'] != null ? convertFromIntToBool(dbData['useThemeColorForStatus'])! : false;
_showTimeLogs = dbData['showTimeLogs'] ?? 0;
_doNotRememberVersion = dbData['doNotRememberVersion'];
_showIpLogs = dbData['showIpLogs'] ?? 0;
_combinedChartHome = dbData['combinedChart'] ?? 0;
_hideServerAddress = dbData['hideServerAddress'];
if (dbData['homeTopItemsOrder'] != null) {
void saveFromSharedPreferences() {
_selectedTheme = sharedPreferencesInstance.getInt('selectedTheme') ?? 0;
_overrideSslCheck = sharedPreferencesInstance.getBool('overrideSslCheck') ?? false;
_hideZeroValues = sharedPreferencesInstance.getBool('hideZeroValues') ?? false;
_useDynamicColor = sharedPreferencesInstance.getBool('useDynamicColor') ?? true;
_staticColor = sharedPreferencesInstance.getInt('staticColor') ?? 0;
_showTimeLogs = sharedPreferencesInstance.getBool('showTimeLogs') ?? false;
_doNotRememberVersion = sharedPreferencesInstance.getString('doNotRememberVersion');
_showIpLogs = sharedPreferencesInstance.getBool('showIpLogs') ?? false;
_combinedChartHome = sharedPreferencesInstance.getBool('combinedChart') ?? false;
_hideServerAddress = sharedPreferencesInstance.getBool('hideServerAddress') ?? false;
if (sharedPreferencesInstance.getStringList('homeTopItemsOrder') != null) {
try {
final itemsOrder = List<HomeTopItems>.from(
List<String>.from(jsonDecode(dbData['homeTopItemsOrder'])).map((e) {
List<String>.from(sharedPreferencesInstance.getStringList('homeTopItemsOrder')!).map((e) {
switch (e) {
case 'queriedDomains':
return HomeTopItems.queriedDomains;
@ -458,8 +403,5 @@ class AppConfigProvider with ChangeNotifier {
_homeTopItemsOrder = homeTopItemsDefaultOrder;
}
}
_dbInstance = dbInstance;
notifyListeners();
}
}

View file

@ -120,7 +120,7 @@ class _CustomizationWidgetState extends State<CustomizationWidget> {
label: AppLocalizations.of(context)!.color,
padding: const EdgeInsets.only(top: 45, left: 16, right: 16, bottom: 5),
),
if (appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31) CustomSwitchListTile(
if (appConfigProvider.supportsDynamicTheme) CustomSwitchListTile(
value: dynamicColor,
onChanged: (value) {
setState(() => dynamicColor = value);
@ -129,7 +129,10 @@ class _CustomizationWidgetState extends State<CustomizationWidget> {
title: AppLocalizations.of(context)!.useDynamicTheme,
),
if (!(appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31)) const SizedBox(height: 20),
if (dynamicColor == false) Padding(
if (
appConfigProvider.supportsDynamicTheme == false ||
(appConfigProvider.supportsDynamicTheme == true && dynamicColor == false)
) Padding(
padding: const EdgeInsets.only(bottom: 8, left: 16, right: 16),
child: Scrollbar(
controller: _colorsScrollController,
@ -207,15 +210,6 @@ class _CustomizationWidgetState extends State<CustomizationWidget> {
),
),
),
CustomSwitchListTile(
value: useThemeColorInsteadGreenRed,
onChanged: (value) {
setState(() => useThemeColorInsteadGreenRed = value);
appConfigProvider.setUseThemeColorForStatus(value);
},
title: AppLocalizations.of(context)!.useThemeColorStatus,
subtitle: AppLocalizations.of(context)!.useThemeColorStatusDescription,
)
],
),
),

View file

@ -1,141 +1,7 @@
import 'package:sqflite/sqflite.dart';
import 'package:adguard_home_manager/config/home_top_items_default_order.dart';
Future<Map<String, dynamic>> loadDb(bool acceptsDynamicTheme) async {
Future<Map<String, dynamic>> loadDb() async {
List<Map<String, Object?>>? servers;
List<Map<String, Object?>>? appConfig;
Future rebuildAppConfig(Database db) async {
await db.execute("DROP TABLE appConfig");
await db.execute("CREATE TABLE appConfig (theme NUMERIC, overrideSslCheck NUMERIC, hideZeroValues NUMERIC, useDynamicColor NUMERIC, staticColor NUMERIC, useThemeColorForStatus NUMERIC, showTimeLogs NUMERIC, showIpLogs NUMERIC, combinedChart NUMERIC, doNotRememberVersion TEXT)");
await db.execute("INSERT INTO appConfig (theme, overrideSslCheck, hideZeroValues, useDynamicColor, staticColor, useThemeColorForStatus, showTimeLogs, showIpLogs, combinedChart) VALUES (0, 0, 0, ${acceptsDynamicTheme == true ? 1 : 0}, 0, 0, 0, 0, 0)");
}
Future upgradeDbToV2(Database db) async {
await db.execute("ALTER TABLE appConfig ADD COLUMN overrideSslCheck NUMERIC");
await db.execute("UPDATE appConfig SET overrideSslCheck = 0");
await db.transaction((txn) async{
await txn.rawQuery(
'SELECT * FROM appConfig',
);
});
}
Future upgradeDbToV3(Database db) async {
await db.execute("ALTER TABLE appConfig ADD COLUMN hideZeroValues NUMERIC");
await db.execute("UPDATE appConfig SET hideZeroValues = 0");
await db.transaction((txn) async{
await txn.rawQuery(
'SELECT * FROM appConfig',
);
});
}
Future upgradeDbToV4(Database db) async {
await db.execute("ALTER TABLE servers ADD COLUMN runningOnHa INTEGER");
await db.execute("UPDATE servers SET runningOnHa = 0");
await db.transaction((txn) async{
await txn.rawQuery(
'SELECT * FROM servers',
);
});
}
Future upgradeDbToV5(Database db) async {
await db.execute("ALTER TABLE appConfig ADD COLUMN useDynamicColor NUMERIC");
await db.execute("ALTER TABLE appConfig ADD COLUMN staticColor NUMERIC");
await db.execute("ALTER TABLE appConfig ADD COLUMN useThemeColorForStatus NUMERIC");
await db.execute("UPDATE appConfig SET useDynamicColor = ${acceptsDynamicTheme == true ? 1 : 0}, staticColor = 0, useThemeColorForStatus = 0");
await db.transaction((txn) async{
await txn.rawQuery(
'SELECT * FROM appConfig',
);
});
}
Future upgradeDbToV6(Database db) async {
await db.execute("ALTER TABLE appConfig ADD COLUMN showNameTimeLogs NUMERIC");
await db.execute("UPDATE appConfig SET showNameTimeLogs = 0");
await db.transaction((txn) async{
await txn.rawQuery(
'SELECT * FROM appConfig',
);
});
}
Future upgradeDbToV7(Database db) async {
await db.execute("ALTER TABLE appConfig ADD COLUMN doNotRememberVersion TEXT");
await db.transaction((txn) async{
await txn.rawQuery(
'SELECT * FROM appConfig',
);
});
}
Future upgradeDbToV8(Database db) async {
try {
final data = await db.rawQuery(
'SELECT * FROM appConfig',
);
await rebuildAppConfig(db);
await db.update(
'appConfig',
{
'theme': data[0]['theme'],
'overrideSslCheck': data[0]['overrideSslCheck'],
'hideZeroValues': data[0]['hideZeroValues'],
'useDynamicColor': data[0]['useDynamicColor'],
'staticColor': data[0]['staticColor'],
'useThemeColorForStatus': data[0]['useThemeColorForStatus'],
'showTimeLogs': data[0]['showNameTimeLogs'],
'showIpLogs': data[0]['showIpLogs'],
'combinedChart': data[0]['combinedChart'],
}
);
} catch (e) {
await rebuildAppConfig(db);
}
}
Future upgradeDbToV9(Database db) async {
await db.execute("ALTER TABLE appConfig ADD COLUMN hideServerAddress NUMERIC");
await db.execute("ALTER TABLE appConfig ADD COLUMN homeTopItemsOrder TEXT");
await db.execute("UPDATE appConfig SET hideServerAddress = 0, homeTopItemsOrder = '$homeTopItemsDefaultOrderString'");
await db.transaction((txn) async{
await txn.rawQuery(
'SELECT * FROM appConfig',
);
});
}
Future upgradeDbToV10(Database db) async {
await db.execute("ALTER TABLE appConfig ADD COLUMN showTopItemsChart NUMERIC");
await db.execute("UPDATE appConfig SET showTopItemsChart = 1");
await db.transaction((txn) async{
await txn.rawQuery(
'SELECT * FROM appConfig',
);
});
}
Future upgradeDbToV11(Database db) async {
await db.execute("ALTER TABLE appConfig DROP COLUMN showTopItemsChart");
await db.transaction((txn) async{
await txn.rawQuery(
'SELECT * FROM appConfig',
);
});
}
Database db = await openDatabase(
'adguard_home_manager.db',
@ -159,135 +25,9 @@ Future<Map<String, dynamic>> loadDb(bool acceptsDynamicTheme) async {
)
"""
);
await db.execute(
"""
CREATE TABLE
appConfig (
theme NUMERIC,
overrideSslCheck NUMERIC,
hideZeroValues NUMERIC,
useDynamicColor NUMERIC,
staticColor NUMERIC,
useThemeColorForStatus NUMERIC,
showTimeLogs NUMERIC,
showIpLogs NUMERIC,
combinedChart NUMERIC,
doNotRememberVersion TEXT,
hideServerAddress NUMERIC,
homeTopItemsOrder TEXT
)
"""
);
await db.execute(
"""
INSERT INTO
appConfig (
theme,
overrideSslCheck,
hideZeroValues,
useDynamicColor,
staticColor,
useThemeColorForStatus,
showTimeLogs,
showIpLogs,
combinedChart,
hideServerAddress,
homeTopItemsOrder
)
VALUES (
0,
0,
0,
${acceptsDynamicTheme == true ? 1 : 0},
0,
0,
0,
0,
0,
0,
'$homeTopItemsDefaultOrderString'
)
"""
);
},
onUpgrade: (Database db, int oldVersion, int newVersion) async {
if (oldVersion == 1) {
await upgradeDbToV2(db);
await upgradeDbToV3(db);
await upgradeDbToV4(db);
await upgradeDbToV5(db);
await upgradeDbToV6(db);
await upgradeDbToV7(db);
await upgradeDbToV8(db);
await upgradeDbToV9(db);
await upgradeDbToV10(db);
await upgradeDbToV11(db);
}
if (oldVersion == 2) {
await upgradeDbToV3(db);
await upgradeDbToV4(db);
await upgradeDbToV5(db);
await upgradeDbToV6(db);
await upgradeDbToV7(db);
await upgradeDbToV8(db);
await upgradeDbToV9(db);
await upgradeDbToV10(db);
await upgradeDbToV11(db);
}
if (oldVersion == 3) {
await upgradeDbToV4(db);
await upgradeDbToV5(db);
await upgradeDbToV6(db);
await upgradeDbToV7(db);
await upgradeDbToV8(db);
await upgradeDbToV9(db);
await upgradeDbToV10(db);
await upgradeDbToV11(db);
}
if (oldVersion == 4) {
await upgradeDbToV5(db);
await upgradeDbToV6(db);
await upgradeDbToV7(db);
await upgradeDbToV8(db);
await upgradeDbToV9(db);
await upgradeDbToV10(db);
await upgradeDbToV11(db);
}
if (oldVersion == 5) {
await upgradeDbToV6(db);
await upgradeDbToV7(db);
await upgradeDbToV8(db);
await upgradeDbToV9(db);
await upgradeDbToV10(db);
await upgradeDbToV11(db);
}
if (oldVersion == 6) {
await upgradeDbToV7(db);
await upgradeDbToV8(db);
await upgradeDbToV9(db);
await upgradeDbToV10(db);
await upgradeDbToV11(db);
}
if (oldVersion == 7) {
await upgradeDbToV8(db);
await upgradeDbToV9(db);
await upgradeDbToV10(db);
await upgradeDbToV11(db);
}
if (oldVersion == 8) {
await upgradeDbToV9(db);
await upgradeDbToV10(db);
await upgradeDbToV11(db);
}
if (oldVersion == 9) {
await upgradeDbToV10(db);
await upgradeDbToV11(db);
}
if (oldVersion == 10) {
await upgradeDbToV11(db);
}
},
onOpen: (Database db) async {
await db.transaction((txn) async{
@ -295,17 +35,11 @@ Future<Map<String, dynamic>> loadDb(bool acceptsDynamicTheme) async {
'SELECT * FROM servers',
);
});
await db.transaction((txn) async{
appConfig = await txn.rawQuery(
'SELECT * FROM appConfig',
);
});
}
);
return {
"servers": servers,
"appConfig": appConfig![0],
"dbInstance": db,
};
}

View file

@ -9,6 +9,7 @@ import device_info_plus
import dynamic_color
import package_info_plus
import sentry_flutter
import shared_preferences_foundation
import sqflite
import sqlite3_flutter_libs
import url_launcher_macos
@ -19,6 +20,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
SentryFlutterPlugin.register(with: registry.registrar(forPlugin: "SentryFlutterPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))

View file

@ -502,6 +502,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
percent_indicator:
dependency: "direct main"
description:
@ -526,6 +550,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "5.4.0"
platform:
dependency: transitive
description:
name: platform
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
plugin_platform_interface:
dependency: transitive
description:
@ -574,6 +606,62 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.15.0"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
url: "https://pub.dev"
source: hosted
version: "2.3.5"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
sky_engine:
dependency: transitive
description: flutter
@ -852,6 +940,14 @@ packages:
url: "https://github.com/google/flutter-desktop-embedding"
source: git
version: "0.1.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
url: "https://pub.dev"
source: hosted
version: "1.0.4"
xml:
dependency: transitive
description:

View file

@ -77,6 +77,7 @@ dependencies:
timezone: ^0.9.2
flutter_custom_tabs: ^2.0.0+1
url_launcher: ^6.2.4
shared_preferences: ^2.2.2
dev_dependencies:
flutter_test: