diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 75c31ca..2bb205d 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -162,5 +162,9 @@ "average": "Average", "blockedFilters": "Blocked by filters", "malwarePhisingBlocked": "Blocked malware/phising", - "blockedAdultWebsites": "Blocked adult websites" + "blockedAdultWebsites": "Blocked adult websites", + "generalSettings": "General settings", + "generalSettingsDescription": "Various different settings", + "hideZeroValues": "Hide zero values", + "hideZeroValuesDescription": "On homescreen, hide blocks with zero value" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 601f811..5da9929 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -162,5 +162,9 @@ "average": "Promedio", "blockedFilters": "Bloqueado por filtros", "malwarePhisingBlocked": "Malware/phising bloqueado", - "blockedAdultWebsites": "Sitios para adultos bloqueados" + "blockedAdultWebsites": "Sitios para adultos bloqueados", + "generalSettings": "Ajustes generales", + "generalSettingsDescription": "Varios ajustes generales", + "hideZeroValues": "Oculta valores a cero", + "hideZeroValuesDescription": "En la pantalla de inicio, oculta bloqueos con valor cero" } \ No newline at end of file diff --git a/lib/providers/app_config_provider.dart b/lib/providers/app_config_provider.dart index f841918..f5df72c 100644 --- a/lib/providers/app_config_provider.dart +++ b/lib/providers/app_config_provider.dart @@ -21,6 +21,8 @@ class AppConfigProvider with ChangeNotifier { int _overrideSslCheck = 0; + int _hideZeroValues = 0; + PackageInfo? get getAppInfo { return _appInfo; } @@ -67,6 +69,10 @@ class AppConfigProvider with ChangeNotifier { return _overrideSslCheck == 1 ? true : false; } + bool get hideZeroValues { + return _hideZeroValues == 1 ? true : false; + } + void setDbInstance(Database db) { _dbInstance = db; } @@ -105,6 +111,17 @@ class AppConfigProvider with ChangeNotifier { } } + Future setHideZeroValues(bool status) async { + final updated = await _updateSetHideZeroValues(status == true ? 1 : 0); + if (updated == true) { + _hideZeroValues = status == true ? 1 : 0; + notifyListeners(); + return true; + } + else { + return false; + } + } Future setSelectedTheme(int value) async { final updated = await _updateThemeDb(value); @@ -144,9 +161,23 @@ class AppConfigProvider with ChangeNotifier { } } + Future _updateSetHideZeroValues(int value) async { + try { + return await _dbInstance!.transaction((txn) async { + await txn.rawUpdate( + 'UPDATE appConfig SET hideZeroValues = $value', + ); + return true; + }); + } catch (e) { + return false; + } + } + void saveFromDb(Database dbInstance, Map dbData) { _selectedTheme = dbData['theme']; _overrideSslCheck = dbData['overrideSslCheck']; + _hideZeroValues = dbData['hideZeroValues']; _dbInstance = dbInstance; notifyListeners(); diff --git a/lib/screens/home/chart.dart b/lib/screens/home/chart.dart index 7a7a30b..829de1f 100644 --- a/lib/screens/home/chart.dart +++ b/lib/screens/home/chart.dart @@ -1,7 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:adguard_home_manager/widgets/line_chart.dart'; +import 'package:adguard_home_manager/providers/app_config_provider.dart'; + class HomeChart extends StatelessWidget { final List data; final String label; @@ -20,6 +23,8 @@ class HomeChart extends StatelessWidget { @override Widget build(BuildContext context) { + final appConfigProvider = Provider.of(context); + bool isEmpty = true; for (int item in data) { if (item > 0) { @@ -28,79 +33,95 @@ class HomeChart extends StatelessWidget { } } - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Column( + if (!(appConfigProvider.hideZeroValues == true && isEmpty == true)) { + return Column( children: [ Padding( - padding: EdgeInsets.only( - bottom: !isEmpty ? 10 : 15 - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( children: [ - Text( - label, - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500 + Padding( + padding: EdgeInsets.only( + bottom: !isEmpty ? 10 : 15 + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500 + ), + ), + !isEmpty + ? Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + primaryValue, + style: TextStyle( + color: color, + fontSize: 18, + fontWeight: FontWeight.w500 + ), + ), + Text( + secondaryValue, + style: TextStyle( + fontSize: 12, + color: color + ), + ) + ], + ) + : Row( + children: [ + Text( + primaryValue, + style: TextStyle( + color: color, + fontSize: 18, + fontWeight: FontWeight.w500 + ), + ), + const SizedBox(width: 10), + Text( + "($secondaryValue)", + style: TextStyle( + fontSize: 12, + color: color + ), + ) + ], + ) + ], ), ), - !isEmpty - ? Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Text( - primaryValue, - style: TextStyle( - color: color, - fontSize: 18, - fontWeight: FontWeight.w500 - ), - ), - Text( - secondaryValue, - style: TextStyle( - fontSize: 12, - color: color - ), - ) - ], - ) - : Row( - children: [ - Text( - primaryValue, - style: TextStyle( - color: color, - fontSize: 18, - fontWeight: FontWeight.w500 - ), - ), - const SizedBox(width: 10), - Text( - "($secondaryValue)", - style: TextStyle( - fontSize: 12, - color: color - ), - ) - ], - ) + if (!isEmpty) SizedBox( + width: double.maxFinite, + height: 150, + child: CustomLineChart( + data: data, + color: color, + ) + ), ], ), ), - if (!isEmpty) SizedBox( - width: double.maxFinite, - height: 150, - child: CustomLineChart( - data: data, - color: color, - ) + const Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Divider( + thickness: 1, + ), ), + const SizedBox(height: 20), ], - ), - ); + ); + } + else { + return const SizedBox(); + } } } \ No newline at end of file diff --git a/lib/screens/home/home.dart b/lib/screens/home/home.dart index d169b2f..692d115 100644 --- a/lib/screens/home/home.dart +++ b/lib/screens/home/home.dart @@ -65,13 +65,6 @@ class Home extends StatelessWidget { secondaryValue: "${doubleFormat(serversProvider.serverStatus.data!.stats.avgProcessingTime*1000, Platform.localeName)} ms", color: Colors.blue, ), - const Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Divider( - thickness: 1, - ), - ), - const SizedBox(height: 20), HomeChart( data: serversProvider.serverStatus.data!.stats.blockedFiltering, @@ -80,13 +73,6 @@ class Home extends StatelessWidget { secondaryValue: "${doubleFormat((serversProvider.serverStatus.data!.stats.numBlockedFiltering/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName)}%", color: Colors.red, ), - const Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Divider( - thickness: 1, - ), - ), - const SizedBox(height: 20), HomeChart( data: serversProvider.serverStatus.data!.stats.replacedSafebrowsing, @@ -95,13 +81,6 @@ class Home extends StatelessWidget { secondaryValue: "${doubleFormat((serversProvider.serverStatus.data!.stats.numReplacedSafebrowsing/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName)}%", color: Colors.green, ), - const Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Divider( - thickness: 1, - ), - ), - const SizedBox(height: 20), HomeChart( data: serversProvider.serverStatus.data!.stats.replacedParental, @@ -110,13 +89,6 @@ class Home extends StatelessWidget { secondaryValue: "${doubleFormat((serversProvider.serverStatus.data!.stats.numReplacedParental/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName)}%", color: Colors.orange, ), - const Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Divider( - thickness: 1, - ), - ), - const SizedBox(height: 20), TopItems( label: AppLocalizations.of(context)!.topQueriedDomains, diff --git a/lib/screens/settings/general_settings.dart b/lib/screens/settings/general_settings.dart new file mode 100644 index 0000000..3d5d061 --- /dev/null +++ b/lib/screens/settings/general_settings.dart @@ -0,0 +1,65 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +import 'package:adguard_home_manager/screens/settings/custom_list_tile.dart'; + +import 'package:adguard_home_manager/providers/app_config_provider.dart'; + +class GeneralSettings extends StatelessWidget { + const GeneralSettings({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final appConfigProvider = Provider.of(context); + + Future updateHideZeroValues(bool newStatus) async { + final result = await appConfigProvider.setHideZeroValues(newStatus); + if (result == true) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context)!.settingsUpdatedSuccessfully), + backgroundColor: Colors.green, + ) + ); + } + else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context)!.cannotUpdateSettings), + backgroundColor: Colors.red, + ) + ); + } + } + + return Scaffold( + appBar: AppBar( + title: Text(AppLocalizations.of(context)!.generalSettings) , + ), + body: ListView( + children: [ + CustomListTile( + leadingIcon: Icons.exposure_zero_rounded, + label: AppLocalizations.of(context)!.hideZeroValues, + description: AppLocalizations.of(context)!.hideZeroValuesDescription, + trailing: Switch( + value: appConfigProvider.hideZeroValues, + onChanged: updateHideZeroValues, + activeColor: Theme.of(context).primaryColor, + ), + onTap: () => updateHideZeroValues(!appConfigProvider.hideZeroValues), + padding: const EdgeInsets.only( + top: 10, + bottom: 10, + left: 20, + right: 10 + ) + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index 5aeb587..13cbd30 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -1,4 +1,3 @@ -import 'package:adguard_home_manager/screens/settings/advanced_setings.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -7,7 +6,8 @@ import 'package:adguard_home_manager/screens/settings/theme_modal.dart'; import 'package:adguard_home_manager/screens/settings/custom_list_tile.dart'; import 'package:adguard_home_manager/screens/settings/section_label.dart'; import 'package:adguard_home_manager/screens/servers/servers.dart'; -import 'package:adguard_home_manager/screens/app_logs/app_logs.dart'; +import 'package:adguard_home_manager/screens/settings/advanced_setings.dart'; +import 'package:adguard_home_manager/screens/settings/general_settings.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; @@ -79,6 +79,18 @@ class Settings extends StatelessWidget { ), CustomListTile( leadingIcon: Icons.settings, + label: AppLocalizations.of(context)!.generalSettings, + description: AppLocalizations.of(context)!.generalSettingsDescription, + onTap: () => { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => const GeneralSettings() + ) + ) + }, + ), + CustomListTile( + leadingIcon: Icons.build_outlined, label: AppLocalizations.of(context)!.advancedSettings, description: AppLocalizations.of(context)!.advancedSetupDescription, onTap: () => { diff --git a/lib/services/database.dart b/lib/services/database.dart index eae2b2c..d88ef5b 100644 --- a/lib/services/database.dart +++ b/lib/services/database.dart @@ -15,17 +15,32 @@ Future> loadDb() async { }); } + 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', + ); + }); + } + Database db = await openDatabase( 'adguard_home_manager.db', - version: 2, + version: 3, onCreate: (Database db, int version) async { await db.execute("CREATE TABLE servers (id TEXT PRIMARY KEY, name TEXT, connectionMethod TEXT, domain TEXT, path TEXT, port INTEGER, user TEXT, password TEXT, defaultServer INTEGER, authToken TEXT)"); - await db.execute("CREATE TABLE appConfig (theme NUMERIC, overrideSslCheck NUMERIC)"); - await db.execute("INSERT INTO appConfig (theme, overrideSslCheck) VALUES (0, 0)"); + await db.execute("CREATE TABLE appConfig (theme NUMERIC, overrideSslCheck NUMERIC, hideZeroValues NUMERIC)"); + await db.execute("INSERT INTO appConfig (theme, overrideSslCheck) VALUES (0, 0, 0)"); }, onUpgrade: (Database db, int oldVersion, int newVersion) async { if (oldVersion == 1) { await upgradeDbToV2(db); + await upgradeDbToV3(db); + } + if (oldVersion == 2) { + await upgradeDbToV3(db); } }, onOpen: (Database db) async {