diff --git a/lib/providers/app_config_provider.dart b/lib/providers/app_config_provider.dart index d44b5af..99e2f0f 100644 --- a/lib/providers/app_config_provider.dart +++ b/lib/providers/app_config_provider.dart @@ -52,8 +52,6 @@ class AppConfigProvider with ChangeNotifier { int _combinedChartHome = 0; - int _showTopItemsChart = 0; - String? _doNotRememberVersion; GitHubRelease? _appUpdatesAvailable; @@ -170,10 +168,6 @@ class AppConfigProvider with ChangeNotifier { return _hideServerAddress == 1 ? true : false; } - bool get showTopItemsChart { - return _showTopItemsChart == 1 ? true : false; - } - void setDbInstance(Database db) { _dbInstance = db; } @@ -408,23 +402,6 @@ class AppConfigProvider with ChangeNotifier { } } - Future setShowTopItemsChart(bool value) async { - final updated = await updateConfigQuery( - db: _dbInstance!, - column: 'showTopItemsChart', - value: value == true ? 1 : 0 - ); - if (updated == true) { - _showTopItemsChart = value == true ? 1 : 0; - notifyListeners(); - return true; - } - else { - return false; - } - } - - Future setDoNotRememberVersion(String value) async { final updated = await updateConfigQuery( db: _dbInstance!, @@ -446,7 +423,6 @@ class AppConfigProvider with ChangeNotifier { _showIpLogs = dbData['showIpLogs'] ?? 0; _combinedChartHome = dbData['combinedChart'] ?? 0; _hideServerAddress = dbData['hideServerAddress']; - _showTopItemsChart = dbData['showTopItemsChart']; if (dbData['homeTopItemsOrder'] != null) { try { final itemsOrder = List.from( diff --git a/lib/screens/home/top_items/top_items_section.dart b/lib/screens/home/top_items/top_items_section.dart index 2c6f0c1..475ffb9 100644 --- a/lib/screens/home/top_items/top_items_section.dart +++ b/lib/screens/home/top_items/top_items_section.dart @@ -3,7 +3,6 @@ import 'dart:io'; 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/home/top_items/row_item.dart'; @@ -13,9 +12,8 @@ import 'package:adguard_home_manager/widgets/custom_pie_chart.dart'; import 'package:adguard_home_manager/functions/number_format.dart'; import 'package:adguard_home_manager/models/menu_option.dart'; import 'package:adguard_home_manager/constants/enums.dart'; -import 'package:adguard_home_manager/providers/app_config_provider.dart'; -class TopItemsSection extends StatefulWidget { +class TopItemsSection extends StatelessWidget { final HomeTopItems type; final String label; final List> data; @@ -37,45 +35,32 @@ class TopItemsSection extends StatefulWidget { this.onTapEntry, }); - @override - State createState() => _TopItemsState(); -} - -class _TopItemsState extends State { - bool _showChart = true; - - final colors = [ - Colors.red, - Colors.green, - Colors.blue, - Colors.orange, - Colors.teal, - Colors.grey - ]; - - @override - void initState() { - _showChart = Provider.of(context, listen: false).showTopItemsChart; - super.initState(); - } - @override Widget build(BuildContext context) { + final colors = [ + Colors.red, + Colors.green, + Colors.blue, + Colors.orange, + Colors.teal, + Colors.grey + ]; + final width = MediaQuery.of(context).size.width; - final withChart = widget.type != HomeTopItems.avgUpstreamResponseTime; + final withChart = type != HomeTopItems.avgUpstreamResponseTime; Map ringData() { Map values = {}; - widget.data.sublist(0, widget.data.length > 5 ? 5 : widget.data.length).forEach((element) { + data.sublist(0, data.length > 5 ? 5 : data.length).forEach((element) { values = { ...values, element.keys.first: element.values.first.toDouble() }; }); - if (widget.data.length > 5) { + if (data.length > 5) { final int rest = List.from( - widget.data.sublist(5, widget.data.length).map((e) => e.values.first.toInt()) + data.sublist(5, data.length).map((e) => e.values.first.toInt()) ).reduce((a, b) => a + b); values = { ...values, @@ -87,15 +72,15 @@ class _TopItemsState extends State { List> lineData() { List> values = []; - widget.data.sublist(0, widget.data.length > 5 ? 5 : widget.data.length).forEach((element) { + data.sublist(0, data.length > 5 ? 5 : data.length).forEach((element) { values.add({ "label": element.keys.first, "value": element.values.first.toDouble() }); }); - if (widget.data.length > 5) { + if (data.length > 5) { final int rest = List.from( - widget.data.sublist(5, widget.data.length).map((e) => e.values.first.toInt()) + data.sublist(5, data.length).map((e) => e.values.first.toInt()) ).reduce((a, b) => a + b); values.add({ "label": AppLocalizations.of(context)!.others, @@ -105,8 +90,8 @@ class _TopItemsState extends State { return values; } - final data = lineData(); - final total = data.map((e) => e["value"]).reduce((a, b) => a + b); + final lineChartData = lineData(); + final total = lineChartData.map((e) => e["value"]).reduce((a, b) => a + b); final Widget noItems = Padding( padding: const EdgeInsets.only( @@ -125,8 +110,8 @@ class _TopItemsState extends State { return SizedBox( child: Column( children: [ - if (widget.data.isEmpty) noItems, - if (widget.data.isNotEmpty && width > 700) Padding( + if (data.isEmpty) noItems, + if (data.isNotEmpty && width > 700) Padding( padding: EdgeInsets.only(bottom: withChart == false ? 16 : 0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, @@ -156,7 +141,7 @@ class _TopItemsState extends State { bottom: 16 ), child: Text( - widget.label, + label, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.w500 @@ -165,16 +150,16 @@ class _TopItemsState extends State { ), _ItemsList( colors: colors, - data: widget.data, - clients: widget.type == HomeTopItems.recurrentClients, - type: widget.type, - showChart: withChart == true ? _showChart : false, - buildValue: widget.buildValue, - menuOptions: widget.menuOptions, - onTapEntry: widget.onTapEntry, + data: data, + clients: type == HomeTopItems.recurrentClients, + type: type, + showChart: withChart, + buildValue: buildValue, + menuOptions: menuOptions, + onTapEntry: onTapEntry, ), if (withChart == true) OthersRowItem( - items: widget.data, + items: data, showColor: true, ) ] @@ -183,9 +168,9 @@ class _TopItemsState extends State { ], ), ), - if (widget.data.isNotEmpty && width <= 700) ...[ + if (data.isNotEmpty && width <= 700) ...[ Text( - widget.label, + label, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 18, @@ -202,7 +187,7 @@ class _TopItemsState extends State { height: 20, child: LayoutBuilder( builder: (context, constraints) => Row( - children: data.asMap().entries.map((e) => Tooltip( + children: lineChartData.asMap().entries.map((e) => Tooltip( message:'${e.value["label"]} (${doubleFormat((e.value["value"]/total)*100, Platform.localeName)}%)', child: Container( width: constraints.maxWidth*(e.value["value"]/total), @@ -220,22 +205,22 @@ class _TopItemsState extends State { padding: const EdgeInsets.only(top: 8), child: _ItemsList( colors: colors, - data: widget.data, - clients: widget.type == HomeTopItems.recurrentClients, - type: widget.type, - showChart: withChart == false ? false : _showChart, - buildValue: widget.buildValue, - menuOptions: widget.menuOptions, - onTapEntry: widget.onTapEntry, + data: data, + clients: type == HomeTopItems.recurrentClients, + type: type, + showChart: withChart, + buildValue: buildValue, + menuOptions: menuOptions, + onTapEntry: onTapEntry, ), ), OthersRowItem( - items: widget.data, - showColor: withChart == false ? false : _showChart, + items: data, + showColor: withChart, ), ], - if (widget.data.length > 5) ...[ + if (data.length > 5) ...[ Padding( padding: const EdgeInsets.only(right: 20), child: Row( @@ -263,14 +248,14 @@ class _TopItemsState extends State { ); }, pageBuilder: (context, animation, secondaryAnimation) => TopItemsScreen( - type: widget.type, - title: widget.label, - isClient: widget.type == HomeTopItems.recurrentClients, - data: widget.data, - withProgressBar: widget.withProgressBar, - buildValue: widget.buildValue, - options: widget.menuOptions, - onTapEntry: widget.onTapEntry, + type: type, + title: label, + isClient: type == HomeTopItems.recurrentClients, + data: data, + withProgressBar: withProgressBar, + buildValue: buildValue, + options: menuOptions, + onTapEntry: onTapEntry, isFullscreen: !(width > 700 || !(Platform.isAndroid | Platform.isIOS)), ) ) diff --git a/lib/screens/settings/general_settings/general_settings.dart b/lib/screens/settings/general_settings/general_settings.dart index 74cc752..fb0560c 100644 --- a/lib/screens/settings/general_settings/general_settings.dart +++ b/lib/screens/settings/general_settings/general_settings.dart @@ -206,28 +206,6 @@ class _GeneralSettingsState extends State { ) ) ), - CustomListTile( - icon: Icons.donut_large_rounded, - title: AppLocalizations.of(context)!.showTopItemsChart, - subtitle: AppLocalizations.of(context)!.showTopItemsChartDescription, - trailing: Switch( - value: appConfigProvider.showTopItemsChart, - onChanged: (value) => updateSettings( - newStatus: value, - function: appConfigProvider.setShowTopItemsChart - ), - ), - onTap: () => updateSettings( - newStatus: !appConfigProvider.showTopItemsChart, - function: appConfigProvider.setShowTopItemsChart - ), - padding: const EdgeInsets.only( - top: 10, - bottom: 10, - left: 16, - right: 10 - ) - ), SectionLabel(label: AppLocalizations.of(context)!.logs), CustomListTile( icon: Icons.timer_rounded, diff --git a/lib/services/db/database.dart b/lib/services/db/database.dart index 7d8cf13..b60b38a 100644 --- a/lib/services/db/database.dart +++ b/lib/services/db/database.dart @@ -127,9 +127,19 @@ Future> loadDb(bool acceptsDynamicTheme) async { }); } + 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', - version: 10, + version: 11, onCreate: (Database db, int version) async { await db.execute( """ @@ -165,8 +175,7 @@ Future> loadDb(bool acceptsDynamicTheme) async { combinedChart NUMERIC, doNotRememberVersion TEXT, hideServerAddress NUMERIC, - homeTopItemsOrder TEXT, - showTopItemsChart NUMERIC + homeTopItemsOrder TEXT ) """ ); @@ -185,8 +194,7 @@ Future> loadDb(bool acceptsDynamicTheme) async { showIpLogs, combinedChart, hideServerAddress, - homeTopItemsOrder, - showTopItemsChart + homeTopItemsOrder ) VALUES ( 0, @@ -199,8 +207,7 @@ Future> loadDb(bool acceptsDynamicTheme) async { 0, 0, 0, - '$homeTopItemsDefaultOrderString', - 1 + '$homeTopItemsDefaultOrderString' ) """ ); @@ -216,6 +223,7 @@ Future> loadDb(bool acceptsDynamicTheme) async { await upgradeDbToV8(db); await upgradeDbToV9(db); await upgradeDbToV10(db); + await upgradeDbToV11(db); } if (oldVersion == 2) { await upgradeDbToV3(db); @@ -226,6 +234,7 @@ Future> loadDb(bool acceptsDynamicTheme) async { await upgradeDbToV8(db); await upgradeDbToV9(db); await upgradeDbToV10(db); + await upgradeDbToV11(db); } if (oldVersion == 3) { await upgradeDbToV4(db); @@ -235,6 +244,7 @@ Future> loadDb(bool acceptsDynamicTheme) async { await upgradeDbToV8(db); await upgradeDbToV9(db); await upgradeDbToV10(db); + await upgradeDbToV11(db); } if (oldVersion == 4) { await upgradeDbToV5(db); @@ -243,6 +253,7 @@ Future> loadDb(bool acceptsDynamicTheme) async { await upgradeDbToV8(db); await upgradeDbToV9(db); await upgradeDbToV10(db); + await upgradeDbToV11(db); } if (oldVersion == 5) { await upgradeDbToV6(db); @@ -250,24 +261,32 @@ Future> loadDb(bool acceptsDynamicTheme) async { 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 {