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:device_info_plus/device_info_plus.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:sentry_flutter/sentry_flutter.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:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:store_checker/store_checker.dart'; import 'package:store_checker/store_checker.dart';
import 'package:window_size/window_size.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/constants/colors.dart';
import 'package:adguard_home_manager/config/globals.dart'; import 'package:adguard_home_manager/config/globals.dart';
import 'package:adguard_home_manager/config/theme.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/services/db/database.dart';
import 'package:adguard_home_manager/classes/http_override.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
@ -49,7 +50,11 @@ void main() async {
await dotenv.load(fileName: '.env'); 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 ServersProvider serversProvider = ServersProvider();
final StatusProvider statusProvider = StatusProvider(); final StatusProvider statusProvider = StatusProvider();
final ClientsProvider clientsProvider = ClientsProvider(); final ClientsProvider clientsProvider = ClientsProvider();
@ -69,9 +74,7 @@ void main() async {
appConfigProvider.setIosInfo(iosInfo); appConfigProvider.setIosInfo(iosInfo);
} }
final dbData = await loadDb(appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31); if (sharedPreferences.getBool('overrideSslCheck') == true) {
if (dbData['appConfig']['overrideSslCheck'] == 1) {
HttpOverrides.global = MyHttpOverrides(); HttpOverrides.global = MyHttpOverrides();
} }
@ -80,10 +83,12 @@ void main() async {
appConfigProvider.setInstallationSource(installationSource); appConfigProvider.setInstallationSource(installationSource);
} }
final dbData = await loadDb();
serversProvider.setDbInstance(dbData['dbInstance']); serversProvider.setDbInstance(dbData['dbInstance']);
appConfigProvider.saveFromDb(dbData['dbInstance'], dbData['appConfig']);
serversProvider.saveFromDb(dbData['servers']); serversProvider.saveFromDb(dbData['servers']);
appConfigProvider.saveFromSharedPreferences();
PackageInfo appInfo = await PackageInfo.fromPlatform(); PackageInfo appInfo = await PackageInfo.fromPlatform();
appConfigProvider.setAppInfo(appInfo); appConfigProvider.setAppInfo(appInfo);
@ -208,14 +213,16 @@ class _MainState extends State<Main> {
final appConfigProvider = Provider.of<AppConfigProvider>(context); final appConfigProvider = Provider.of<AppConfigProvider>(context);
return DynamicColorBuilder( return DynamicColorBuilder(
builder: (lightDynamic, darkDynamic) => MaterialApp( builder: (lightDynamic, darkDynamic) {
appConfigProvider.setSupportsDynamicTheme(lightDynamic != null && darkDynamic != null);
return MaterialApp(
title: 'AdGuard Home Manager', title: 'AdGuard Home Manager',
theme: appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31 theme: lightDynamic != null
? appConfigProvider.useDynamicColor == true ? appConfigProvider.useDynamicColor == true
? lightTheme(lightDynamic) ? lightTheme(lightDynamic)
: lightThemeOldVersions(colors[appConfigProvider.staticColor]) : lightThemeOldVersions(colors[appConfigProvider.staticColor])
: lightThemeOldVersions(colors[appConfigProvider.staticColor]), : lightThemeOldVersions(colors[appConfigProvider.staticColor]),
darkTheme: appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31 darkTheme: darkDynamic != null
? appConfigProvider.useDynamicColor == true ? appConfigProvider.useDynamicColor == true
? darkTheme(darkDynamic) ? darkTheme(darkDynamic)
: darkThemeOldVersions(colors[appConfigProvider.staticColor]) : darkThemeOldVersions(colors[appConfigProvider.staticColor])
@ -243,7 +250,8 @@ class _MainState extends State<Main> {
child: child!, child: child!,
), ),
home: const Layout(), home: const Layout(),
), );
}
); );
} }
} }

View file

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

View file

@ -120,7 +120,7 @@ class _CustomizationWidgetState extends State<CustomizationWidget> {
label: AppLocalizations.of(context)!.color, label: AppLocalizations.of(context)!.color,
padding: const EdgeInsets.only(top: 45, left: 16, right: 16, bottom: 5), 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, value: dynamicColor,
onChanged: (value) { onChanged: (value) {
setState(() => dynamicColor = value); setState(() => dynamicColor = value);
@ -129,7 +129,10 @@ class _CustomizationWidgetState extends State<CustomizationWidget> {
title: AppLocalizations.of(context)!.useDynamicTheme, title: AppLocalizations.of(context)!.useDynamicTheme,
), ),
if (!(appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31)) const SizedBox(height: 20), 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), padding: const EdgeInsets.only(bottom: 8, left: 16, right: 16),
child: Scrollbar( child: Scrollbar(
controller: _colorsScrollController, 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:sqflite/sqflite.dart';
import 'package:adguard_home_manager/config/home_top_items_default_order.dart'; Future<Map<String, dynamic>> loadDb() async {
Future<Map<String, dynamic>> loadDb(bool acceptsDynamicTheme) async {
List<Map<String, Object?>>? servers; 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( Database db = await openDatabase(
'adguard_home_manager.db', '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 { 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 { onOpen: (Database db) async {
await db.transaction((txn) async{ await db.transaction((txn) async{
@ -295,17 +35,11 @@ Future<Map<String, dynamic>> loadDb(bool acceptsDynamicTheme) async {
'SELECT * FROM servers', 'SELECT * FROM servers',
); );
}); });
await db.transaction((txn) async{
appConfig = await txn.rawQuery(
'SELECT * FROM appConfig',
);
});
} }
); );
return { return {
"servers": servers, "servers": servers,
"appConfig": appConfig![0],
"dbInstance": db, "dbInstance": db,
}; };
} }

View file

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

View file

@ -502,6 +502,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.1" 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: percent_indicator:
dependency: "direct main" dependency: "direct main"
description: description:
@ -526,6 +550,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.4.0" 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: plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -574,6 +606,62 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.15.0" 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: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -852,6 +940,14 @@ packages:
url: "https://github.com/google/flutter-desktop-embedding" url: "https://github.com/google/flutter-desktop-embedding"
source: git source: git
version: "0.1.0" 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: xml:
dependency: transitive dependency: transitive
description: description:

View file

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