From aef0dd38c77d64f6a98893dd20445458e5541e90 Mon Sep 17 00:00:00 2001 From: thomas-sterrenburg Date: Mon, 18 May 2020 20:40:47 +0200 Subject: [PATCH 01/11] Actually using forward destinations titleOrIp --- .../pages/summary/widgets/forward_destinations_tile.dart | 2 +- .../pihole_api/data/models/forward_destinations.dart | 9 ++++++--- test/fixtures/get_forward_destinations.json | 3 ++- test/model_test.dart | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/features/home/presentation/pages/summary/widgets/forward_destinations_tile.dart b/lib/features/home/presentation/pages/summary/widgets/forward_destinations_tile.dart index ef35215b..879cf834 100644 --- a/lib/features/home/presentation/pages/summary/widgets/forward_destinations_tile.dart +++ b/lib/features/home/presentation/pages/summary/widgets/forward_destinations_tile.dart @@ -37,7 +37,7 @@ class ForwardDestinationsTile extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 4.0), child: GraphLegendItem( index: index, - title: forwardDestination.title, + title: forwardDestination.titleOrIp, subtitle: '$percentage%', color: ForwardDestinationsPieChart.colorAtIndex(index), diff --git a/lib/features/pihole_api/data/models/forward_destinations.dart b/lib/features/pihole_api/data/models/forward_destinations.dart index 9f2dcf4c..7beece79 100644 --- a/lib/features/pihole_api/data/models/forward_destinations.dart +++ b/lib/features/pihole_api/data/models/forward_destinations.dart @@ -18,7 +18,7 @@ abstract class ForwardDestination extends MapModel factory ForwardDestination.fromJson(Map json) => _$ForwardDestinationFromJson(json); - String get titleOrIp => (title?.isEmpty ?? true) ? ip : '${ip} (${title})'; + String get titleOrIp => (title?.isEmpty ?? true) ? ip : title; } Map _valueToForwardDestinations(dynamic value) { @@ -55,6 +55,9 @@ abstract class ForwardDestinationsResult extends MapModel Map forwardDestinations}) = _ForwardDestinationsResult; - factory ForwardDestinationsResult.fromJson(Map json) => - _$ForwardDestinationsResultFromJson(json); + factory ForwardDestinationsResult.fromJson(Map json) { + print('json: $json'); + + return _$ForwardDestinationsResultFromJson(json); + } } diff --git a/test/fixtures/get_forward_destinations.json b/test/fixtures/get_forward_destinations.json index a064496f..78278ac4 100644 --- a/test/fixtures/get_forward_destinations.json +++ b/test/fixtures/get_forward_destinations.json @@ -5,6 +5,7 @@ "dns.google|8.8.4.4": 40.21, "dns.google|8.8.8.8": 13.36, "hi.google|1.2.3.4": 5, - "bye.google|5.6.7.8": 5.0 + "bye.google|5.6.7.8": 5.0, + "1.2.3.4": 1.23 } } \ No newline at end of file diff --git a/test/model_test.dart b/test/model_test.dart index c1d5a014..0eac8436 100644 --- a/test/model_test.dart +++ b/test/model_test.dart @@ -65,7 +65,7 @@ void main() { testMapModel( 'get_query_sources.json', (json) => TopSourcesResult.fromJson(json)); testMapModel('single_forward_destination.json', - (json) => ForwardDestination.fromJson(json)); + (json) => ForwardDestination.fromJson(json)); testMapModel('get_forward_destinations.json', (json) => ForwardDestinationsResult.fromJson(json)); testListModel( From 3e845c81d8e75a5ffd59f33bb5c392c7746848b2 Mon Sep 17 00:00:00 2001 From: thomas-sterrenburg Date: Mon, 18 May 2020 20:52:07 +0200 Subject: [PATCH 02/11] Remove index shift from QueryStatus toJson/fromJson, fixes #82 --- lib/features/pihole_api/data/models/query_data.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/features/pihole_api/data/models/query_data.dart b/lib/features/pihole_api/data/models/query_data.dart index 3ff92866..12d808d0 100644 --- a/lib/features/pihole_api/data/models/query_data.dart +++ b/lib/features/pihole_api/data/models/query_data.dart @@ -56,7 +56,7 @@ QueryStatus _stringToQueryStatus(String json) { if (index > QueryStatus.values.length || index == 0) return QueryStatus.values.first; - return QueryStatus.values[index - 1]; + return QueryStatus.values[index]; } catch (e) { print('_stringToQueryStatus failed: $e'); return QueryStatus.Unknown; @@ -103,7 +103,7 @@ abstract class QueryData extends ListModel implements _$QueryData { _$QueryTypeEnumMap[queryType], domain, clientName, - '${QueryStatus.values.indexOf(queryStatus) + 1}', + '${QueryStatus.values.indexOf(queryStatus)}', '${DnsSecStatus.values.indexOf(dnsSecStatus)}', '$replyTextIndex', '${(replyDuration.inMicroseconds / 100).round()}', From b6cc2280c36336f8c59e48d72af621b3cce9d044 Mon Sep 17 00:00:00 2001 From: thomas-sterrenburg Date: Mon, 18 May 2020 22:33:18 +0200 Subject: [PATCH 03/11] Adding QueryLogPage --- lib/constants.dart | 1 + .../pihole_api/blocs/query_log_bloc.dart | 75 +++++++++ .../data/datasources/api_data_source.dart | 11 +- .../data/datasources/api_data_source_dio.dart | 17 +- .../data/repositories/api_repository.dart | 4 + .../repositories/api_repository_impl.dart | 15 +- .../presentation/pages/query_log_page.dart | 93 +++++++++++ .../widgets/many_query_tiles_builder.dart | 3 + .../query_log_page_overflow_refresher.dart | 61 +++++++ .../widgets/single_query_data_tile.dart | 6 +- .../presentation/widgets/default_drawer.dart | 5 + .../routing/services/router_service.dart | 1 + .../services/router_service_sailor.dart | 6 + .../pages/user_preferences_page.dart | 73 +------- .../preferences/theme_radio_preferences.dart | 45 +++++ .../use_numbers_api_switch_preference.dart | 20 +++ .../settings/services/preference_service.dart | 6 + .../services/preference_service_impl.dart | 7 + .../pihole_api/blocs/query_log_bloc_test.dart | 126 ++++++++++++++ .../datasources/api_data_source_dio_test.dart | 30 +++- .../api_repository_impl_test.dart | 156 ++++++++++++++---- 21 files changed, 649 insertions(+), 112 deletions(-) create mode 100644 lib/features/pihole_api/blocs/query_log_bloc.dart create mode 100644 lib/features/pihole_api/presentation/pages/query_log_page.dart create mode 100644 lib/features/pihole_api/presentation/widgets/query_log_page_overflow_refresher.dart create mode 100644 lib/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart create mode 100644 lib/features/settings/presentation/widgets/preferences/use_numbers_api_switch_preference.dart create mode 100644 test/features/pihole_api/blocs/query_log_bloc_test.dart diff --git a/lib/constants.dart b/lib/constants.dart index 979e4b71..d3764d07 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -25,6 +25,7 @@ class KIcons { static const IconData welcome = MaterialCommunityIcons.message_text; static const IconData dashboard = MaterialCommunityIcons.view_dashboard; + static const IconData queryLog = MaterialCommunityIcons.file_document; static const IconData clients = MaterialCommunityIcons.laptop_windows; static const IconData domains = MaterialCommunityIcons.checkbox_multiple_blank_circle_outline; diff --git a/lib/features/pihole_api/blocs/query_log_bloc.dart b/lib/features/pihole_api/blocs/query_log_bloc.dart new file mode 100644 index 00000000..c0b0cff1 --- /dev/null +++ b/lib/features/pihole_api/blocs/query_log_bloc.dart @@ -0,0 +1,75 @@ +import 'package:bloc/bloc.dart'; +import 'package:dartz/dartz.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutterhole/core/models/failures.dart'; +import 'package:flutterhole/dependency_injection.dart'; +import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; +import 'package:flutterhole/features/pihole_api/data/repositories/api_repository.dart'; +import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; +import 'package:flutterhole/features/settings/data/repositories/settings_repository.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'query_log_bloc.freezed.dart'; + +@freezed +abstract class QueryLogState with _$QueryLogState { + const factory QueryLogState.initial() = QueryLogStateInitial; + + const factory QueryLogState.loading() = QueryLogStateLoading; + + const factory QueryLogState.failure(Failure failure) = QueryLogStateFailure; + + const factory QueryLogState.success(List queries) = + QueryLogStateSuccess; +} + +@freezed +abstract class QueryLogEvent with _$QueryLogEvent { + const factory QueryLogEvent.fetchAll() = QueryLogEventFetchAll; + + const factory QueryLogEvent.fetchSome(int maxResults) = + QueryLogEventFetchSome; +} + +class QueryLogBloc extends Bloc { + QueryLogBloc([ + ApiRepository apiRepository, + SettingsRepository settingsRepository, + ]) : _apiRepository = apiRepository ?? getIt(), + _settingsRepository = settingsRepository ?? getIt(); + + final ApiRepository _apiRepository; + final SettingsRepository _settingsRepository; + + @override + QueryLogState get initialState => QueryLogState.initial(); + + Stream _fetch([int maxResults]) async* { + yield QueryLogStateLoading(); + + final Either active = + await _settingsRepository.fetchActivePiholeSettings(); + + yield* active.fold( + (Failure failure) async* { + yield QueryLogState.failure(failure); + }, + (PiholeSettings settings) async* { + final Either> result = + await _apiRepository.fetchManyQueryData(settings, maxResults); + + yield* result.fold((Failure failure) async* { + yield QueryLogState.failure(failure); + }, (queries) async* { + yield QueryLogState.success(queries); + }); + }, + ); + } + + @override + Stream mapEventToState(QueryLogEvent event) => event.when( + fetchAll: () => _fetch(), + fetchSome: (maxResults) => _fetch(maxResults), + ); +} diff --git a/lib/features/pihole_api/data/datasources/api_data_source.dart b/lib/features/pihole_api/data/datasources/api_data_source.dart index f2bc3c92..80ee62a0 100644 --- a/lib/features/pihole_api/data/datasources/api_data_source.dart +++ b/lib/features/pihole_api/data/datasources/api_data_source.dart @@ -34,9 +34,12 @@ abstract class ApiDataSource { Future fetchVersions(PiholeSettings settings); - Future fetchQueryDataForClient(PiholeSettings settings, - PiClient client); + Future fetchQueryDataForClient( + PiholeSettings settings, PiClient client); - Future fetchQueryDataForDomain(PiholeSettings settings, - String domain); + Future fetchQueryDataForDomain( + PiholeSettings settings, String domain); + + Future fetchManyQueryData(PiholeSettings settings, + [int maxResults]); } diff --git a/lib/features/pihole_api/data/datasources/api_data_source_dio.dart b/lib/features/pihole_api/data/datasources/api_data_source_dio.dart index d89885c7..1b36b731 100644 --- a/lib/features/pihole_api/data/datasources/api_data_source_dio.dart +++ b/lib/features/pihole_api/data/datasources/api_data_source_dio.dart @@ -231,8 +231,10 @@ class ApiDataSourceDio implements ApiDataSource { } @override - Future fetchQueryDataForClient(PiholeSettings settings, - PiClient client,) async { + Future fetchQueryDataForClient( + PiholeSettings settings, + PiClient client, + ) async { final Map json = await _getSecure(settings, queryParameters: { 'getAllQueries': '', @@ -255,4 +257,15 @@ class ApiDataSourceDio implements ApiDataSource { return ManyQueryData.fromJson(json); } + + @override + Future fetchManyQueryData(PiholeSettings settings, + [int maxResults]) async { + final Map json = + await _getSecure(settings, queryParameters: { + 'getAllQueries': '${maxResults ?? ''}', + }); + + return ManyQueryData.fromJson(json); + } } diff --git a/lib/features/pihole_api/data/repositories/api_repository.dart b/lib/features/pihole_api/data/repositories/api_repository.dart index 94a4764c..44d9ec29 100644 --- a/lib/features/pihole_api/data/repositories/api_repository.dart +++ b/lib/features/pihole_api/data/repositories/api_repository.dart @@ -32,4 +32,8 @@ abstract class ApiRepository { Future>> fetchQueriesForDomain( PiholeSettings settings, String domain); + + Future>> fetchManyQueryData( + PiholeSettings settings, + [int maxResults]); } diff --git a/lib/features/pihole_api/data/repositories/api_repository_impl.dart b/lib/features/pihole_api/data/repositories/api_repository_impl.dart index fa256089..d1c22243 100644 --- a/lib/features/pihole_api/data/repositories/api_repository_impl.dart +++ b/lib/features/pihole_api/data/repositories/api_repository_impl.dart @@ -98,7 +98,7 @@ class ApiRepositoryImpl implements ApiRepository { PiholeSettings settings, PiClient client) async { try { final ManyQueryData result = - await _apiDataSource.fetchQueryDataForClient(settings, client); + await _apiDataSource.fetchQueryDataForClient(settings, client); return Right(result.data.reversed.toList()); } on PiException catch (e) { return Left(Failure('fetchQueriesForClient failed', e)); @@ -116,4 +116,17 @@ class ApiRepositoryImpl implements ApiRepository { return Left(Failure('fetchQueriesForDomain failed', e)); } } + + @override + Future>> fetchManyQueryData( + PiholeSettings settings, + [int maxResults]) async { + try { + final ManyQueryData result = + await _apiDataSource.fetchManyQueryData(settings, maxResults); + return Right(result.data.reversed.toList()); + } on PiException catch (e) { + return Left(Failure('fetchManyQueryData failed', e)); + } + } } diff --git a/lib/features/pihole_api/presentation/pages/query_log_page.dart b/lib/features/pihole_api/presentation/pages/query_log_page.dart new file mode 100644 index 00000000..35ec1c95 --- /dev/null +++ b/lib/features/pihole_api/presentation/pages/query_log_page.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutterhole/dependency_injection.dart'; +import 'package:flutterhole/features/pihole_api/blocs/query_log_bloc.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/query_log_page_overflow_refresher.dart'; +import 'package:flutterhole/features/routing/presentation/widgets/default_drawer.dart'; +import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; +import 'package:flutterhole/features/settings/services/preference_service.dart'; +import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:intl/intl.dart'; + +final _numberFormat = NumberFormat(); + +class _PopupMenu extends StatelessWidget { + PopupMenuItem _buildPopupMenuItem(int value) { + return CheckedPopupMenuItem( + child: Text('${_numberFormat.format(value)}'), + value: value, + checked: value == getIt().queryLogMaxResults, + ); + } + + @override + Widget build(BuildContext context) { + return PopupMenuButton( + tooltip: 'Set max results', +// initialValue: getIt().queryLogMaxResults, + onSelected: (int value) async { + getIt().setQueryLogMaxResults(value); + + // Force a delay to allow the PopUpMenu to close. + // If we don't, the animation hangs until the Bloc returns. + // TODO not sure what a better solution is, but I assume there is one. + await Future.delayed(Duration(milliseconds: 300)); + + BlocProvider.of(context) + .add(QueryLogEvent.fetchSome(value)); + }, + + itemBuilder: (BuildContext context) => >[ + PopupMenuItem( + child: Text('Max results'), + enabled: false, + ), + PopupMenuDivider(), + _buildPopupMenuItem(10), + _buildPopupMenuItem(100), + _buildPopupMenuItem(1000), + _buildPopupMenuItem(10000), + ], + ); + } +} + +class QueryLogPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (_) => + QueryLogBloc() + ..add(QueryLogEvent.fetchSome( + getIt().queryLogMaxResults)), + child: PiholeThemeBuilder( + child: Scaffold( + drawer: DefaultDrawer(), + appBar: AppBar( + title: Text('Query log'), + elevation: 0.0, + actions: [ + _PopupMenu(), + ], + ), + body: QueryLogPageOverflowRefresher( + child: BlocBuilder( + builder: (BuildContext context, QueryLogState state) { + return state.maybeWhen( + success: (queries) { + return ManyQueryTilesBuilder(queries: queries); + }, + initial: () => Container(), + orElse: () { + return CenteredLoadingIndicator(); + }, + ); + }, + ), + ), + ), + ), + ); + } +} diff --git a/lib/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart b/lib/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart index e903e006..0bceb6da 100644 --- a/lib/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart +++ b/lib/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart @@ -7,15 +7,18 @@ class ManyQueryTilesBuilder extends StatelessWidget { const ManyQueryTilesBuilder({ Key key, @required this.queries, + this.shrinkWrap = false, }) : super(key: key); final List queries; + final bool shrinkWrap; @override Widget build(BuildContext context) { return AnimateOnBuild( child: Scrollbar( child: ListView.builder( + shrinkWrap: shrinkWrap, itemCount: queries.length, itemBuilder: (context, index) { final QueryData query = queries.elementAt(index); diff --git a/lib/features/pihole_api/presentation/widgets/query_log_page_overflow_refresher.dart b/lib/features/pihole_api/presentation/widgets/query_log_page_overflow_refresher.dart new file mode 100644 index 00000000..1ef7907d --- /dev/null +++ b/lib/features/pihole_api/presentation/widgets/query_log_page_overflow_refresher.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutterhole/dependency_injection.dart'; +import 'package:flutterhole/features/pihole_api/blocs/query_log_bloc.dart'; +import 'package:flutterhole/features/settings/services/preference_service.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; + +typedef void OnRefreshCallback(BuildContext context); + +class QueryLogPageOverflowRefresher extends StatefulWidget { + const QueryLogPageOverflowRefresher({ + Key key, + @required this.child, + }) : super(key: key); + + final Widget child; + + @override + _QueryLogPageOverflowRefresherState createState() => + _QueryLogPageOverflowRefresherState(); +} + +class _QueryLogPageOverflowRefresherState + extends State { + final RefreshController _refreshController = RefreshController(); + + void _onRefresh() { + BlocProvider.of(context).add( + QueryLogEvent.fetchSome(getIt().queryLogMaxResults)); + } + + @override + void dispose() { + _refreshController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return RefreshConfiguration( + headerBuilder: () => WaterDropMaterialHeader( + semanticsLabel: 'Refresh data', + color: Theme.of(context).colorScheme.onBackground, + ), + enableBallisticLoad: true, + child: BlocListener( + listener: (BuildContext context, QueryLogState state) { + if (state is QueryLogStateSuccess) { + _refreshController?.refreshCompleted(); + } + }, + child: SmartRefresher( + enablePullDown: true, + controller: _refreshController, + onRefresh: _onRefresh, + child: widget.child, + ), + ), + ); + } +} diff --git a/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart b/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart index 6079e1cc..55faa893 100644 --- a/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart +++ b/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart @@ -115,8 +115,7 @@ class SingleQueryDataTile extends StatelessWidget { final QueryData query; String get _timeStamp => - '${query.timestamp.formattedDate}\t${query.timestamp - .formattedTime} (${query.timestamp.fromNow})'; + '${query.timestamp.formattedDate}\t${query.timestamp.formattedTime} (${query.timestamp.fromNow})'; Icon _buildQueryStatusIcon() { return Icon( @@ -175,8 +174,7 @@ class SingleQueryDataTile extends StatelessWidget { return ListTile( dense: true, title: Text('${type.toFullString}'), - subtitle: - Text('${type.toDescription}'), + subtitle: Text('${type.toDescription}'), ); }), OpenUrlTile( diff --git a/lib/features/routing/presentation/widgets/default_drawer.dart b/lib/features/routing/presentation/widgets/default_drawer.dart index f3ec8624..7d4edd39 100644 --- a/lib/features/routing/presentation/widgets/default_drawer.dart +++ b/lib/features/routing/presentation/widgets/default_drawer.dart @@ -25,6 +25,11 @@ class DefaultDrawer extends StatelessWidget { title: Text('Dashboard'), icon: Icon(KIcons.dashboard), ), + DrawerTile( + routeName: RouterService.queryLog, + title: Text('Query log'), + icon: Icon(KIcons.queryLog), + ), DrawerTile( routeName: RouterService.settings, title: Text('Settings'), diff --git a/lib/features/routing/services/router_service.dart b/lib/features/routing/services/router_service.dart index b01f3914..0f2ebf4e 100644 --- a/lib/features/routing/services/router_service.dart +++ b/lib/features/routing/services/router_service.dart @@ -2,6 +2,7 @@ import 'package:flutter/widgets.dart'; abstract class RouterService { static const String home = '/'; + static const String queryLog = '/query-log'; static const String settings = '/settings'; static const String allPiholes = '/all-piholes'; static const String userPreferences = '/user-preferences'; diff --git a/lib/features/routing/services/router_service_sailor.dart b/lib/features/routing/services/router_service_sailor.dart index 881c5621..fe6de953 100644 --- a/lib/features/routing/services/router_service_sailor.dart +++ b/lib/features/routing/services/router_service_sailor.dart @@ -3,6 +3,7 @@ import 'package:flutter/src/widgets/framework.dart'; import 'package:flutter/src/widgets/navigator.dart'; import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/home/presentation/pages/home_page.dart'; +import 'package:flutterhole/features/pihole_api/presentation/pages/query_log_page.dart'; import 'package:flutterhole/features/routing/presentation/pages/about_page.dart'; import 'package:flutterhole/features/routing/services/router_service.dart'; import 'package:flutterhole/features/settings/presentation/pages/all_pihole_settings_page.dart'; @@ -32,6 +33,11 @@ class RouterServiceSailor implements RouterService { builder: (context, args, params) { return HomePage(); }), + SailorRoute( + name: RouterService.queryLog, + builder: (context, args, params) { + return QueryLogPage(); + }), SailorRoute( name: RouterService.settings, builder: (context, args, params) { diff --git a/lib/features/settings/presentation/pages/user_preferences_page.dart b/lib/features/settings/presentation/pages/user_preferences_page.dart index 1faf445f..326a082a 100644 --- a/lib/features/settings/presentation/pages/user_preferences_page.dart +++ b/lib/features/settings/presentation/pages/user_preferences_page.dart @@ -1,43 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; -import 'package:flutterhole/core/convert.dart'; -import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/settings/presentation/notifiers/theme_mode_notifier.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; -import 'package:flutterhole/features/settings/services/preference_service.dart'; +import 'package:flutterhole/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart'; +import 'package:flutterhole/features/settings/presentation/widgets/preferences/use_numbers_api_switch_preference.dart'; import 'package:flutterhole/widgets/layout/dialogs.dart'; import 'package:flutterhole/widgets/layout/list_title.dart'; -import 'package:flutterhole/widgets/layout/snackbars.dart'; -import 'package:preferences/preferences.dart'; import 'package:provider/provider.dart'; -enum _PopupOption { - reset, -} - -class _PopupMenu extends StatelessWidget { - @override - Widget build(BuildContext context) { - return PopupMenuButton<_PopupOption>( - onSelected: (option) async { - switch (option) { - case _PopupOption.reset: - await getIt().reset(); - showInfoSnackBar(context, 'Preferences reset', - duration: Duration(seconds: 2)); - break; - } - }, - itemBuilder: (BuildContext context) => >[ - const PopupMenuItem( - child: Text('Reset my preferences'), - value: _PopupOption.reset, - ), - ], - ); - } -} - class UserPreferencesPage extends StatefulWidget { @override _UserPreferencesPageState createState() => _UserPreferencesPageState(); @@ -47,9 +17,11 @@ class _UserPreferencesPageState extends State { @override Widget build(BuildContext context) { return Consumer( - builder: (BuildContext context, - ThemeModeNotifier notifier, - _,) { + builder: ( + BuildContext context, + ThemeModeNotifier notifier, + _, + ) { return PiholeThemeBuilder( child: Scaffold( appBar: AppBar( @@ -62,36 +34,9 @@ class _UserPreferencesPageState extends State { body: ListView( children: [ ListTitle('Customization'), - RadioPreference( - '${ThemeModeEnumMap[ThemeMode.system].capitalize} theme', - '${ThemeModeEnumMap[ThemeMode.system]}', - KPrefs.themeMode, - isDefault: true, - onSelect: () => notifier.update(), - leading: Icon(KIcons.themeSystem), - ), - RadioPreference( - '${ThemeModeEnumMap[ThemeMode.light].capitalize} theme', - '${ThemeModeEnumMap[ThemeMode.light]}', - KPrefs.themeMode, - onSelect: () => notifier.update(), - leading: Icon(KIcons.themeLight), - ), - RadioPreference( - '${ThemeModeEnumMap[ThemeMode.dark].capitalize} theme', - '${ThemeModeEnumMap[ThemeMode.dark]}', - KPrefs.themeMode, - onSelect: () => notifier.update(), - leading: Icon(KIcons.themeDark), - ), + ThemeRadioPreferences(), ListTitle('Data'), - SwitchPreference( - 'Use numbers API', - KPrefs.useNumbersApi, - defaultVal: true, - desc: - 'If enabled, the dashboard will fetch number trivia from the Numbers API.', - ), + UseNumbersApiSwitchPreference(), ListTitle('Misc'), ListTile( leading: Icon(KIcons.welcome), diff --git a/lib/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart b/lib/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart new file mode 100644 index 00000000..e40c7d17 --- /dev/null +++ b/lib/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:flutterhole/constants.dart'; +import 'package:flutterhole/core/convert.dart'; +import 'package:flutterhole/features/settings/presentation/notifiers/theme_mode_notifier.dart'; +import 'package:flutterhole/features/settings/services/preference_service.dart'; +import 'package:preferences/radio_preference.dart'; +import 'package:provider/provider.dart'; + +class ThemeRadioPreferences extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Consumer(builder: ( + BuildContext context, + ThemeModeNotifier notifier, + _, + ) { + return Column( + children: [ + RadioPreference( + '${ThemeModeEnumMap[ThemeMode.system].capitalize} theme', + '${ThemeModeEnumMap[ThemeMode.system]}', + KPrefs.themeMode, + isDefault: true, + onSelect: () => notifier.update(), + leading: Icon(KIcons.themeSystem), + ), + RadioPreference( + '${ThemeModeEnumMap[ThemeMode.light].capitalize} theme', + '${ThemeModeEnumMap[ThemeMode.light]}', + KPrefs.themeMode, + onSelect: () => notifier.update(), + leading: Icon(KIcons.themeLight), + ), + RadioPreference( + '${ThemeModeEnumMap[ThemeMode.dark].capitalize} theme', + '${ThemeModeEnumMap[ThemeMode.dark]}', + KPrefs.themeMode, + onSelect: () => notifier.update(), + leading: Icon(KIcons.themeDark), + ), + ], + ); + }); + } +} diff --git a/lib/features/settings/presentation/widgets/preferences/use_numbers_api_switch_preference.dart b/lib/features/settings/presentation/widgets/preferences/use_numbers_api_switch_preference.dart new file mode 100644 index 00000000..015fe7db --- /dev/null +++ b/lib/features/settings/presentation/widgets/preferences/use_numbers_api_switch_preference.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:flutterhole/features/settings/services/preference_service.dart'; +import 'package:preferences/switch_preference.dart'; + +class UseNumbersApiSwitchPreference extends StatelessWidget { + const UseNumbersApiSwitchPreference({ + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return SwitchPreference( + 'Use numbers API', + KPrefs.useNumbersApi, + defaultVal: true, + desc: + 'If enabled, the dashboard will fetch number trivia from the Numbers API.', + ); + } +} diff --git a/lib/features/settings/services/preference_service.dart b/lib/features/settings/services/preference_service.dart index 1a4dee50..d55c73c6 100644 --- a/lib/features/settings/services/preference_service.dart +++ b/lib/features/settings/services/preference_service.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart' show ThemeMode; +/// Constant preference keys for map-like storage implementations. class KPrefs { KPrefs._(); static const String isFirstUse = 'isFirstUse'; static const String useNumbersApi = 'useNumbersApi'; static const String themeMode = 'themeMode'; + static const String queryLogMaxResults = 'queryLogMaxResults'; } const ThemeModeEnumMap = { @@ -28,4 +30,8 @@ abstract class PreferenceService { bool get useNumbersApi; ThemeMode get themeMode; + + int get queryLogMaxResults; + + Future setQueryLogMaxResults(int maxResults); } diff --git a/lib/features/settings/services/preference_service_impl.dart b/lib/features/settings/services/preference_service_impl.dart index df374570..5211afdc 100644 --- a/lib/features/settings/services/preference_service_impl.dart +++ b/lib/features/settings/services/preference_service_impl.dart @@ -81,4 +81,11 @@ class PrServiceImpl implements PreferenceService { final String value = _get(KPrefs.themeMode) ?? 'system'; return ThemeModeMapEnum[value]; } + + @override + int get queryLogMaxResults => _get(KPrefs.queryLogMaxResults) ?? 100; + + @override + Future setQueryLogMaxResults(int maxResults) async => + _set(KPrefs.queryLogMaxResults, maxResults); } diff --git a/test/features/pihole_api/blocs/query_log_bloc_test.dart b/test/features/pihole_api/blocs/query_log_bloc_test.dart new file mode 100644 index 00000000..ba63db58 --- /dev/null +++ b/test/features/pihole_api/blocs/query_log_bloc_test.dart @@ -0,0 +1,126 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:dartz/dartz.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutterhole/core/models/failures.dart'; +import 'package:flutterhole/features/pihole_api/blocs/query_log_bloc.dart'; +import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; +import 'package:flutterhole/features/pihole_api/data/repositories/api_repository.dart'; +import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; +import 'package:flutterhole/features/settings/data/repositories/settings_repository.dart'; +import 'package:mockito/mockito.dart'; + +import '../../../test_dependency_injection.dart'; + +class MockApiRepository extends Mock implements ApiRepository {} + +class MockSettingsRepository extends Mock implements SettingsRepository {} + +void main() { + setUpAllForTest(); + + PiholeSettings settings; + ApiRepository mockApiRepository; + SettingsRepository mockSettingsRepository; + QueryLogBloc bloc; + + setUp(() { + settings = PiholeSettings(title: 'First', apiToken: 'token'); + mockApiRepository = MockApiRepository(); + mockSettingsRepository = MockSettingsRepository(); + bloc = QueryLogBloc(mockApiRepository, mockSettingsRepository); + }); + + tearDown(() { + bloc.close(); + }); + + blocTest( + 'Initially emits QueryLogStateInitial', + build: () async => bloc, + skip: 0, + expect: [QueryLogStateInitial()], + ); + + blocTest( + 'Emits [] when nothing is added', + build: () async => bloc, + expect: [], + ); + + group('$QueryLogEventFetchAll', () { + final List queries = [ + QueryData(clientName: 'first'), + QueryData(clientName: 'second'), + QueryData(clientName: 'last'), + ]; + final tFailure = Failure(); + + blocTest( + 'Emits [$QueryLogStateLoading, $QueryLogStateSuccess] when $QueryLogEventFetchAll succeeds', + build: () async { + when(mockSettingsRepository.fetchActivePiholeSettings()) + .thenAnswer((_) async => Right(settings)); + when(mockApiRepository.fetchManyQueryData(settings)) + .thenAnswer((_) async => Right(queries)); + + return bloc; + }, + act: (QueryLogBloc bloc) async => bloc.add(QueryLogEvent.fetchAll()), + expect: [QueryLogStateLoading(), QueryLogStateSuccess(queries)], + ); + + blocTest( + 'Emits [$QueryLogStateLoading, $QueryLogStateFailure] when $QueryLogEventFetchAll fails', + build: () async { + when(mockSettingsRepository.fetchActivePiholeSettings()) + .thenAnswer((_) async => Right(settings)); + when(mockApiRepository.fetchManyQueryData(settings)) + .thenAnswer((_) async => Left(tFailure)); + + return bloc; + }, + act: (QueryLogBloc bloc) async => bloc.add(QueryLogEvent.fetchAll()), + expect: [QueryLogStateLoading(), QueryLogStateFailure(tFailure)], + ); + }); + + group('$QueryLogEventFetchSome', () { + final List queries = [ + QueryData(clientName: 'first'), + QueryData(clientName: 'second'), + QueryData(clientName: 'last'), + ]; + final tFailure = Failure(); + final maxResults = 123; + + blocTest( + 'Emits [$QueryLogStateLoading, $QueryLogStateSuccess] when $QueryLogEventFetchSome succeeds', + build: () async { + when(mockSettingsRepository.fetchActivePiholeSettings()) + .thenAnswer((_) async => Right(settings)); + when(mockApiRepository.fetchManyQueryData(settings, maxResults)) + .thenAnswer((_) async => Right(queries)); + + return bloc; + }, + act: (QueryLogBloc bloc) async => + bloc.add(QueryLogEvent.fetchSome(maxResults)), + expect: [QueryLogStateLoading(), QueryLogStateSuccess(queries)], + ); + + blocTest( + 'Emits [$QueryLogStateLoading, $QueryLogStateFailure] when $QueryLogEventFetchSome fails', + build: () async { + when(mockSettingsRepository.fetchActivePiholeSettings()) + .thenAnswer((_) async => Right(settings)); + when(mockApiRepository.fetchManyQueryData(settings, maxResults)) + .thenAnswer((_) async => Left(tFailure)); + + return bloc; + }, + act: (QueryLogBloc bloc) async => + bloc.add(QueryLogEvent.fetchSome(maxResults)), + expect: [QueryLogStateLoading(), QueryLogStateFailure(tFailure)], + ); + }); +} diff --git a/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart b/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart index 62a6c68a..b461e4e1 100644 --- a/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart +++ b/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart @@ -288,7 +288,7 @@ void main() async { test( 'should return $PiVersions on successful fetchPiVersions', - () async { + () async { // arrange piholeSettings = piholeSettings.copyWith(apiToken: 'token'); final json = stubFixtureResponse('get_versions.json', 200); @@ -346,4 +346,32 @@ void main() async { expect(result, equals(ManyQueryData.fromJson(json))); }, ); + + test( + 'should return $ManyQueryData on successful fetchManyQueryData without maxResult', + () async { + // arrange + piholeSettings = piholeSettings.copyWith(apiToken: 'token'); + final json = stubFixtureResponse('get_all_queries_10.json', 200); + // act + final ManyQueryData result = + await apiDataSourceDio.fetchManyQueryData(piholeSettings); + // assert + expect(result, equals(ManyQueryData.fromJson(json))); + }, + ); + + test( + 'should return $ManyQueryData on successful fetchManyQueryData with maxResult', + () async { + // arrange + piholeSettings = piholeSettings.copyWith(apiToken: 'token'); + final json = stubFixtureResponse('get_all_queries_10.json', 200); + // act + final ManyQueryData result = + await apiDataSourceDio.fetchManyQueryData(piholeSettings, 123); + // assert + expect(result, equals(ManyQueryData.fromJson(json))); + }, + ); } diff --git a/test/features/pihole_api/data/repositories/api_repository_impl_test.dart b/test/features/pihole_api/data/repositories/api_repository_impl_test.dart index 82859062..ba122a15 100644 --- a/test/features/pihole_api/data/repositories/api_repository_impl_test.dart +++ b/test/features/pihole_api/data/repositories/api_repository_impl_test.dart @@ -5,6 +5,7 @@ import 'package:flutterhole/core/models/failures.dart'; import 'package:flutterhole/features/pihole_api/data/datasources/api_data_source.dart'; import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart'; import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; +import 'package:flutterhole/features/pihole_api/data/models/many_query_data.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; @@ -231,24 +232,32 @@ void main() async { group('fetchQueryDataForClient', () { final PiClient client = PiClient(title: 'test.org'); -// test( -// 'should return reversed List on successful fetchQueriesForClient', -// () async { -// // arrange -// final ManyQueryData manyQueryData = ManyQueryData( -// data: [QueryData(clientName: client.title)], -// ); -// -// when(mockApiDataSource.fetchQueryDataForClient(piholeSettings, client)) -// .thenAnswer((_) async => manyQueryData); -// // act -// final Either> result = -// await apiRepository.fetchQueriesForClient(piholeSettings, client); -// // assert -// expect(result, -// equals(Right>(manyQueryData.data.reversed.toList()))); -// }, -// ); + test( + 'should return reversed List on successful fetchQueriesForClient', + () async { + // arrange + final ManyQueryData manyQueryData = ManyQueryData( + data: [ + QueryData(clientName: 'first'), + QueryData(clientName: 'second'), + QueryData(clientName: 'third'), + ], + ); + + when(mockApiDataSource.fetchQueryDataForClient(piholeSettings, client)) + .thenAnswer((_) async => manyQueryData); + // act + final Either> result = + await apiRepository.fetchQueriesForClient(piholeSettings, client); + // assert + result.fold( + (failure) => fail('result should be Right'), + (list) { + expect(list, equals(manyQueryData.data.reversed.toList())); + }, + ); + }, + ); test( 'should return $Failure on failed fetchQueriesForClient', @@ -267,25 +276,29 @@ void main() async { ); }); - group('fetchQueryDataForDomain', () { + group('fetchQueriesForDomain', () { final String domain = 'test.org'; -// test( -// 'should return reversed List on successful fetchQueriesForDomain', -// () async { -// // arrange -// final ManyQueryData manyQueryData = ManyQueryData( -// data: [QueryData(domain: domain)], -// ); -// when(mockApiDataSource.fetchQueryDataForDomain(piholeSettings, domain)) -// .thenAnswer((_) async => manyQueryData); -// // act -// final Either> result = -// await apiRepository.fetchQueriesForDomain(piholeSettings, domain); -// // assert -// expect(result, -// equals(Right>(manyQueryData.data.reversed.toList()))); -// }, -// ); + test( + 'should return reversed List on successful fetchQueriesForDomain', + () async { + // arrange + final ManyQueryData manyQueryData = ManyQueryData( + data: [QueryData(domain: domain)], + ); + when(mockApiDataSource.fetchQueryDataForDomain(piholeSettings, domain)) + .thenAnswer((_) async => manyQueryData); + // act + final Either> result = + await apiRepository.fetchQueriesForDomain(piholeSettings, domain); + // assert + result.fold( + (failure) => fail('result should be Right'), + (list) { + expect(list, equals(manyQueryData.data.reversed.toList())); + }, + ); + }, + ); test( 'should return $Failure on failed fetchQueriesForDomain', @@ -303,4 +316,75 @@ void main() async { }, ); }); + + group('fetchManyQueryData', () { + test( + 'should return reversed List on successful fetchManyQueryData without maxResults', + () async { + // arrange + final ManyQueryData manyQueryData = ManyQueryData( + data: [ + QueryData(clientName: 'first'), + QueryData(clientName: 'second'), + QueryData(clientName: 'third'), + ], + ); + when(mockApiDataSource.fetchManyQueryData(piholeSettings)) + .thenAnswer((_) async => manyQueryData); + // act + final Either> result = + await apiRepository.fetchManyQueryData(piholeSettings); + // assert + result.fold( + (failure) => fail('result should be Right'), + (list) { + expect(list, equals(manyQueryData.data.reversed.toList())); + }, + ); + }, + ); + + test( + 'should return reversed List on successful fetchManyQueryData with maxResults', + () async { + // arrange + final int maxResults = 123; + final ManyQueryData manyQueryData = ManyQueryData( + data: [ + QueryData(clientName: 'first'), + QueryData(clientName: 'second'), + QueryData(clientName: 'third'), + ], + ); + when(mockApiDataSource.fetchManyQueryData(piholeSettings, maxResults)) + .thenAnswer((_) async => manyQueryData); + // act + final Either> result = + await apiRepository.fetchManyQueryData(piholeSettings, maxResults); + // assert + result.fold( + (failure) => fail('result should be Right'), + (list) { + expect(list, equals(manyQueryData.data.reversed.toList())); + }, + ); + }, + ); + + test( + 'should return $Failure on failed fetchManyQueryData', + () async { + // arrange + final tError = PiException.emptyResponse(); + when(mockApiDataSource.fetchManyQueryData(piholeSettings)) + .thenThrow(tError); + // act + final Either> result = + await apiRepository.fetchManyQueryData(piholeSettings); + // assert + expect( + result, equals(Left(Failure('fetchManyQueryData failed', tError)))); + }, + ); + }); } From b80f46f96fa80f2d2f6635bd30373c8b8a6e64e5 Mon Sep 17 00:00:00 2001 From: thomas-sterrenburg Date: Tue, 19 May 2020 11:46:43 +0200 Subject: [PATCH 04/11] Searchable & refreshable query log/client/domain pages --- lib/constants.dart | 2 + .../pihole_api/data/models/query_data.dart | 6 +- .../notifiers/queries_search_notifier.dart | 27 +++ .../presentation/pages/query_log_page.dart | 82 +++++--- .../pages/single_client_page.dart | 65 +++--- .../pages/single_domain_page.dart | 69 ++++--- .../widgets/many_query_tiles_builder.dart | 31 --- .../widgets/queries_search_app_bar.dart | 115 +++++++++++ .../widgets/queries_search_list_builder.dart | 50 +++++ ...single_client_page_overflow_refresher.dart | 62 ++++++ ...single_domain_page_overflow_refresher.dart | 61 ++++++ .../widgets/single_query_data_tile.dart | 186 +++++++++--------- .../widgets/pihole_theme_builder.dart | 2 +- release_notes.txt | 4 + 14 files changed, 555 insertions(+), 207 deletions(-) create mode 100644 lib/features/pihole_api/presentation/notifiers/queries_search_notifier.dart delete mode 100644 lib/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart create mode 100644 lib/features/pihole_api/presentation/widgets/queries_search_app_bar.dart create mode 100644 lib/features/pihole_api/presentation/widgets/queries_search_list_builder.dart create mode 100644 lib/features/pihole_api/presentation/widgets/single_client_page_overflow_refresher.dart create mode 100644 lib/features/pihole_api/presentation/widgets/single_domain_page_overflow_refresher.dart diff --git a/lib/constants.dart b/lib/constants.dart index d3764d07..ab609587 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -40,7 +40,9 @@ class KIcons { static const IconData log = AntDesign.codesquare; static const IconData open = MaterialIcons.keyboard_arrow_right; + static const IconData search = MaterialIcons.search; static const IconData close = Icons.close; + static const IconData back = Icons.arrow_back; static const IconData delete = MaterialCommunityIcons.delete_circle; static const IconData openInBrowser = MaterialIcons.open_in_browser; static const IconData copy = Icons.content_copy; diff --git a/lib/features/pihole_api/data/models/query_data.dart b/lib/features/pihole_api/data/models/query_data.dart index 12d808d0..a376f7e2 100644 --- a/lib/features/pihole_api/data/models/query_data.dart +++ b/lib/features/pihole_api/data/models/query_data.dart @@ -106,8 +106,8 @@ abstract class QueryData extends ListModel implements _$QueryData { '${QueryStatus.values.indexOf(queryStatus)}', '${DnsSecStatus.values.indexOf(dnsSecStatus)}', '$replyTextIndex', - '${(replyDuration.inMicroseconds / 100).round()}', - replyText, - someString, + '${(replyDuration.inMicroseconds / 100).round()}', + replyText, + someString, ]; } diff --git a/lib/features/pihole_api/presentation/notifiers/queries_search_notifier.dart b/lib/features/pihole_api/presentation/notifiers/queries_search_notifier.dart new file mode 100644 index 00000000..33f2cfdb --- /dev/null +++ b/lib/features/pihole_api/presentation/notifiers/queries_search_notifier.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +class QueriesSearchNotifier extends ChangeNotifier { + bool _isSearching = false; + String _searchQuery = ''; + + bool get isSearching => _isSearching; + + String get searchQuery => _searchQuery; + + set searchQuery(String value) { + _searchQuery = value.toLowerCase(); + notifyListeners(); + } + + void startSearching() { + _isSearching = true; + _searchQuery = ''; + notifyListeners(); + } + + void stopSearching() { + _isSearching = false; + _searchQuery = ''; + notifyListeners(); + } +} diff --git a/lib/features/pihole_api/presentation/pages/query_log_page.dart b/lib/features/pihole_api/presentation/pages/query_log_page.dart index 35ec1c95..f24b222c 100644 --- a/lib/features/pihole_api/presentation/pages/query_log_page.dart +++ b/lib/features/pihole_api/presentation/pages/query_log_page.dart @@ -2,13 +2,18 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/pihole_api/blocs/query_log_bloc.dart'; -import 'package:flutterhole/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart'; +import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; +import 'package:flutterhole/features/pihole_api/presentation/notifiers/queries_search_notifier.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/queries_search_app_bar.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/queries_search_list_builder.dart'; import 'package:flutterhole/features/pihole_api/presentation/widgets/query_log_page_overflow_refresher.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/single_query_data_tile.dart'; import 'package:flutterhole/features/routing/presentation/widgets/default_drawer.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; import 'package:flutterhole/features/settings/services/preference_service.dart'; import 'package:flutterhole/widgets/layout/loading_indicators.dart'; import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; final _numberFormat = NumberFormat(); @@ -25,7 +30,6 @@ class _PopupMenu extends StatelessWidget { Widget build(BuildContext context) { return PopupMenuButton( tooltip: 'Set max results', -// initialValue: getIt().queryLogMaxResults, onSelected: (int value) async { getIt().setQueryLogMaxResults(value); @@ -37,7 +41,6 @@ class _PopupMenu extends StatelessWidget { BlocProvider.of(context) .add(QueryLogEvent.fetchSome(value)); }, - itemBuilder: (BuildContext context) => >[ PopupMenuItem( child: Text('Max results'), @@ -56,34 +59,51 @@ class _PopupMenu extends StatelessWidget { class QueryLogPage extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocProvider( - create: (_) => - QueryLogBloc() - ..add(QueryLogEvent.fetchSome( - getIt().queryLogMaxResults)), - child: PiholeThemeBuilder( - child: Scaffold( - drawer: DefaultDrawer(), - appBar: AppBar( - title: Text('Query log'), - elevation: 0.0, - actions: [ - _PopupMenu(), - ], - ), - body: QueryLogPageOverflowRefresher( - child: BlocBuilder( - builder: (BuildContext context, QueryLogState state) { - return state.maybeWhen( - success: (queries) { - return ManyQueryTilesBuilder(queries: queries); - }, - initial: () => Container(), - orElse: () { - return CenteredLoadingIndicator(); - }, - ); - }, + return ChangeNotifierProvider( + create: (BuildContext context) => QueriesSearchNotifier(), + child: BlocProvider( + create: (_) => QueryLogBloc() + ..add(QueryLogEvent.fetchSome( + getIt().queryLogMaxResults)), + child: PiholeThemeBuilder( + child: Scaffold( + drawer: DefaultDrawer(), + appBar: QueriesSearchAppBar( + title: Text('Query log'), + actions: [ + _PopupMenu(), + ], + ), + body: Scrollbar( + child: BlocBuilder( + builder: (BuildContext context, QueryLogState state) { + return state.maybeWhen( + success: (List queries) { + return QueriesSearchListBuilder( + initialData: queries, + builder: + (BuildContext context, List matches) { + return QueryLogPageOverflowRefresher( + child: ListView.builder( + itemCount: matches.length, + itemBuilder: (context, index) { + final QueryData query = + matches.elementAt(index); + + return SingleQueryDataTile(query: query); + }, + ), + ); + }, + ); + }, + initial: () => Container(), + orElse: () { + return CenteredLoadingIndicator(); + }, + ); + }, + ), ), ), ), diff --git a/lib/features/pihole_api/presentation/pages/single_client_page.dart b/lib/features/pihole_api/presentation/pages/single_client_page.dart index 25a99a25..6b9c2ee5 100644 --- a/lib/features/pihole_api/presentation/pages/single_client_page.dart +++ b/lib/features/pihole_api/presentation/pages/single_client_page.dart @@ -2,10 +2,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutterhole/features/pihole_api/blocs/single_client_bloc.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; -import 'package:flutterhole/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart'; +import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; +import 'package:flutterhole/features/pihole_api/presentation/notifiers/queries_search_notifier.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/queries_search_app_bar.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/queries_search_list_builder.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/single_client_page_overflow_refresher.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/single_query_data_tile.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; import 'package:flutterhole/widgets/layout/failure_indicators.dart'; import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:provider/provider.dart'; class SingleClientPage extends StatelessWidget { const SingleClientPage({ @@ -17,28 +23,41 @@ class SingleClientPage extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocProvider( - create: (_) => - SingleClientBloc()..add(SingleClientEvent.fetchQueries(client)), - child: PiholeThemeBuilder( - child: Scaffold( - appBar: AppBar( - title: Text('${client.titleOrIp}'), - ), - body: Center( - child: Builder( - builder: (context) { - return BlocBuilder( - builder: (BuildContext context, SingleClientState state) { - return state.maybeWhen( - success: (client, queries) => - ManyQueryTilesBuilder(queries: queries), - failure: (failure) => CenteredFailureIndicator(failure), - orElse: () => CenteredLoadingIndicator(), - ); - }, - ); - }, + return ChangeNotifierProvider( + create: (BuildContext context) => QueriesSearchNotifier(), + child: BlocProvider( + create: (_) => + SingleClientBloc()..add(SingleClientEvent.fetchQueries(client)), + child: PiholeThemeBuilder( + child: Scaffold( + appBar: QueriesSearchAppBar( + title: Text('${client.titleOrIp}'), + ), + body: Scrollbar( + child: BlocBuilder( + builder: (BuildContext context, SingleClientState state) { + return state.maybeWhen( + success: (client, queries) => QueriesSearchListBuilder( + initialData: queries, + builder: (context, matches) { + return SingleClientPageOverflowRefresher( + client: client, + child: ListView.builder( + itemCount: matches.length, + itemBuilder: (context, index) { + final QueryData query = + matches.elementAt(index); + + return SingleQueryDataTile(query: query); + }, + ), + ); + }), + failure: (failure) => CenteredFailureIndicator(failure), + orElse: () => CenteredLoadingIndicator(), + ); + }, + ), ), ), ), diff --git a/lib/features/pihole_api/presentation/pages/single_domain_page.dart b/lib/features/pihole_api/presentation/pages/single_domain_page.dart index 4fc9e77d..040d1d44 100644 --- a/lib/features/pihole_api/presentation/pages/single_domain_page.dart +++ b/lib/features/pihole_api/presentation/pages/single_domain_page.dart @@ -1,10 +1,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutterhole/features/pihole_api/blocs/single_domain_bloc.dart'; -import 'package:flutterhole/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart'; +import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; +import 'package:flutterhole/features/pihole_api/presentation/notifiers/queries_search_notifier.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/queries_search_app_bar.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/queries_search_list_builder.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/single_domain_page_overflow_refresher.dart'; +import 'package:flutterhole/features/pihole_api/presentation/widgets/single_query_data_tile.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; import 'package:flutterhole/widgets/layout/failure_indicators.dart'; import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:provider/provider.dart'; class SingleDomainPage extends StatelessWidget { const SingleDomainPage({ @@ -16,31 +22,44 @@ class SingleDomainPage extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocProvider( - create: (_) => - SingleDomainBloc()..add(SingleDomainEvent.fetchQueries(domain)), - child: PiholeThemeBuilder( - child: Scaffold( - appBar: AppBar( - title: Text( - '$domain', - overflow: TextOverflow.fade, + return ChangeNotifierProvider( + create: (BuildContext context) => QueriesSearchNotifier(), + child: BlocProvider( + create: (_) => + SingleDomainBloc()..add(SingleDomainEvent.fetchQueries(domain)), + child: PiholeThemeBuilder( + child: Scaffold( + appBar: QueriesSearchAppBar( + title: Text( + '$domain', + overflow: TextOverflow.fade, + ), ), - ), - body: Center( - child: Builder( - builder: (context) { - return BlocBuilder( - builder: (BuildContext context, SingleDomainState state) { - return state.maybeWhen( - success: (domain, queries) => - ManyQueryTilesBuilder(queries: queries), - failure: (failure) => CenteredFailureIndicator(failure), - orElse: () => CenteredLoadingIndicator(), - ); - }, - ); - }, + body: Scrollbar( + child: BlocBuilder( + builder: (BuildContext context, SingleDomainState state) { + return state.maybeWhen( + success: (domain, queries) => QueriesSearchListBuilder( + initialData: queries, + builder: (context, matches) { + return SingleDomainPageOverflowRefresher( + domain: domain, + child: ListView.builder( + itemCount: matches.length, + itemBuilder: (context, index) { + final QueryData query = + matches.elementAt(index); + + return SingleQueryDataTile(query: query); + }, + ), + ); + }), + failure: (failure) => CenteredFailureIndicator(failure), + orElse: () => CenteredLoadingIndicator(), + ); + }, + ), ), ), ), diff --git a/lib/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart b/lib/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart deleted file mode 100644 index 0bceb6da..00000000 --- a/lib/features/pihole_api/presentation/widgets/many_query_tiles_builder.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; -import 'package:flutterhole/features/pihole_api/presentation/widgets/single_query_data_tile.dart'; -import 'package:flutterhole/widgets/layout/animate_on_build.dart'; - -class ManyQueryTilesBuilder extends StatelessWidget { - const ManyQueryTilesBuilder({ - Key key, - @required this.queries, - this.shrinkWrap = false, - }) : super(key: key); - - final List queries; - final bool shrinkWrap; - - @override - Widget build(BuildContext context) { - return AnimateOnBuild( - child: Scrollbar( - child: ListView.builder( - shrinkWrap: shrinkWrap, - itemCount: queries.length, - itemBuilder: (context, index) { - final QueryData query = queries.elementAt(index); - - return SingleQueryDataTile(query: query); - }), - ), - ); - } -} diff --git a/lib/features/pihole_api/presentation/widgets/queries_search_app_bar.dart b/lib/features/pihole_api/presentation/widgets/queries_search_app_bar.dart new file mode 100644 index 00000000..9377df3b --- /dev/null +++ b/lib/features/pihole_api/presentation/widgets/queries_search_app_bar.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; +import 'package:flutterhole/constants.dart'; +import 'package:flutterhole/features/pihole_api/presentation/notifiers/queries_search_notifier.dart'; +import 'package:flutterhole/widgets/layout/animate_on_build.dart'; +import 'package:provider/provider.dart'; + +class QueriesSearchAppBar extends StatefulWidget + implements PreferredSizeWidget { + QueriesSearchAppBar({ + Key key, + this.title, + this.actions, + }) : super(key: key); + + final Widget title; + final List actions; + + @override + Size get preferredSize => Size.fromHeight(56.0); + + @override + _QueriesSearchAppBarState createState() => _QueriesSearchAppBarState(); +} + +class _QueriesSearchAppBarState extends State { + TextEditingController _searchEditingController; + + @override + void initState() { + super.initState(); + _searchEditingController = TextEditingController(); + _searchEditingController.addListener(() { + setState(() { + Provider.of(context, listen: false).searchQuery = + _searchEditingController.text; + }); + }); + } + + @override + void dispose() { + _searchEditingController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Consumer( + builder: ( + BuildContext context, + QueriesSearchNotifier notifier, + _, + ) { + return AppBar( + leading: notifier.isSearching + ? WillPopScope( + child: IconButton( + tooltip: 'Stop searching', + icon: Icon(KIcons.back), + onPressed: () { + notifier.stopSearching(); + }, + ), + onWillPop: () async { + notifier.stopSearching(); + return false; + }, + ) + : null, + title: notifier.isSearching + ? AnimateOnBuild( + child: TextField( + controller: _searchEditingController, + autofocus: true, + keyboardType: TextInputType.url, + style: Theme.of(context).textTheme.headline6.apply( + color: Theme.of(context).colorScheme.onPrimary, + ), + decoration: InputDecoration( + hintText: 'Search queries...', + border: InputBorder.none, + suffixIcon: _searchEditingController.text.isEmpty + ? null + : IconButton( + tooltip: 'Clear search', + icon: Icon(KIcons.close), + color: Theme.of(context).colorScheme.onPrimary, + onPressed: () { + setState(() { + _searchEditingController.text = ''; + }); + }, + ), + ), + ), + ) + : widget.title ?? Container(), + elevation: 0.0, + actions: notifier.isSearching + ? [] + : [ + IconButton( + tooltip: 'Search queries', + icon: Icon(KIcons.search), + onPressed: () { + notifier.startSearching(); + }, + ), + ...widget.actions ?? [], + ], + ); + }, + ); + } +} diff --git a/lib/features/pihole_api/presentation/widgets/queries_search_list_builder.dart b/lib/features/pihole_api/presentation/widgets/queries_search_list_builder.dart new file mode 100644 index 00000000..96accc68 --- /dev/null +++ b/lib/features/pihole_api/presentation/widgets/queries_search_list_builder.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; +import 'package:flutterhole/features/pihole_api/presentation/notifiers/queries_search_notifier.dart'; +import 'package:provider/provider.dart'; + +extension QueryDataSearchable on QueryData { + String get searchableString => [ + queryType, + domain, + clientName, + queryStatus, + dnsSecStatus, + ].toString().toLowerCase(); +} + +typedef Widget SearchListBuilder(BuildContext context, List matches); + +class QueriesSearchListBuilder extends StatelessWidget { + const QueriesSearchListBuilder({ + Key key, + @required this.initialData, + @required this.builder, + }) : super(key: key); + + final List initialData; + final SearchListBuilder builder; + + @override + Widget build(BuildContext context) { + return Consumer(builder: ( + BuildContext context, + QueriesSearchNotifier notifier, + _, + ) { + List searchedQueries; + + if (notifier.isSearching && notifier.searchQuery.isNotEmpty) { + searchedQueries = initialData.where((element) { + final string = element.searchableString; + print('checking for "${notifier.searchQuery}" in "$string'); + return string.contains(notifier.searchQuery); + }).toList(); + } + + final List toUse = searchedQueries ?? initialData; + + return builder(context, toUse); + }); + } +} diff --git a/lib/features/pihole_api/presentation/widgets/single_client_page_overflow_refresher.dart b/lib/features/pihole_api/presentation/widgets/single_client_page_overflow_refresher.dart new file mode 100644 index 00000000..95c18f17 --- /dev/null +++ b/lib/features/pihole_api/presentation/widgets/single_client_page_overflow_refresher.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutterhole/features/pihole_api/blocs/single_client_bloc.dart'; +import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; + +typedef void OnRefreshCallback(BuildContext context); + +class SingleClientPageOverflowRefresher extends StatefulWidget { + const SingleClientPageOverflowRefresher({ + Key key, + @required this.client, + @required this.child, + }) : super(key: key); + + final PiClient client; + final Widget child; + + @override + _SingleClientPageOverflowRefresherState createState() => + _SingleClientPageOverflowRefresherState(); +} + +class _SingleClientPageOverflowRefresherState + extends State { + final RefreshController _refreshController = RefreshController(); + + void _onRefresh() { + BlocProvider.of(context) + .add(SingleClientEvent.fetchQueries(widget.client)); + } + + @override + void dispose() { + _refreshController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return RefreshConfiguration( + headerBuilder: () => WaterDropMaterialHeader( + semanticsLabel: 'Refresh data', + color: Theme.of(context).colorScheme.onBackground, + ), + enableBallisticLoad: true, + child: BlocListener( + listener: (BuildContext context, SingleClientState state) { + if (state is SingleClientStateSuccess) { + _refreshController?.refreshCompleted(); + } + }, + child: SmartRefresher( + enablePullDown: true, + controller: _refreshController, + onRefresh: _onRefresh, + child: widget.child, + ), + ), + ); + } +} diff --git a/lib/features/pihole_api/presentation/widgets/single_domain_page_overflow_refresher.dart b/lib/features/pihole_api/presentation/widgets/single_domain_page_overflow_refresher.dart new file mode 100644 index 00000000..c992b948 --- /dev/null +++ b/lib/features/pihole_api/presentation/widgets/single_domain_page_overflow_refresher.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutterhole/features/pihole_api/blocs/single_domain_bloc.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; + +typedef void OnRefreshCallback(BuildContext context); + +class SingleDomainPageOverflowRefresher extends StatefulWidget { + const SingleDomainPageOverflowRefresher({ + Key key, + @required this.domain, + @required this.child, + }) : super(key: key); + + final String domain; + final Widget child; + + @override + _SingleDomainPageOverflowRefresherState createState() => + _SingleDomainPageOverflowRefresherState(); +} + +class _SingleDomainPageOverflowRefresherState + extends State { + final RefreshController _refreshController = RefreshController(); + + void _onRefresh() { + BlocProvider.of(context) + .add(SingleDomainEvent.fetchQueries(widget.domain)); + } + + @override + void dispose() { + _refreshController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return RefreshConfiguration( + headerBuilder: () => WaterDropMaterialHeader( + semanticsLabel: 'Refresh data', + color: Theme.of(context).colorScheme.onBackground, + ), + enableBallisticLoad: true, + child: BlocListener( + listener: (BuildContext context, SingleDomainState state) { + if (state is SingleDomainStateSuccess) { + _refreshController?.refreshCompleted(); + } + }, + child: SmartRefresher( + enablePullDown: true, + controller: _refreshController, + onRefresh: _onRefresh, + child: widget.child, + ), + ), + ); + } +} diff --git a/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart b/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart index 55faa893..e7621f6a 100644 --- a/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart +++ b/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; import 'package:flutterhole/core/convert.dart'; import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; +import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; import 'package:flutterhole/widgets/layout/animated_opener.dart'; import 'package:flutterhole/widgets/layout/open_url_tile.dart'; @@ -127,101 +128,100 @@ class SingleQueryDataTile extends StatelessWidget { @override Widget build(BuildContext context) { return AnimatedOpener( - closed: (context) => - ListTile( - title: Text('${query.domain}'), - isThreeLine: true, - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('$_timeStamp'), - Text('${query.queryStatus.toFullString}', - style: TextStyle(color: query.queryStatus.toColor)), - ], - ), - trailing: _buildQueryStatusIcon(), + closed: (context) => ListTile( + title: Text('${query.domain}'), + isThreeLine: true, + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('$_timeStamp'), + Text('${query.queryStatus.toFullString}', + style: TextStyle(color: query.queryStatus.toColor)), + ], + ), + trailing: _buildQueryStatusIcon(), + ), + opened: (context) => PiholeThemeBuilder( + child: Scaffold( + appBar: AppBar( + title: Text('Query data'), ), - opened: (context) => - Scaffold( - appBar: AppBar( - title: Text('Query data'), - ), - body: ListView( - children: [ - ListTile( - leading: Icon(KIcons.timestamp), - title: Text('$_timeStamp'), - subtitle: Text('Timestamp'), - ), - ListTile( - leading: Icon(KIcons.queryType), - title: Text('${query.queryType.toFullString}'), - subtitle: Text('DNS record type'), - trailing: IconButton( - tooltip: 'Wat are DNS record types?', - icon: Icon(KIcons.moreInfo), - onPressed: () { - showDialog( - context: context, - builder: (context) { - return SimpleDialog( - title: Text('Wat are DNS record types?'), - children: [ - ...List.generate(QueryType.values.length, - (index) { - final QueryType type = - QueryType.values.elementAt(index); - return ListTile( - dense: true, - title: Text('${type.toFullString}'), - subtitle: Text('${type.toDescription}'), - ); - }), - OpenUrlTile( - url: _wikipediaUrl, - leading: Icon(KIcons.info), - title: Row( - children: [ - Text('Learn more on '), - Text( - 'Wikipedia', - style: TextStyle( - fontWeight: FontWeight.bold), - ) - ], - ), - ) - ], - ); - }, - ); - }, - ), - ), - ListTile( - leading: Icon(KIcons.domains), - title: Text('${query.domain}'), - subtitle: Text('Domain'), - ), - ListTile( - leading: Icon(KIcons.clients), - title: Text('${query.clientName}'), - subtitle: Text('Client'), + body: ListView( + children: [ + ListTile( + leading: Icon(KIcons.timestamp), + title: Text('$_timeStamp'), + subtitle: Text('Timestamp'), + ), + ListTile( + leading: Icon(KIcons.queryType), + title: Text('${query.queryType.toFullString}'), + subtitle: Text('DNS record type'), + trailing: IconButton( + tooltip: 'Wat are DNS record types?', + icon: Icon(KIcons.moreInfo), + onPressed: () { + showDialog( + context: context, + builder: (context) { + return SimpleDialog( + title: Text('Wat are DNS record types?'), + children: [ + ...List.generate(QueryType.values.length, + (index) { + final QueryType type = + QueryType.values.elementAt(index); + return ListTile( + dense: true, + title: Text('${type.toFullString}'), + subtitle: Text('${type.toDescription}'), + ); + }), + OpenUrlTile( + url: _wikipediaUrl, + leading: Icon(KIcons.info), + title: Row( + children: [ + Text('Learn more on '), + Text( + 'Wikipedia', + style: + TextStyle(fontWeight: FontWeight.bold), + ) + ], + ), + ) + ], + ); + }, + ); + }, ), - ListTile( - leading: Icon(KIcons.queryStatus), - title: Text('${query.queryStatus.toFullString}'), - subtitle: Text('Status'), - trailing: _buildQueryStatusIcon(), - ), - ListTile( - leading: Icon(KIcons.pingInterval), - title: Text( - '${query.replyDuration.inMicroseconds ~/ 100} ms'), - subtitle: Text('Reply duration'), - ), - ], - ), + ), + ListTile( + leading: Icon(KIcons.domains), + title: Text('${query.domain}'), + subtitle: Text('Domain'), + ), + ListTile( + leading: Icon(KIcons.clients), + title: Text('${query.clientName}'), + subtitle: Text('Client'), + ), + ListTile( + leading: Icon(KIcons.queryStatus), + title: Text('${query.queryStatus.toFullString}'), + subtitle: Text('Status'), + trailing: _buildQueryStatusIcon(), + ), + ListTile( + leading: Icon(KIcons.pingInterval), + title: Text('${query.replyDuration.inMicroseconds ~/ 100} ms'), + subtitle: Text('Reply duration'), + ), + ], + ), + ), ), ); } diff --git a/lib/features/settings/presentation/widgets/pihole_theme_builder.dart b/lib/features/settings/presentation/widgets/pihole_theme_builder.dart index 5d8da880..b198770f 100644 --- a/lib/features/settings/presentation/widgets/pihole_theme_builder.dart +++ b/lib/features/settings/presentation/widgets/pihole_theme_builder.dart @@ -21,7 +21,7 @@ Map _materialColorMap = { class PiholeThemeBuilder extends StatelessWidget { /// Applies theme data from the active [PiholeSettings]. /// - /// Optionally applies theme data from [settings]. + /// Optionally overrides theme data from [settings]. const PiholeThemeBuilder({ Key key, @required this.child, diff --git a/release_notes.txt b/release_notes.txt index 740749c4..25a7026d 100644 --- a/release_notes.txt +++ b/release_notes.txt @@ -1,3 +1,7 @@ +* Feature: query logs are searchable and refreshable. + +* Feature: the query log is back. I intend to make some kind of live query viewer separately, this page does _not_ automatically listen for new data. + * Feature: single queries can be expanded to show more data again. * Feature: Basic Authentication is back - thank you Joerg. From 4cf2b5b5cb0408df7b9677eb14d34e8b584b26f5 Mon Sep 17 00:00:00 2001 From: thomas-sterrenburg Date: Tue, 19 May 2020 19:29:00 +0200 Subject: [PATCH 05/11] Toggles use theme color --- .../pages/user_preferences_page.dart | 56 +++++++------------ .../widgets/pihole_theme_builder.dart | 11 ++-- .../settings/services/preference_service.dart | 2 +- 3 files changed, 29 insertions(+), 40 deletions(-) diff --git a/lib/features/settings/presentation/pages/user_preferences_page.dart b/lib/features/settings/presentation/pages/user_preferences_page.dart index 326a082a..1b1bd40e 100644 --- a/lib/features/settings/presentation/pages/user_preferences_page.dart +++ b/lib/features/settings/presentation/pages/user_preferences_page.dart @@ -1,12 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; -import 'package:flutterhole/features/settings/presentation/notifiers/theme_mode_notifier.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; import 'package:flutterhole/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart'; import 'package:flutterhole/features/settings/presentation/widgets/preferences/use_numbers_api_switch_preference.dart'; import 'package:flutterhole/widgets/layout/dialogs.dart'; import 'package:flutterhole/widgets/layout/list_title.dart'; -import 'package:provider/provider.dart'; class UserPreferencesPage extends StatefulWidget { @override @@ -16,40 +14,28 @@ class UserPreferencesPage extends StatefulWidget { class _UserPreferencesPageState extends State { @override Widget build(BuildContext context) { - return Consumer( - builder: ( - BuildContext context, - ThemeModeNotifier notifier, - _, - ) { - return PiholeThemeBuilder( - child: Scaffold( - appBar: AppBar( - title: Text('Preferences'), - actions: [ - // TODO this throws some exceptions from ThemeModeNotifier after clearing and re-opening the page - // _PopupMenu(), - ], + return PiholeThemeBuilder( + child: Scaffold( + appBar: AppBar( + title: Text('Preferences'), + ), + body: ListView( + children: [ + ListTitle('Customization'), + ThemeRadioPreferences(), + ListTitle('Data'), + UseNumbersApiSwitchPreference(), + ListTitle('Misc'), + ListTile( + leading: Icon(KIcons.welcome), + title: Text('Show welcome message'), + onTap: () { + showWelcomeDialog(context); + }, ), - body: ListView( - children: [ - ListTitle('Customization'), - ThemeRadioPreferences(), - ListTitle('Data'), - UseNumbersApiSwitchPreference(), - ListTitle('Misc'), - ListTile( - leading: Icon(KIcons.welcome), - title: Text('Show welcome message'), - onTap: () { - showWelcomeDialog(context); - }, - ), - ], - ), - ), - ); - }, + ], + ), + ), ); } } diff --git a/lib/features/settings/presentation/widgets/pihole_theme_builder.dart b/lib/features/settings/presentation/widgets/pihole_theme_builder.dart index b198770f..b3e7d3f5 100644 --- a/lib/features/settings/presentation/widgets/pihole_theme_builder.dart +++ b/lib/features/settings/presentation/widgets/pihole_theme_builder.dart @@ -54,11 +54,14 @@ class PiholeThemeBuilder extends StatelessWidget { } ThemeData _buildTheme(BuildContext context, PiholeSettings settings) { + final MaterialColor color = MaterialColor( + settings.primaryColor.value, + _materialColorMap, + ); + return Theme.of(context).copyWith( - accentColor: MaterialColor( - settings.primaryColor.value, - _materialColorMap, - ), + accentColor: color, + toggleableActiveColor: color, ); } } diff --git a/lib/features/settings/services/preference_service.dart b/lib/features/settings/services/preference_service.dart index d55c73c6..99778d54 100644 --- a/lib/features/settings/services/preference_service.dart +++ b/lib/features/settings/services/preference_service.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart' show ThemeMode; +import 'package:flutter/material.dart'; /// Constant preference keys for map-like storage implementations. class KPrefs { From 7c53759bcf8fcfab871efd27c6a5815d495b8af6 Mon Sep 17 00:00:00 2001 From: thomas-sterrenburg Date: Tue, 19 May 2020 21:42:10 +0200 Subject: [PATCH 06/11] Status indicators in Pi-hole forms can be tapped to show error details --- .../presentation/pages/about_page.dart | 2 +- .../presentation/pages/add_pihole_page.dart | 2 - .../pages/single_pihole_settings_page.dart | 2 - .../form/authentication_status_icon.dart | 35 ++++-- .../form/host_details_status_icon.dart | 104 ++++++++++-------- lib/widgets/layout/dialogs.dart | 24 ++++ lib/widgets/layout/failure_indicators.dart | 31 ++++++ 7 files changed, 143 insertions(+), 57 deletions(-) diff --git a/lib/features/routing/presentation/pages/about_page.dart b/lib/features/routing/presentation/pages/about_page.dart index 8c110526..2db49d3c 100644 --- a/lib/features/routing/presentation/pages/about_page.dart +++ b/lib/features/routing/presentation/pages/about_page.dart @@ -79,7 +79,7 @@ class AboutPage extends StatelessWidget { '\n\n' 'FlutterHole is open source, which means anyone ' 'can view the code that runs your app. ' - 'You can find the repository on Github.'), + 'You can find the repository on GitHub.'), ], ), ), diff --git a/lib/features/settings/presentation/pages/add_pihole_page.dart b/lib/features/settings/presentation/pages/add_pihole_page.dart index 34a467a4..2679931e 100644 --- a/lib/features/settings/presentation/pages/add_pihole_page.dart +++ b/lib/features/settings/presentation/pages/add_pihole_page.dart @@ -165,7 +165,6 @@ class _AddPiholePageState extends State { title: Row( children: [ Text('Host details'), - SizedBox(width: 8.0), HostDetailsStatusIcon(), ], ), @@ -190,7 +189,6 @@ class _AddPiholePageState extends State { title: Row( children: [ Text('Authentication'), - SizedBox(width: 8.0), AuthenticationStatusIcon(), ], ), diff --git a/lib/features/settings/presentation/pages/single_pihole_settings_page.dart b/lib/features/settings/presentation/pages/single_pihole_settings_page.dart index 2c1b4b9e..4c855f9d 100644 --- a/lib/features/settings/presentation/pages/single_pihole_settings_page.dart +++ b/lib/features/settings/presentation/pages/single_pihole_settings_page.dart @@ -265,7 +265,6 @@ class _HostDetailsForm extends StatelessWidget { title: Row( children: [ Text('Host details'), - SizedBox(width: 8.0), HostDetailsStatusIcon(), ], ), @@ -303,7 +302,6 @@ class _AuthenticationFormState extends State { title: Row( children: [ Text('Authentication'), - SizedBox(width: 8.0), AuthenticationStatusIcon(), ], ), diff --git a/lib/features/settings/presentation/widgets/form/authentication_status_icon.dart b/lib/features/settings/presentation/widgets/form/authentication_status_icon.dart index ee12cad2..f1585725 100644 --- a/lib/features/settings/presentation/widgets/form/authentication_status_icon.dart +++ b/lib/features/settings/presentation/widgets/form/authentication_status_icon.dart @@ -5,7 +5,9 @@ import 'package:flutterhole/constants.dart'; import 'package:flutterhole/core/models/failures.dart'; import 'package:flutterhole/features/settings/blocs/pihole_settings_bloc.dart'; import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; +import 'package:flutterhole/widgets/layout/failure_indicators.dart'; import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/snackbars.dart'; class AuthenticationStatusIcon extends StatelessWidget { const AuthenticationStatusIcon({ @@ -22,23 +24,38 @@ class AuthenticationStatusIcon extends StatelessWidget { _, __, dartz.Either authenticatedStatus, - ___, + ___, ) { return authenticatedStatus.fold( - (Failure failure) => Icon( - KIcons.error, - color: KColors.error, + (Failure failure) => + FailureIconButton( + failure: failure, + title: Text('Authentication failed'), ), (bool isAuthenticated) { - return Icon( - isAuthenticated ? KIcons.success : KIcons.error, - color: isAuthenticated ? KColors.success : KColors.error, + return isAuthenticated + ? IconButton( + icon: Icon( + KIcons.success, + color: KColors.success, + ), + onPressed: () { + showInfoSnackBar( + context, 'Authentication successful'); + }, + ) + : FailureIconButton( + failure: Failure('Is your API token correct?'), + title: Text('Authentication failed'), ); }, ); }, - loading: () => LoadingIcon(), - orElse: () => Icon(KIcons.debug, color: Colors.transparent,)); + orElse: () => + IconButton( + icon: LoadingIcon(), + onPressed: null, + )); }, ); } diff --git a/lib/features/settings/presentation/widgets/form/host_details_status_icon.dart b/lib/features/settings/presentation/widgets/form/host_details_status_icon.dart index b03ff27e..1ec8c861 100644 --- a/lib/features/settings/presentation/widgets/form/host_details_status_icon.dart +++ b/lib/features/settings/presentation/widgets/form/host_details_status_icon.dart @@ -6,7 +6,28 @@ import 'package:flutterhole/core/models/failures.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_status.dart'; import 'package:flutterhole/features/settings/blocs/pihole_settings_bloc.dart'; import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; +import 'package:flutterhole/widgets/layout/failure_indicators.dart'; import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/snackbars.dart'; + +class _SuccessIconButton extends StatelessWidget { + const _SuccessIconButton({ + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return IconButton( + icon: Icon( + KIcons.success, + color: KColors.success, + ), + onPressed: () { + showInfoSnackBar(context, 'Host connection established'); + }, + ); + } +} class HostDetailsStatusIcon extends StatelessWidget { @override @@ -14,49 +35,46 @@ class HostDetailsStatusIcon extends StatelessWidget { return BlocBuilder( builder: (BuildContext context, PiholeSettingsState state) { return state.maybeWhen( - validated: ( - PiholeSettings settings, - dartz.Either hostStatusCode, - dartz.Either piholeStatus, - _, - __, - ) { - return hostStatusCode.fold( - (Failure failure) => Icon( - KIcons.error, - color: KColors.error, - ), - (int statusCode) { - return piholeStatus.fold( - (Failure failure) => Icon( - KIcons.error, - color: KColors.error, - ), - (PiStatusEnum piStatus) { - switch (piStatus) { - case PiStatusEnum.enabled: - case PiStatusEnum.disabled: - return Icon( - KIcons.success, - color: KColors.success, - ); - case PiStatusEnum.unknown: - default: - return Icon( - KIcons.error, - color: KColors.error, - ); - } - }, - ); - }, - ); - }, - loading: () => LoadingIcon(), - orElse: () => Icon( - KIcons.debug, - color: Colors.transparent, - )); + validated: ( + PiholeSettings settings, + dartz.Either hostStatusCode, + dartz.Either piholeStatus, + _, + __, + ) { + return hostStatusCode.fold( + (Failure failure) => FailureIconButton( + failure: failure, + title: Text('Fetching host status failed'), + ), + (int statusCode) { + return piholeStatus.fold( + (Failure failure) => FailureIconButton( + failure: failure, + title: Text('Fetching Pi-hole status failed'), + ), + (PiStatusEnum piStatus) { + switch (piStatus) { + case PiStatusEnum.enabled: + case PiStatusEnum.disabled: + return _SuccessIconButton(); + case PiStatusEnum.unknown: + default: + return FailureIconButton( + failure: null, + title: Text('Unknown Pi-hole status'), + ); + } + }, + ); + }, + ); + }, + orElse: () => IconButton( + icon: LoadingIcon(), + onPressed: null, + ), + ); }, ); } diff --git a/lib/widgets/layout/dialogs.dart b/lib/widgets/layout/dialogs.dart index 460b4b44..2d0b15f5 100644 --- a/lib/widgets/layout/dialogs.dart +++ b/lib/widgets/layout/dialogs.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutterhole/core/models/failures.dart'; Future showWelcomeDialog(BuildContext context) { return showDialog( @@ -62,3 +63,26 @@ Future showConfirmationDialog( return result ?? false; } + +Future showFailureDialog( + BuildContext context, + Failure failure, { + Widget title, +}) async { + showDialog( + context: context, + builder: (BuildContext dialogContext) { + return AlertDialog( + title: title, + content: SingleChildScrollView( + child: ListBody( + children: [ + Text('${failure?.message ?? 'unknown failure'}'), + Text('${failure?.error?.toString() ?? ''}'), + ], + ), + ), + ); + }, + ); +} diff --git a/lib/widgets/layout/failure_indicators.dart b/lib/widgets/layout/failure_indicators.dart index f22956fb..19f05347 100644 --- a/lib/widgets/layout/failure_indicators.dart +++ b/lib/widgets/layout/failure_indicators.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:flutterhole/constants.dart'; import 'package:flutterhole/core/models/failures.dart'; +import 'package:flutterhole/widgets/layout/dialogs.dart'; class CenteredFailureIndicator extends StatelessWidget { const CenteredFailureIndicator( @@ -20,3 +22,32 @@ class CenteredFailureIndicator extends StatelessWidget { ); } } + +class FailureIconButton extends StatelessWidget { + const FailureIconButton({ + Key key, + @required this.failure, + this.title, + }) : super(key: key); + + final Failure failure; + final Widget title; + + @override + Widget build(BuildContext context) { + return IconButton( + tooltip: 'Show failure', + icon: Icon( + KIcons.error, + color: KColors.error, + ), + onPressed: () { + showFailureDialog( + context, + failure, + title: title, + ); + }, + ); + } +} From b5e0dfe5adfdcc2cae1274171bc1f80abb2943ba Mon Sep 17 00:00:00 2001 From: thomas-sterrenburg Date: Wed, 20 May 2020 16:58:11 +0200 Subject: [PATCH 07/11] Adding queries over time chart More verbose error logging Adding drawer footer and better about dialog Adding apiTokenRequired field, fixes #79 --- lib/constants.dart | 7 +- lib/core/convert.dart | 2 + lib/core/models/exceptions.dart | 14 +- .../pages/summary/summary_page_view.dart | 20 ++- .../total_queries_over_day_line_chart.dart | 147 ++++++++++++++++++ .../widgets/total_queries_over_day_tile.dart | 45 ++++++ .../data/datasources/api_data_source.dart | 6 + .../data/datasources/api_data_source_dio.dart | 39 +++-- .../data/models/forward_destinations.dart | 2 - .../presentation/pages/query_log_page.dart | 2 + .../widgets/queries_search_list_builder.dart | 9 +- .../presentation/pages/about_page.dart | 137 ++++++---------- .../presentation/widgets/default_drawer.dart | 103 ++++++++---- .../settings_data_source_hive.dart | 4 +- .../settings/data/models/pihole_settings.dart | 12 +- .../pages/user_preferences_page.dart | 2 + .../widgets/form/api_token_form_tile.dart | 110 ++++++++----- .../widgets/form/detected_versions_tile.dart | 80 ++++++---- .../footer_message_string_preference.dart | 19 +++ .../services/package_info_service.dart | 9 ++ .../services/package_info_service_impl.dart | 19 +++ .../settings/services/preference_service.dart | 3 + .../services/preference_service_impl.dart | 8 +- lib/widgets/layout/copy_button.dart | 129 +++++++++++++++ lib/widgets/layout/dialogs.dart | 61 ++++++++ lib/widgets/layout/failure_indicators.dart | 18 ++- release_notes.txt | 10 +- .../numbers_api_data_source_dio_test.dart | 8 +- .../numbers_api_repository_impl_test.dart | 4 +- .../datasources/api_data_source_dio_test.dart | 25 ++- .../api_repository_impl_test.dart | 22 +-- .../connection_repository_dio_test.dart | 18 ++- .../settings_repository_impl_test.dart | 10 +- test/fixtures/pihole_settings_default.json | 1 + 34 files changed, 830 insertions(+), 275 deletions(-) create mode 100644 lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_line_chart.dart create mode 100644 lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_tile.dart create mode 100644 lib/features/settings/presentation/widgets/preferences/footer_message_string_preference.dart create mode 100644 lib/features/settings/services/package_info_service.dart create mode 100644 lib/features/settings/services/package_info_service_impl.dart create mode 100644 lib/widgets/layout/copy_button.dart diff --git a/lib/constants.dart b/lib/constants.dart index ab609587..e3ae786a 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -8,6 +8,10 @@ class KStrings { static const String piholeSettingsActive = 'active'; static const String playStoreUrl = 'https://play.google.com/store/apps/details?id=sterrenburg.github.flutterhole'; + static const String githubHomeUrl = + 'https://github.com/sterrenburg/flutterhole/'; + static const String githubIssuesUrl = + 'https://github.com/sterrenburg/flutterhole/issues/new/choose'; } class KIcons { @@ -37,7 +41,7 @@ class KIcons { static const IconData settings = MaterialIcons.settings; static const IconData preferences = MaterialIcons.format_paint; static const IconData about = MaterialCommunityIcons.heart; - static const IconData log = AntDesign.codesquare; + static const IconData apiLog = AntDesign.codesquare; static const IconData open = MaterialIcons.keyboard_arrow_right; static const IconData search = MaterialIcons.search; @@ -108,6 +112,7 @@ class KColors { static const Color queryStatus = Colors.brown; static const Color dnsSec = Colors.blueGrey; static const Color timestamp = Colors.amber; + static const Color link = Colors.blue; static const Color info = Colors.blue; static const Color debug = Colors.brown; diff --git a/lib/core/convert.dart b/lib/core/convert.dart index d68c1dce..a28a16c2 100644 --- a/lib/core/convert.dart +++ b/lib/core/convert.dart @@ -12,6 +12,8 @@ extension DateTimeWithRelative on DateTime { String get formattedDate => Jiffy(this).format('yyyy-MM-d'); String get formattedTime => Jiffy(this).format('h:mm:ss a'); + + String get formattedTimeShort => Jiffy(this).format('hh:mm'); } extension StringExtension on String { diff --git a/lib/core/models/exceptions.dart b/lib/core/models/exceptions.dart index 7ceb5fcd..d659c93f 100644 --- a/lib/core/models/exceptions.dart +++ b/lib/core/models/exceptions.dart @@ -3,20 +3,22 @@ import 'package:flutterhole/features/pihole_api/data/models/model.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'exceptions.freezed.dart'; - part 'exceptions.g.dart'; @freezed abstract class PiException extends MapModel with _$PiException { - const factory PiException.notFound() = NotFoundPiException; + const factory PiException.notFound(Object error) = NotFoundPiException; - const factory PiException.timeOut() = TimeOutPiException; + const factory PiException.timeOut(Object error) = TimeOutPiException; - const factory PiException.notAuthenticated() = NotAuthenticatedPiException; + const factory PiException.notAuthenticated(Object error) = + NotAuthenticatedPiException; - const factory PiException.emptyResponse() = EmptyResponsePiException; + const factory PiException.emptyResponse(Object error) = + EmptyResponsePiException; - const factory PiException.malformedResponse() = MalformedResponsePiException; + const factory PiException.malformedResponse(Object error) = + MalformedResponsePiException; factory PiException.fromJson(Map json) => _$PiExceptionFromJson(json); diff --git a/lib/features/home/presentation/pages/summary/summary_page_view.dart b/lib/features/home/presentation/pages/summary/summary_page_view.dart index 68f8b582..bfb571dd 100644 --- a/lib/features/home/presentation/pages/summary/summary_page_view.dart +++ b/lib/features/home/presentation/pages/summary/summary_page_view.dart @@ -6,10 +6,12 @@ import 'package:flutterhole/features/home/blocs/home_bloc.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/widgets/forward_destinations_tile.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/widgets/query_types_tile.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/widgets/summary_tile.dart'; +import 'package:flutterhole/features/home/presentation/pages/summary/widgets/total_queries_over_day_tile.dart'; import 'package:flutterhole/features/home/presentation/widgets/home_bloc_builder.dart'; import 'package:flutterhole/features/home/presentation/widgets/home_page_overflow_refresher.dart'; import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart'; import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; import 'package:flutterhole/features/pihole_api/data/models/summary.dart'; import 'package:flutterhole/widgets/layout/failure_indicators.dart'; import 'package:flutterhole/widgets/layout/loading_indicators.dart'; @@ -25,13 +27,15 @@ class SummaryPageView extends StatelessWidget { return HomeBlocBuilder(builder: (BuildContext context, HomeState state) { return state.maybeWhen( failure: (failure) => CenteredFailureIndicator(failure), - success: (Either summaryResult, - _, - __, - ___, - Either - forwardDestinationsResult, - Either dnsQueryTypesResult,) => + success: ( + Either summaryResult, + Either queriesOverTimeResult, + _, + __, + Either + forwardDestinationsResult, + Either dnsQueryTypesResult, + ) => summaryResult.fold( (failure) => CenteredFailureIndicator(failure), (summary) => @@ -67,6 +71,7 @@ class SummaryPageView extends StatelessWidget { color: Colors.red, integer: summary.domainsBeingBlocked, ), + TotalQueriesOverDayTile(queriesOverTimeResult), QueryTypesTile(dnsQueryTypesResult), ForwardDestinationsTile(forwardDestinationsResult), ], @@ -77,6 +82,7 @@ class SummaryPageView extends StatelessWidget { StaggeredTile.count(4, 1), StaggeredTile.count(4, 3), StaggeredTile.count(4, 3), + StaggeredTile.count(4, 3), ], ), ), diff --git a/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_line_chart.dart b/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_line_chart.dart new file mode 100644 index 00000000..5d555b65 --- /dev/null +++ b/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_line_chart.dart @@ -0,0 +1,147 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:flutterhole/constants.dart'; +import 'package:flutterhole/core/convert.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; + +const double kHorizontalLineInterval = 200.0; +const double kVerticalLineInterval = 30.0; + +class TotalQueriesOverDayLineChart extends StatelessWidget { + const TotalQueriesOverDayLineChart( + this.overTimeData, { + Key key, + }) : super(key: key); + + final OverTimeData overTimeData; + + List _spotsFromMap(Map map) { + List spots = []; + int index = 0; + + map.forEach((DateTime timestamp, int hits) { + spots.add(FlSpot(index.toDouble(), hits.toDouble())); + index++; + }); + + return spots; + } + + @override + Widget build(BuildContext context) { + return LineChart( + LineChartData( + titlesData: FlTitlesData( + leftTitles: SideTitles( + textStyle: Theme.of(context).textTheme.caption, + showTitles: true, + interval: kHorizontalLineInterval, + getTitles: (double value) { + return '${value.round()}'; + }, + ), + bottomTitles: SideTitles( + showTitles: true, + interval: kVerticalLineInterval, + textStyle: Theme.of(context).textTheme.caption, + getTitles: (double value) { + final dateTime = + overTimeData.domainsOverTime.keys.elementAt(value.round()); + + return '${dateTime.formattedTimeShort}'; + }), + ), + lineBarsData: [ + LineChartBarData( + colors: [KColors.success], + spots: _spotsFromMap(overTimeData.domainsOverTime), + barWidth: 4.0, + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: true, + colors: [ + KColors.success.withOpacity(0.5), + KColors.success.withOpacity(0.25), + ], + gradientColorStops: [0.5, 1.0], + gradientFrom: const Offset(0, 0), + gradientTo: const Offset(0, 1), + ), + ), + LineChartBarData( + colors: [KColors.blocked], + spots: _spotsFromMap(overTimeData.adsOverTime), + barWidth: 4.0, + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: true, + colors: [ + KColors.blocked.withOpacity(0.5), + KColors.blocked.withOpacity(0.25), + ], + gradientColorStops: [0.5, 1.0], + gradientFrom: const Offset(0, 0), + gradientTo: const Offset(0, 1), + ), + ), + ], + gridData: FlGridData( + show: true, + drawVerticalLine: true, + checkToShowHorizontalLine: (double value) { + return value.round() % kHorizontalLineInterval == 0; + }, + checkToShowVerticalLine: (double value) { + return value.round() % kVerticalLineInterval == 0; + }, + ), + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Theme.of(context).cardColor, + getTooltipItems: (List touchedSpots) { + if (touchedSpots == null) { + return null; + } + + return touchedSpots.map((LineBarSpot touchedSpot) { + if (touchedSpot == null) { + return null; + } + + final Color color = touchedSpot.bar.colors[0]; + + if (color == KColors.success) { + return LineTooltipItem( + 'Permitted: ${touchedSpot.y.round()}', + Theme.of(context).textTheme.bodyText1.apply( + color: color, + ), + ); + } else if (color == KColors.blocked) { + return LineTooltipItem( + 'Blocked: ${touchedSpot.y.round()}', + Theme.of(context).textTheme.bodyText1.apply( + color: color, + ), + ); + } + + return LineTooltipItem( + '${touchedSpot.y.round()}', + Theme.of(context).textTheme.bodyText1.apply( + color: color, + ), + ); + }).toList(); + }, + ), + ), + borderData: FlBorderData(show: false), + ), + ); + } +} diff --git a/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_tile.dart b/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_tile.dart new file mode 100644 index 00000000..f2fe60e4 --- /dev/null +++ b/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_tile.dart @@ -0,0 +1,45 @@ +import 'package:dartz/dartz.dart'; +import 'package:flutter/material.dart'; +import 'package:flutterhole/core/models/failures.dart'; +import 'package:flutterhole/features/home/presentation/pages/summary/widgets/total_queries_over_day_line_chart.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; +import 'package:flutterhole/widgets/layout/failure_indicators.dart'; + +class TotalQueriesOverDayTile extends StatelessWidget { + const TotalQueriesOverDayTile( + this.queriesOverTimeResult, { + Key key, + }) : super(key: key); + + final Either queriesOverTimeResult; + + @override + Widget build(BuildContext context) { + return Card( + child: SafeArea( + minimum: EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: Text( + 'Total queries over last 24 hours', + style: TextStyle(fontSize: 16), + ), + ), + Expanded( + child: queriesOverTimeResult.fold( + (failure) => CenteredFailureIndicator(failure), + (overTimeData) { + return TotalQueriesOverDayLineChart(overTimeData); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/features/pihole_api/data/datasources/api_data_source.dart b/lib/features/pihole_api/data/datasources/api_data_source.dart index 80ee62a0..fac03fe2 100644 --- a/lib/features/pihole_api/data/datasources/api_data_source.dart +++ b/lib/features/pihole_api/data/datasources/api_data_source.dart @@ -10,6 +10,12 @@ import 'package:flutterhole/features/pihole_api/data/models/top_items.dart'; import 'package:flutterhole/features/pihole_api/data/models/top_sources.dart'; import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; +/// The string that counts as the API token on Pi-holes +/// without authentication. +/// +/// https://github.com/sterrenburg/flutterhole/issues/79 +const String kNoApiTokenNeeded = 'No password set'; + abstract class ApiDataSource { Future fetchSummary(PiholeSettings settings); diff --git a/lib/features/pihole_api/data/datasources/api_data_source_dio.dart b/lib/features/pihole_api/data/datasources/api_data_source_dio.dart index 1b36b731..68e45e11 100644 --- a/lib/features/pihole_api/data/datasources/api_data_source_dio.dart +++ b/lib/features/pihole_api/data/datasources/api_data_source_dio.dart @@ -62,8 +62,10 @@ class ApiDataSourceDio implements ApiDataSource { } try { + final url = '${settings.baseUrl}:${settings.apiPort}${settings.apiPath}'; + final Response response = await _dio.get( - '${settings.baseUrl}:${settings.apiPort}${settings.apiPath}', + url, queryParameters: queryParameters, options: Options( headers: headers, @@ -75,11 +77,11 @@ class ApiDataSourceDio implements ApiDataSource { final data = response.data; if (data is String) { - if (data.isEmpty) throw EmptyResponsePiException(); + if (data.isEmpty) throw EmptyResponsePiException(data); } if (data is List && data.isEmpty) { - throw EmptyResponsePiException(); + throw EmptyResponsePiException(data); } return data; @@ -88,17 +90,17 @@ class ApiDataSourceDio implements ApiDataSource { case DioErrorType.CONNECT_TIMEOUT: case DioErrorType.SEND_TIMEOUT: case DioErrorType.RECEIVE_TIMEOUT: - throw TimeOutPiException(); + throw TimeOutPiException(e); case DioErrorType.RESPONSE: - throw NotFoundPiException(); + throw NotFoundPiException(e); case DioErrorType.CANCEL: case DioErrorType.DEFAULT: default: switch (e.response?.statusCode ?? 0) { case 404: - throw NotFoundPiException(); + throw NotFoundPiException(e); default: - throw MalformedResponsePiException(); + throw MalformedResponsePiException(e); } } } @@ -108,15 +110,22 @@ class ApiDataSourceDio implements ApiDataSource { PiholeSettings settings, { Map queryParameters = const {}, }) async { - if (settings.apiToken.isEmpty) throw NotAuthenticatedPiException(); + String apiToken = settings.apiToken; + + if (settings.apiTokenRequired) { + if (apiToken.isEmpty) + throw NotAuthenticatedPiException('API token is empty'); + } else { + apiToken = kNoApiTokenNeeded; + } - queryParameters.addAll({'auth': settings.apiToken}); + queryParameters.addAll({'auth': apiToken}); try { final result = await _get(settings, queryParameters: queryParameters); return result; - } on EmptyResponsePiException catch (_) { - throw NotAuthenticatedPiException(); + } on EmptyResponsePiException catch (e) { + throw NotAuthenticatedPiException(e); } } @@ -236,7 +245,7 @@ class ApiDataSourceDio implements ApiDataSource { PiClient client, ) async { final Map json = - await _getSecure(settings, queryParameters: { + await _getSecure(settings, queryParameters: { 'getAllQueries': '', 'client': (client.title != null && client.title.isNotEmpty) ? client.title.trim() @@ -247,8 +256,10 @@ class ApiDataSourceDio implements ApiDataSource { } @override - Future fetchQueryDataForDomain(PiholeSettings settings, - String domain,) async { + Future fetchQueryDataForDomain( + PiholeSettings settings, + String domain, + ) async { final Map json = await _getSecure(settings, queryParameters: { 'getAllQueries': '', diff --git a/lib/features/pihole_api/data/models/forward_destinations.dart b/lib/features/pihole_api/data/models/forward_destinations.dart index 7beece79..71a55a2e 100644 --- a/lib/features/pihole_api/data/models/forward_destinations.dart +++ b/lib/features/pihole_api/data/models/forward_destinations.dart @@ -56,8 +56,6 @@ abstract class ForwardDestinationsResult extends MapModel _ForwardDestinationsResult; factory ForwardDestinationsResult.fromJson(Map json) { - print('json: $json'); - return _$ForwardDestinationsResultFromJson(json); } } diff --git a/lib/features/pihole_api/presentation/pages/query_log_page.dart b/lib/features/pihole_api/presentation/pages/query_log_page.dart index f24b222c..d339476e 100644 --- a/lib/features/pihole_api/presentation/pages/query_log_page.dart +++ b/lib/features/pihole_api/presentation/pages/query_log_page.dart @@ -11,6 +11,7 @@ import 'package:flutterhole/features/pihole_api/presentation/widgets/single_quer import 'package:flutterhole/features/routing/presentation/widgets/default_drawer.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; import 'package:flutterhole/features/settings/services/preference_service.dart'; +import 'package:flutterhole/widgets/layout/failure_indicators.dart'; import 'package:flutterhole/widgets/layout/loading_indicators.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -97,6 +98,7 @@ class QueryLogPage extends StatelessWidget { }, ); }, + failure: (failure) => CenteredFailureIndicator(failure), initial: () => Container(), orElse: () { return CenteredLoadingIndicator(); diff --git a/lib/features/pihole_api/presentation/widgets/queries_search_list_builder.dart b/lib/features/pihole_api/presentation/widgets/queries_search_list_builder.dart index 96accc68..2b4f1b6e 100644 --- a/lib/features/pihole_api/presentation/widgets/queries_search_list_builder.dart +++ b/lib/features/pihole_api/presentation/widgets/queries_search_list_builder.dart @@ -35,11 +35,10 @@ class QueriesSearchListBuilder extends StatelessWidget { List searchedQueries; if (notifier.isSearching && notifier.searchQuery.isNotEmpty) { - searchedQueries = initialData.where((element) { - final string = element.searchableString; - print('checking for "${notifier.searchQuery}" in "$string'); - return string.contains(notifier.searchQuery); - }).toList(); + searchedQueries = initialData + .where((QueryData queryData) => + queryData.searchableString.contains(notifier.searchQuery)) + .toList(); } final List toUse = searchedQueries ?? initialData; diff --git a/lib/features/routing/presentation/pages/about_page.dart b/lib/features/routing/presentation/pages/about_page.dart index 2db49d3c..10b12239 100644 --- a/lib/features/routing/presentation/pages/about_page.dart +++ b/lib/features/routing/presentation/pages/about_page.dart @@ -4,8 +4,9 @@ import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/browser/services/browser_service.dart'; import 'package:flutterhole/features/routing/presentation/pages/privacy_page.dart'; import 'package:flutterhole/features/routing/presentation/widgets/default_drawer.dart'; -import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; +import 'package:flutterhole/features/settings/services/package_info_service.dart'; import 'package:flutterhole/widgets/layout/animated_opener.dart'; +import 'package:flutterhole/widgets/layout/dialogs.dart'; import 'package:flutterhole/widgets/layout/list_title.dart'; import 'package:package_info/package_info.dart'; import 'package:share/share.dart'; @@ -13,94 +14,58 @@ import 'package:share/share.dart'; class AboutPage extends StatelessWidget { @override Widget build(BuildContext context) { - return PiholeThemeBuilder( - child: FutureBuilder( - future: PackageInfo.fromPlatform(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - PackageInfo packageInfo; - if (snapshot.hasData) { - packageInfo = snapshot.data; - } + final packageInfo = getIt().packageInfo; - return Scaffold( - drawer: DefaultDrawer(), - body: CustomScrollView( - slivers: [ - SliverAppBar( - title: Text('About'), - flexibleSpace: FlexibleSpaceBar(), - ), - SliverList( - delegate: SliverChildListDelegate([ - Column( + return Scaffold( + drawer: DefaultDrawer(), + body: CustomScrollView( + slivers: [ + SliverAppBar( + title: Text('About'), + flexibleSpace: FlexibleSpaceBar(), + ), + SliverList( + delegate: SliverChildListDelegate([ + Column( + children: [ + ListTile( + contentPadding: EdgeInsets.all(16), + title: Row( children: [ - ListTile( - contentPadding: EdgeInsets.all(16), - title: Row( - children: [ - Text( - '${packageInfo?.appName}', - style: Theme.of(context) - .textTheme - .headline4 - .copyWith( - color: Theme.of(context).accentColor), - ), - ], - ), - subtitle: Text( - 'Made by Sterrenburg', - style: Theme.of(context).textTheme.caption, - ), - ), - ListTile( - leading: Icon( - KIcons.version, - color: KColors.success, - ), - trailing: FlatButton( - onPressed: () { - showAboutDialog( - context: context, - applicationName: '${packageInfo?.appName}', - applicationVersion: '${packageInfo?.version}', - applicationLegalese: 'Made by Sterrenburg', - children: [ - SizedBox(height: 24), - RichText( - text: TextSpan( - style: - Theme.of(context).textTheme.bodyText2, - children: [ - TextSpan( - text: - 'FlutterHole is a free third party Android application ' - 'for interacting with your Pi-Hole® server. ' - '\n\n' - 'FlutterHole is open source, which means anyone ' - 'can view the code that runs your app. ' - 'You can find the repository on GitHub.'), - ], - ), - ), - ], - ); - }, - child: Text('Details'), - ), - title: Text('Version'), - subtitle: Text( - '${packageInfo?.version} (build #${packageInfo?.buildNumber})'), + Text( + '${packageInfo?.appName}', + style: Theme.of(context) + .textTheme + .headline4 + .copyWith(color: Theme.of(context).accentColor), ), ], ), - Divider(), - _AboutTiles(packageInfo: packageInfo), - ])), + subtitle: Text( + 'Made by Sterrenburg', + style: Theme.of(context).textTheme.caption, + ), + ), + ListTile( + leading: Icon( + KIcons.version, + color: KColors.success, + ), + trailing: FlatButton( + onPressed: () { + showAppDetailsDialog(context, packageInfo); + }, + child: Text('Details'), + ), + title: Text('Version'), + subtitle: Text('${packageInfo.versionAndBuildString}'), + ), ], ), - ); - }, + Divider(), + _AboutTiles(packageInfo: packageInfo), + ])), + ], ), ); } @@ -132,8 +97,8 @@ class _AboutTiles extends StatelessWidget { _AboutTile( KIcons.bugReport, text: 'Submit a bug report', - onTap: () => getIt().launchUrl( - 'https://github.com/sterrenburg/flutterhole/issues/new'), + onTap: () => + getIt().launchUrl(KStrings.githubIssuesUrl), ), Divider(), ListTitle('Support the developer'), @@ -145,8 +110,8 @@ class _AboutTiles extends StatelessWidget { _AboutTile( KIcons.github, text: 'Star on GitHub', - onTap: () => getIt() - .launchUrl('https://github.com/sterrenburg/flutterhole/'), + onTap: () => + getIt().launchUrl(KStrings.githubHomeUrl), ), Divider(), ListTitle('Other'), diff --git a/lib/features/routing/presentation/widgets/default_drawer.dart b/lib/features/routing/presentation/widgets/default_drawer.dart index 7d4edd39..682366be 100644 --- a/lib/features/routing/presentation/widgets/default_drawer.dart +++ b/lib/features/routing/presentation/widgets/default_drawer.dart @@ -7,6 +7,10 @@ import 'package:flutterhole/features/routing/presentation/widgets/default_drawer import 'package:flutterhole/features/routing/presentation/widgets/drawer_menu.dart'; import 'package:flutterhole/features/routing/presentation/widgets/drawer_tile.dart'; import 'package:flutterhole/features/routing/services/router_service.dart'; +import 'package:flutterhole/features/settings/services/package_info_service.dart'; +import 'package:flutterhole/features/settings/services/preference_service.dart'; +import 'package:flutterhole/widgets/layout/dialogs.dart'; +import 'package:package_info/package_info.dart'; import 'package:provider/provider.dart'; class DefaultDrawer extends StatelessWidget { @@ -15,38 +19,46 @@ class DefaultDrawer extends StatelessWidget { return ChangeNotifierProvider( create: (BuildContext context) => DrawerNotifier(), child: Drawer( - child: ListView( - padding: EdgeInsets.zero, + child: Stack( children: [ - DefaultDrawerHeader(), - DrawerMenu(), - DrawerTile( - routeName: RouterService.home, - title: Text('Dashboard'), - icon: Icon(KIcons.dashboard), + ListView( + padding: EdgeInsets.zero, + children: [ + DefaultDrawerHeader(), + DrawerMenu(), + DrawerTile( + routeName: RouterService.home, + title: Text('Dashboard'), + icon: Icon(KIcons.dashboard), + ), + DrawerTile( + routeName: RouterService.queryLog, + title: Text('Query log'), + icon: Icon(KIcons.queryLog), + ), + DrawerTile( + routeName: RouterService.settings, + title: Text('Settings'), + icon: Icon(KIcons.settings), + ), + Divider(), + DrawerTile( + routeName: RouterService.about, + title: Text('About'), + icon: Icon(KIcons.about), + ), + ListTile( + title: Text('API Log'), + leading: Icon(KIcons.apiLog), + onTap: () { + getIt().showInspector(); + }, + ), + ], ), - DrawerTile( - routeName: RouterService.queryLog, - title: Text('Query log'), - icon: Icon(KIcons.queryLog), - ), - DrawerTile( - routeName: RouterService.settings, - title: Text('Settings'), - icon: Icon(KIcons.settings), - ), - Divider(), - DrawerTile( - routeName: RouterService.about, - title: Text('About'), - icon: Icon(KIcons.about), - ), - ListTile( - title: Text('API Log'), - leading: Icon(KIcons.log), - onTap: () { - getIt().showInspector(); - }, + Align( + alignment: Alignment.bottomCenter, + child: _Footer(), ), ], ), @@ -54,3 +66,34 @@ class DefaultDrawer extends StatelessWidget { ); } } + +class _Footer extends StatelessWidget { + const _Footer({ + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final String footerMessage = getIt().footerMessage; + final PackageInfo packageInfo = getIt().packageInfo; + + return ListTile( + title: Text( + '${packageInfo.appName} ${packageInfo.versionAndBuildString}', + style: Theme.of(context).textTheme.caption, + ), + subtitle: footerMessage.isEmpty + ? null + : Text( + '$footerMessage', + style: Theme + .of(context) + .textTheme + .caption, + ), + onLongPress: () { + showAppDetailsDialog(context, packageInfo); + }, + ); + } +} diff --git a/lib/features/settings/data/datasources/settings_data_source_hive.dart b/lib/features/settings/data/datasources/settings_data_source_hive.dart index 72f339c6..69b599bc 100644 --- a/lib/features/settings/data/datasources/settings_data_source_hive.dart +++ b/lib/features/settings/data/datasources/settings_data_source_hive.dart @@ -72,7 +72,7 @@ class SettingsDataSourceHive implements SettingsDataSource { final int index = all.indexOf(original); if (index < 0) { - throw PiException.notFound(); + throw PiException.notFound(index); } await box.putAt(index, update.toJson()); @@ -116,7 +116,7 @@ class SettingsDataSourceHive implements SettingsDataSource { final int index = all.indexOf(piholeSettings); if (index < 0) { - throw PiException.notFound(); + throw PiException.notFound(index); } await _setActiveIndex(index); diff --git a/lib/features/settings/data/models/pihole_settings.dart b/lib/features/settings/data/models/pihole_settings.dart index 03b1df9a..251f7122 100644 --- a/lib/features/settings/data/models/pihole_settings.dart +++ b/lib/features/settings/data/models/pihole_settings.dart @@ -8,11 +8,15 @@ part 'pihole_settings.freezed.dart'; part 'pihole_settings.g.dart'; @freezed -abstract class PiholeSettings extends MapModel with _$PiholeSettings { +abstract class PiholeSettings extends MapModel implements _$PiholeSettings { + const PiholeSettings._(); + const factory PiholeSettings({ // annotation - @Default('Pihole') String title, - @Default('') String description, + @Default('Pihole') + String title, + @Default('') + String description, @Default(Color.fromRGBO(33, 150, 243, 1)) // i.e. `Colors.blue` @JsonKey(fromJson: colorFromHex, toJson: colorToHex) Color primaryColor, @@ -26,10 +30,10 @@ abstract class PiholeSettings extends MapModel with _$PiholeSettings { // authentication @Default('') String apiToken, + @Default(true) bool apiTokenRequired, @Default(false) bool allowSelfSignedCertificates, @Default('') String basicAuthenticationUsername, @Default('') String basicAuthenticationPassword, - // proxy @Default('') String proxyUrl, @Default(8080) int proxyPort, diff --git a/lib/features/settings/presentation/pages/user_preferences_page.dart b/lib/features/settings/presentation/pages/user_preferences_page.dart index 1b1bd40e..cab335d8 100644 --- a/lib/features/settings/presentation/pages/user_preferences_page.dart +++ b/lib/features/settings/presentation/pages/user_preferences_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; +import 'package:flutterhole/features/settings/presentation/widgets/preferences/footer_message_string_preference.dart'; import 'package:flutterhole/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart'; import 'package:flutterhole/features/settings/presentation/widgets/preferences/use_numbers_api_switch_preference.dart'; import 'package:flutterhole/widgets/layout/dialogs.dart'; @@ -23,6 +24,7 @@ class _UserPreferencesPageState extends State { children: [ ListTitle('Customization'), ThemeRadioPreferences(), + FooterMessageStringPreference(), ListTitle('Data'), UseNumbersApiSwitchPreference(), ListTitle('Misc'), diff --git a/lib/features/settings/presentation/widgets/form/api_token_form_tile.dart b/lib/features/settings/presentation/widgets/form/api_token_form_tile.dart index 56d9dac2..c0748577 100644 --- a/lib/features/settings/presentation/widgets/form/api_token_form_tile.dart +++ b/lib/features/settings/presentation/widgets/form/api_token_form_tile.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutterhole/constants.dart'; import 'package:flutterhole/dependency_injection.dart'; +import 'package:flutterhole/features/settings/blocs/pihole_settings_bloc.dart'; import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; import 'package:flutterhole/features/settings/services/qr_scan_service.dart'; @@ -42,45 +44,81 @@ class _ApiTokenFormTileState extends State { @override Widget build(BuildContext context) { - return ListTile( - title: FormBuilderTextField( - attribute: 'apiToken', - controller: _apiTokenController, - decoration: widget.decoration.copyWith( - labelText: 'API token', - helperText: - 'The API token can be found on the admin home at "Settings > API / Web interface". \nRequired for authenticated tasks, such as enabling & disabling.', - helperMaxLines: 5, - suffixIcon: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.end, - children: [ - IconButton( - tooltip: 'Toggle visibility', - icon: Icon( - _apiTokenVisible - ? KIcons.visibility_on - : KIcons.visibility_off, + return BlocBuilder( + condition: (previous, next) { + if (previous is PiholeSettingsStateValidated) { + return false; + } + + return true; + }, builder: (BuildContext context, PiholeSettingsState state) { + final bool apiTokenFieldIsVisible = state.maybeMap( + validated: (state) => state.settings.apiTokenRequired == true, + orElse: () => true, + ); + + return Column( + children: [ + Opacity( + opacity: apiTokenFieldIsVisible ? 1.0 : 0.3, + child: IgnorePointer( + ignoring: !apiTokenFieldIsVisible, + child: ListTile( + title: FormBuilderTextField( + attribute: 'apiToken', + controller: _apiTokenController, + decoration: widget.decoration.copyWith( + labelText: 'API token', + helperText: + 'The API token can be found on the admin home at "Settings > API / Web interface". Required for authenticated tasks, such as enabling & disabling.', + helperMaxLines: 5, + suffixIcon: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + IconButton( + tooltip: 'Toggle visibility', + icon: Icon( + _apiTokenVisible + ? KIcons.visibility_on + : KIcons.visibility_off, + ), + onPressed: () { + setState(() { + _apiTokenVisible = !_apiTokenVisible; + }); + }, + ), + IconButton( + tooltip: 'Scan QR code', + icon: Icon(KIcons.qrCode), + onPressed: _scanQrCode, + ), + ], + ), + ), + autocorrect: false, + maxLines: 1, + obscureText: !_apiTokenVisible, + valueTransformer: (value) => (value ?? '').toString().trim(), ), - onPressed: () { - setState(() { - _apiTokenVisible = !_apiTokenVisible; - }); - }, ), - IconButton( - tooltip: 'Scan QR code', - icon: Icon(KIcons.qrCode), - onPressed: _scanQrCode, + ), + ), + ListTile( + title: FormBuilderCheckbox( + attribute: 'apiTokenRequired', + decoration: widget.decoration.copyWith( + helperText: + 'If your Pi-hole does not use an API token because it has no password, disable this option.', + helperMaxLines: 3, ), - ], + label: Text('Require API token for authenticated requests'), + ), ), - ), - autocorrect: false, - maxLines: 1, - obscureText: !_apiTokenVisible, - valueTransformer: (value) => (value ?? '').toString().trim(), - ), - ); + Divider(), + ], + ); + }); } } diff --git a/lib/features/settings/presentation/widgets/form/detected_versions_tile.dart b/lib/features/settings/presentation/widgets/form/detected_versions_tile.dart index 78c04ce0..6374440a 100644 --- a/lib/features/settings/presentation/widgets/form/detected_versions_tile.dart +++ b/lib/features/settings/presentation/widgets/form/detected_versions_tile.dart @@ -20,42 +20,56 @@ class DetectedVersionsTile extends StatelessWidget { return true; }, builder: (BuildContext context, PiholeSettingsState state) { - return state.maybeMap( - validated: (state) { - return state.versions.fold( - (failure) => CenteredFailureIndicator(failure), - (versions) => Column( - children: [ - ListTile( - title: Text('Detected versions'), - leading: Icon( - KIcons.version, - color: Theme.of(context).accentColor, - ), - ), - _ListTile( - title: 'Pi-hole Version', - currentVersion: versions.currentCoreVersion, - latestVersion: versions.latestCoreVersion, - branch: versions.coreBranch, - ), - _ListTile( - title: 'Web Interface Version', - currentVersion: versions.currentWebVersion, - latestVersion: versions.latestWebVersion, - branch: versions.webBranch, + return Column( + children: [ + ListTile( + title: Text('Detected versions'), + leading: Icon( + KIcons.version, + color: Theme.of(context).accentColor, + ), + ), + state.maybeMap( + validated: (state) { + return state.versions.fold( + (failure) => CenteredFailureIndicator(failure), + (versions) => Column( + children: [ + _ListTile( + title: 'Pi-hole Version', + currentVersion: versions.currentCoreVersion, + latestVersion: versions.latestCoreVersion, + branch: versions.coreBranch, + ), + _ListTile( + title: 'Web Interface Version', + currentVersion: versions.currentWebVersion, + latestVersion: versions.latestWebVersion, + branch: versions.webBranch, + ), + _ListTile( + title: 'FTL Version', + currentVersion: versions.currentFtlVersion, + latestVersion: versions.latestFtlVersion, + branch: versions.ftlBranch, + ), + ], ), - _ListTile( - title: 'FTL Version', - currentVersion: versions.currentFtlVersion, - latestVersion: versions.latestFtlVersion, - branch: versions.ftlBranch, + ); + }, + // Filling in some empty space in an inelegant fashion + loading: (_) => Column( + children: List.generate( + 3, + (index) => ListTile( + title: Text(''), + subtitle: Text(''), ), - ], + ), ), - ); - }, - orElse: () => Container(), + orElse: () => Container(), + ), + ], ); }, ); diff --git a/lib/features/settings/presentation/widgets/preferences/footer_message_string_preference.dart b/lib/features/settings/presentation/widgets/preferences/footer_message_string_preference.dart new file mode 100644 index 00000000..f9e7ca0f --- /dev/null +++ b/lib/features/settings/presentation/widgets/preferences/footer_message_string_preference.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:flutterhole/features/settings/services/preference_service.dart'; +import 'package:preferences/preferences.dart'; + +class FooterMessageStringPreference extends StatelessWidget { + const FooterMessageStringPreference({ + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return TextFieldPreference( + 'Footer message', + KPrefs.footerMessage, + hintText: 'Shown at the bottom fo the drawer', + defaultVal: 'Made with ♡ by Sterrenburg', + ); + } +} diff --git a/lib/features/settings/services/package_info_service.dart b/lib/features/settings/services/package_info_service.dart new file mode 100644 index 00000000..9d0cc393 --- /dev/null +++ b/lib/features/settings/services/package_info_service.dart @@ -0,0 +1,9 @@ +import 'package:package_info/package_info.dart'; + +extension PackageInfoPrintable on PackageInfo { + String get versionAndBuildString => '$version (build #$buildNumber)'; +} + +abstract class PackageInfoService { + PackageInfo get packageInfo; +} diff --git a/lib/features/settings/services/package_info_service_impl.dart b/lib/features/settings/services/package_info_service_impl.dart new file mode 100644 index 00000000..5c59d61b --- /dev/null +++ b/lib/features/settings/services/package_info_service_impl.dart @@ -0,0 +1,19 @@ +import 'package:flutterhole/features/settings/services/package_info_service.dart'; +import 'package:injectable/injectable.dart'; +import 'package:package_info/package_info.dart'; + +@prod +@singleton +@RegisterAs(PackageInfoService) +class PackageInfoServiceImpl implements PackageInfoService { + PackageInfoServiceImpl._(this._info); + + @factoryMethod + static Future create() async => + PackageInfoServiceImpl._(await PackageInfo.fromPlatform()); + + final PackageInfo _info; + + @override + PackageInfo get packageInfo => _info; +} diff --git a/lib/features/settings/services/preference_service.dart b/lib/features/settings/services/preference_service.dart index 99778d54..58c9bd12 100644 --- a/lib/features/settings/services/preference_service.dart +++ b/lib/features/settings/services/preference_service.dart @@ -8,6 +8,7 @@ class KPrefs { static const String useNumbersApi = 'useNumbersApi'; static const String themeMode = 'themeMode'; static const String queryLogMaxResults = 'queryLogMaxResults'; + static const String footerMessage = 'footerMessage'; } const ThemeModeEnumMap = { @@ -34,4 +35,6 @@ abstract class PreferenceService { int get queryLogMaxResults; Future setQueryLogMaxResults(int maxResults); + + String get footerMessage; } diff --git a/lib/features/settings/services/preference_service_impl.dart b/lib/features/settings/services/preference_service_impl.dart index 5211afdc..3b95eb1c 100644 --- a/lib/features/settings/services/preference_service_impl.dart +++ b/lib/features/settings/services/preference_service_impl.dart @@ -16,7 +16,7 @@ class PrServiceImpl implements PreferenceService { } dynamic _get(String key) { - if (T == null) throw PiException.notFound(); + if (T == null) throw PiException.notFound(TypeError()); switch (T) { case String: @@ -33,7 +33,7 @@ class PrServiceImpl implements PreferenceService { case List: return PrefService.getStringList(key); default: - throw TypeError(); + throw PiException.emptyResponse(TypeError()); } } @@ -88,4 +88,8 @@ class PrServiceImpl implements PreferenceService { @override Future setQueryLogMaxResults(int maxResults) async => _set(KPrefs.queryLogMaxResults, maxResults); + + @override + String get footerMessage => + _get(KPrefs.footerMessage) ?? 'Made with ♡ by Sterrenburg'; } diff --git a/lib/widgets/layout/copy_button.dart b/lib/widgets/layout/copy_button.dart new file mode 100644 index 00000000..04f25680 --- /dev/null +++ b/lib/widgets/layout/copy_button.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutterhole/constants.dart'; +import 'package:flutterhole/widgets/layout/snackbars.dart'; + +const String _tooltip = 'Copy to clipboard'; + +/// An [IconButton] with copy-to-clipboard support. +/// +/// If [onCopy] is `null`, shows a [SnackBar]. +class CopyIconButton extends StatelessWidget { + const CopyIconButton( + this.data, { + Key key, + this.onCopy, + }) : assert(data != null), + super(key: key); + + final String data; + final VoidCallback onCopy; + + @override + Widget build(BuildContext context) { + return IconButton( + tooltip: _tooltip, + icon: Icon(KIcons.copy), + onPressed: () { + Clipboard.setData(ClipboardData(text: data)).then((_) { + if (onCopy != null) + onCopy(); + else + showInfoSnackBar( + context, + 'Copied to clipboard: $data', + ); + }); + }); + } +} + +/// A [FlatButton] with copy-to-clipboard support. +/// +/// If [onCopy] is `null`, shows a [SnackBar]. +class CopyFlatButton extends StatelessWidget { + const CopyFlatButton( + this.data, { + Key key, + this.onCopy, + }) : assert(data != null), + super(key: key); + + final String data; + final VoidCallback onCopy; + + @override + Widget build(BuildContext context) { + return FlatButton.icon( + label: Text(_tooltip), + icon: Icon(KIcons.copy), + onPressed: () { + Clipboard.setData(ClipboardData(text: data)).then((_) { + if (onCopy != null) + onCopy(); + else + showInfoSnackBar( + context, + 'Copied to clipboard: $data', + ); + }); + }); + } +} + +class AnimatedCopyTile extends StatefulWidget { + const AnimatedCopyTile( + this.data, { + Key key, + }) : super(key: key); + + final String data; + + @override + _AnimatedCopyTileState createState() => _AnimatedCopyTileState(); +} + +class _AnimatedCopyTileState extends State { + bool copied = false; + + @override + Widget build(BuildContext context) { + return Tooltip( + message: _tooltip, + child: ListTile( + title: Text(widget.data), + onTap: () async { + setState(() { + copied = true; + }); + + Clipboard.setData(ClipboardData(text: widget.data)); + await Future.delayed(Duration(seconds: 2)); + setState(() { + copied = false; + }); + }, + trailing: Stack( + alignment: Alignment.center, + children: [ + AnimatedOpacity( + opacity: copied ? 1 : 0, + duration: kThemeChangeDuration, + child: Icon( + KIcons.success, + color: KColors.success, + ), + ), + AnimatedOpacity( + opacity: copied ? 0 : 1, + duration: kThemeChangeDuration, + child: Icon( + KIcons.copy, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/layout/dialogs.dart b/lib/widgets/layout/dialogs.dart index 2d0b15f5..27086049 100644 --- a/lib/widgets/layout/dialogs.dart +++ b/lib/widgets/layout/dialogs.dart @@ -1,5 +1,13 @@ +import 'package:alice/alice.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutterhole/constants.dart'; import 'package:flutterhole/core/models/failures.dart'; +import 'package:flutterhole/dependency_injection.dart'; +import 'package:flutterhole/features/browser/services/browser_service.dart'; +import 'package:flutterhole/widgets/layout/copy_button.dart'; +import 'package:flutterhole/widgets/layout/snackbars.dart'; +import 'package:package_info/package_info.dart'; Future showWelcomeDialog(BuildContext context) { return showDialog( @@ -82,7 +90,60 @@ Future showFailureDialog( ], ), ), + actions: [ + FlatButton.icon( + label: Text('API Log'), + icon: Icon(KIcons.apiLog), + onPressed: () { + getIt().showInspector(); + }, + ), + CopyFlatButton( + '${failure.toJson()}', + onCopy: () { + Navigator.of(dialogContext).pop(); + showInfoSnackBar(context, 'Copied failure to clipboard'); + }, + ), + ], ); }, ); } + +void showAppDetailsDialog(BuildContext context, PackageInfo packageInfo) { + return showAboutDialog( + context: context, + applicationName: '${packageInfo.appName}', + applicationVersion: '${packageInfo.version}', + applicationLegalese: 'Made by Sterrenburg', + children: [ + SizedBox(height: 24), + RichText( + text: TextSpan( + children: [ + TextSpan( + text: 'FlutterHole is a free third party Android application ' + 'for interacting with your Pi-Hole® server. ' + '\n\n' + 'FlutterHole is open source, which means anyone ' + 'can view the code that runs your app. ' + 'You can find the repository on '), + TextSpan( + style: Theme + .of(context) + .textTheme + .bodyText2 + .apply(color: KColors.link), + text: 'GitHub', + recognizer: TapGestureRecognizer() + ..onTap = () => + getIt().launchUrl(KStrings.githubHomeUrl), + ), + TextSpan(text: '.'), + ], + ), + ), + ], + ); +} diff --git a/lib/widgets/layout/failure_indicators.dart b/lib/widgets/layout/failure_indicators.dart index 19f05347..ecff409b 100644 --- a/lib/widgets/layout/failure_indicators.dart +++ b/lib/widgets/layout/failure_indicators.dart @@ -13,12 +13,18 @@ class CenteredFailureIndicator extends StatelessWidget { @override Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('${failure.message ?? 'unknown failure'}'), - Text('${failure.error?.toString()}'), - ], + return Center( + child: ListTile( + title: Text('${failure.message ?? 'Unknown failure'}'), + subtitle: Text('${failure.error?.runtimeType ?? 'Unknown error'}'), + trailing: Icon( + KIcons.warning, + color: KColors.warning, + ), + onTap: () { + showFailureDialog(context, failure); + }, + ), ); } } diff --git a/release_notes.txt b/release_notes.txt index 25a7026d..e840473d 100644 --- a/release_notes.txt +++ b/release_notes.txt @@ -1,9 +1,9 @@ -* Feature: query logs are searchable and refreshable. +* Fix: Pi-holes without a password and API token can now toggle off the API token requirement. -* Feature: the query log is back. I intend to make some kind of live query viewer separately, this page does _not_ automatically listen for new data. +* Feature: the queries over time chart is back. -* Feature: single queries can be expanded to show more data again. +* Feature: errors are now more verbose. -* Feature: Basic Authentication is back - thank you Joerg. +* Feature: query logs are searchable and refreshable. -* Fix: Tapping on the pie chart colors in Forward Destinations highlights the wrong category on the left - thank you Jeremy. \ No newline at end of file +* Feature: the query log is back. I intend to make some kind of live query viewer separately, this page does _not_ automatically listen for new data. \ No newline at end of file diff --git a/test/features/numbers_api/data/datasources/numbers_api_data_source_dio_test.dart b/test/features/numbers_api/data/datasources/numbers_api_data_source_dio_test.dart index 5bf7f397..213c36b2 100644 --- a/test/features/numbers_api/data/datasources/numbers_api_data_source_dio_test.dart +++ b/test/features/numbers_api/data/datasources/numbers_api_data_source_dio_test.dart @@ -42,6 +42,8 @@ void main() async { dataSource = NumbersApiDataSourceDio(dio); }); + final tError = PiException.emptyResponse(TypeError()); + group('fetchTrivia', () { // test( // 'should return String on successful fetchTrivia', @@ -60,8 +62,7 @@ void main() async { 'should throw on failed fetchTrivia', () async { // arrange - when(httpClientAdapterMock.fetch(any, any, any)) - .thenThrow(PiException.notFound()); + when(httpClientAdapterMock.fetch(any, any, any)).thenThrow(tError); // act // assert expect(() => dataSource.fetchTrivia(42), throwsA(isA())); @@ -89,8 +90,7 @@ void main() async { 'should throw on failed fetchManyTrivia', () async { // arrange - when(httpClientAdapterMock.fetch(any, any, any)) - .thenThrow(PiException.notFound()); + when(httpClientAdapterMock.fetch(any, any, any)).thenThrow(tError); // act // assert expect(() => dataSource.fetchManyTrivia([1, 2, 3]), diff --git a/test/features/numbers_api/data/repositories/numbers_api_repository_impl_test.dart b/test/features/numbers_api/data/repositories/numbers_api_repository_impl_test.dart index d4b4810b..f16d21b3 100644 --- a/test/features/numbers_api/data/repositories/numbers_api_repository_impl_test.dart +++ b/test/features/numbers_api/data/repositories/numbers_api_repository_impl_test.dart @@ -21,6 +21,8 @@ void main() async { numbersApiRepository = NumbersApiRepositoryImpl(mockNumbersApiDataSource); }); + final tError = PiException.emptyResponse(TypeError()); + group('fetchTrivia', () { test( 'should return String on successful fetchTrivia', @@ -41,7 +43,6 @@ void main() async { 'should return $Failure on failed fetchTrivia', () async { // arrange - final tError = PiException.emptyResponse(); when(mockNumbersApiDataSource.fetchTrivia(2)).thenThrow(tError); // act final Either result = @@ -76,7 +77,6 @@ void main() async { 'should return $Failure on failed fetchManyTrivia', () async { // arrange - final tError = PiException.emptyResponse(); when(mockNumbersApiDataSource.fetchManyTrivia([1, 2, 3])) .thenThrow(tError); // act diff --git a/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart b/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart index b461e4e1..5bd32c67 100644 --- a/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart +++ b/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart @@ -165,14 +165,14 @@ void main() async { ); test( - 'should throw $NotAuthenticatedPiException on enablePihole without apiToken', + 'should throw $NotAuthenticatedPiException on enablePihole with empty apiToken', () async { // arrange - stubStringResponse('[]', 200); +// stubStringResponse('[]', 200); piholeSettings = piholeSettings.copyWith(apiToken: ''); // assert expect(() => apiDataSourceDio.enablePihole(piholeSettings), - throwsA(isA())); + throwsA(NotAuthenticatedPiException('API token is empty'))); }, ); @@ -187,6 +187,23 @@ void main() async { throwsA(isA())); }, ); + + test( + 'should return $ToggleStatus.enabled on successful enablePihole with apiTokenRequired=false', + () async { + // arrange + final json = stubFixtureResponse('status_enabled.json', 200); + piholeSettings = piholeSettings.copyWith( + apiToken: '', + apiTokenRequired: false, + ); + // act + final ToggleStatus result = + await apiDataSourceDio.enablePihole(piholeSettings); + // assert + expect(result, equals(ToggleStatus.fromJson(json))); + }, + ); }); test( @@ -294,7 +311,7 @@ void main() async { final json = stubFixtureResponse('get_versions.json', 200); // act final PiVersions result = - await apiDataSourceDio.fetchVersions(piholeSettings); + await apiDataSourceDio.fetchVersions(piholeSettings); // assert expect(result, equals(PiVersions.fromJson(json))); }, diff --git a/test/features/pihole_api/data/repositories/api_repository_impl_test.dart b/test/features/pihole_api/data/repositories/api_repository_impl_test.dart index ba122a15..5d1ea8d3 100644 --- a/test/features/pihole_api/data/repositories/api_repository_impl_test.dart +++ b/test/features/pihole_api/data/repositories/api_repository_impl_test.dart @@ -33,6 +33,8 @@ void main() async { apiRepository = ApiRepositoryImpl(mockApiDataSource); }); + final tError = PiException.emptyResponse(TypeError()); + group('fetchSummary', () { test( 'should return $SummaryModel on successful fetchSummary', @@ -53,7 +55,7 @@ void main() async { 'should return $Failure on failed fetchSummary', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.fetchSummary(piholeSettings)).thenThrow(tError); // act final Either result = @@ -84,7 +86,7 @@ void main() async { 'should return $Failure on failed fetchQueriesOverTime', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.fetchQueriesOverTime(piholeSettings)) .thenThrow(tError); // act @@ -117,7 +119,7 @@ void main() async { 'should return $Failure on failed fetchTopSources', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.fetchTopSources(piholeSettings)) .thenThrow(tError); // act @@ -152,7 +154,7 @@ void main() async { 'should return $Failure on failed fetchTopItems', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.fetchTopItems(piholeSettings)).thenThrow(tError); // act final Either result = @@ -184,7 +186,7 @@ void main() async { 'should return $Failure on failed fetchForwardDestinations', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.fetchForwardDestinations(piholeSettings)) .thenThrow(tError); // act @@ -217,7 +219,7 @@ void main() async { 'should return $Failure on failed fetchQueryTypes', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.fetchQueryTypes(piholeSettings)) .thenThrow(tError); // act @@ -261,9 +263,9 @@ void main() async { test( 'should return $Failure on failed fetchQueriesForClient', - () async { + () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.fetchQueryDataForClient(piholeSettings, client)) .thenThrow(tError); // act @@ -304,7 +306,7 @@ void main() async { 'should return $Failure on failed fetchQueriesForDomain', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.fetchQueryDataForDomain(piholeSettings, domain)) .thenThrow(tError); // act @@ -375,7 +377,7 @@ void main() async { 'should return $Failure on failed fetchManyQueryData', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.fetchManyQueryData(piholeSettings)) .thenThrow(tError); // act diff --git a/test/features/pihole_api/data/repositories/connection_repository_dio_test.dart b/test/features/pihole_api/data/repositories/connection_repository_dio_test.dart index f74fa897..272ed520 100644 --- a/test/features/pihole_api/data/repositories/connection_repository_dio_test.dart +++ b/test/features/pihole_api/data/repositories/connection_repository_dio_test.dart @@ -47,6 +47,8 @@ void main() async { connectionRepositoryDio = ConnectionRepositoryDio(dio, mockApiDataSource); }); + final tError = PiException.emptyResponse(TypeError()); + group('fetchHostStatusCode', () { test( 'should return 200 when host responds with 200 HTTP response', @@ -108,7 +110,7 @@ void main() async { 'should return $Failure on exception', () async { // arrange - final tError = PiException.timeOut(); + when(mockApiDataSource.pingPihole(settings)).thenThrow(tError); // act final result = @@ -123,7 +125,7 @@ void main() async { group('fetchVersions', () { test( 'should return $PiStatusEnum on successful fetchVersions', - () async { + () async { // arrange final versions = PiVersions(coreBranch: 'master', ftlBranch: 'testing'); when(mockApiDataSource.fetchVersions(settings)) @@ -139,7 +141,7 @@ void main() async { 'should return $Failure on exception', () async { // arrange - final tError = PiException.timeOut(); + when(mockApiDataSource.fetchVersions(settings)).thenThrow(tError); // act final result = await connectionRepositoryDio.fetchVersions(settings); @@ -168,7 +170,7 @@ void main() async { 'should return false on failed fetchQueryTypes', () async { // arrange - final tError = PiException.timeOut(); + when(mockApiDataSource.fetchQueryTypes(settings)).thenThrow(tError); // act final result = @@ -199,7 +201,7 @@ void main() async { 'should return $Failure on failed pingPihole', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.pingPihole(settings)).thenThrow(tError); // act final Either result = @@ -230,7 +232,7 @@ void main() async { 'should return $Failure on failed enablePihole', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.enablePihole(settings)).thenThrow(tError); // act final Either result = @@ -261,7 +263,7 @@ void main() async { 'should return $Failure on failed disablePihole', () async { // arrange - final tError = PiException.emptyResponse(); + when(mockApiDataSource.disablePihole(settings)).thenThrow(tError); // act final Either result = @@ -294,7 +296,7 @@ void main() async { () async { // arrange final duration = Duration(seconds: 10); - final tError = PiException.emptyResponse(); + when(mockApiDataSource.sleepPihole(settings, duration)) .thenThrow(tError); // act diff --git a/test/features/settings/data/repositories/settings_repository_impl_test.dart b/test/features/settings/data/repositories/settings_repository_impl_test.dart index fb97429b..a49e0d77 100644 --- a/test/features/settings/data/repositories/settings_repository_impl_test.dart +++ b/test/features/settings/data/repositories/settings_repository_impl_test.dart @@ -24,6 +24,8 @@ void main() async { settingsRepository = SettingsRepositoryImpl(mockSettingsDataSource); }); + final tError = PiException.emptyResponse(TypeError()); + group('activatePiholeSettings', () { test( 'should return true on successful activatePiholeSettings', @@ -43,7 +45,6 @@ void main() async { 'should return $Failure on failed activatePiholeSettings', () async { // arrange - final tError = PiException.emptyResponse(); when(mockSettingsDataSource.activatePiholeSettings(any)) .thenThrow(tError); // act @@ -75,7 +76,6 @@ void main() async { 'should return $Failure on failed createPiholeSettings', () async { // arrange - final tError = PiException.emptyResponse(); when(mockSettingsDataSource.createPiholeSettings()).thenThrow(tError); // act final Either result = @@ -106,7 +106,6 @@ void main() async { 'should return $Failure on failed addPiholeSettings', () async { // arrange - final tError = PiException.emptyResponse(); when(mockSettingsDataSource.addPiholeSettings(piholeSettings)).thenThrow(tError); // act final Either result = @@ -137,7 +136,6 @@ void main() async { 'should return $Failure on failed deletePiholeSettings', () async { // arrange - final tError = PiException.emptyResponse(); when(mockSettingsDataSource.deletePiholeSettings(any)) .thenThrow(tError); // act @@ -169,7 +167,6 @@ void main() async { 'should return $Failure on failed deleteAllSettings', () async { // arrange - final tError = PiException.emptyResponse(); when(mockSettingsDataSource.deleteAllSettings()).thenThrow(tError); // act final Either result = @@ -237,7 +234,6 @@ void main() async { 'should return $Failure on failed fetchAllPiholeSettings', () async { // arrange - final tError = PiException.emptyResponse(); when(mockSettingsDataSource.fetchAllPiholeSettings()).thenThrow(tError); // act final Either> result = @@ -268,7 +264,6 @@ void main() async { 'should return $Failure on failed updatePiholeSettings', () async { // arrange - final tError = PiException.emptyResponse(); when(mockSettingsDataSource.updatePiholeSettings(any, any)) .thenThrow(tError); // act @@ -303,7 +298,6 @@ void main() async { 'should return $Failure on failed fetchActivePiholeSettings', () async { // arrange - final tError = PiException.timeOut(); when(mockSettingsDataSource.fetchActivePiholeSettings()) .thenThrow(tError); // act diff --git a/test/fixtures/pihole_settings_default.json b/test/fixtures/pihole_settings_default.json index d59f3cb7..27010d37 100644 --- a/test/fixtures/pihole_settings_default.json +++ b/test/fixtures/pihole_settings_default.json @@ -3,6 +3,7 @@ "description": "", "baseUrl": "http://pi.hole", "apiPath": "/admin/api.php", + "apiTokenRequired": true, "apiPort": 80, "apiToken": "", "allowSelfSignedCertificates": false, From e95a01391d24fbce87730bc2fd5935e446a7065a Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 23 May 2020 11:35:12 +0200 Subject: [PATCH 08/11] Feature/integration tests (#90) * Adding PageScaffold and DoubleBackToClose * Adding clients over time chart * Clients/domains pageview shows error * Adding integration test * Updating dependencies --- .gitignore | 3 +- README.md | 22 +- {test => lib/core/debug}/fixture_reader.dart | 8 +- lib/dependency_injection.dart | 12 +- lib/dev_dependency_injection.dart | 597 +++++ lib/features/home/blocs/home_bloc.dart | 15 +- .../pages/clients/clients_page_view.dart | 18 +- .../pages/domains/domains_page_view.dart | 14 +- .../home/presentation/pages/home_page.dart | 126 +- .../pages/summary/summary_page_view.dart | 14 +- .../widgets/clients_over_day_line_chart.dart | 121 + .../widgets/clients_over_day_tile.dart | 33 + .../widgets/forward_destinations_tile.dart | 54 +- .../summary/widgets/line_chart_scaffold.dart | 118 + .../summary/widgets/query_types_tile.dart | 2 +- .../pages/summary/widgets/summary_tile.dart | 7 +- .../total_queries_over_day_line_chart.dart | 118 +- .../widgets/total_queries_over_day_tile.dart | 34 +- .../bottom_navy_bar_item_extension.dart | 21 + .../widgets/welcome_message_checker.dart | 2 +- .../widgets/numbers_api_description_tile.dart | 2 +- .../pihole_api/blocs/pi_connection_bloc.dart | 1 - .../data/datasources/api_data_source.dart | 3 + .../data/datasources/api_data_source_dio.dart | 17 +- .../data/models/over_time_data_clients.dart | 40 + .../pihole_api/data/models/pi_client.dart | 4 +- .../pihole_api/data/models/query_data.dart | 1 + .../pihole_api/data/models/top_sources.dart | 5 +- .../data/repositories/api_repository.dart | 4 + .../repositories/api_repository_impl.dart | 15 +- .../connection_repository_dio.dart | 1 - .../presentation/pages/query_log_page.dart | 80 +- .../pages/single_client_page.dart | 6 +- .../pages/single_domain_page.dart | 4 +- .../widgets/pi_connection_status_icon.dart | 4 +- .../widgets/pi_connection_toggle_button.dart | 4 +- .../widgets/queries_search_app_bar.dart | 2 +- .../widgets/single_query_data_tile.dart | 4 +- .../presentation/pages/about_page.dart | 20 +- .../presentation/pages/page_scaffold.dart | 38 + .../presentation/pages/privacy_page.dart | 2 +- .../presentation/widgets/default_drawer.dart | 4 +- .../widgets/double_back_to_close_app.dart | 62 + .../services/router_service_sailor.dart | 1 - .../datasources/settings_data_source.dart | 3 +- .../settings_data_source_hive.dart | 3 +- .../settings_repository_impl.dart | 1 - .../presentation/blocs/settings_bloc.dart | 1 - .../presentation/pages/add_pihole_page.dart | 2 +- .../pages/all_pihole_settings_page.dart | 17 +- .../presentation/pages/settings_page.dart | 54 +- .../pages/single_pihole_settings_page.dart | 2 +- .../pages/user_preferences_page.dart | 49 +- .../form/authentication_status_icon.dart | 6 +- .../widgets/form/detected_versions_tile.dart | 2 +- .../form/host_details_status_icon.dart | 6 +- .../preferences/theme_radio_preferences.dart | 2 +- .../services/preference_service_impl.dart | 6 +- lib/main.dart | 64 +- lib/test_dependency_injection.dart | 45 + .../{ => animations}/animate_on_build.dart | 0 .../{ => animations}/animated_opener.dart | 0 .../{ => animations}/timer_builder.dart | 0 lib/widgets/layout/copy_button.dart | 2 +- .../{ => indicators}/failure_indicators.dart | 2 +- .../{ => indicators}/loading_indicators.dart | 0 .../percentage_bar_indicator.dart} | 7 +- .../layout/{ => lists}/frequency_tile.dart | 4 +- .../layout/{ => lists}/list_title.dart | 0 .../layout/{ => lists}/list_with_header.dart | 0 .../layout/{ => lists}/open_url_tile.dart | 2 +- lib/widgets/layout/menu_list_tile.dart | 22 - .../layout/notifications/copy_button.dart | 129 ++ .../layout/{ => notifications}/dialogs.dart | 4 +- .../layout/{ => notifications}/snackbars.dart | 0 .../layout/{ => notifications}/toasts.dart | 2 + pubspec.lock | 107 +- pubspec.yaml | 22 +- release_notes.txt | 2 +- test/blocs/home_bloc_test.dart | 23 +- .../numbers_api_data_source_dio_test.dart | 2 +- .../blocs/single_client_bloc_test.dart | 2 +- .../datasources/api_data_source_dio_test.dart | 8 +- .../api_repository_impl_test.dart | 2 +- test/fixtures/over_time_data_clients.json | 2000 +++++++++++++++++ test/fixtures/single_pi_client.json | 2 +- test/model_test.dart | 8 +- test/test_dependency_injection.dart | 4 +- test_driver/app.dart | 11 + test_driver/app_test.dart | 78 + 90 files changed, 3860 insertions(+), 511 deletions(-) rename {test => lib/core/debug}/fixture_reader.dart (73%) create mode 100644 lib/dev_dependency_injection.dart create mode 100644 lib/features/home/presentation/pages/summary/widgets/clients_over_day_line_chart.dart create mode 100644 lib/features/home/presentation/pages/summary/widgets/clients_over_day_tile.dart create mode 100644 lib/features/home/presentation/pages/summary/widgets/line_chart_scaffold.dart create mode 100644 lib/features/home/presentation/widgets/bottom_navy_bar_item_extension.dart create mode 100644 lib/features/pihole_api/data/models/over_time_data_clients.dart create mode 100644 lib/features/routing/presentation/pages/page_scaffold.dart create mode 100644 lib/features/routing/presentation/widgets/double_back_to_close_app.dart create mode 100644 lib/test_dependency_injection.dart rename lib/widgets/layout/{ => animations}/animate_on_build.dart (100%) rename lib/widgets/layout/{ => animations}/animated_opener.dart (100%) rename lib/widgets/layout/{ => animations}/timer_builder.dart (100%) rename lib/widgets/layout/{ => indicators}/failure_indicators.dart (94%) rename lib/widgets/layout/{ => indicators}/loading_indicators.dart (100%) rename lib/widgets/layout/{percentage_box.dart => indicators/percentage_bar_indicator.dart} (87%) rename lib/widgets/layout/{ => lists}/frequency_tile.dart (94%) rename lib/widgets/layout/{ => lists}/list_title.dart (100%) rename lib/widgets/layout/{ => lists}/list_with_header.dart (100%) rename lib/widgets/layout/{ => lists}/open_url_tile.dart (91%) delete mode 100644 lib/widgets/layout/menu_list_tile.dart create mode 100644 lib/widgets/layout/notifications/copy_button.dart rename lib/widgets/layout/{ => notifications}/dialogs.dart (96%) rename lib/widgets/layout/{ => notifications}/snackbars.dart (100%) rename lib/widgets/layout/{ => notifications}/toasts.dart (91%) create mode 100644 test/fixtures/over_time_data_clients.json create mode 100644 test_driver/app.dart create mode 100644 test_driver/app_test.dart diff --git a/.gitignore b/.gitignore index 7fb892ea..f11de03c 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,5 @@ app.*.map.json android/app/keystore.jks android/app/upload_certificate.pem /ios/Runner/Assets.xcassets/AppIcon.appiconset/ -android/key.properties \ No newline at end of file +android/key.properties +/ozzie/ diff --git a/README.md b/README.md index 7d188ee3..8775c997 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,10 @@ FlutterHole is a free third party Android application for interacting with your - **Quick enable/disable:** Toggle your Pi-hole from your home screen with a single tap. - **Multiple configurations:** Easily switch between every Pi-hole that you have access to. - **Summary overview:** View top clients and the top used domains. +- **Query log:** Inspect & search your Pi-hole queries. ## Roadmap/missing features ## - **Manage your blacklist & whitelist:** Blocking issues. See [issue #76](https://github.com/sterrenburg/flutterhole/issues/76) for progress. -- **Query log:** Coming soon for V5! - **Proxy support:** Coming soon for V5! ## Development ## @@ -67,12 +67,30 @@ flutter pub get flutter pub run flutter_launcher_icons:main ``` -#### Generate code +#### Generate code #### + +To generate `freezed` classes `injectable` injections etc.: + ```shell script flutter pub run build_runner build --delete-conflicting-outputs ``` + +Or, build continuously: + +```shell script +flutter pub run build_runner watch --delete-conflicting-outputs +``` + You can now build and run the app on either an emulator or a physical device using `flutter run`. +### Testing ### + +To run the default integration test: + +```shell script +flutter drive --target=test_driver/app.dart +``` + ## API ## This application interacts with the [Pi-hole PHP API](https://discourse.pi-hole.net/t/pi-hole-api/1863). diff --git a/test/fixture_reader.dart b/lib/core/debug/fixture_reader.dart similarity index 73% rename from test/fixture_reader.dart rename to lib/core/debug/fixture_reader.dart index 7649e6ff..026ed4e3 100644 --- a/test/fixture_reader.dart +++ b/lib/core/debug/fixture_reader.dart @@ -1,11 +1,11 @@ import 'dart:convert'; import 'dart:io'; -const fixturePath = 'test/fixtures/'; +const kFixturePath = 'test/fixtures/'; /// Hack fix for `flutter test` outside IDE /// https://stackoverflow.com/questions/45780255/flutter-how-to-load-file-for-testing -String _loadFileAsString(String name) { +String _loadFileAsString(String name, String fixturePath) { final String filePath = '$fixturePath$name'; String fileString; @@ -21,8 +21,8 @@ String _loadFileAsString(String name) { /// Returns the json representation of the fixture file [name]. /// /// Typically returns a `Map` or `List`. -dynamic jsonFixture(String name) { - final string = _loadFileAsString(name); +dynamic jsonFixture(String name, {fixturePath = kFixturePath}) { + final string = _loadFileAsString(name, fixturePath); try { return jsonDecode(string); diff --git a/lib/dependency_injection.dart b/lib/dependency_injection.dart index 7d44b219..86c9d2c3 100644 --- a/lib/dependency_injection.dart +++ b/lib/dependency_injection.dart @@ -15,7 +15,7 @@ Future configure(String environment) async { } @registerModule -abstract class RegisterModule { +abstract class RegisterProdModule { @prod @injectable Dio get dio => Dio(); @@ -32,12 +32,14 @@ abstract class RegisterModule { @singleton Sailor get sailor => Sailor( options: SailorOptions( - isLoggingEnabled: true, + isLoggingEnabled: false, )); + @prod @singleton Alice get alice => Alice( - showNotification: false, - darkTheme: true, - ); + showNotification: false, + darkTheme: true, + ); } + diff --git a/lib/dev_dependency_injection.dart b/lib/dev_dependency_injection.dart new file mode 100644 index 00000000..5e37fc23 --- /dev/null +++ b/lib/dev_dependency_injection.dart @@ -0,0 +1,597 @@ +import 'package:alice/alice.dart'; +import 'package:dartz/dartz.dart'; +import 'package:dio/dio.dart'; +import 'package:flutterhole/core/models/failures.dart'; +import 'package:flutterhole/features/numbers_api/data/repositories/numbers_api_repository.dart'; +import 'package:flutterhole/features/pihole_api/data/datasources/api_data_source.dart'; +import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart'; +import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; +import 'package:flutterhole/features/pihole_api/data/models/many_query_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; +import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; +import 'package:flutterhole/features/pihole_api/data/models/pi_status.dart'; +import 'package:flutterhole/features/pihole_api/data/models/pi_versions.dart'; +import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/summary.dart'; +import 'package:flutterhole/features/pihole_api/data/models/toggle_status.dart'; +import 'package:flutterhole/features/pihole_api/data/models/top_items.dart'; +import 'package:flutterhole/features/pihole_api/data/models/top_sources.dart'; +import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; +import 'package:flutterhole/features/settings/services/preference_service.dart'; +import 'package:flutterhole/features/settings/services/preference_service_impl.dart'; +import 'package:hive/hive.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:injectable/injectable.dart'; +import 'package:preferences/preferences.dart'; +import 'package:sailor/sailor.dart'; + +@registerModule +abstract class RegisterDevModule { + @dev + @injectable + Dio get dio => Dio(BaseOptions(baseUrl: 'http://dev.com')); + + @dev + @preResolve + @singleton + Future get hive async { + await Hive.deleteFromDisk(); + await Hive.initFlutter('dev'); + return Hive; + } + + @dev + @singleton + Sailor get sailor => Sailor( + options: SailorOptions( + isLoggingEnabled: true, + )); + + @dev + @singleton + Alice get alice => Alice( + showNotification: false, + darkTheme: true, + ); +} + +@dev +@injectable +@RegisterAs(ApiDataSource) +class ApiDataSourceDev implements ApiDataSource { + @override + Future disablePihole(PiholeSettings settings) async { + return ToggleStatus(PiStatusEnum.disabled); + } + + @override + Future enablePihole(PiholeSettings settings) async { + return ToggleStatus(PiStatusEnum.enabled); + } + + @override + Future fetchForwardDestinations( + PiholeSettings settings) async { + return ForwardDestinationsResult(forwardDestinations: { + ForwardDestination(title: 'blocklist'): 25.5, + ForwardDestination(title: 'cache'): 14.5, + ForwardDestination(title: 'example.com', ip: '1.2.3.4'): 35, + ForwardDestination(ip: '5.6.7.8'): 5, + }); + } + + @override + Future fetchManyQueryData(PiholeSettings settings, + [int maxResults]) async { + return ManyQueryData(data: [ + QueryData( + timestamp: DateTime.fromMillisecondsSinceEpoch(1590058147934), + queryType: QueryType.A, + domain: 'query.org', + clientName: 'my-client', + queryStatus: QueryStatus.Forwarded, + dnsSecStatus: DnsSecStatus.Insecure, + replyDuration: Duration(milliseconds: 123), + ), + QueryData( + timestamp: DateTime.fromMillisecondsSinceEpoch(15958147934), + queryType: QueryType.PTR, + domain: 'pointer.org', + clientName: 'pointer-client', + queryStatus: QueryStatus.Cached, + dnsSecStatus: DnsSecStatus.Bogus, + replyDuration: Duration(milliseconds: 321), + ), + ]); + } + + @override + Future fetchQueriesOverTime(PiholeSettings settings) async { + return _overTimeDataFromJson(); + } + + @override + Future fetchClientsOverTime( + PiholeSettings settings) async { + // TODO implement + throw UnimplementedError(); + } + + @override + Future fetchQueryDataForClient( + PiholeSettings settings, PiClient client) async { + return ManyQueryData(data: [ + QueryData( + timestamp: DateTime.fromMillisecondsSinceEpoch(1590058147934), + queryType: QueryType.A, + domain: 'query.org', + clientName: '${client.nameOrIp}', + queryStatus: QueryStatus.Forwarded, + dnsSecStatus: DnsSecStatus.Insecure, + replyDuration: Duration(milliseconds: 123), + ), + QueryData( + timestamp: DateTime.fromMillisecondsSinceEpoch(15958147934), + queryType: QueryType.PTR, + domain: 'pointer.org', + clientName: '${client.nameOrIp}', + queryStatus: QueryStatus.Cached, + dnsSecStatus: DnsSecStatus.Bogus, + replyDuration: Duration(milliseconds: 321), + ), + ]); + } + + @override + Future fetchQueryDataForDomain( + PiholeSettings settings, String domain) async { + return ManyQueryData(data: [ + QueryData( + timestamp: DateTime.fromMillisecondsSinceEpoch(1590058147934), + queryType: QueryType.A, + domain: '$domain', + clientName: 'my-client', + queryStatus: QueryStatus.Forwarded, + dnsSecStatus: DnsSecStatus.Insecure, + replyDuration: Duration(milliseconds: 123), + ), + QueryData( + timestamp: DateTime.fromMillisecondsSinceEpoch(15958147934), + queryType: QueryType.PTR, + domain: '$domain', + clientName: 'pointer-client', + queryStatus: QueryStatus.Cached, + dnsSecStatus: DnsSecStatus.Bogus, + replyDuration: Duration(milliseconds: 321), + ), + ]); + } + + @override + Future fetchQueryTypes(PiholeSettings settings) async { + return DnsQueryTypeResult( + dnsQueryTypes: [ + DnsQueryType(title: 'A (IPv4)', fraction: 60.40), + DnsQueryType(title: 'AAAA (IPv6)', fraction: 5), + DnsQueryType(title: 'ANY', fraction: 18.09), + DnsQueryType(title: 'SRV', fraction: 11.91), + DnsQueryType(title: 'SOA', fraction: 2), + DnsQueryType(title: 'PTR', fraction: 2.60), + DnsQueryType(title: 'TXT', fraction: 0), + ], + ); + } + + @override + Future fetchSummary(PiholeSettings settings) async { + return SummaryModel( + domainsBeingBlocked: 128977, + dnsQueriesToday: 80085, + adsBlockedToday: 44875, + adsPercentageToday: 56.03, + uniqueDomains: 10897, + queriesForwarded: 13653, + queriesCached: 1072, + clientsEverSeen: 13, + uniqueClients: 11, + dnsQueriesAllTypes: 14773, + replyNoData: 59, + replyNxDomain: 528, + replyCName: 7603, + replyIP: 4818, + privacyLevel: 0, + status: PiStatusEnum.enabled, + ); + } + + @override + Future fetchTopItems(PiholeSettings settings) async { + return TopItems( + topQueries: { + "0.debian.pool.ntp.org": 744, + "1.debian.pool.ntp.org": 744, + "2.debian.pool.ntp.org": 744, + "3.debian.pool.ntp.org": 744, + "time.apple.com": 100, + "indigo.tvaddons.co": 100, + "www.google.com": 54, + "8.8.8.8.in-addr.arpa": 50, + "4.4.8.8.in-addr.arpa": 50, + "ssl.gstatic.com": 27, + }, + topAds: { + "activity.windows.com": 28, + "graph.facebook.com": 9, + "googleads.g.doubleclick.net": 8, + "www.google-analytics.com": 7, + "www.googletagmanager.com": 7, + "www.googletagservices.com": 6, + }, + ); + } + + @override + Future fetchTopSources(PiholeSettings settings) async { + return TopSourcesResult( + topSources: { + PiClient(name: 'localhost', ip: '127.0.0.1'): 3204, + PiClient(name: 'openelec', ip: '10.0.1.2'): 324, + PiClient(ip: '10.0.1.3'): 216, + PiClient(name: 'laptop', ip: '10.0.1.4'): 96, + }, + ); + } + + @override + Future fetchVersions(PiholeSettings settings) async { + return PiVersions( + hasCoreUpdate: false, + currentCoreVersion: 'v5.0', + latestCoreVersion: 'v5.0', + coreBranch: 'master', + hasWebUpdate: false, + currentWebVersion: 'v5.0', + latestWebVersion: 'v5.0', + webBranch: 'beta', + hasFtlUpdate: true, + currentFtlVersion: 'v5.0', + latestFtlVersion: 'v5.3', + ftlBranch: 'master', + ); + } + + @override + Future pingPihole(PiholeSettings settings) async { + return ToggleStatus(PiStatusEnum.enabled); + } + + @override + Future sleepPihole( + PiholeSettings settings, Duration duration) async { + return ToggleStatus(PiStatusEnum.disabled); + } +} + +@dev +@preResolve +@singleton +@RegisterAs(PreferenceService) +class PreferenceServiceDev extends PreferenceServiceImpl { + @factoryMethod + static Future create() async { + await PrefService.init(prefix: 'dev_'); + return PreferenceServiceDev(); + } +} + +@dev +@singleton +@RegisterAs(NumbersApiRepository) +class NumbersApiRepositoryDev implements NumbersApiRepository { + @override + Future>> fetchManyTrivia( + List integers) async { + return Right(integers.asMap().map((_, integer) => MapEntry( + integer, + '80,085 is an odd composite number composed of four prime numbers multiplied together.'))); + } + + @override + Future> fetchTrivia(int integer) async { + return Right('Some singular info for $integer'); + } +} + +OverTimeData _overTimeDataFromJson() { + final Map json = { + "domains_over_time": { + "1588197900": 58, + "1588198500": 86, + "1588199100": 59, + "1588199700": 17, + "1588200300": 12, + "1588200900": 8, + "1588201500": 2, + "1588202100": 2, + "1588202700": 0, + "1588203300": 5, + "1588203900": 0, + "1588204500": 26, + "1588205100": 14, + "1588205700": 0, + "1588206300": 0, + "1588206900": 39, + "1588207500": 0, + "1588208100": 0, + "1588208700": 18, + "1588209300": 0, + "1588209900": 1, + "1588210500": 4, + "1588211100": 0, + "1588211700": 0, + "1588212300": 14, + "1588212900": 0, + "1588213500": 0, + "1588214100": 4, + "1588214700": 0, + "1588215300": 2, + "1588215900": 14, + "1588216500": 0, + "1588217100": 0, + "1588217700": 10, + "1588218300": 3, + "1588218900": 8, + "1588219500": 39, + "1588220100": 5, + "1588220700": 1, + "1588221300": 25, + "1588221900": 0, + "1588222500": 4, + "1588223100": 20, + "1588223700": 1, + "1588224300": 2, + "1588224900": 44, + "1588225500": 12, + "1588226100": 11, + "1588226700": 57, + "1588227300": 402, + "1588227900": 250, + "1588228500": 40, + "1588229100": 745, + "1588229700": 1151, + "1588230300": 210, + "1588230900": 229, + "1588231500": 243, + "1588232100": 232, + "1588232700": 80, + "1588233300": 193, + "1588233900": 257, + "1588234500": 164, + "1588235100": 608, + "1588235700": 121, + "1588236300": 196, + "1588236900": 149, + "1588237500": 373, + "1588238100": 173, + "1588238700": 130, + "1588239300": 157, + "1588239900": 173, + "1588240500": 400, + "1588241100": 103, + "1588241700": 406, + "1588242300": 148, + "1588242900": 130, + "1588243500": 104, + "1588244100": 111, + "1588244700": 162, + "1588245300": 270, + "1588245900": 216, + "1588246500": 154, + "1588247100": 101, + "1588247700": 158, + "1588248300": 101, + "1588248900": 176, + "1588249500": 115, + "1588250100": 74, + "1588250700": 189, + "1588251300": 304, + "1588251900": 63, + "1588252500": 84, + "1588253100": 111, + "1588253700": 117, + "1588254300": 80, + "1588254900": 183, + "1588255500": 139, + "1588256100": 92, + "1588256700": 133, + "1588257300": 199, + "1588257900": 139, + "1588258500": 161, + "1588259100": 104, + "1588259700": 343, + "1588260300": 218, + "1588260900": 238, + "1588261500": 149, + "1588262100": 161, + "1588262700": 133, + "1588263300": 122, + "1588263900": 63, + "1588264500": 36, + "1588265100": 23, + "1588265700": 2, + "1588266300": 14, + "1588266900": 0, + "1588267500": 0, + "1588268100": 27, + "1588268700": 167, + "1588269300": 17, + "1588269900": 60, + "1588270500": 39, + "1588271100": 9, + "1588271700": 32, + "1588272300": 25, + "1588272900": 32, + "1588273500": 33, + "1588274100": 44, + "1588274700": 146, + "1588275300": 74, + "1588275900": 18, + "1588276500": 57, + "1588277100": 457, + "1588277700": 174, + "1588278300": 139, + "1588278900": 124, + "1588279500": 142, + "1588280100": 193, + "1588280700": 99, + "1588281300": 55, + "1588281900": 80 + }, + "ads_over_time": { + "1588197900": 0, + "1588198500": 0, + "1588199100": 0, + "1588199700": 0, + "1588200300": 0, + "1588200900": 0, + "1588201500": 0, + "1588202100": 0, + "1588202700": 0, + "1588203300": 0, + "1588203900": 0, + "1588204500": 0, + "1588205100": 0, + "1588205700": 0, + "1588206300": 0, + "1588206900": 0, + "1588207500": 0, + "1588208100": 0, + "1588208700": 0, + "1588209300": 0, + "1588209900": 0, + "1588210500": 0, + "1588211100": 0, + "1588211700": 0, + "1588212300": 0, + "1588212900": 0, + "1588213500": 0, + "1588214100": 0, + "1588214700": 0, + "1588215300": 0, + "1588215900": 0, + "1588216500": 0, + "1588217100": 0, + "1588217700": 0, + "1588218300": 0, + "1588218900": 0, + "1588219500": 0, + "1588220100": 0, + "1588220700": 0, + "1588221300": 0, + "1588221900": 0, + "1588222500": 0, + "1588223100": 0, + "1588223700": 0, + "1588224300": 0, + "1588224900": 0, + "1588225500": 0, + "1588226100": 0, + "1588226700": 0, + "1588227300": 0, + "1588227900": 0, + "1588228500": 0, + "1588229100": 0, + "1588229700": 0, + "1588230300": 0, + "1588230900": 0, + "1588231500": 0, + "1588232100": 0, + "1588232700": 0, + "1588233300": 0, + "1588233900": 0, + "1588234500": 0, + "1588235100": 0, + "1588235700": 0, + "1588236300": 0, + "1588236900": 0, + "1588237500": 0, + "1588238100": 0, + "1588238700": 0, + "1588239300": 0, + "1588239900": 0, + "1588240500": 0, + "1588241100": 0, + "1588241700": 0, + "1588242300": 0, + "1588242900": 0, + "1588243500": 0, + "1588244100": 0, + "1588244700": 0, + "1588245300": 0, + "1588245900": 0, + "1588246500": 0, + "1588247100": 0, + "1588247700": 0, + "1588248300": 0, + "1588248900": 0, + "1588249500": 0, + "1588250100": 1, + "1588250700": 0, + "1588251300": 0, + "1588251900": 0, + "1588252500": 0, + "1588253100": 0, + "1588253700": 0, + "1588254300": 0, + "1588254900": 0, + "1588255500": 0, + "1588256100": 0, + "1588256700": 0, + "1588257300": 0, + "1588257900": 0, + "1588258500": 0, + "1588259100": 0, + "1588259700": 0, + "1588260300": 0, + "1588260900": 0, + "1588261500": 0, + "1588262100": 0, + "1588262700": 0, + "1588263300": 0, + "1588263900": 0, + "1588264500": 0, + "1588265100": 0, + "1588265700": 0, + "1588266300": 0, + "1588266900": 0, + "1588267500": 0, + "1588268100": 0, + "1588268700": 0, + "1588269300": 0, + "1588269900": 0, + "1588270500": 0, + "1588271100": 0, + "1588271700": 0, + "1588272300": 0, + "1588272900": 0, + "1588273500": 0, + "1588274100": 0, + "1588274700": 0, + "1588275300": 0, + "1588275900": 0, + "1588276500": 0, + "1588277100": 0, + "1588277700": 0, + "1588278300": 0, + "1588278900": 0, + "1588279500": 0, + "1588280100": 0, + "1588280700": 0, + "1588281300": 0, + "1588281900": 0 + } + }; + + return OverTimeData.fromJson(json); +} diff --git a/lib/features/home/blocs/home_bloc.dart b/lib/features/home/blocs/home_bloc.dart index 6d807759..733dd987 100644 --- a/lib/features/home/blocs/home_bloc.dart +++ b/lib/features/home/blocs/home_bloc.dart @@ -6,6 +6,7 @@ import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart'; import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; import 'package:flutterhole/features/pihole_api/data/models/summary.dart'; import 'package:flutterhole/features/pihole_api/data/models/top_items.dart'; import 'package:flutterhole/features/pihole_api/data/models/top_sources.dart'; @@ -27,6 +28,7 @@ abstract class HomeState with _$HomeState { const factory HomeState.success( Either summary, Either overTimeData, + Either overTimeDataClients, Either topSources, Either topItems, Either forwardDestinations, @@ -66,6 +68,7 @@ class HomeBloc extends Bloc { final List futures = [ _apiRepository.fetchSummary(settings), _apiRepository.fetchQueriesOverTime(settings), + _apiRepository.fetchClientsOverTime(settings), _apiRepository.fetchTopSources(settings), _apiRepository.fetchTopItems(settings), _apiRepository.fetchForwardDestinations(settings), @@ -76,17 +79,19 @@ class HomeBloc extends Bloc { final Either summary = results.elementAt(0); final Either overTimeData = results.elementAt(1); - final Either topSources = + final Either overTimeDataClients = results.elementAt(2); - final Either topItems = + final Either topSources = results.elementAt(3); + final Either topItems = results.elementAt(4); final Either forwardDestinations = - results.elementAt(4); - final Either dnsQueryTypes = results.elementAt(5); + final Either dnsQueryTypes = + results.elementAt(6); if (summary.isLeft() && overTimeData.isLeft() && + overTimeDataClients.isLeft() && topSources.isLeft() && topItems.isLeft() && forwardDestinations.isLeft() && @@ -94,6 +99,7 @@ class HomeBloc extends Bloc { List failures = []; summary.leftMap((l) => failures.add(l)); overTimeData.leftMap((l) => failures.add(l)); + overTimeDataClients.leftMap((l) => failures.add(l)); topSources.leftMap((l) => failures.add(l)); topItems.leftMap((l) => failures.add(l)); forwardDestinations.leftMap((l) => failures.add(l)); @@ -107,6 +113,7 @@ class HomeBloc extends Bloc { yield HomeStateSuccess( summary, overTimeData, + overTimeDataClients, topSources, topItems, forwardDestinations, diff --git a/lib/features/home/presentation/pages/clients/clients_page_view.dart b/lib/features/home/presentation/pages/clients/clients_page_view.dart index 8ac0e942..989b036e 100644 --- a/lib/features/home/presentation/pages/clients/clients_page_view.dart +++ b/lib/features/home/presentation/pages/clients/clients_page_view.dart @@ -9,10 +9,10 @@ import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; import 'package:flutterhole/features/pihole_api/data/models/summary.dart'; import 'package:flutterhole/features/pihole_api/data/models/top_sources.dart'; import 'package:flutterhole/features/pihole_api/presentation/pages/single_client_page.dart'; -import 'package:flutterhole/widgets/layout/animated_opener.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; -import 'package:flutterhole/widgets/layout/frequency_tile.dart'; -import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/animations/animated_opener.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/lists/frequency_tile.dart'; class ClientsPageView extends StatelessWidget { const ClientsPageView({ @@ -26,10 +26,11 @@ class ClientsPageView extends StatelessWidget { success: ( Either summaryResult, _, - Either topSourcesResult, __, + Either topSourcesResult, ___, ____, + _____, ) { return topSourcesResult.fold( (failure) => CenteredFailureIndicator(failure), @@ -54,9 +55,9 @@ class ClientsPageView extends StatelessWidget { return AnimatedOpener( closed: (context) => FrequencyTile( - title: client.titleOrIp, - requests: queryCount, - totalRequests: totalQueryCount, + title: client.nameOrIp, + requests: queryCount, + totalRequests: totalQueryCount, color: KColors.clients, ), opened: (context) => SingleClientPage(client: client), @@ -66,6 +67,7 @@ class ClientsPageView extends StatelessWidget { }, ); }, + failure: (failure) => CenteredFailureIndicator(failure), orElse: () => CenteredLoadingIndicator()); }); } diff --git a/lib/features/home/presentation/pages/domains/domains_page_view.dart b/lib/features/home/presentation/pages/domains/domains_page_view.dart index 2e6240e5..89a2a071 100644 --- a/lib/features/home/presentation/pages/domains/domains_page_view.dart +++ b/lib/features/home/presentation/pages/domains/domains_page_view.dart @@ -7,11 +7,11 @@ import 'package:flutterhole/features/home/presentation/widgets/home_bloc_builder import 'package:flutterhole/features/home/presentation/widgets/home_page_overflow_refresher.dart'; import 'package:flutterhole/features/pihole_api/data/models/top_items.dart'; import 'package:flutterhole/features/pihole_api/presentation/pages/single_domain_page.dart'; -import 'package:flutterhole/widgets/layout/animated_opener.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; -import 'package:flutterhole/widgets/layout/frequency_tile.dart'; -import 'package:flutterhole/widgets/layout/list_with_header.dart'; -import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/animations/animated_opener.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/lists/frequency_tile.dart'; +import 'package:flutterhole/widgets/layout/lists/list_with_header.dart'; import 'package:supercharged/supercharged.dart'; class DomainsPageView extends StatelessWidget { @@ -28,9 +28,10 @@ class DomainsPageView extends StatelessWidget { _, __, ___, - Either topItemsResult, ____, + Either topItemsResult, _____, + ______, ) { return topItemsResult.fold( (failure) => CenteredFailureIndicator(failure), @@ -46,6 +47,7 @@ class DomainsPageView extends StatelessWidget { }, ); }, + failure: (failure) => CenteredFailureIndicator(failure), orElse: () => CenteredLoadingIndicator(), ); }, diff --git a/lib/features/home/presentation/pages/home_page.dart b/lib/features/home/presentation/pages/home_page.dart index 17aaaefb..1fea42de 100644 --- a/lib/features/home/presentation/pages/home_page.dart +++ b/lib/features/home/presentation/pages/home_page.dart @@ -6,14 +6,14 @@ import 'package:flutterhole/features/home/blocs/home_bloc.dart'; import 'package:flutterhole/features/home/presentation/pages/clients/clients_page_view.dart'; import 'package:flutterhole/features/home/presentation/pages/domains/domains_page_view.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/summary_page_view.dart'; +import 'package:flutterhole/features/home/presentation/widgets/bottom_navy_bar_item_extension.dart'; import 'package:flutterhole/features/home/presentation/widgets/home_trivia_fetcher.dart'; import 'package:flutterhole/features/home/presentation/widgets/welcome_message_checker.dart'; import 'package:flutterhole/features/numbers_api/blocs/number_trivia_bloc.dart'; import 'package:flutterhole/features/pihole_api/presentation/widgets/pi_connection_sleep_button.dart'; import 'package:flutterhole/features/pihole_api/presentation/widgets/pi_connection_toggle_button.dart'; -import 'package:flutterhole/features/routing/presentation/widgets/default_drawer.dart'; +import 'package:flutterhole/features/routing/presentation/pages/page_scaffold.dart'; import 'package:flutterhole/features/settings/presentation/widgets/active_pihole_title.dart'; -import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; class HomePage extends StatefulWidget { @override @@ -54,69 +54,69 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { - return PiholeThemeBuilder( - child: MultiBlocProvider( - providers: [ - BlocProvider( - create: (_) => HomeBloc()..add(HomeEvent.fetch()), - ), - BlocProvider( - create: (_) => NumberTriviaBloc(), - ), - ], - child: Builder( - builder: (context) { - return HomeTriviaFetcher( - child: WelcomeMessageChecker( - child: Scaffold( - drawer: DefaultDrawer(), - appBar: AppBar( - elevation: 0.0, - title: ActivePiholeTitle(interactive: true), - actions: [ - PiConnectionSleepButton(), - PiConnectionToggleButton(), - ], - ), - bottomNavigationBar: BottomNavyBar( - selectedIndex: _selectedIndex, - onItemSelected: _onItemSelected, - curve: Curves.easeInOut, - items: [ - BottomNavyBarItem( - icon: Icon(KIcons.summary), - title: Text('Summary'), - activeColor: KColors.summary, - textAlign: TextAlign.center, - ), - BottomNavyBarItem( - icon: Icon(KIcons.clients), - title: Text('Clients'), - activeColor: KColors.clients, - textAlign: TextAlign.center, - ), - BottomNavyBarItem( - icon: Icon(KIcons.domains), - title: Text('Domains'), - activeColor: KColors.domains, - textAlign: TextAlign.center, - ), - ], - ), - body: PageView( - controller: _pageController, - onPageChanged: _onPageChanged, - children: const [ - SummaryPageView(), - ClientsPageView(), - DomainsPageView(), - ], - ), + return MultiBlocProvider( + providers: [ + BlocProvider( + create: (_) => HomeBloc()..add(HomeEvent.fetch()), + ), + BlocProvider( + create: (_) => NumberTriviaBloc(), + ), + ], + child: Builder( + builder: (context) { + return HomeTriviaFetcher( + child: WelcomeMessageChecker( + child: PageScaffold( + appBar: AppBar( + elevation: 0.0, + title: ActivePiholeTitle(interactive: true), + actions: [ + PiConnectionSleepButton(), + PiConnectionToggleButton(), + ], + ), + bottomNavigationBar: BottomNavyBar( + selectedIndex: _selectedIndex, + onItemSelected: _onItemSelected, + curve: Curves.easeInOut, + items: [ + BottomNavyBarItemExtension( + key: Key('SummaryNavBarItem'), + icon: Icon(KIcons.summary), + title: Text('Summary'), + activeColor: KColors.summary, + textAlign: TextAlign.center, + ), + BottomNavyBarItemExtension( + key: Key('ClientsNavBarItem'), + icon: Icon(KIcons.clients), + title: Text('Clients'), + activeColor: KColors.clients, + textAlign: TextAlign.center, + ), + BottomNavyBarItemExtension( + key: Key('DomainsNavBarItem'), + icon: Icon(KIcons.domains), + title: Text('Domains'), + activeColor: KColors.domains, + textAlign: TextAlign.center, + ), + ], + ), + body: PageView( + controller: _pageController, + onPageChanged: _onPageChanged, + children: const [ + SummaryPageView(), + ClientsPageView(), + DomainsPageView(), + ], ), ), - ); - }, - ), + ), + ); + }, ), ); } diff --git a/lib/features/home/presentation/pages/summary/summary_page_view.dart b/lib/features/home/presentation/pages/summary/summary_page_view.dart index bfb571dd..0f7aa8e4 100644 --- a/lib/features/home/presentation/pages/summary/summary_page_view.dart +++ b/lib/features/home/presentation/pages/summary/summary_page_view.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutterhole/core/models/failures.dart'; import 'package:flutterhole/features/home/blocs/home_bloc.dart'; +import 'package:flutterhole/features/home/presentation/pages/summary/widgets/clients_over_day_tile.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/widgets/forward_destinations_tile.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/widgets/query_types_tile.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/widgets/summary_tile.dart'; @@ -12,9 +13,10 @@ import 'package:flutterhole/features/home/presentation/widgets/home_page_overflo import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart'; import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; import 'package:flutterhole/features/pihole_api/data/models/summary.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; -import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/loading_indicators.dart'; import 'package:intl/intl.dart'; final _numberFormat = NumberFormat(); @@ -30,6 +32,7 @@ class SummaryPageView extends StatelessWidget { success: ( Either summaryResult, Either queriesOverTimeResult, + Either clientsOverTimeResult, _, __, Either @@ -37,9 +40,8 @@ class SummaryPageView extends StatelessWidget { Either dnsQueryTypesResult, ) => summaryResult.fold( - (failure) => CenteredFailureIndicator(failure), - (summary) => - HomePageOverflowRefresher( + (failure) => CenteredFailureIndicator(failure), + (summary) => HomePageOverflowRefresher( child: StaggeredGridView.count( crossAxisCount: 4, children: [ @@ -72,6 +74,7 @@ class SummaryPageView extends StatelessWidget { integer: summary.domainsBeingBlocked, ), TotalQueriesOverDayTile(queriesOverTimeResult), + ClientsOverDayTile(clientsOverTimeResult), QueryTypesTile(dnsQueryTypesResult), ForwardDestinationsTile(forwardDestinationsResult), ], @@ -83,6 +86,7 @@ class SummaryPageView extends StatelessWidget { StaggeredTile.count(4, 3), StaggeredTile.count(4, 3), StaggeredTile.count(4, 3), + StaggeredTile.count(4, 3), ], ), ), diff --git a/lib/features/home/presentation/pages/summary/widgets/clients_over_day_line_chart.dart b/lib/features/home/presentation/pages/summary/widgets/clients_over_day_line_chart.dart new file mode 100644 index 00000000..e56bddfc --- /dev/null +++ b/lib/features/home/presentation/pages/summary/widgets/clients_over_day_line_chart.dart @@ -0,0 +1,121 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:flutterhole/features/home/presentation/pages/summary/widgets/line_chart_scaffold.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; +import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; +import 'package:supercharged/supercharged.dart'; + +const List _colors = [ + Colors.blue, + Colors.orange, + Colors.green, + Colors.red, + Colors.yellow, + Colors.purple, +]; + +class ClientsOverDayLineChart extends StatelessWidget { + const ClientsOverDayLineChart( + this.overTimeData, { + Key key, + }) : super(key: key); + + final OverTimeDataClients overTimeData; + + Color _indexToColor(int index) => _colors.elementAt(index % (_colors.length)); + + Map> _buildClientHitsMap() { + Map> map = {}; + + overTimeData.clients.forEachIndexed(( + int index, + PiClient client, + ) { + map.putIfAbsent(client, () => []); + }); + + overTimeData.data.forEach(( + DateTime timestamp, + List hitsPerClient, + ) { + hitsPerClient.forEachIndexed((index, hits) { + final indexedClient = overTimeData.clients.elementAt(index); + + map[indexedClient].add(hits); + }); + }); + + return map; + } + + List _spotsFromHits(List allHits) { + List spots = []; + + allHits.forEachIndexed((int index, int hits) { + spots.add(FlSpot(index.toDouble(), hits.toDouble())); + }); + + return spots; + } + + List _buildLineChartBarData() { + List results = []; + + final Map> map = _buildClientHitsMap(); + + map.forEach((PiClient client, List hits) { + final list = _spotsFromHits(hits); + + final color = _indexToColor(overTimeData.clients.indexOf(client)); + results.add(LineChartBarData( + colors: [color], + spots: list, + barWidth: kLineWidth, + dotData: FlDotData( + show: false, + ), + belowBarData: buildBarAreaData(color), + )); + }); + + return results; + } + + @override + Widget build(BuildContext context) { + return LineChart( + LineChartData( + titlesData: buildTitlesData( + context: context, + getLeftTitles: (double value) { + return '${value.round()}'; + }, + getBottomTitles: (double value) { + return ''; + }, + ), + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Theme.of(context).cardColor, + getTooltipItems: (List touchedSpots) => + buildLineTooltipItems( + context: context, + showTooltipWhenZero: false, + touchedSpots: touchedSpots, + lineTooltipTextBuilder: (int index, + Color color, + double y,) { + return '${overTimeData.clients + .elementAt(index) + .nameOrIp}: ${y.round()}'; + }, + ), + ), + ), + lineBarsData: _buildLineChartBarData(), + gridData: buildGridData(), + borderData: FlBorderData(show: false), + ), + ); + } +} diff --git a/lib/features/home/presentation/pages/summary/widgets/clients_over_day_tile.dart b/lib/features/home/presentation/pages/summary/widgets/clients_over_day_tile.dart new file mode 100644 index 00000000..4b36e220 --- /dev/null +++ b/lib/features/home/presentation/pages/summary/widgets/clients_over_day_tile.dart @@ -0,0 +1,33 @@ +import 'package:dartz/dartz.dart'; +import 'package:flutter/material.dart'; +import 'package:flutterhole/core/models/failures.dart'; +import 'package:flutterhole/features/home/presentation/pages/summary/widgets/clients_over_day_line_chart.dart'; +import 'package:flutterhole/features/home/presentation/pages/summary/widgets/line_chart_scaffold.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; + +class ClientsOverDayTile extends StatelessWidget { + const ClientsOverDayTile( + this.clientsOverTimeResult, { + Key key, + }) : super(key: key); + + final Either clientsOverTimeResult; + + @override + Widget build(BuildContext context) { + return Card( + child: LineChartScaffold( + title: 'Total queries over last 24 hours', + lineChart: clientsOverTimeResult.fold( + (failure) => CenteredFailureIndicator(failure), + (overTimeData) { + return SafeArea( + minimum: EdgeInsets.only(right: 20.0), + child: ClientsOverDayLineChart(overTimeData)); + }, + ), + ), + ); + } +} diff --git a/lib/features/home/presentation/pages/summary/widgets/forward_destinations_tile.dart b/lib/features/home/presentation/pages/summary/widgets/forward_destinations_tile.dart index 879cf834..050aade8 100644 --- a/lib/features/home/presentation/pages/summary/widgets/forward_destinations_tile.dart +++ b/lib/features/home/presentation/pages/summary/widgets/forward_destinations_tile.dart @@ -5,7 +5,7 @@ import 'package:flutterhole/features/home/presentation/pages/summary/widgets/for import 'package:flutterhole/features/home/presentation/pages/summary/widgets/graph_legend_item.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/widgets/pie_chart_scaffold.dart'; import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; class ForwardDestinationsTile extends StatelessWidget { const ForwardDestinationsTile( @@ -18,36 +18,32 @@ class ForwardDestinationsTile extends StatelessWidget { @override Widget build(BuildContext context) { return Card( - child: Container( - child: forwardDestinationsResult.fold( - (failure) => CenteredFailureIndicator(failure), - (success) => PieChartScaffold( - title: 'Forward destinations', - pieChart: - ForwardDestinationsPieChart(success.forwardDestinations), - legendItems: success.forwardDestinations - .map((forwardDestination, percentage) { - final int index = success.forwardDestinations.keys - .toList() - .indexOf(forwardDestination); + child: forwardDestinationsResult.fold( + (failure) => CenteredFailureIndicator(failure), + (success) => PieChartScaffold( + title: 'Forward destinations', + pieChart: ForwardDestinationsPieChart(success.forwardDestinations), + legendItems: success.forwardDestinations + .map((forwardDestination, percentage) { + final int index = success.forwardDestinations.keys + .toList() + .indexOf(forwardDestination); - return MapEntry( - index, - Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: GraphLegendItem( - index: index, - title: forwardDestination.titleOrIp, - subtitle: '$percentage%', - color: - ForwardDestinationsPieChart.colorAtIndex(index), - ), + return MapEntry( + index, + Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: GraphLegendItem( + index: index, + title: forwardDestination.titleOrIp, + subtitle: '$percentage%', + color: ForwardDestinationsPieChart.colorAtIndex(index), ), - ); - }) - .values - .toList()), - ), + ), + ); + }) + .values + .toList()), ), ); } diff --git a/lib/features/home/presentation/pages/summary/widgets/line_chart_scaffold.dart b/lib/features/home/presentation/pages/summary/widgets/line_chart_scaffold.dart new file mode 100644 index 00000000..a0059200 --- /dev/null +++ b/lib/features/home/presentation/pages/summary/widgets/line_chart_scaffold.dart @@ -0,0 +1,118 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +const double kLineWidth = 2.0; +const double kHorizontalLineInterval = 100.0; +const double kVerticalLineInterval = 30.0; + +class LineChartScaffold extends StatelessWidget { + const LineChartScaffold({ + Key key, + @required this.title, + @required this.lineChart, + }) : super(key: key); + + final String title; + final Widget lineChart; + + @override + Widget build(BuildContext context) { + return SafeArea( + minimum: EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: Text( + '$title', + style: TextStyle(fontSize: 16), + ), + ), + Expanded( + child: lineChart, + ), + ], + ), + ); + } +} + +FlTitlesData buildTitlesData({ + @required BuildContext context, + @required GetTitleFunction getLeftTitles, + @required GetTitleFunction getBottomTitles, +}) => + FlTitlesData( + leftTitles: SideTitles( + textStyle: Theme.of(context).textTheme.caption, + showTitles: true, + interval: kHorizontalLineInterval, + getTitles: getLeftTitles, + ), + bottomTitles: SideTitles( + showTitles: true, + interval: kVerticalLineInterval, + textStyle: Theme.of(context).textTheme.caption, + getTitles: getBottomTitles, + ), + ); + +FlGridData buildGridData() => FlGridData( + show: true, + drawVerticalLine: true, + checkToShowHorizontalLine: (double value) { + return value.round() % kHorizontalLineInterval == 0; + }, + checkToShowVerticalLine: (double value) { + return value.round() % kVerticalLineInterval == 0; + }, + ); + +BarAreaData buildBarAreaData(Color color) => BarAreaData( + show: true, + colors: [ + color.withOpacity(0.5), + color.withOpacity(0.25), + ], + gradientColorStops: [0.5, 1.0], + gradientFrom: const Offset(0, 0), + gradientTo: const Offset(0, 1), + ); + +typedef String LineTooltipTextBuilder(int index, Color color, double y); + +List buildLineTooltipItems({ + BuildContext context, + List touchedSpots, + bool showTooltipWhenZero = true, + LineTooltipTextBuilder lineTooltipTextBuilder, +}) { + if (touchedSpots == null) { + return null; + } + + return touchedSpots.map((LineBarSpot touchedSpot) { + if (touchedSpot == null) { + return null; + } + + final Color color = touchedSpot.bar.colors[0]; + + final text = lineTooltipTextBuilder( + touchedSpot.barIndex, + color, + touchedSpot.y, + ); + + if (!showTooltipWhenZero && touchedSpot.y == 0) return null; + + return LineTooltipItem( + '$text', + Theme.of(context).textTheme.bodyText1.apply( + color: color, + ), + ); + }).toList(); +} diff --git a/lib/features/home/presentation/pages/summary/widgets/query_types_tile.dart b/lib/features/home/presentation/pages/summary/widgets/query_types_tile.dart index 2cb3d861..903fb6fc 100644 --- a/lib/features/home/presentation/pages/summary/widgets/query_types_tile.dart +++ b/lib/features/home/presentation/pages/summary/widgets/query_types_tile.dart @@ -5,7 +5,7 @@ import 'package:flutterhole/features/home/presentation/pages/summary/widgets/gra import 'package:flutterhole/features/home/presentation/pages/summary/widgets/pie_chart_scaffold.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/widgets/query_types_pie_chart.dart'; import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; class QueryTypesTile extends StatelessWidget { const QueryTypesTile( diff --git a/lib/features/home/presentation/pages/summary/widgets/summary_tile.dart b/lib/features/home/presentation/pages/summary/widgets/summary_tile.dart index 7f554d91..a7a4eacb 100644 --- a/lib/features/home/presentation/pages/summary/widgets/summary_tile.dart +++ b/lib/features/home/presentation/pages/summary/widgets/summary_tile.dart @@ -5,8 +5,8 @@ import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/numbers_api/blocs/number_trivia_bloc.dart'; import 'package:flutterhole/features/numbers_api/presentation/widgets/numbers_api_description_tile.dart'; import 'package:flutterhole/features/settings/services/preference_service.dart'; -import 'package:flutterhole/widgets/layout/animate_on_build.dart'; -import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/animations/animate_on_build.dart'; +import 'package:flutterhole/widgets/layout/indicators/loading_indicators.dart'; class SummaryTile extends StatelessWidget { const SummaryTile({ @@ -96,8 +96,7 @@ class _SummaryTriviaPage extends StatelessWidget { if (trivia.containsKey(integer)) { return Text( '${trivia[integer]}', - style: Theme - .of(context) + style: Theme.of(context) .textTheme .headline6 .copyWith(color: Colors.white), diff --git a/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_line_chart.dart b/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_line_chart.dart index 5d555b65..3d2a118c 100644 --- a/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_line_chart.dart +++ b/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_line_chart.dart @@ -2,11 +2,9 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; import 'package:flutterhole/core/convert.dart'; +import 'package:flutterhole/features/home/presentation/pages/summary/widgets/line_chart_scaffold.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; -const double kHorizontalLineInterval = 200.0; -const double kVerticalLineInterval = 30.0; - class TotalQueriesOverDayLineChart extends StatelessWidget { const TotalQueriesOverDayLineChart( this.overTimeData, { @@ -31,113 +29,55 @@ class TotalQueriesOverDayLineChart extends StatelessWidget { Widget build(BuildContext context) { return LineChart( LineChartData( - titlesData: FlTitlesData( - leftTitles: SideTitles( - textStyle: Theme.of(context).textTheme.caption, - showTitles: true, - interval: kHorizontalLineInterval, - getTitles: (double value) { - return '${value.round()}'; - }, - ), - bottomTitles: SideTitles( - showTitles: true, - interval: kVerticalLineInterval, - textStyle: Theme.of(context).textTheme.caption, - getTitles: (double value) { - final dateTime = - overTimeData.domainsOverTime.keys.elementAt(value.round()); + titlesData: buildTitlesData( + context: context, + getLeftTitles: (double value) { + return '${value.round()}'; + }, + getBottomTitles: (double value) { + final dateTime = + overTimeData.domainsOverTime.keys.elementAt(value.round()); - return '${dateTime.formattedTimeShort}'; - }), + return '${dateTime.formattedTimeShort}'; + }, ), lineBarsData: [ LineChartBarData( colors: [KColors.success], spots: _spotsFromMap(overTimeData.domainsOverTime), - barWidth: 4.0, + barWidth: kLineWidth, dotData: FlDotData( show: false, ), - belowBarData: BarAreaData( - show: true, - colors: [ - KColors.success.withOpacity(0.5), - KColors.success.withOpacity(0.25), - ], - gradientColorStops: [0.5, 1.0], - gradientFrom: const Offset(0, 0), - gradientTo: const Offset(0, 1), - ), + belowBarData: buildBarAreaData(KColors.success), ), LineChartBarData( colors: [KColors.blocked], spots: _spotsFromMap(overTimeData.adsOverTime), - barWidth: 4.0, + barWidth: kLineWidth, dotData: FlDotData( show: false, ), - belowBarData: BarAreaData( - show: true, - colors: [ - KColors.blocked.withOpacity(0.5), - KColors.blocked.withOpacity(0.25), - ], - gradientColorStops: [0.5, 1.0], - gradientFrom: const Offset(0, 0), - gradientTo: const Offset(0, 1), - ), + belowBarData: buildBarAreaData(KColors.error), ), ], - gridData: FlGridData( - show: true, - drawVerticalLine: true, - checkToShowHorizontalLine: (double value) { - return value.round() % kHorizontalLineInterval == 0; - }, - checkToShowVerticalLine: (double value) { - return value.round() % kVerticalLineInterval == 0; - }, - ), + gridData: buildGridData(), lineTouchData: LineTouchData( touchTooltipData: LineTouchTooltipData( tooltipBgColor: Theme.of(context).cardColor, - getTooltipItems: (List touchedSpots) { - if (touchedSpots == null) { - return null; - } - - return touchedSpots.map((LineBarSpot touchedSpot) { - if (touchedSpot == null) { - return null; - } - - final Color color = touchedSpot.bar.colors[0]; - - if (color == KColors.success) { - return LineTooltipItem( - 'Permitted: ${touchedSpot.y.round()}', - Theme.of(context).textTheme.bodyText1.apply( - color: color, - ), - ); - } else if (color == KColors.blocked) { - return LineTooltipItem( - 'Blocked: ${touchedSpot.y.round()}', - Theme.of(context).textTheme.bodyText1.apply( - color: color, - ), - ); - } - - return LineTooltipItem( - '${touchedSpot.y.round()}', - Theme.of(context).textTheme.bodyText1.apply( - color: color, - ), - ); - }).toList(); - }, + getTooltipItems: (List touchedSpots) => + buildLineTooltipItems( + context: context, + touchedSpots: touchedSpots, + lineTooltipTextBuilder: (int index, Color color, double y) { + if (color == KColors.success) { + return 'Permitted: ${y.round()}'; + } else if (color == KColors.blocked) { + return 'Blocked: ${y.round()}'; + } else { + return 'Unknown: ${y.round()}'; + } + }), ), ), borderData: FlBorderData(show: false), diff --git a/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_tile.dart b/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_tile.dart index f2fe60e4..2cd6ef38 100644 --- a/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_tile.dart +++ b/lib/features/home/presentation/pages/summary/widgets/total_queries_over_day_tile.dart @@ -1,9 +1,10 @@ import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; import 'package:flutterhole/core/models/failures.dart'; +import 'package:flutterhole/features/home/presentation/pages/summary/widgets/line_chart_scaffold.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/widgets/total_queries_over_day_line_chart.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; class TotalQueriesOverDayTile extends StatelessWidget { const TotalQueriesOverDayTile( @@ -16,28 +17,15 @@ class TotalQueriesOverDayTile extends StatelessWidget { @override Widget build(BuildContext context) { return Card( - child: SafeArea( - minimum: EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 16.0), - child: Text( - 'Total queries over last 24 hours', - style: TextStyle(fontSize: 16), - ), - ), - Expanded( - child: queriesOverTimeResult.fold( - (failure) => CenteredFailureIndicator(failure), - (overTimeData) { - return TotalQueriesOverDayLineChart(overTimeData); - }, - ), - ), - ], + child: LineChartScaffold( + title: 'Total queries over last 24 hours', + lineChart: queriesOverTimeResult.fold( + (failure) => CenteredFailureIndicator(failure), + (overTimeData) { + return SafeArea( + minimum: EdgeInsets.only(right: 20.0), + child: TotalQueriesOverDayLineChart(overTimeData)); + }, ), ), ); diff --git a/lib/features/home/presentation/widgets/bottom_navy_bar_item_extension.dart b/lib/features/home/presentation/widgets/bottom_navy_bar_item_extension.dart new file mode 100644 index 00000000..9cd99690 --- /dev/null +++ b/lib/features/home/presentation/widgets/bottom_navy_bar_item_extension.dart @@ -0,0 +1,21 @@ +import 'package:bottom_navy_bar/bottom_navy_bar.dart'; +import 'package:flutter/material.dart'; + +class BottomNavyBarItemExtension extends BottomNavyBarItem { + final Key key; + + BottomNavyBarItemExtension({ + this.key, + Icon icon, + Text title, + Color activeColor, + Color inactiveColor, + TextAlign textAlign, + }) : super( + icon: icon, + title: title, + activeColor: activeColor, + inactiveColor: inactiveColor, + textAlign: textAlign, + ); +} diff --git a/lib/features/home/presentation/widgets/welcome_message_checker.dart b/lib/features/home/presentation/widgets/welcome_message_checker.dart index 9e345bf4..548ac5fd 100644 --- a/lib/features/home/presentation/widgets/welcome_message_checker.dart +++ b/lib/features/home/presentation/widgets/welcome_message_checker.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/settings/services/preference_service.dart'; -import 'package:flutterhole/widgets/layout/dialogs.dart'; +import 'package:flutterhole/widgets/layout/notifications/dialogs.dart'; /// Calls [showWelcomeDialog] if this is the first time the app is launched. class WelcomeMessageChecker extends StatefulWidget { diff --git a/lib/features/numbers_api/presentation/widgets/numbers_api_description_tile.dart b/lib/features/numbers_api/presentation/widgets/numbers_api_description_tile.dart index ce2dd0fe..5af15186 100644 --- a/lib/features/numbers_api/presentation/widgets/numbers_api_description_tile.dart +++ b/lib/features/numbers_api/presentation/widgets/numbers_api_description_tile.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; -import 'package:flutterhole/widgets/layout/open_url_tile.dart'; +import 'package:flutterhole/widgets/layout/lists/open_url_tile.dart'; const String _numbersApiHome = 'http://numbersapi.com/'; diff --git a/lib/features/pihole_api/blocs/pi_connection_bloc.dart b/lib/features/pihole_api/blocs/pi_connection_bloc.dart index 8cc7b4a4..2ba95eed 100644 --- a/lib/features/pihole_api/blocs/pi_connection_bloc.dart +++ b/lib/features/pihole_api/blocs/pi_connection_bloc.dart @@ -45,7 +45,6 @@ abstract class PiConnectionEvent with _$PiConnectionEvent { typedef Future> ConnectionFunction( PiholeSettings piholeSettings); -@prod @singleton class PiConnectionBloc extends Bloc { PiConnectionBloc([ diff --git a/lib/features/pihole_api/data/datasources/api_data_source.dart b/lib/features/pihole_api/data/datasources/api_data_source.dart index fac03fe2..7c8a9b9e 100644 --- a/lib/features/pihole_api/data/datasources/api_data_source.dart +++ b/lib/features/pihole_api/data/datasources/api_data_source.dart @@ -2,6 +2,7 @@ import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart' import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; import 'package:flutterhole/features/pihole_api/data/models/many_query_data.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_versions.dart'; import 'package:flutterhole/features/pihole_api/data/models/summary.dart'; @@ -29,6 +30,8 @@ abstract class ApiDataSource { Future fetchQueriesOverTime(PiholeSettings settings); + Future fetchClientsOverTime(PiholeSettings settings); + Future fetchTopSources(PiholeSettings settings); Future fetchTopItems(PiholeSettings settings); diff --git a/lib/features/pihole_api/data/datasources/api_data_source_dio.dart b/lib/features/pihole_api/data/datasources/api_data_source_dio.dart index 68e45e11..9bec0406 100644 --- a/lib/features/pihole_api/data/datasources/api_data_source_dio.dart +++ b/lib/features/pihole_api/data/datasources/api_data_source_dio.dart @@ -11,6 +11,7 @@ import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart' import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; import 'package:flutterhole/features/pihole_api/data/models/many_query_data.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_versions.dart'; import 'package:flutterhole/features/pihole_api/data/models/summary.dart'; @@ -187,6 +188,18 @@ class ApiDataSourceDio implements ApiDataSource { return OverTimeData.fromJson(json); } + @override + Future fetchClientsOverTime( + PiholeSettings settings) async { + final Map json = + await _getSecure(settings, queryParameters: { + 'getClientNames': '', + 'overTimeDataClients': '', + }); + + return OverTimeDataClients.fromJson(json); + } + @override Future fetchTopSources(PiholeSettings settings) async { final Map json = @@ -247,8 +260,8 @@ class ApiDataSourceDio implements ApiDataSource { final Map json = await _getSecure(settings, queryParameters: { 'getAllQueries': '', - 'client': (client.title != null && client.title.isNotEmpty) - ? client.title.trim() + 'client': (client.name != null && client.name.isNotEmpty) + ? client.name.trim() : client.ip, }); diff --git a/lib/features/pihole_api/data/models/over_time_data_clients.dart b/lib/features/pihole_api/data/models/over_time_data_clients.dart new file mode 100644 index 00000000..c8a9afa7 --- /dev/null +++ b/lib/features/pihole_api/data/models/over_time_data_clients.dart @@ -0,0 +1,40 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutterhole/core/convert.dart'; +import 'package:flutterhole/features/pihole_api/data/models/model.dart'; +import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'over_time_data_clients.freezed.dart'; +part 'over_time_data_clients.g.dart'; + +Map> _valueToHitsOverTime(dynamic value) { + return (value as Map).cast>().map>( + (String key, List hits) => + MapEntry(dateTimeFromPiholeString(key), List.from(hits))); +} + +dynamic _hitsOverTimeToValues(Map> hitsOverTime) { + return hitsOverTime + .map((DateTime key, List hits) => MapEntry( + piholeStringFromDateTime(key), + hits, + )); +} + +@freezed +abstract class OverTimeDataClients extends MapModel with _$OverTimeDataClients { + @JsonSerializable(explicitToJson: true) + const factory OverTimeDataClients({ + @JsonKey(name: 'clients') + List clients, + @JsonKey( + name: 'over_time', + fromJson: _valueToHitsOverTime, + toJson: _hitsOverTimeToValues, + ) + Map> data, + }) = _OverTimeDataClients; + + factory OverTimeDataClients.fromJson(Map json) => + _$OverTimeDataClientsFromJson(json); +} \ No newline at end of file diff --git a/lib/features/pihole_api/data/models/pi_client.dart b/lib/features/pihole_api/data/models/pi_client.dart index c99b9d12..976f07a5 100644 --- a/lib/features/pihole_api/data/models/pi_client.dart +++ b/lib/features/pihole_api/data/models/pi_client.dart @@ -10,12 +10,12 @@ abstract class PiClient extends MapModel implements _$PiClient { const PiClient._(); const factory PiClient({ - String title, + String name, String ip, }) = _PiClient; factory PiClient.fromJson(Map json) => _$PiClientFromJson(json); - String get titleOrIp => (title?.isEmpty ?? true) ? ip : '${ip} (${title})'; + String get nameOrIp => (name?.isEmpty ?? true) ? ip : '${ip} (${name})'; } diff --git a/lib/features/pihole_api/data/models/query_data.dart b/lib/features/pihole_api/data/models/query_data.dart index a376f7e2..36032667 100644 --- a/lib/features/pihole_api/data/models/query_data.dart +++ b/lib/features/pihole_api/data/models/query_data.dart @@ -59,6 +59,7 @@ QueryStatus _stringToQueryStatus(String json) { return QueryStatus.values[index]; } catch (e) { print('_stringToQueryStatus failed: $e'); + print('string: $json'); return QueryStatus.Unknown; } } diff --git a/lib/features/pihole_api/data/models/top_sources.dart b/lib/features/pihole_api/data/models/top_sources.dart index 9e824f5e..abf2ef6c 100644 --- a/lib/features/pihole_api/data/models/top_sources.dart +++ b/lib/features/pihole_api/data/models/top_sources.dart @@ -4,7 +4,6 @@ import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'top_sources.freezed.dart'; - part 'top_sources.g.dart'; Map _valueToTopSources(dynamic value) { @@ -16,14 +15,14 @@ Map _valueToTopSources(dynamic value) { String ip = splits.last; if (splits.length > 1) title = splits.first; - return MapEntry(PiClient(title: title, ip: ip), queryCount); + return MapEntry(PiClient(name: title, ip: ip), queryCount); }, ); } dynamic _topSourcesToValue(Map topSources) => topSources.map((client, count) => MapEntry( - '${client.title ?? ''}${(client.title?.isEmpty ?? true) ? '' : '|'}${client.ip}', + '${client.name ?? ''}${(client.name?.isEmpty ?? true) ? '' : '|'}${client.ip}', count)); /// {{ base_url }}?getQuerySources&auth={{ auth }} diff --git a/lib/features/pihole_api/data/repositories/api_repository.dart b/lib/features/pihole_api/data/repositories/api_repository.dart index 44d9ec29..1cf1a45a 100644 --- a/lib/features/pihole_api/data/repositories/api_repository.dart +++ b/lib/features/pihole_api/data/repositories/api_repository.dart @@ -3,6 +3,7 @@ import 'package:flutterhole/core/models/failures.dart'; import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart'; import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; import 'package:flutterhole/features/pihole_api/data/models/summary.dart'; @@ -16,6 +17,9 @@ abstract class ApiRepository { Future> fetchQueriesOverTime( PiholeSettings settings); + Future> fetchClientsOverTime( + PiholeSettings settings); + Future> fetchTopSources( PiholeSettings settings); diff --git a/lib/features/pihole_api/data/repositories/api_repository_impl.dart b/lib/features/pihole_api/data/repositories/api_repository_impl.dart index d1c22243..4c464af4 100644 --- a/lib/features/pihole_api/data/repositories/api_repository_impl.dart +++ b/lib/features/pihole_api/data/repositories/api_repository_impl.dart @@ -7,6 +7,7 @@ import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart' import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; import 'package:flutterhole/features/pihole_api/data/models/many_query_data.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; import 'package:flutterhole/features/pihole_api/data/models/summary.dart'; @@ -16,7 +17,6 @@ import 'package:flutterhole/features/pihole_api/data/repositories/api_repository import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; import 'package:injectable/injectable.dart'; -@prod @singleton @RegisterAs(ApiRepository) class ApiRepositoryImpl implements ApiRepository { @@ -36,6 +36,8 @@ class ApiRepositoryImpl implements ApiRepository { return Right(result); } on PiException catch (e) { return Left(Failure('$description failed', e)); + } catch (e) { + return Left(Failure('$description failed with unexpected error', e)); } } @@ -57,6 +59,15 @@ class ApiRepositoryImpl implements ApiRepository { 'fetchQueriesOverTime', ); + @override + Future> fetchClientsOverTime( + PiholeSettings settings) async => + fetchOrFailure( + settings, + _apiDataSource.fetchClientsOverTime, + 'fetchClientsOverTime', + ); + @override Future> fetchTopSources( PiholeSettings settings) async => @@ -110,7 +121,7 @@ class ApiRepositoryImpl implements ApiRepository { PiholeSettings settings, String domain) async { try { final ManyQueryData result = - await _apiDataSource.fetchQueryDataForDomain(settings, domain); + await _apiDataSource.fetchQueryDataForDomain(settings, domain); return Right(result.data.reversed.toList()); } on PiException catch (e) { return Left(Failure('fetchQueriesForDomain failed', e)); diff --git a/lib/features/pihole_api/data/repositories/connection_repository_dio.dart b/lib/features/pihole_api/data/repositories/connection_repository_dio.dart index 8dec9bd9..6e7f7dc6 100644 --- a/lib/features/pihole_api/data/repositories/connection_repository_dio.dart +++ b/lib/features/pihole_api/data/repositories/connection_repository_dio.dart @@ -12,7 +12,6 @@ import 'package:flutterhole/features/pihole_api/data/repositories/connection_rep import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; import 'package:injectable/injectable.dart'; -@prod @singleton @RegisterAs(ConnectionRepository) class ConnectionRepositoryDio implements ConnectionRepository { diff --git a/lib/features/pihole_api/presentation/pages/query_log_page.dart b/lib/features/pihole_api/presentation/pages/query_log_page.dart index d339476e..4ee48db7 100644 --- a/lib/features/pihole_api/presentation/pages/query_log_page.dart +++ b/lib/features/pihole_api/presentation/pages/query_log_page.dart @@ -8,11 +8,11 @@ import 'package:flutterhole/features/pihole_api/presentation/widgets/queries_sea import 'package:flutterhole/features/pihole_api/presentation/widgets/queries_search_list_builder.dart'; import 'package:flutterhole/features/pihole_api/presentation/widgets/query_log_page_overflow_refresher.dart'; import 'package:flutterhole/features/pihole_api/presentation/widgets/single_query_data_tile.dart'; +import 'package:flutterhole/features/routing/presentation/pages/page_scaffold.dart'; import 'package:flutterhole/features/routing/presentation/widgets/default_drawer.dart'; -import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; import 'package:flutterhole/features/settings/services/preference_service.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; -import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/loading_indicators.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -66,46 +66,42 @@ class QueryLogPage extends StatelessWidget { create: (_) => QueryLogBloc() ..add(QueryLogEvent.fetchSome( getIt().queryLogMaxResults)), - child: PiholeThemeBuilder( - child: Scaffold( - drawer: DefaultDrawer(), - appBar: QueriesSearchAppBar( - title: Text('Query log'), - actions: [ - _PopupMenu(), - ], - ), - body: Scrollbar( - child: BlocBuilder( - builder: (BuildContext context, QueryLogState state) { - return state.maybeWhen( - success: (List queries) { - return QueriesSearchListBuilder( - initialData: queries, - builder: - (BuildContext context, List matches) { - return QueryLogPageOverflowRefresher( - child: ListView.builder( - itemCount: matches.length, - itemBuilder: (context, index) { - final QueryData query = - matches.elementAt(index); + child: PageScaffold( + drawer: DefaultDrawer(), + appBar: QueriesSearchAppBar( + title: Text('Query log'), + actions: [ + _PopupMenu(), + ], + ), + body: Scrollbar( + child: BlocBuilder( + builder: (BuildContext context, QueryLogState state) { + return state.maybeWhen( + success: (List queries) { + return QueriesSearchListBuilder( + initialData: queries, + builder: (BuildContext context, List matches) { + return QueryLogPageOverflowRefresher( + child: ListView.builder( + itemCount: matches.length, + itemBuilder: (context, index) { + final QueryData query = matches.elementAt(index); - return SingleQueryDataTile(query: query); - }, - ), - ); - }, - ); - }, - failure: (failure) => CenteredFailureIndicator(failure), - initial: () => Container(), - orElse: () { - return CenteredLoadingIndicator(); - }, - ); - }, - ), + return SingleQueryDataTile(query: query); + }, + ), + ); + }, + ); + }, + failure: (failure) => CenteredFailureIndicator(failure), + initial: () => Container(), + orElse: () { + return CenteredLoadingIndicator(); + }, + ); + }, ), ), ), diff --git a/lib/features/pihole_api/presentation/pages/single_client_page.dart b/lib/features/pihole_api/presentation/pages/single_client_page.dart index 6b9c2ee5..484c6a15 100644 --- a/lib/features/pihole_api/presentation/pages/single_client_page.dart +++ b/lib/features/pihole_api/presentation/pages/single_client_page.dart @@ -9,8 +9,8 @@ import 'package:flutterhole/features/pihole_api/presentation/widgets/queries_sea import 'package:flutterhole/features/pihole_api/presentation/widgets/single_client_page_overflow_refresher.dart'; import 'package:flutterhole/features/pihole_api/presentation/widgets/single_query_data_tile.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; -import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/loading_indicators.dart'; import 'package:provider/provider.dart'; class SingleClientPage extends StatelessWidget { @@ -31,7 +31,7 @@ class SingleClientPage extends StatelessWidget { child: PiholeThemeBuilder( child: Scaffold( appBar: QueriesSearchAppBar( - title: Text('${client.titleOrIp}'), + title: Text('${client.nameOrIp}'), ), body: Scrollbar( child: BlocBuilder( diff --git a/lib/features/pihole_api/presentation/pages/single_domain_page.dart b/lib/features/pihole_api/presentation/pages/single_domain_page.dart index 040d1d44..4517f2e4 100644 --- a/lib/features/pihole_api/presentation/pages/single_domain_page.dart +++ b/lib/features/pihole_api/presentation/pages/single_domain_page.dart @@ -8,8 +8,8 @@ import 'package:flutterhole/features/pihole_api/presentation/widgets/queries_sea import 'package:flutterhole/features/pihole_api/presentation/widgets/single_domain_page_overflow_refresher.dart'; import 'package:flutterhole/features/pihole_api/presentation/widgets/single_query_data_tile.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; -import 'package:flutterhole/widgets/layout/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/loading_indicators.dart'; import 'package:provider/provider.dart'; class SingleDomainPage extends StatelessWidget { diff --git a/lib/features/pihole_api/presentation/widgets/pi_connection_status_icon.dart b/lib/features/pihole_api/presentation/widgets/pi_connection_status_icon.dart index ba268c73..60a74328 100644 --- a/lib/features/pihole_api/presentation/widgets/pi_connection_status_icon.dart +++ b/lib/features/pihole_api/presentation/widgets/pi_connection_status_icon.dart @@ -7,8 +7,8 @@ import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/pihole_api/blocs/pi_connection_bloc.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_status.dart'; import 'package:flutterhole/features/pihole_api/data/models/toggle_status.dart'; -import 'package:flutterhole/widgets/layout/timer_builder.dart'; -import 'package:flutterhole/widgets/layout/toasts.dart'; +import 'package:flutterhole/widgets/layout/animations/timer_builder.dart'; +import 'package:flutterhole/widgets/layout/notifications/toasts.dart'; import 'package:supercharged/supercharged.dart'; const _$PiStatusEnumEnumMap = { diff --git a/lib/features/pihole_api/presentation/widgets/pi_connection_toggle_button.dart b/lib/features/pihole_api/presentation/widgets/pi_connection_toggle_button.dart index 9efd38bb..bda8992a 100644 --- a/lib/features/pihole_api/presentation/widgets/pi_connection_toggle_button.dart +++ b/lib/features/pihole_api/presentation/widgets/pi_connection_toggle_button.dart @@ -7,8 +7,8 @@ import 'package:flutterhole/features/pihole_api/blocs/pi_connection_bloc.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_status.dart'; import 'package:flutterhole/features/pihole_api/data/models/toggle_status.dart'; import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; -import 'package:flutterhole/widgets/layout/loading_indicators.dart'; -import 'package:flutterhole/widgets/layout/snackbars.dart'; +import 'package:flutterhole/widgets/layout/indicators/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/notifications/snackbars.dart'; class PiConnectionToggleButton extends StatelessWidget { diff --git a/lib/features/pihole_api/presentation/widgets/queries_search_app_bar.dart b/lib/features/pihole_api/presentation/widgets/queries_search_app_bar.dart index 9377df3b..12c2efe1 100644 --- a/lib/features/pihole_api/presentation/widgets/queries_search_app_bar.dart +++ b/lib/features/pihole_api/presentation/widgets/queries_search_app_bar.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; import 'package:flutterhole/features/pihole_api/presentation/notifiers/queries_search_notifier.dart'; -import 'package:flutterhole/widgets/layout/animate_on_build.dart'; +import 'package:flutterhole/widgets/layout/animations/animate_on_build.dart'; import 'package:provider/provider.dart'; class QueriesSearchAppBar extends StatefulWidget diff --git a/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart b/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart index e7621f6a..e25ff303 100644 --- a/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart +++ b/lib/features/pihole_api/presentation/widgets/single_query_data_tile.dart @@ -3,8 +3,8 @@ import 'package:flutterhole/constants.dart'; import 'package:flutterhole/core/convert.dart'; import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; -import 'package:flutterhole/widgets/layout/animated_opener.dart'; -import 'package:flutterhole/widgets/layout/open_url_tile.dart'; +import 'package:flutterhole/widgets/layout/animations/animated_opener.dart'; +import 'package:flutterhole/widgets/layout/lists/open_url_tile.dart'; const String _wikipediaUrl = 'https://en.wikipedia.org/wiki/List_of_DNS_record_types'; diff --git a/lib/features/routing/presentation/pages/about_page.dart b/lib/features/routing/presentation/pages/about_page.dart index 10b12239..0e6f06cd 100644 --- a/lib/features/routing/presentation/pages/about_page.dart +++ b/lib/features/routing/presentation/pages/about_page.dart @@ -2,12 +2,12 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/browser/services/browser_service.dart'; +import 'package:flutterhole/features/routing/presentation/pages/page_scaffold.dart'; import 'package:flutterhole/features/routing/presentation/pages/privacy_page.dart'; -import 'package:flutterhole/features/routing/presentation/widgets/default_drawer.dart'; import 'package:flutterhole/features/settings/services/package_info_service.dart'; -import 'package:flutterhole/widgets/layout/animated_opener.dart'; -import 'package:flutterhole/widgets/layout/dialogs.dart'; -import 'package:flutterhole/widgets/layout/list_title.dart'; +import 'package:flutterhole/widgets/layout/animations/animated_opener.dart'; +import 'package:flutterhole/widgets/layout/lists/list_title.dart'; +import 'package:flutterhole/widgets/layout/notifications/dialogs.dart'; import 'package:package_info/package_info.dart'; import 'package:share/share.dart'; @@ -16,8 +16,7 @@ class AboutPage extends StatelessWidget { Widget build(BuildContext context) { final packageInfo = getIt().packageInfo; - return Scaffold( - drawer: DefaultDrawer(), + return PageScaffold( body: CustomScrollView( slivers: [ SliverAppBar( @@ -32,13 +31,8 @@ class AboutPage extends StatelessWidget { contentPadding: EdgeInsets.all(16), title: Row( children: [ - Text( - '${packageInfo?.appName}', - style: Theme.of(context) - .textTheme - .headline4 - .copyWith(color: Theme.of(context).accentColor), - ), + Text('${packageInfo?.appName}', + style: Theme.of(context).textTheme.headline4), ], ), subtitle: Text( diff --git a/lib/features/routing/presentation/pages/page_scaffold.dart b/lib/features/routing/presentation/pages/page_scaffold.dart new file mode 100644 index 00000000..e44ad729 --- /dev/null +++ b/lib/features/routing/presentation/pages/page_scaffold.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:flutterhole/features/routing/presentation/widgets/default_drawer.dart'; +import 'package:flutterhole/features/routing/presentation/widgets/double_back_to_close_app.dart'; +import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; + +class PageScaffold extends StatelessWidget { + /// A [Scaffold] that uses the active pihole theme, + /// and adds double back to close app. + const PageScaffold({ + Key key, + this.body, + this.appBar, + this.bottomNavigationBar, + this.floatingActionButton, + this.drawer = const DefaultDrawer(), + this.isNested = false, + }) : super(key: key); + + final Widget body; + final PreferredSizeWidget appBar; + final Widget drawer; + final Widget bottomNavigationBar; + final Widget floatingActionButton; + final bool isNested; + + @override + Widget build(BuildContext context) { + return PiholeThemeBuilder( + child: Scaffold( + drawer: isNested ? null : drawer, + appBar: appBar, + bottomNavigationBar: bottomNavigationBar, + floatingActionButton: floatingActionButton, + body: isNested ? body : DoubleBackToCloseApp(child: body), + ), + ); + } +} diff --git a/lib/features/routing/presentation/pages/privacy_page.dart b/lib/features/routing/presentation/pages/privacy_page.dart index 96a933f7..309fd385 100644 --- a/lib/features/routing/presentation/pages/privacy_page.dart +++ b/lib/features/routing/presentation/pages/privacy_page.dart @@ -3,7 +3,7 @@ import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutterhole/constants.dart'; import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/browser/services/browser_service.dart'; -import 'package:flutterhole/widgets/layout/animate_on_build.dart'; +import 'package:flutterhole/widgets/layout/animations/animate_on_build.dart'; class PrivacyPage extends StatelessWidget { const PrivacyPage({ diff --git a/lib/features/routing/presentation/widgets/default_drawer.dart b/lib/features/routing/presentation/widgets/default_drawer.dart index 682366be..7aea81d9 100644 --- a/lib/features/routing/presentation/widgets/default_drawer.dart +++ b/lib/features/routing/presentation/widgets/default_drawer.dart @@ -9,11 +9,13 @@ import 'package:flutterhole/features/routing/presentation/widgets/drawer_tile.da import 'package:flutterhole/features/routing/services/router_service.dart'; import 'package:flutterhole/features/settings/services/package_info_service.dart'; import 'package:flutterhole/features/settings/services/preference_service.dart'; -import 'package:flutterhole/widgets/layout/dialogs.dart'; +import 'package:flutterhole/widgets/layout/notifications/dialogs.dart'; import 'package:package_info/package_info.dart'; import 'package:provider/provider.dart'; class DefaultDrawer extends StatelessWidget { + const DefaultDrawer(); + @override Widget build(BuildContext context) { return ChangeNotifierProvider( diff --git a/lib/features/routing/presentation/widgets/double_back_to_close_app.dart b/lib/features/routing/presentation/widgets/double_back_to_close_app.dart new file mode 100644 index 00000000..411ecd4e --- /dev/null +++ b/lib/features/routing/presentation/widgets/double_back_to_close_app.dart @@ -0,0 +1,62 @@ +import 'package:clock/clock.dart'; +import 'package:flutter/material.dart'; +import 'package:flutterhole/widgets/layout/notifications/toasts.dart'; + +const Duration kDoubleBackToCloseDuration = Duration(seconds: 2); + +class DoubleBackToCloseApp extends StatefulWidget { + DoubleBackToCloseApp({ + Key key, + @required this.child, + }) : super(key: key); + + final Widget child; + + @override + _DoubleBackToCloseAppState createState() => _DoubleBackToCloseAppState(); +} + +class _DoubleBackToCloseAppState extends State { + Stopwatch _stopwatch; + + @override + void dispose() { + _stopwatch?.stop(); + super.dispose(); + } + + bool get _willHandlePopInternally => + ModalRoute.of(context).willHandlePopInternally; + + bool get _isDoubleBack { + return _stopwatch?.isRunning ?? false; + } + + @override + Widget build(BuildContext context) { + return WillPopScope( + onWillPop: () async { + if (_isDoubleBack || _willHandlePopInternally) { + cancelToast(); + return true; + } + + showToast('Press BACK again to exit'); + + setState(() { + _stopwatch = clock.stopwatch()..start(); + }); + + Future.delayed(kDoubleBackToCloseDuration).then((_) { + setState(() { + _stopwatch?.stop(); + _stopwatch?.reset(); + }); + }); + + return false; + }, + child: widget.child, + ); + } +} diff --git a/lib/features/routing/services/router_service_sailor.dart b/lib/features/routing/services/router_service_sailor.dart index fe6de953..83afe865 100644 --- a/lib/features/routing/services/router_service_sailor.dart +++ b/lib/features/routing/services/router_service_sailor.dart @@ -12,7 +12,6 @@ import 'package:flutterhole/features/settings/presentation/pages/user_preference import 'package:injectable/injectable.dart'; import 'package:sailor/sailor.dart'; -@prod @singleton @RegisterAs(RouterService) class RouterServiceSailor implements RouterService { diff --git a/lib/features/settings/data/datasources/settings_data_source.dart b/lib/features/settings/data/datasources/settings_data_source.dart index 33e744c5..4bf20b2f 100644 --- a/lib/features/settings/data/datasources/settings_data_source.dart +++ b/lib/features/settings/data/datasources/settings_data_source.dart @@ -7,7 +7,8 @@ abstract class SettingsDataSource { Future addPiholeSettings(PiholeSettings piholeSettings); - Future updatePiholeSettings(PiholeSettings original, PiholeSettings update); + Future updatePiholeSettings( + PiholeSettings original, PiholeSettings update); Future deletePiholeSettings(PiholeSettings piholeSettings); diff --git a/lib/features/settings/data/datasources/settings_data_source_hive.dart b/lib/features/settings/data/datasources/settings_data_source_hive.dart index 69b599bc..6903e8ec 100644 --- a/lib/features/settings/data/datasources/settings_data_source_hive.dart +++ b/lib/features/settings/data/datasources/settings_data_source_hive.dart @@ -6,8 +6,7 @@ import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; import 'package:hive/hive.dart'; import 'package:injectable/injectable.dart'; -@prod -@injectable +@singleton @RegisterAs(SettingsDataSource) class SettingsDataSourceHive implements SettingsDataSource { SettingsDataSourceHive([HiveInterface hive]) diff --git a/lib/features/settings/data/repositories/settings_repository_impl.dart b/lib/features/settings/data/repositories/settings_repository_impl.dart index 68536486..9af57537 100644 --- a/lib/features/settings/data/repositories/settings_repository_impl.dart +++ b/lib/features/settings/data/repositories/settings_repository_impl.dart @@ -7,7 +7,6 @@ import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; import 'package:flutterhole/features/settings/data/repositories/settings_repository.dart'; import 'package:injectable/injectable.dart'; -@prod @singleton @RegisterAs(SettingsRepository) class SettingsRepositoryImpl implements SettingsRepository { diff --git a/lib/features/settings/presentation/blocs/settings_bloc.dart b/lib/features/settings/presentation/blocs/settings_bloc.dart index 016da1b8..1e9a4cb0 100644 --- a/lib/features/settings/presentation/blocs/settings_bloc.dart +++ b/lib/features/settings/presentation/blocs/settings_bloc.dart @@ -47,7 +47,6 @@ abstract class SettingsEvent with _$SettingsEvent { ) = SettingsEventUpdate; } -@prod @singleton class SettingsBloc extends Bloc { SettingsBloc([ diff --git a/lib/features/settings/presentation/pages/add_pihole_page.dart b/lib/features/settings/presentation/pages/add_pihole_page.dart index 2679931e..7453ec27 100644 --- a/lib/features/settings/presentation/pages/add_pihole_page.dart +++ b/lib/features/settings/presentation/pages/add_pihole_page.dart @@ -19,7 +19,7 @@ import 'package:flutterhole/features/settings/presentation/widgets/form/descript import 'package:flutterhole/features/settings/presentation/widgets/form/detected_versions_tile.dart'; import 'package:flutterhole/features/settings/presentation/widgets/form/host_details_status_icon.dart'; import 'package:flutterhole/features/settings/presentation/widgets/form/title_form_tile.dart'; -import 'package:flutterhole/widgets/layout/snackbars.dart'; +import 'package:flutterhole/widgets/layout/notifications/snackbars.dart'; const InputDecoration _decoration = InputDecoration( border: const OutlineInputBorder(), diff --git a/lib/features/settings/presentation/pages/all_pihole_settings_page.dart b/lib/features/settings/presentation/pages/all_pihole_settings_page.dart index 87cb4d4f..40bc37d8 100644 --- a/lib/features/settings/presentation/pages/all_pihole_settings_page.dart +++ b/lib/features/settings/presentation/pages/all_pihole_settings_page.dart @@ -1,15 +1,15 @@ import 'package:animations/animations.dart'; import 'package:flutter/material.dart'; import 'package:flutterhole/dependency_injection.dart'; +import 'package:flutterhole/features/routing/presentation/pages/page_scaffold.dart'; import 'package:flutterhole/features/settings/presentation/blocs/settings_bloc.dart'; import 'package:flutterhole/features/settings/presentation/pages/add_pihole_page.dart'; import 'package:flutterhole/features/settings/presentation/pages/single_pihole_settings_page.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_settings_tile.dart'; -import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; import 'package:flutterhole/features/settings/presentation/widgets/settings_bloc_builder.dart'; -import 'package:flutterhole/widgets/layout/animated_opener.dart'; -import 'package:flutterhole/widgets/layout/dialogs.dart'; -import 'package:flutterhole/widgets/layout/snackbars.dart'; +import 'package:flutterhole/widgets/layout/animations/animated_opener.dart'; +import 'package:flutterhole/widgets/layout/notifications/dialogs.dart'; +import 'package:flutterhole/widgets/layout/notifications/snackbars.dart'; // https://github.com/flutter/packages/blob/ed004de397e3823f2d986ac28a180baf683735ef/packages/animations/example/lib/container_transition.dart#L39 const double _fabDimension = 56.0; @@ -71,11 +71,12 @@ class _PopupMenu extends StatelessWidget { class AllPiholeSettingsPage extends StatelessWidget { @override Widget build(BuildContext context) { - return PiholeThemeBuilder(child: SettingsBlocBuilder( + return SettingsBlocBuilder( builder: (BuildContext context, SettingsState state) { - return Scaffold( + return PageScaffold( + isNested: true, appBar: AppBar( - title: Text('My Piholes'), + title: Text('My Pi-holes'), actions: [ _PopupMenu(), ], @@ -109,7 +110,7 @@ class AllPiholeSettingsPage extends StatelessWidget { }, ), ); - })); + }); } } diff --git a/lib/features/settings/presentation/pages/settings_page.dart b/lib/features/settings/presentation/pages/settings_page.dart index d69ca881..a4a3ee0a 100644 --- a/lib/features/settings/presentation/pages/settings_page.dart +++ b/lib/features/settings/presentation/pages/settings_page.dart @@ -1,41 +1,35 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; import 'package:flutterhole/dependency_injection.dart'; -import 'package:flutterhole/features/routing/presentation/widgets/default_drawer.dart'; +import 'package:flutterhole/features/routing/presentation/pages/page_scaffold.dart'; import 'package:flutterhole/features/routing/services/router_service.dart'; -import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; class SettingsPage extends StatelessWidget { @override Widget build(BuildContext context) { - return PiholeThemeBuilder( - child: Scaffold( - drawer: DefaultDrawer(), - appBar: AppBar( - title: Text('Settings'), - ), - body: ListView( - children: [ -// UserPreferencesListTile(), - ListTile( - title: Text('My Piholes'), - leading: Icon(KIcons.pihole), - trailing: Icon(KIcons.open), - onTap: () { - getIt().push(RouterService.allPiholes); - }, - ), - ListTile( - title: Text('Preferences'), - leading: Icon(KIcons.preferences), - trailing: Icon(KIcons.open), - onTap: () { - getIt().push(RouterService.userPreferences); - }, - ), - - ], - ), + return PageScaffold( + appBar: AppBar( + title: Text('Settings'), + ), + body: ListView( + children: [ + ListTile( + title: Text('My Piholes'), + leading: Icon(KIcons.pihole), + trailing: Icon(KIcons.open), + onTap: () { + getIt().push(RouterService.allPiholes); + }, + ), + ListTile( + title: Text('Preferences'), + leading: Icon(KIcons.preferences), + trailing: Icon(KIcons.open), + onTap: () { + getIt().push(RouterService.userPreferences); + }, + ), + ], ), ); } diff --git a/lib/features/settings/presentation/pages/single_pihole_settings_page.dart b/lib/features/settings/presentation/pages/single_pihole_settings_page.dart index 4c855f9d..a7c18591 100644 --- a/lib/features/settings/presentation/pages/single_pihole_settings_page.dart +++ b/lib/features/settings/presentation/pages/single_pihole_settings_page.dart @@ -19,7 +19,7 @@ import 'package:flutterhole/features/settings/presentation/widgets/form/detected import 'package:flutterhole/features/settings/presentation/widgets/form/host_details_status_icon.dart'; import 'package:flutterhole/features/settings/presentation/widgets/form/title_form_tile.dart'; import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; -import 'package:flutterhole/widgets/layout/dialogs.dart'; +import 'package:flutterhole/widgets/layout/notifications/dialogs.dart'; const InputDecoration _decoration = InputDecoration( border: const OutlineInputBorder(), diff --git a/lib/features/settings/presentation/pages/user_preferences_page.dart b/lib/features/settings/presentation/pages/user_preferences_page.dart index cab335d8..0dfe69f0 100644 --- a/lib/features/settings/presentation/pages/user_preferences_page.dart +++ b/lib/features/settings/presentation/pages/user_preferences_page.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; -import 'package:flutterhole/features/settings/presentation/widgets/pihole_theme_builder.dart'; +import 'package:flutterhole/features/routing/presentation/pages/page_scaffold.dart'; import 'package:flutterhole/features/settings/presentation/widgets/preferences/footer_message_string_preference.dart'; import 'package:flutterhole/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart'; import 'package:flutterhole/features/settings/presentation/widgets/preferences/use_numbers_api_switch_preference.dart'; -import 'package:flutterhole/widgets/layout/dialogs.dart'; -import 'package:flutterhole/widgets/layout/list_title.dart'; +import 'package:flutterhole/widgets/layout/lists/list_title.dart'; +import 'package:flutterhole/widgets/layout/notifications/dialogs.dart'; class UserPreferencesPage extends StatefulWidget { @override @@ -15,28 +15,27 @@ class UserPreferencesPage extends StatefulWidget { class _UserPreferencesPageState extends State { @override Widget build(BuildContext context) { - return PiholeThemeBuilder( - child: Scaffold( - appBar: AppBar( - title: Text('Preferences'), - ), - body: ListView( - children: [ - ListTitle('Customization'), - ThemeRadioPreferences(), - FooterMessageStringPreference(), - ListTitle('Data'), - UseNumbersApiSwitchPreference(), - ListTitle('Misc'), - ListTile( - leading: Icon(KIcons.welcome), - title: Text('Show welcome message'), - onTap: () { - showWelcomeDialog(context); - }, - ), - ], - ), + return PageScaffold( + isNested: true, + appBar: AppBar( + title: Text('Preferences'), + ), + body: ListView( + children: [ + ListTitle('Customization'), + ThemeRadioPreferences(), + FooterMessageStringPreference(), + ListTitle('Data'), + UseNumbersApiSwitchPreference(), + ListTitle('Misc'), + ListTile( + leading: Icon(KIcons.welcome), + title: Text('Show welcome message'), + onTap: () { + showWelcomeDialog(context); + }, + ), + ], ), ); } diff --git a/lib/features/settings/presentation/widgets/form/authentication_status_icon.dart b/lib/features/settings/presentation/widgets/form/authentication_status_icon.dart index f1585725..0aac8565 100644 --- a/lib/features/settings/presentation/widgets/form/authentication_status_icon.dart +++ b/lib/features/settings/presentation/widgets/form/authentication_status_icon.dart @@ -5,9 +5,9 @@ import 'package:flutterhole/constants.dart'; import 'package:flutterhole/core/models/failures.dart'; import 'package:flutterhole/features/settings/blocs/pihole_settings_bloc.dart'; import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; -import 'package:flutterhole/widgets/layout/loading_indicators.dart'; -import 'package:flutterhole/widgets/layout/snackbars.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/notifications/snackbars.dart'; class AuthenticationStatusIcon extends StatelessWidget { const AuthenticationStatusIcon({ diff --git a/lib/features/settings/presentation/widgets/form/detected_versions_tile.dart b/lib/features/settings/presentation/widgets/form/detected_versions_tile.dart index 6374440a..d8f6b165 100644 --- a/lib/features/settings/presentation/widgets/form/detected_versions_tile.dart +++ b/lib/features/settings/presentation/widgets/form/detected_versions_tile.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutterhole/constants.dart'; import 'package:flutterhole/features/settings/blocs/pihole_settings_bloc.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; class DetectedVersionsTile extends StatelessWidget { const DetectedVersionsTile({ diff --git a/lib/features/settings/presentation/widgets/form/host_details_status_icon.dart b/lib/features/settings/presentation/widgets/form/host_details_status_icon.dart index 1ec8c861..b1ea66bb 100644 --- a/lib/features/settings/presentation/widgets/form/host_details_status_icon.dart +++ b/lib/features/settings/presentation/widgets/form/host_details_status_icon.dart @@ -6,9 +6,9 @@ import 'package:flutterhole/core/models/failures.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_status.dart'; import 'package:flutterhole/features/settings/blocs/pihole_settings_bloc.dart'; import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; -import 'package:flutterhole/widgets/layout/failure_indicators.dart'; -import 'package:flutterhole/widgets/layout/loading_indicators.dart'; -import 'package:flutterhole/widgets/layout/snackbars.dart'; +import 'package:flutterhole/widgets/layout/indicators/failure_indicators.dart'; +import 'package:flutterhole/widgets/layout/indicators/loading_indicators.dart'; +import 'package:flutterhole/widgets/layout/notifications/snackbars.dart'; class _SuccessIconButton extends StatelessWidget { const _SuccessIconButton({ diff --git a/lib/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart b/lib/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart index e40c7d17..715deaba 100644 --- a/lib/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart +++ b/lib/features/settings/presentation/widgets/preferences/theme_radio_preferences.dart @@ -20,7 +20,7 @@ class ThemeRadioPreferences extends StatelessWidget { '${ThemeModeEnumMap[ThemeMode.system].capitalize} theme', '${ThemeModeEnumMap[ThemeMode.system]}', KPrefs.themeMode, - isDefault: true, +// isDefault: true, onSelect: () => notifier.update(), leading: Icon(KIcons.themeSystem), ), diff --git a/lib/features/settings/services/preference_service_impl.dart b/lib/features/settings/services/preference_service_impl.dart index 3b95eb1c..63cbc257 100644 --- a/lib/features/settings/services/preference_service_impl.dart +++ b/lib/features/settings/services/preference_service_impl.dart @@ -8,11 +8,11 @@ import 'package:preferences/preferences.dart'; @preResolve @singleton @RegisterAs(PreferenceService) -class PrServiceImpl implements PreferenceService { +class PreferenceServiceImpl implements PreferenceService { @factoryMethod - static Future create() async { + static Future create() async { await PrefService.init(); - return PrServiceImpl(); + return PreferenceServiceImpl(); } dynamic _get(String key) { diff --git a/lib/main.dart b/lib/main.dart index 30c1d6fa..8bfc6fc1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,28 +3,34 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/core/debug/bloc_delegate.dart'; import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/pihole_api/blocs/pi_connection_bloc.dart'; +import 'package:flutterhole/features/routing/presentation/widgets/double_back_to_close_app.dart'; import 'package:flutterhole/features/routing/services/router_service.dart'; import 'package:flutterhole/features/settings/presentation/blocs/settings_bloc.dart'; import 'package:flutterhole/features/settings/presentation/notifiers/theme_mode_notifier.dart'; import 'package:injectable/injectable.dart'; import 'package:provider/provider.dart'; -void main() async { +void main([List arguments = const [Environment.prod]]) { // wait for flutter initialization WidgetsFlutterBinding.ensureInitialized(); - // Configure service injection - await configure(Environment.prod); + print('args: $arguments'); - if (foundation.kReleaseMode) {} else { - enableBlocDelegate(); - } + // Configure service injection + List args = List.from(arguments) ?? []; + if (args.isEmpty) args.add(Environment.prod); + configure(args.first).then((_) { + if (foundation.kReleaseMode) { + } else { + enableBlocDelegate(); + } - getIt().createRoutes(); - getIt().add(SettingsEvent.init()); - getIt().add(PiConnectionEvent.ping()); + getIt().createRoutes(); + getIt().add(SettingsEvent.init()); + getIt().add(PiConnectionEvent.ping()); - runApp(MyApp()); + runApp(MyApp()); + }); } class MyApp extends StatelessWidget { @@ -33,24 +39,28 @@ class MyApp extends StatelessWidget { return ChangeNotifierProvider( create: (_) => ThemeModeNotifier(), child: Consumer( - builder: (BuildContext context, - ThemeModeNotifier notifier, - _,) { - return MaterialApp( - title: 'FlutterHole', - navigatorKey: getIt().navigatorKey, - onGenerateRoute: getIt().onGenerateRoute, - initialRoute: RouterService.home, - theme: ThemeData( - brightness: Brightness.light, - primaryColor: Colors.red, - visualDensity: VisualDensity.adaptivePlatformDensity, - ), - darkTheme: ThemeData( - brightness: Brightness.dark, - visualDensity: VisualDensity.adaptivePlatformDensity, + builder: ( + BuildContext context, + ThemeModeNotifier notifier, + _, + ) { + return DoubleBackToCloseApp( + child: MaterialApp( + title: 'FlutterHole', + navigatorKey: getIt().navigatorKey, + onGenerateRoute: getIt().onGenerateRoute, + initialRoute: RouterService.home, + theme: ThemeData( + brightness: Brightness.light, + primaryColor: Colors.red, + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + darkTheme: ThemeData( + brightness: Brightness.dark, + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + themeMode: notifier.themeMode, ), - themeMode: notifier.themeMode, ); }, ), diff --git a/lib/test_dependency_injection.dart b/lib/test_dependency_injection.dart new file mode 100644 index 00000000..0b7f0cf5 --- /dev/null +++ b/lib/test_dependency_injection.dart @@ -0,0 +1,45 @@ +import 'package:alice/alice.dart'; +import 'package:dio/dio.dart'; +import 'package:flutterhole/features/pihole_api/data/datasources/api_data_source.dart'; +import 'package:flutterhole/features/settings/services/package_info_service.dart'; +import 'package:hive/hive.dart'; +import 'package:injectable/injectable.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sailor/sailor.dart'; + +@Environment(Environment.test) +@injectable +@RegisterAs(ApiDataSource) +class MockApiDataSource extends Mock implements ApiDataSource {} + +@Environment(Environment.test) +@injectable +@RegisterAs(PackageInfoService) +class MockPackageInfoService extends Mock implements PackageInfoService {} + +class MockHive extends Mock implements HiveInterface {} + +@registerModule +abstract class RegisterTestModule { + @test + @injectable + Dio get dio => Dio(); + + @test + @singleton + HiveInterface get hive => MockHive(); + + @test + @singleton + Sailor get sailor => Sailor( + options: SailorOptions( + isLoggingEnabled: true, + )); + + @test + @singleton + Alice get alice => Alice( + showNotification: false, + darkTheme: true, + ); +} diff --git a/lib/widgets/layout/animate_on_build.dart b/lib/widgets/layout/animations/animate_on_build.dart similarity index 100% rename from lib/widgets/layout/animate_on_build.dart rename to lib/widgets/layout/animations/animate_on_build.dart diff --git a/lib/widgets/layout/animated_opener.dart b/lib/widgets/layout/animations/animated_opener.dart similarity index 100% rename from lib/widgets/layout/animated_opener.dart rename to lib/widgets/layout/animations/animated_opener.dart diff --git a/lib/widgets/layout/timer_builder.dart b/lib/widgets/layout/animations/timer_builder.dart similarity index 100% rename from lib/widgets/layout/timer_builder.dart rename to lib/widgets/layout/animations/timer_builder.dart diff --git a/lib/widgets/layout/copy_button.dart b/lib/widgets/layout/copy_button.dart index 04f25680..eaec9f01 100644 --- a/lib/widgets/layout/copy_button.dart +++ b/lib/widgets/layout/copy_button.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutterhole/constants.dart'; -import 'package:flutterhole/widgets/layout/snackbars.dart'; +import 'package:flutterhole/widgets/layout/notifications/snackbars.dart'; const String _tooltip = 'Copy to clipboard'; diff --git a/lib/widgets/layout/failure_indicators.dart b/lib/widgets/layout/indicators/failure_indicators.dart similarity index 94% rename from lib/widgets/layout/failure_indicators.dart rename to lib/widgets/layout/indicators/failure_indicators.dart index ecff409b..a19c3c26 100644 --- a/lib/widgets/layout/failure_indicators.dart +++ b/lib/widgets/layout/indicators/failure_indicators.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; import 'package:flutterhole/core/models/failures.dart'; -import 'package:flutterhole/widgets/layout/dialogs.dart'; +import 'package:flutterhole/widgets/layout/notifications/dialogs.dart'; class CenteredFailureIndicator extends StatelessWidget { const CenteredFailureIndicator( diff --git a/lib/widgets/layout/loading_indicators.dart b/lib/widgets/layout/indicators/loading_indicators.dart similarity index 100% rename from lib/widgets/layout/loading_indicators.dart rename to lib/widgets/layout/indicators/loading_indicators.dart diff --git a/lib/widgets/layout/percentage_box.dart b/lib/widgets/layout/indicators/percentage_bar_indicator.dart similarity index 87% rename from lib/widgets/layout/percentage_box.dart rename to lib/widgets/layout/indicators/percentage_bar_indicator.dart index a72177b6..43f18eec 100644 --- a/lib/widgets/layout/percentage_box.dart +++ b/lib/widgets/layout/indicators/percentage_bar_indicator.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; -class PercentageBox extends StatelessWidget { +class PercentageBarIndicator extends StatelessWidget { final double width; final double fraction; final Color color; - const PercentageBox({Key key, - @required this.width, + const PercentageBarIndicator( + {Key key, + @required this.width, @required this.fraction, this.color = Colors.green}) : super(key: key); diff --git a/lib/widgets/layout/frequency_tile.dart b/lib/widgets/layout/lists/frequency_tile.dart similarity index 94% rename from lib/widgets/layout/frequency_tile.dart rename to lib/widgets/layout/lists/frequency_tile.dart index ff623f92..e0f311d7 100644 --- a/lib/widgets/layout/frequency_tile.dart +++ b/lib/widgets/layout/lists/frequency_tile.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutterhole/widgets/layout/percentage_box.dart'; +import 'package:flutterhole/widgets/layout/indicators/percentage_bar_indicator.dart'; import 'package:intl/intl.dart'; final _numberFormat = NumberFormat(); @@ -58,7 +58,7 @@ class FrequencyTile extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.symmetric(vertical: 2.0), - child: PercentageBox( + child: PercentageBarIndicator( color: this.color, width: 100, fraction: _fraction, diff --git a/lib/widgets/layout/list_title.dart b/lib/widgets/layout/lists/list_title.dart similarity index 100% rename from lib/widgets/layout/list_title.dart rename to lib/widgets/layout/lists/list_title.dart diff --git a/lib/widgets/layout/list_with_header.dart b/lib/widgets/layout/lists/list_with_header.dart similarity index 100% rename from lib/widgets/layout/list_with_header.dart rename to lib/widgets/layout/lists/list_with_header.dart diff --git a/lib/widgets/layout/open_url_tile.dart b/lib/widgets/layout/lists/open_url_tile.dart similarity index 91% rename from lib/widgets/layout/open_url_tile.dart rename to lib/widgets/layout/lists/open_url_tile.dart index 012ff253..3b32880c 100644 --- a/lib/widgets/layout/open_url_tile.dart +++ b/lib/widgets/layout/lists/open_url_tile.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/browser/services/browser_service.dart'; -import 'package:flutterhole/widgets/layout/snackbars.dart'; +import 'package:flutterhole/widgets/layout/notifications/snackbars.dart'; class OpenUrlTile extends StatelessWidget { const OpenUrlTile({ diff --git a/lib/widgets/layout/menu_list_tile.dart b/lib/widgets/layout/menu_list_tile.dart deleted file mode 100644 index 4545e8b2..00000000 --- a/lib/widgets/layout/menu_list_tile.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:flutter/material.dart'; - -class MenuListTile extends StatelessWidget { - final String title; - final double leftPadding; - - - MenuListTile(this.title, {this.leftPadding = 10.0, }); - @override - Widget build(BuildContext context) { - return Padding( - padding: EdgeInsets.only(left: leftPadding, bottom: 0.0, top: 20.0), - child: Text( - title, - style: - TextStyle( - color: Theme.of(context).accentColor, - fontWeight: FontWeight.bold), - ), - ); - } -} diff --git a/lib/widgets/layout/notifications/copy_button.dart b/lib/widgets/layout/notifications/copy_button.dart new file mode 100644 index 00000000..eaec9f01 --- /dev/null +++ b/lib/widgets/layout/notifications/copy_button.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutterhole/constants.dart'; +import 'package:flutterhole/widgets/layout/notifications/snackbars.dart'; + +const String _tooltip = 'Copy to clipboard'; + +/// An [IconButton] with copy-to-clipboard support. +/// +/// If [onCopy] is `null`, shows a [SnackBar]. +class CopyIconButton extends StatelessWidget { + const CopyIconButton( + this.data, { + Key key, + this.onCopy, + }) : assert(data != null), + super(key: key); + + final String data; + final VoidCallback onCopy; + + @override + Widget build(BuildContext context) { + return IconButton( + tooltip: _tooltip, + icon: Icon(KIcons.copy), + onPressed: () { + Clipboard.setData(ClipboardData(text: data)).then((_) { + if (onCopy != null) + onCopy(); + else + showInfoSnackBar( + context, + 'Copied to clipboard: $data', + ); + }); + }); + } +} + +/// A [FlatButton] with copy-to-clipboard support. +/// +/// If [onCopy] is `null`, shows a [SnackBar]. +class CopyFlatButton extends StatelessWidget { + const CopyFlatButton( + this.data, { + Key key, + this.onCopy, + }) : assert(data != null), + super(key: key); + + final String data; + final VoidCallback onCopy; + + @override + Widget build(BuildContext context) { + return FlatButton.icon( + label: Text(_tooltip), + icon: Icon(KIcons.copy), + onPressed: () { + Clipboard.setData(ClipboardData(text: data)).then((_) { + if (onCopy != null) + onCopy(); + else + showInfoSnackBar( + context, + 'Copied to clipboard: $data', + ); + }); + }); + } +} + +class AnimatedCopyTile extends StatefulWidget { + const AnimatedCopyTile( + this.data, { + Key key, + }) : super(key: key); + + final String data; + + @override + _AnimatedCopyTileState createState() => _AnimatedCopyTileState(); +} + +class _AnimatedCopyTileState extends State { + bool copied = false; + + @override + Widget build(BuildContext context) { + return Tooltip( + message: _tooltip, + child: ListTile( + title: Text(widget.data), + onTap: () async { + setState(() { + copied = true; + }); + + Clipboard.setData(ClipboardData(text: widget.data)); + await Future.delayed(Duration(seconds: 2)); + setState(() { + copied = false; + }); + }, + trailing: Stack( + alignment: Alignment.center, + children: [ + AnimatedOpacity( + opacity: copied ? 1 : 0, + duration: kThemeChangeDuration, + child: Icon( + KIcons.success, + color: KColors.success, + ), + ), + AnimatedOpacity( + opacity: copied ? 0 : 1, + duration: kThemeChangeDuration, + child: Icon( + KIcons.copy, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/layout/dialogs.dart b/lib/widgets/layout/notifications/dialogs.dart similarity index 96% rename from lib/widgets/layout/dialogs.dart rename to lib/widgets/layout/notifications/dialogs.dart index 27086049..afd91b1b 100644 --- a/lib/widgets/layout/dialogs.dart +++ b/lib/widgets/layout/notifications/dialogs.dart @@ -5,8 +5,8 @@ import 'package:flutterhole/constants.dart'; import 'package:flutterhole/core/models/failures.dart'; import 'package:flutterhole/dependency_injection.dart'; import 'package:flutterhole/features/browser/services/browser_service.dart'; -import 'package:flutterhole/widgets/layout/copy_button.dart'; -import 'package:flutterhole/widgets/layout/snackbars.dart'; +import 'package:flutterhole/widgets/layout/notifications/copy_button.dart'; +import 'package:flutterhole/widgets/layout/notifications/snackbars.dart'; import 'package:package_info/package_info.dart'; Future showWelcomeDialog(BuildContext context) { diff --git a/lib/widgets/layout/snackbars.dart b/lib/widgets/layout/notifications/snackbars.dart similarity index 100% rename from lib/widgets/layout/snackbars.dart rename to lib/widgets/layout/notifications/snackbars.dart diff --git a/lib/widgets/layout/toasts.dart b/lib/widgets/layout/notifications/toasts.dart similarity index 91% rename from lib/widgets/layout/toasts.dart rename to lib/widgets/layout/notifications/toasts.dart index b2dec321..4ce55411 100644 --- a/lib/widgets/layout/toasts.dart +++ b/lib/widgets/layout/notifications/toasts.dart @@ -15,6 +15,8 @@ ToastGravity _ToastPositionToToastGravity(ToastPosition position) { } } +Future cancelToast() => Fluttertoast.cancel(); + Future showToast(String message, { ToastPosition position = ToastPosition.Bottom, }) async { diff --git a/pubspec.lock b/pubspec.lock index 97fe2bc8..a2e38610 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -197,6 +197,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.1" + country_pickers: + dependency: transitive + description: + name: country_pickers + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" coverage: dependency: transitive description: @@ -281,6 +288,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.3" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" fixnum: dependency: transitive description: @@ -301,7 +315,7 @@ packages: name: flushbar url: "https://pub.dartlang.org" source: hosted - version: "1.10.2" + version: "1.10.4" flutter: dependency: "direct main" description: flutter @@ -328,13 +342,18 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.3.4" + flutter_driver: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" flutter_form_builder: dependency: "direct main" description: name: flutter_form_builder url: "https://pub.dartlang.org" source: hosted - version: "3.9.0" + version: "3.10.1" flutter_keyboard_visibility: dependency: transitive description: @@ -416,7 +435,7 @@ packages: name: flutter_typeahead url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" flutter_vector_icons: dependency: "direct main" description: @@ -442,7 +461,7 @@ packages: name: freezed url: "https://pub.dartlang.org" source: hosted - version: "0.10.8" + version: "0.10.9" freezed_annotation: dependency: "direct main" description: @@ -450,6 +469,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.7.1" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" get_it: dependency: "direct main" description: @@ -583,6 +607,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.1" + json_rpc_2: + dependency: transitive + description: + name: json_rpc_2 + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" json_serializable: dependency: "direct dev" description: @@ -639,13 +670,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.1.1" - modal_bottom_sheet: - dependency: "direct main" - description: - name: modal_bottom_sheet - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.5" multi_server_socket: dependency: transitive description: @@ -695,6 +719,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.3.0" + ozzie: + dependency: "direct dev" + description: + name: ozzie + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.3" package_config: dependency: transitive description: @@ -779,6 +810,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" + phone_number: + dependency: transitive + description: + name: phone_number + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.2+3" platform: dependency: transitive description: @@ -807,6 +845,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "5.2.0" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.12" protobuf: dependency: transitive description: @@ -820,7 +865,7 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "4.1.1" + version: "4.1.2" pub_semver: dependency: transitive description: @@ -904,7 +949,7 @@ packages: name: share url: "https://pub.dartlang.org" source: hosted - version: "0.6.4+2" + version: "0.6.4+3" shared_preferences: dependency: transitive description: @@ -961,6 +1006,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.3" + signature: + dependency: transitive + description: + name: signature + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" sky_engine: dependency: transitive description: flutter @@ -1042,7 +1094,14 @@ packages: name: supercharged url: "https://pub.dartlang.org" source: hosted - version: "1.5.1" + version: "1.6.0" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" synchronized: dependency: transitive description: @@ -1058,7 +1117,7 @@ packages: source: hosted version: "1.1.0" test: - dependency: transitive + dependency: "direct dev" description: name: test url: "https://pub.dartlang.org" @@ -1098,7 +1157,7 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "5.4.7" + version: "5.4.10" url_launcher_macos: dependency: transitive description: @@ -1162,6 +1221,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.2" + vm_service_client: + dependency: transitive + description: + name: vm_service_client + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.6+2" wakelock: dependency: transitive description: @@ -1183,6 +1249,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" webkit_inspection_protocol: dependency: transitive description: @@ -1206,4 +1279,4 @@ packages: version: "2.2.1" sdks: dart: ">=2.7.2 <3.0.0" - flutter: ">=1.17.0 <2.0.0" + flutter: ">=1.16.0 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index da0deaac..dc3c079a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: injectable: ^0.3.0 # state management bloc: ^4.0.0 - provider: ^4.1.1 + provider: ^4.1.2 # http client dio: ^3.0.9 dio_http_cache: ^0.2.6 @@ -38,9 +38,9 @@ dependencies: clock: ^1.0.1 # utilities - supercharged: ^1.5.1 + supercharged: ^1.6.0 flutter_bloc: ^4.0.0 - flutter_form_builder: ^3.9.0 + flutter_form_builder: ^3.10.1 barcode_scan: ^3.0.1 preferences: ^5.2.0 jiffy: ^3.0.1 @@ -50,11 +50,10 @@ dependencies: flutter_vector_icons: ^0.2.1 flutter_staggered_grid_view: ^0.3.0 animations: ^1.0.0+5 - modal_bottom_sheet: ^0.1.5 flutter_spinkit: ^4.1.2+1 fl_chart: ^0.9.4 flutter_sticky_header: ^0.4.2 - flushbar: ^1.10.2 + flushbar: ^1.10.4 fluttertoast: ^4.0.1 pull_to_refresh: ^1.5.8 @@ -64,18 +63,21 @@ dependencies: # about page package_info: ^0.4.0+18 qr_flutter: ^3.2.0 - share: ^0.6.4+2 + share: ^0.6.4+3 launch_review: ^2.0.0 - url_launcher: ^5.4.7 - flutter_markdown: ^0.3.5 + url_launcher: ^5.4.10 + flutter_markdown: 0.3.5 dev_dependencies: flutter_test: sdk: flutter + flutter_driver: + sdk: flutter + test: any # code generation build_runner: ^1.10.0 # data model & sealed union code generation - freezed: ^0.10.8 + freezed: ^0.10.9 # generators injectable_generator: ^0.3.5 # toJson/fromJson generator @@ -88,6 +90,8 @@ dev_dependencies: fake_async: ^1.1.0 # icon generation flutter_launcher_icons: ^0.7.5 + # flutter_driver extras + ozzie: ^2.2.3 flutter: uses-material-design: true diff --git a/release_notes.txt b/release_notes.txt index e840473d..27cb3452 100644 --- a/release_notes.txt +++ b/release_notes.txt @@ -1,6 +1,6 @@ * Fix: Pi-holes without a password and API token can now toggle off the API token requirement. -* Feature: the queries over time chart is back. +* Feature: the queries/clients over time charts are back. * Feature: errors are now more verbose. diff --git a/test/blocs/home_bloc_test.dart b/test/blocs/home_bloc_test.dart index 046ff900..c16107a8 100644 --- a/test/blocs/home_bloc_test.dart +++ b/test/blocs/home_bloc_test.dart @@ -6,6 +6,7 @@ import 'package:flutterhole/features/home/blocs/home_bloc.dart'; import 'package:flutterhole/features/pihole_api/data/models/dns_query_type.dart'; import 'package:flutterhole/features/pihole_api/data/models/forward_destinations.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; import 'package:flutterhole/features/pihole_api/data/models/summary.dart'; import 'package:flutterhole/features/pihole_api/data/models/top_items.dart'; import 'package:flutterhole/features/pihole_api/data/models/top_sources.dart'; @@ -55,6 +56,10 @@ void main() { final SummaryModel tSummary = SummaryModel(domainsBeingBlocked: 123); final OverTimeData tOverTimeData = OverTimeData(domainsOverTime: {}, adsOverTime: {}); + final OverTimeDataClients tOverTimeDataClients = OverTimeDataClients( + clients: [], + data: {}, + ); final TopSourcesResult tTopSources = TopSourcesResult(topSources: {}); final TopItems tTopItems = TopItems(topQueries: { 'a': 5, @@ -75,6 +80,8 @@ void main() { .thenAnswer((_) async => Right(tSummary)); when(mockApiRepository.fetchQueriesOverTime(any)) .thenAnswer((_) async => Right(tOverTimeData)); + when(mockApiRepository.fetchClientsOverTime(any)) + .thenAnswer((_) async => Right(tOverTimeDataClients)); when(mockApiRepository.fetchTopSources(any)) .thenAnswer((_) async => Right(tTopSources)); when(mockApiRepository.fetchTopItems(any)) @@ -92,6 +99,7 @@ void main() { HomeStateSuccess( Right(tSummary), Right(tOverTimeData), + Right(tOverTimeDataClients), Right(tTopSources), Right(tTopItems), Right(tForwardDestinations), @@ -109,6 +117,8 @@ void main() { .thenAnswer((_) async => Right(tSummary)); when(mockApiRepository.fetchQueriesOverTime(any)) .thenAnswer((_) async => Right(tOverTimeData)); + when(mockApiRepository.fetchClientsOverTime(any)) + .thenAnswer((_) async => Right(tOverTimeDataClients)); when(mockApiRepository.fetchTopSources(any)) .thenAnswer((_) async => Left(Failure())); when(mockApiRepository.fetchTopItems(any)) @@ -126,6 +136,7 @@ void main() { HomeStateSuccess( Right(tSummary), Right(tOverTimeData), + Right(tOverTimeDataClients), Left(Failure()), Left(Failure()), Left(Failure()), @@ -140,6 +151,7 @@ void main() { final tFailure3 = Failure('test #3'); final tFailure4 = Failure('test #4'); final tFailure5 = Failure('test #5'); + final tFailure6 = Failure('test #6'); blocTest( 'Emits [$HomeStateLoading, $HomeStateFailure] when $HomeEventFetch fails', @@ -150,14 +162,16 @@ void main() { .thenAnswer((_) async => Left(tFailure0)); when(mockApiRepository.fetchQueriesOverTime(any)) .thenAnswer((_) async => Left(tFailure1)); - when(mockApiRepository.fetchTopSources(any)) + when(mockApiRepository.fetchClientsOverTime(any)) .thenAnswer((_) async => Left(tFailure2)); - when(mockApiRepository.fetchTopItems(any)) + when(mockApiRepository.fetchTopSources(any)) .thenAnswer((_) async => Left(tFailure3)); - when(mockApiRepository.fetchForwardDestinations(any)) + when(mockApiRepository.fetchTopItems(any)) .thenAnswer((_) async => Left(tFailure4)); - when(mockApiRepository.fetchQueryTypes(any)) + when(mockApiRepository.fetchForwardDestinations(any)) .thenAnswer((_) async => Left(tFailure5)); + when(mockApiRepository.fetchQueryTypes(any)) + .thenAnswer((_) async => Left(tFailure6)); return bloc; }, @@ -171,6 +185,7 @@ void main() { tFailure3, tFailure4, tFailure5, + tFailure6, ])), ], ); diff --git a/test/features/numbers_api/data/datasources/numbers_api_data_source_dio_test.dart b/test/features/numbers_api/data/datasources/numbers_api_data_source_dio_test.dart index 213c36b2..4218ffb4 100644 --- a/test/features/numbers_api/data/datasources/numbers_api_data_source_dio_test.dart +++ b/test/features/numbers_api/data/datasources/numbers_api_data_source_dio_test.dart @@ -6,7 +6,7 @@ import 'package:flutterhole/core/models/exceptions.dart'; import 'package:flutterhole/features/numbers_api/data/datasources/numbers_api_data_source_dio.dart'; import 'package:mockito/mockito.dart'; -import '../../../../fixture_reader.dart'; +import '../../../../../lib/core/debug/fixture_reader.dart'; import '../../../../test_dependency_injection.dart'; class MockHttpClientAdapter extends Mock implements HttpClientAdapter {} diff --git a/test/features/pihole_api/blocs/single_client_bloc_test.dart b/test/features/pihole_api/blocs/single_client_bloc_test.dart index 874dcddd..5e4ec367 100644 --- a/test/features/pihole_api/blocs/single_client_bloc_test.dart +++ b/test/features/pihole_api/blocs/single_client_bloc_test.dart @@ -49,7 +49,7 @@ void main() { ); group('$SingleClientEventFetchQueries', () { - final PiClient client = PiClient(title: 'test'); + final PiClient client = PiClient(name: 'test'); final List queries = [QueryData(clientName: 'test')]; final tFailure = Failure(); diff --git a/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart b/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart index 5bd32c67..9d110bba 100644 --- a/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart +++ b/test/features/pihole_api/data/datasources/api_data_source_dio_test.dart @@ -18,7 +18,7 @@ import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; import 'package:mockito/mockito.dart'; import 'package:supercharged/supercharged.dart'; -import '../../../../fixture_reader.dart'; +import '../../../../../lib/core/debug/fixture_reader.dart'; import '../../../../test_dependency_injection.dart'; class MockHttpClientAdapter extends Mock implements HttpClientAdapter {} @@ -328,9 +328,9 @@ void main() async { await apiDataSourceDio.fetchQueryDataForClient( piholeSettings, PiClient( - title: 'client', - ip: '1.2.3.4', - )); + name: 'client', + ip: '1.2.3.4', + )); // assert expect(result, equals(ManyQueryData.fromJson(json))); }, diff --git a/test/features/pihole_api/data/repositories/api_repository_impl_test.dart b/test/features/pihole_api/data/repositories/api_repository_impl_test.dart index 5d1ea8d3..36de22e2 100644 --- a/test/features/pihole_api/data/repositories/api_repository_impl_test.dart +++ b/test/features/pihole_api/data/repositories/api_repository_impl_test.dart @@ -232,7 +232,7 @@ void main() async { }); group('fetchQueryDataForClient', () { - final PiClient client = PiClient(title: 'test.org'); + final PiClient client = PiClient(name: 'test.org'); test( 'should return reversed List on successful fetchQueriesForClient', diff --git a/test/fixtures/over_time_data_clients.json b/test/fixtures/over_time_data_clients.json new file mode 100644 index 00000000..da2e1024 --- /dev/null +++ b/test/fixtures/over_time_data_clients.json @@ -0,0 +1,2000 @@ +{ + "clients": [ + { + "name": "", + "ip": "10.0.1.12" + }, + { + "name": "", + "ip": "10.0.1.2" + }, + { + "name": "hello", + "ip": "10.0.1.15" + }, + { + "name": "", + "ip": "10.0.1.1" + }, + { + "name": "", + "ip": "10.0.1.17" + }, + { + "name": "localhost", + "ip": "127.0.0.1" + }, + { + "name": "", + "ip": "1.2.3.4" + }, + { + "name": "", + "ip": "10.0.1.7" + }, + { + "name": "", + "ip": "10.0.1.18" + }, + { + "name": "", + "ip": "10.0.1.6" + }, + { + "name": "", + "ip": "10.0.1.9" + }, + { + "name": "and finally", + "ip": "10.0.1.13" + } + ], + "over_time": { + "1590084300": [ + 9, + 90, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 0, + 0, + 0 + ], + "1590084900": [ + 196, + 73, + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 0, + 0, + 0 + ], + "1590085500": [ + 130, + 49, + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 0, + 0, + 0 + ], + "1590086100": [ + 119, + 58, + 0, + 0, + 0, + 0, + 0, + 0, + 17, + 0, + 0, + 0 + ], + "1590086700": [ + 86, + 36, + 0, + 0, + 0, + 0, + 0, + 0, + 17, + 0, + 0, + 0 + ], + "1590087300": [ + 51, + 21, + 0, + 4, + 0, + 0, + 0, + 0, + 42, + 0, + 0, + 0 + ], + "1590087900": [ + 112, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 17, + 0, + 0, + 0 + ], + "1590088500": [ + 79, + 37, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0 + ], + "1590089100": [ + 141, + 124, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + "1590089700": [ + 127, + 27, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "1590090300": [ + 92, + 38, + 0, + 0, + 0, + 0, + 3, + 0, + 6, + 0, + 0, + 0 + ], + "1590090900": [ + 94, + 31, + 0, + 4, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "1590091500": [ + 152, + 40, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590092100": [ + 61, + 39, + 0, + 0, + 0, + 0, + 0, + 0, + 5, + 0, + 0, + 0 + ], + "1590092700": [ + 50, + 116, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590093300": [ + 58, + 34, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 0, + 0 + ], + "1590093900": [ + 34, + 53, + 0, + 0, + 0, + 0, + 1, + 0, + 17, + 0, + 0, + 0 + ], + "1590094500": [ + 63, + 89, + 0, + 4, + 0, + 0, + 0, + 0, + 18, + 0, + 0, + 0 + ], + "1590095100": [ + 64, + 50, + 0, + 0, + 0, + 0, + 0, + 0, + 10, + 0, + 0, + 0 + ], + "1590095700": [ + 32, + 84, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 0, + 0 + ], + "1590096300": [ + 58, + 74, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 0, + 0, + 0 + ], + "1590096900": [ + 45, + 42, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 0, + 0 + ], + "1590097500": [ + 51, + 50, + 0, + 0, + 0, + 0, + 0, + 0, + 13, + 0, + 0, + 0 + ], + "1590098100": [ + 81, + 7, + 0, + 4, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0 + ], + "1590098700": [ + 38, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590099300": [ + 37, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 9, + 0, + 0, + 0 + ], + "1590099900": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 30, + 0, + 0, + 0 + ], + "1590100500": [ + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 13, + 0, + 0, + 0 + ], + "1590101100": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 0, + 0 + ], + "1590101700": [ + 110, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 16, + 0, + 0, + 0 + ], + "1590102300": [ + 119, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 0, + 0, + 0 + ], + "1590102900": [ + 25, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0 + ], + "1590103500": [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590104100": [ + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0 + ], + "1590104700": [ + 3, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0 + ], + "1590105300": [ + 24, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590105900": [ + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590106500": [ + 21, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "1590107100": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 0, + 0, + 0 + ], + "1590107700": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590108300": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590108900": [ + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590109500": [ + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0, + 0, + 0 + ], + "1590110100": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590110700": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590111300": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590111900": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590112500": [ + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590113100": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 18, + 0, + 0, + 0 + ], + "1590113700": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590114300": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "1590114900": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590115500": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "1590116100": [ + 0, + 0, + 0, + 4, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0 + ], + "1590116700": [ + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + "1590117300": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "1590117900": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590118500": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590119100": [ + 15, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590119700": [ + 2, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590120300": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590120900": [ + 1, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0 + ], + "1590121500": [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590122100": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590122700": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590123300": [ + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590123900": [ + 5, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "1590124500": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590125100": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590125700": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "1590126300": [ + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0, + 0, + 0 + ], + "1590126900": [ + 4, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590127500": [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 19, + 0, + 0, + 0 + ], + "1590128100": [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590128700": [ + 15, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590129300": [ + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590129900": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 57, + 0, + 0, + 0 + ], + "1590130500": [ + 2, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 54, + 0, + 0, + 0 + ], + "1590131100": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 81, + 0, + 0, + 0 + ], + "1590131700": [ + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 104, + 2, + 0, + 0 + ], + "1590132300": [ + 3, + 57, + 0, + 0, + 0, + 0, + 2, + 0, + 19, + 0, + 0, + 0 + ], + "1590132900": [ + 188, + 93, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 0, + 0 + ], + "1590133500": [ + 112, + 59, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590134100": [ + 48, + 19, + 0, + 4, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0 + ], + "1590134700": [ + 72, + 70, + 0, + 0, + 0, + 26, + 1, + 0, + 1, + 0, + 0, + 0 + ], + "1590135300": [ + 74, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 20, + 0, + 0, + 0 + ], + "1590135900": [ + 82, + 31, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0 + ], + "1590136500": [ + 28, + 14, + 0, + 0, + 0, + 0, + 0, + 0, + 23, + 0, + 0, + 0 + ], + "1590137100": [ + 15, + 23, + 0, + 0, + 0, + 0, + 4, + 0, + 6, + 0, + 0, + 0 + ], + "1590137700": [ + 5, + 8, + 0, + 4, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0 + ], + "1590138300": [ + 30, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 22, + 0, + 0, + 0 + ], + "1590138900": [ + 19, + 14, + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 0, + 0, + 0 + ], + "1590139500": [ + 75, + 34, + 0, + 0, + 0, + 0, + 0, + 0, + 21, + 0, + 0, + 0 + ], + "1590140100": [ + 182, + 17, + 0, + 0, + 0, + 0, + 0, + 0, + 42, + 0, + 0, + 0 + ], + "1590140700": [ + 29, + 13, + 0, + 0, + 0, + 0, + 2, + 0, + 2, + 0, + 0, + 0 + ], + "1590141300": [ + 3, + 12, + 0, + 4, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "1590141900": [ + 5, + 10, + 0, + 0, + 0, + 0, + 0, + 0, + 42, + 0, + 0, + 0 + ], + "1590142500": [ + 16, + 7, + 0, + 0, + 0, + 0, + 0, + 0, + 86, + 0, + 0, + 0 + ], + "1590143100": [ + 7, + 18, + 0, + 0, + 0, + 0, + 0, + 0, + 78, + 0, + 0, + 0 + ], + "1590143700": [ + 23, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 0, + 0, + 0 + ], + "1590144300": [ + 48, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 29, + 0, + 0, + 0 + ], + "1590144900": [ + 30, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 5, + 0, + 0, + 0 + ], + "1590145500": [ + 138, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 0, + 0 + ], + "1590146100": [ + 56, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 0, + 0, + 0 + ], + "1590146700": [ + 69, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0 + ], + "1590147300": [ + 34, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 24, + 0, + 0, + 0 + ], + "1590147900": [ + 25, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 53, + 0, + 0, + 0 + ], + "1590148500": [ + 99, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 35, + 0, + 0, + 0 + ], + "1590149100": [ + 47, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 61, + 0, + 0, + 0 + ], + "1590149700": [ + 10, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + "1590150300": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590150900": [ + 32, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0 + ], + "1590151500": [ + 0, + 81, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0 + ], + "1590152100": [ + 0, + 62, + 0, + 4, + 0, + 0, + 0, + 0, + 9, + 0, + 0, + 0 + ], + "1590152700": [ + 0, + 14, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0 + ], + "1590153300": [ + 0, + 38, + 0, + 0, + 0, + 0, + 0, + 0, + 10, + 0, + 0, + 0 + ], + "1590153900": [ + 0, + 41, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0 + ], + "1590154500": [ + 0, + 31, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 0, + 0, + 0 + ], + "1590155100": [ + 0, + 15, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0 + ], + "1590155700": [ + 0, + 28, + 0, + 4, + 0, + 0, + 0, + 0, + 5, + 0, + 0, + 0 + ], + "1590156300": [ + 0, + 13, + 0, + 0, + 0, + 0, + 5, + 0, + 11, + 0, + 0, + 0 + ], + "1590156900": [ + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 0, + 0 + ], + "1590157500": [ + 0, + 17, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "1590158100": [ + 0, + 23, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0 + ], + "1590158700": [ + 0, + 17, + 0, + 0, + 0, + 0, + 1, + 0, + 4, + 0, + 0, + 0 + ], + "1590159300": [ + 0, + 38, + 0, + 4, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0 + ], + "1590159900": [ + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 0, + 0, + 0 + ], + "1590160500": [ + 0, + 22, + 0, + 0, + 0, + 6, + 0, + 0, + 2, + 0, + 0, + 0 + ], + "1590161100": [ + 0, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "1590161700": [ + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 0, + 0, + 0 + ], + "1590162300": [ + 0, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0 + ], + "1590162900": [ + 0, + 18, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590163500": [ + 0, + 7, + 0, + 0, + 0, + 0, + 0, + 0, + 5, + 0, + 0, + 0 + ], + "1590164100": [ + 0, + 14, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590164700": [ + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "1590165300": [ + 0, + 7, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "1590165900": [ + 0, + 12, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0 + ], + "1590166500": [ + 0, + 28, + 0, + 4, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0 + ], + "1590167100": [ + 0, + 20, + 0, + 0, + 0, + 0, + 2, + 0, + 5, + 0, + 0, + 0 + ] + } +} \ No newline at end of file diff --git a/test/fixtures/single_pi_client.json b/test/fixtures/single_pi_client.json index 93575388..48953b9b 100644 --- a/test/fixtures/single_pi_client.json +++ b/test/fixtures/single_pi_client.json @@ -1,4 +1,4 @@ { - "title": "localhost", + "name": "localhost", "ip": "127.0.0.1" } \ No newline at end of file diff --git a/test/model_test.dart b/test/model_test.dart index 0eac8436..1ef52f83 100644 --- a/test/model_test.dart +++ b/test/model_test.dart @@ -6,6 +6,7 @@ import 'package:flutterhole/features/pihole_api/data/models/forward_destinations import 'package:flutterhole/features/pihole_api/data/models/many_query_data.dart'; import 'package:flutterhole/features/pihole_api/data/models/model.dart'; import 'package:flutterhole/features/pihole_api/data/models/over_time_data.dart'; +import 'package:flutterhole/features/pihole_api/data/models/over_time_data_clients.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_client.dart'; import 'package:flutterhole/features/pihole_api/data/models/pi_versions.dart'; import 'package:flutterhole/features/pihole_api/data/models/query_data.dart'; @@ -16,7 +17,7 @@ import 'package:flutterhole/features/pihole_api/data/models/top_sources.dart'; import 'package:flutterhole/features/pihole_api/data/models/whitelist.dart'; import 'package:flutterhole/features/settings/data/models/pihole_settings.dart'; -import 'fixture_reader.dart'; +import '../lib/core/debug/fixture_reader.dart'; void testMapModel( String fixtureName, Function1, T> fromJson) { @@ -59,6 +60,8 @@ void main() { 'get_query_types.json', (json) => DnsQueryTypeResult.fromJson(json)); testMapModel( 'over_time_data_10mins.json', (json) => OverTimeData.fromJson(json)); + testMapModel('over_time_data_clients.json', + (json) => OverTimeDataClients.fromJson(json)); testMapModel('top_items.json', (json) => TopItems.fromJson(json)); testMapModel( 'single_pi_client.json', (json) => PiClient.fromJson(json)); @@ -67,7 +70,7 @@ void main() { testMapModel('single_forward_destination.json', (json) => ForwardDestination.fromJson(json)); testMapModel('get_forward_destinations.json', - (json) => ForwardDestinationsResult.fromJson(json)); + (json) => ForwardDestinationsResult.fromJson(json)); testListModel( 'blacklist.json', (json) => Blacklist.fromList(json)); testListModel( @@ -82,7 +85,6 @@ void main() { 'status_disabled.json', (json) => ToggleStatus.fromJson(json)); testMapModel( 'get_versions.json', (json) => PiVersions.fromJson(json)); - testMapModel( 'pihole_settings_default.json', (json) => PiholeSettings.fromJson(json)); } diff --git a/test/test_dependency_injection.dart b/test/test_dependency_injection.dart index ce306f09..40057250 100644 --- a/test/test_dependency_injection.dart +++ b/test/test_dependency_injection.dart @@ -4,7 +4,7 @@ import 'package:injectable/injectable.dart'; Future setUpAllForTest() async { setUpAll(() async { - await configure(Environment.test); TestWidgetsFlutterBinding.ensureInitialized(); + await configure(Environment.test); }); -} \ No newline at end of file +} diff --git a/test_driver/app.dart b/test_driver/app.dart new file mode 100644 index 00000000..61f5df0d --- /dev/null +++ b/test_driver/app.dart @@ -0,0 +1,11 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_driver/driver_extension.dart'; +import 'package:flutterhole/main.dart' as app; +import 'package:injectable/injectable.dart'; + +void main() { + enableFlutterDriverExtension(); + WidgetsApp.debugAllowBannerOverride = + false; // remove debug banner for screenshots + app.main([Environment.dev]); +} diff --git a/test_driver/app_test.dart b/test_driver/app_test.dart new file mode 100644 index 00000000..67ef200f --- /dev/null +++ b/test_driver/app_test.dart @@ -0,0 +1,78 @@ +import 'dart:io'; + +import 'package:flutter_driver/flutter_driver.dart'; +import 'package:ozzie/ozzie.dart'; +import 'package:test/test.dart'; + +main() { + group('checking', () { + FlutterDriver driver; + Ozzie ozzie; + + setUpAll(() async { + driver = await FlutterDriver.connect(); + ozzie = Ozzie.initWith( + driver, + groupName: 'home', + shouldTakeScreenshots: true, + ); + }); + + tearDownAll(() async { + print('tearDownAll'); + + driver?.close(); + ozzie?.generateHtmlReport(); + }); + + test('Home page', () async { + await driver.clearTimeline(); + + await driver.tap(find.text('Got it!')); + + await ozzie.takeScreenshot('summary_top'); + + await driver.tap(find.text('Total Queries')); + + expect(driver.getText(find.text('Powered by')), completes); + + await ozzie.takeScreenshot('summary_numbers_wiki'); + + await driver.tap(find.byTooltip('Back')); + + await driver.scrollIntoView(find.byType('TotalQueriesOverDayTile')); + + await ozzie.takeScreenshot('summary_middle_1'); + + await driver.scrollIntoView(find.byType('QueryTypesTile')); + + await driver.waitFor(find.text('AAAA (IPv6)')); + + await ozzie.takeScreenshot('summary_middle_2'); + + await driver.scrollIntoView(find.byType('ForwardDestinationsTile')); + + await ozzie.takeScreenshot('summary_bottom'); + + await driver.scroll(find.byType('ForwardDestinationsTile'), -300, 0, + Duration(milliseconds: 500)); + + await ozzie.takeScreenshot('clients_all'); + + await driver.tap(find.text('10.0.1.2 (openelec)')); + + await ozzie.takeScreenshot('client_single'); + + await driver.tap(find.byTooltip('Back')); + + print('done with screenshots'); + + exit(0); + }); + }); +} + +// await driver.scroll( +// find.byType('FrequencyTile'), -300, 0, Duration(milliseconds: 500)); +// +// await Future.delayed(Duration(seconds: 2)); From 125e58b0450393da429f5364657864d2b8a2ac5a Mon Sep 17 00:00:00 2001 From: thomas-sterrenburg Date: Sun, 24 May 2020 10:48:44 +0200 Subject: [PATCH 09/11] Ignoring gradle.properties --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f11de03c..93864a62 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ android/app/upload_certificate.pem /ios/Runner/Assets.xcassets/AppIcon.appiconset/ android/key.properties /ozzie/ +/gradle.properties From a920c508772f5c978bbbb68492e1b2806902d8c3 Mon Sep 17 00:00:00 2001 From: thomas-sterrenburg Date: Mon, 25 May 2020 10:39:24 +0200 Subject: [PATCH 10/11] =?UTF-8?q?Adding=20new=20logo=20with=20an=20easter?= =?UTF-8?q?=20egg=20=F0=9F=A5=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 2 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 2310 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 1460 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 3323 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 5332 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 7632 bytes android/settings_aar.gradle | 1 + assets/icon/icon.png | Bin 52556 -> 33381 bytes assets/icon/logo.png | Bin 0 -> 8191 bytes assets/icon/old_icon.png | Bin 0 -> 52556 bytes assets/images/logos.jpeg | Bin 0 -> 73394 bytes .../Icon-App-1024x1024@1x.png | Bin 88702 -> 151480 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 677 -> 669 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1477 -> 1730 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 2483 -> 2943 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1050 -> 1084 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 2440 -> 2808 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 3822 -> 4752 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1477 -> 1730 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 3382 -> 4328 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 5297 -> 6791 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 5297 -> 6791 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 9050 -> 9603 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 3244 -> 4029 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 7249 -> 8635 bytes .../Icon-App-83.5x83.5@2x.png | Bin 8396 -> 9367 bytes lib/constants.dart | 1 + lib/dev_dependency_injection.dart | 195 +++++++++++++++-- .../widgets/clients_over_day_tile.dart | 2 +- .../summary/widgets/graph_legend_item.dart | 1 - .../presentation/pages/about_page.dart | 205 +++++++++++++++++- .../presentation/widgets/default_drawer.dart | 15 +- .../settings_data_source_hive.dart | 2 +- .../presentation/pages/add_pihole_page.dart | 1 - .../widgets/pihole_theme_builder.dart | 4 +- .../services/package_info_service_impl.dart | 1 - lib/main.dart | 3 +- lib/widgets/layout/notifications/dialogs.dart | 37 +++- .../layout/notifications/snackbars.dart | 5 +- pubspec.yaml | 13 +- test_driver/app_test.dart | 16 +- 41 files changed, 450 insertions(+), 54 deletions(-) create mode 100644 android/settings_aar.gradle create mode 100644 assets/icon/logo.png create mode 100644 assets/icon/old_icon.png create mode 100644 assets/images/logos.jpeg diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 9e80e7a8..a77f535b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -14,7 +14,7 @@ + android:icon="@mipmap/ic_launcher"> Cu%9GjKWm_%bFNl6yMrJx*&9MK3t*E32GBq*LlPHzizyLm|+Gr3}$DTeINA|Z)V=SdHs9c|L*>#-haqs(vXHUq#=ziKc0}; z+IBap37a0vm@n&Qw3ofpwy7P!+{I$7!o^~d!o@OD;bs+~aJ5?2r6$f9=Pqo3EuDwd z@AD`lYSva7Xvr=VD6E?{mlt+Y#-85}} z^tdNtGKG_JTz@MZqwpNHDR;3@$(=07)XsE*y3HK{^n~0|8D^}2V3XY0f}XLHFTbCq zI|!(onS*jo>%oi>kPvJEND;?jrURhvX8%&IHFiKI?aRah)x2EBN{~*t3ABx_)n)aRihEARTfi9L_q?^?h zRNq)nB^9OQyT+gDn;NL5u7*m*I&$Va+M1P23pRgF?=PA_gM0>)xvN#z2V^m^ zKaKqCEr0S`8%PtDI8aUfZMu8+?gMA(tuh95M|J0+`(^x;L1X9HkyrFoonh$}5W>fE zg%2IgJI2PUR4Q7(KaQeyMN@NgbEg1R-mapLm%7k}l3)1o&FY&Jm!3ejL2nv9AY4gD zaqONut$a6{}hnr!~v9W zFn@_dN%N%PNoOwQ(dvC`$#=Cs*#^JK219rYuU(*PH%mB7-~ks)FOknGU*SQOJj*Mu zQ}Oj;%Da4)b{^X$bZ0y{g}YKvd zDa+{m)j|#hgiX$cpJ?93g%lJQBC=L08-JVepG*o(4r^Cu9;QJ6=@I2gw`y();Adz} z>N@e6pHS@ncmcAU_o-{Bqx76ZG-LfN`ZP9}9KxLFS=WC01BBXS;pWBcIaR^~(u6il zUmHM)2RE<*IMJhLv#CL(?N&pv?JdIW>W!-%0<LI>`m>30N_DSG@mc2 zD4}U<{ImrAwkQw$goj>f2P!}S(onzQv}|XTmaxYjh^J@W`soKyV9ZRd6W*AyS)}t7 zlyY<@3vBWAD_Z+NQ$iBwus5L~JbzJel9um|X2C{94NusVxs@)JT^54eB#Omz6!?|) zXCajL2ra_r94|P*AqcNh-{=V>v2FILZK!2$)_)72&^HTBr*2BqMOpcoUj(!V8#CNMGLwr#TVrjxtv5+1e*19oopt5zq>B?E@yiKvt6m zur48$!y5q`+n9jS&)u4Adsa>yvCAyE;wn0cRE)O6O^EfmE9W1&n%I#gSF8u2rNIJR*!Bnx zxsHae!7SS2#D8tP|HdA)K^XNzVGgJ0_Fz2>5W==dc+(+KnTMxD(!2BQ*jsg7yf?_N zeV{Qf2w3=b1EGX|EHrs37j&pwP!ixPjLv{e#+bSqs|WEd znT|?&`iP5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..a7d767fe82d34b2497e22af2913eb798115b475e 100644 GIT binary patch delta 1453 zcmV;e1ycID1GEc}8Gi-<00374`G)`i1$#+EK~#9!?O6#>lw}y+(iqe!Cq==3#YGZL z(V8+lJaQG&%$jMYaR6IZVE|1_^Bi?Ft#lOS23Lg4AR{kSZj^E55D@VOJiuEdk!#oG zKIZBDK5+v>SewP&oc(6r*?<54|Gxiu-s5@y-A^Pk4PzcNMStByQfYUC8pH6+W4-8Q zZpJd62~VpV#d2|9L2f%paDBttAV$w-7}~?uA$Y-4=qYxwQ3$hb?u+F%<%TqlK}J{z zQ|BaFF4BY$nhYXgG$uGo!U)<+Pbbh)EP}IOLEsUQhxPS4_qN#XYT|%WE~X(d=LiRTx3q|R{Oq-JSRMWY zGV(KV;l@Q2-n)hes#27x%bxi|Bm zX%!t7!L`4yZ%aa-1U_0a0l{(Gu{}N%dAIUWO5S8Sy(>AKdys)Va{6e8DWs{b`Y!M`iwLpW(0S3CU@V1ElTu#Y_z5FG^1pl@*g`UPz?9#(5O zp!$Y-{=KoW5rI_Hm6}R4H9xv1=jv%BwIa#VCzuG$4VsUv%P099b(I=lZFJNxf$>zZ zMP>K+Lu>2nu$fYTsmhZcKAahYoPyJ&LnccBPJx@h2fU;FcwIzL3f(HXt-YT` zl7C%`$%>DD1FpCB?4oDwcgrA zWZe8cc>xafu&WR4SP0W<|bz@0Do+a@`vS6P&Df(x=f|Ql6LBsfVJF~gJcW) z9S(%^78#D6Q}VDg)rnN@!3T@S>(um^%E*1(ka;PKyzY;CWyM&uV+q#n{)sn2Ruf|u zjn%&jjio3sJ+Eu1_> ztF`LJ8f2TU+$EiO{=1|?TX4Ij6EjaT)nNJ^n)nO0M)^=mEX8a}lko)9aq}#A1kR(b zycQt|q142@u_j_2@6b$gt4SQvNPp3syuR-GPTb~Qh*F9bE(6ZG?qike>|KcU1eW)V z44W_aam5h#;f8w~W%)XJ)l|&i_ALUVgLy|~y`Z3|5F7V;;WFtzliSqXG+sCB|M;1_ zEyFwCy>I$GU?N~5U?T8B68Jy=x!ZTD@TSp5;A6{CPbbi_Y0yX7XQ0?cQh&yGXpCut z!^yh5_n6+cj|hmmceKT1ZuzBnpCFTflQ05fSo+Tp4idH=y6lm4GqW}9L796cB z1~^I7g3}-s`+T1E_?hJSihk3rV$3YfSo(C+b*Hii*i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@U}uMa(3V& z0N{47hO&}z5Prv++&se(414%H;-40X%CtQTa#?$hN=m9$8$=4Spz-xG?ACrGdDl5H z)6x%Er!B0d;a%TiOz&6Z#4SKU!F}>;j#eK?9w+}xV&N2RGunZ>=-TVb_fZ_ZTrMB4 zD2!)y`#-1(vKmS1xrVssnWpnMoPAS0QTlqOxHM5WFY#TE9mAg2>fJhtJZ`J9Uv~1e z+wV5-dG}nLDCMWCldXgpfUz4mv)Zq@ zm+7_X<~T|&Ka}o(t~@7v?q7M2dg*9=9fDwdhhIS6gQ@#ZM{{H!H;1_FI^`CY1&}oW z___x%^&gZ%j^b({jo!_9nWPc2ql+0|32(6yu#L64X@|{{+)4;>(`tsbStsFa zNROiLnJLRHk9i3&cyb}LJZXy=yw<;us#z>~*Lpt`ZskRF{uM{C1ha~Grn+s*mRJS|!&8z#w#^seiRH563fKPbflK4@3XwYwSF zmD3XEMHGe~lO;wK#c_K2{!~@{5}nHprz@b)2MQ3=6D0yvqW*hH{|p(7Q4b)KE?|5* zYgn#fT{+ZZvwD~&+(8=pdL@o#YOp+4eh)OIx3DF@5#T0+OT$j4)+pE-1L+-+p?HII zgZmYilKeRhy(y+U$j5YwY7=jT4g7yjnB1&)=3N)@%sgKZ-aN?_+tewgPe zi!XKBb8UjyZn>G15f+!)itU0bn?~hm-7`{rk1KD zH|YVQyd;YRzu@JwL~fqHeemEnv4}WtTKqprMJdv_i`lIUZa_Ze_XEM>{4Jfp-TCv` zE%C;0Ec79uB^!LepVP8N65`cS zFR$o-A{HJQ##Fm_MEd2sY)V+B4!tWLKV%S5z1EFy2{}cg=}z4X5p2HWm+ocsI#L;u z#Aw}JReq5?=-4JFJ5~mr9uH+x%Dw8G=%k9*DDuzQMYLHMmX(yL2MM~-z#sJnuFR0g z6K=m*WdAe-&y8}x?kt@UgJ9~3=nzx4mxgKpD<&q&tv%RRR1dpIjy!*=#%a0$)c2lD z_&Or5nfyh-W9oV5ju&GjTL~Uv6Ff=pC&RSC=wO0$B}3hOm#%%N^mtV8f}vL!N7pNq z`W4uR!dfh*t?Z;kTx+oT5wk`6s+A$ddJoeH*j5aXf=W(nUvLkBQ1UW)*}Uf2>M00q zbVS6j0Xb(ch^I*n_t#{$6m%Qk*F;DO)1QG6x)~f62xTyP8 zo(GYgoX8!qsI*Q4(u#%%G z(&jicnKAOCGJ)V5A0u7nKgxueB6lr%PAvVoV5-G9mxog(a6deG;;i|co!p+11D^*9 zaL<3&oEi0gv)VZ&2P(~w}$5Z)1HQk>Nf3Dn7c+SL06ZDBaa;@9kXAo z$XSq**5!-%(mQ-$o>fg0Hl6^`3K5h-&{1aw>)Lf77!Iq@LnanEON=@;5GSm|r<7dJ zdPw}kVNhSAfB88TKhi#l7iB#zFD3rm#by@U>!g{l`Yo`iK0iy$|JRjx&R~Hwc=DnV zk2$DVv)b4BarB6sc6AQQa6xwA;2Bp3@o7rJI7tuljR{CfF(J9uQ8c zbn!Ec9mV=@aE}>R@M|6bK60&~->H*Gl&M3gcKn9dO|poEP^@lX+R^tTanH<0{F}t+ zIf5R}#F$I4%EF#V1h&Uv7WwC1aF?h{hA}F-d*#X^pHerq0Gym=zRv!y3shMj<;+Zcj zO{%%WUP8nQ2H7v9TT-M;*F1HprGRx49b_6#v&id$?@hz(%^BE;t~ z^kkD|UAuL$R&+WcDA9?jMyOMf)(fCM(CR=zt2`p(cm0Dy=eIn37&}m3nAhD=81Ud` zg!DC4Y5}N2Gr>6CK}4$dMb^iy3Eb1gpMoxM&DD+YqFJB9S0Eclcg#NFvfWM~YndDH z@=_*+{Nv&{_T{jNxoodf(W?&>NXFxMj3F9b=LDvZJXxWyD-fxk(+Ewa(c-7upNU|k?kJU0?aCBycp zsk4|O<{w0GiSzyLzQ+Z|4NAhxQ#SaBGxuA`bLuwS0Sb;RN5a#)`$a}sdM{i01DlvO z=@uJFNfXIi$ugz6qW$vvbZAtRYWz28T+Kh6k`}(5wljZvXnP$!Y_xt8(ZkV1%rKy0 zjtoII?oc6IdJY;46I8Ay&2VEVDt^ZU@>xgdyywU$?okWNwnd=xp4$v0K;M}}J0Iw< zo2r$znpmpeAEa(n+v$0}08Rv=;#rWR5yJfAYvGpbY9F*~in!jal6xxwms&5OfrY-D zylosaeE&cggHs`i_r|l{&X02fYhypK)sNq0W_^GVGT|9d4wW96re7uQ_g}sJM}gNX zo>YR~RgW#hwScS~KG&${m`W_IekA07IH+45e+`w+|HJwwxD7@rw(BsbPp2xGP#^uhdTL-b*)~tWj6gXBVUriF$d!~L$zs3 zkT0@%CPGHr8MY-Hb3>8HAGO`}@;QA}>$pu}fqsfZQ{G3j-esjdt3<~&p+ z`(%nQ`*@-(`(%P|rBVLNw)@(UvYq{^3udAFbAg1|1hZQbse}TJ*!lZ1Lta0bC{-iu z@)3h23)0M|%BtEI(#KTY{$@z<8;)6wu{IiImyR0uyJ-2nO{DV6HaU7Q?xyu8K`MB9 z&D9p??Ab${4FKDf2zFgk#hUOqlF(?FoZA}d@Fuh99r?$Cga7nc8T@3JkC4Ykyi{^P$W_DE6$Kv}wnYcE9pzBT|26y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..e818bfa6a48784e41efed9e4388585e9a4603f4f 100644 GIT binary patch literal 5332 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 I{3PUm0P+DOKmY&$ literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..faac6f0e7c3945f9975fbb1e685e08624654467a 100644 GIT binary patch literal 7632 zcmb7}cQhQp*Y}s`Nw8|v=tPM`@78A3s7r|6HU!Z{Z$Ypmu{vvY(WCdWh_-r!M7O%= zy|>5jkLR!VeV+5af6UB1^PPL=%$%8XW5(wK^D^0Pz&i?Suj$IGhFQihZ_8VQ82dPSe zs$Fp<@W12BgS`gVK|HJWn&{k(_O#i=z#4-lx>enR+{J6PNJX`7JqZWqgEj0npMECPm2`&Ik&S@QPDZ$>)*$Ud}4*K9H6h_>naOZT90juT&WPn(y1Bgi#IF^W3)A!~kOx$28F5Wjhlc*($zjxNv`Cs9iQ!I^Aw#oySmBMO@ zl$13^bNSVWVV@)uIvX*JX2N$^p{=dxH|IDbQHWzNlL3fsp5f^H{49y-rF4cLxFk=i zAXVlPOif4o3ErBU0=Gl`VyTU^`Zsu+5j$pf{YbD{**u?(objuJrNJjI;%b3@v7$gh`c`;Az~!A2}dm(ZSCmLIPaEa~XQ?>?J+XowX=d@vGkXCuvVIQ4JlG zoo{e>LO1~pFnkyH>$MOA8h*YK&}t;PP-uUmbn=w^Y5pW{(zUW4AZjp@pj$*$0@`4+ z*tGO0nJ1PTc5a^Y$z-r`^y^ZI^aWGlX&zce5uqO(?^3K1f4+?G05K<6Y!EGk6mD6U>)%U;fUgTk_Fxn*;4{g>hllNrPpE_0 zj_|c>U921Q^T4qW!HNJ$6C5h^^ZdH|3Gi_->qIQdJj5)SB%o|uZ5$pwz<*pp_*wTh z)x8P6w+aDNB-Fv+d;MM}xmUCQN0B=C|BQ3*&I`Er$IrqgV&&kV74M!l`4EMD({JMM zMWVr9+DEre7hiWbLv8K1-*aK=-BuIy$jFiGZ9vhDS>tfxAm{12npews!Uyxe zCgWu_s!b(%&!*Sd?x$l3Q<-mSKnN8%66?-WG!0WuAlCxohjRC1ED65ReUQ7}wLUtT zg|GE~mrqr6NJ{x*{5NGtx;|y@$}252f()74`we+o?h!YFyd0=sJBKgZ?0ssrnLwM` zbe?{-S?$3Ng}iA?v1`*5x3>8z+R5GK;2U%s*XaD-!2Rf;fmeX=iv70tVSkF*~MWAu>`1WLTC!?J2Bud6dXinuBASm#x3r@M#zW6|2 zJ8fu|`e>+NOew`ye%H=vE1=++vq2n$PwhXevq;!=DQeufFxDV@T~=A$oAxJdB86Q! zCS|!d<{|M7tK$oN1d`_)lf2C-)2wr#X)DHme@8igD~${}9W(JTNTCo=MUX;q4L3Z< z5f#6ky(}OnIpWX`v8e+l03RJd}1<#YgxAZ`U#xIWqg5sR}y{W?hJckLY^utk#7?{+lqlD3PkM0rheM}6AVo1gD8q_(-e3ypzB(waJ1?w^ zx|$7o-$vw*X_y%LD(fV~xr>J2@0-&GOV6BL*CeOjU5!wDJy1kxNQ=!RW_`c*udipW zv-yRtplbj9aX@{JyF5NMXd%U*E9ihT&e5+f&3R2jh^f?FD@ANYor4;*P$%2<^!iW9 zTFg+%4?`E5w7|a1w$u{lAAG{g%42fGlN&?!I4slOUhM*b*rUrEq2ij+=Xsgp=;Nv;QoKxLtiF$ekem!$fo5@hc6gz>c-^)HACPZ#Ve9vY zwE9FC*@ohuc%2YFB!b@E3r7kbpRf1;9eY{N`oj%h3>GcMW8*c%s6j*zgSD|)p1YZS4~;-vcmZOH|nWVDz?s$O=2UzY;0 zF(R^Zf%76;V_^TV*HVeed#^0Ks#V=S@A5t)cIBuy^}M5IBN(KVi|G<#EG2M+wof4hbxs8 zSI)gZq{xcC7%-dzNO64Xd!_Rl$)q6Sqe((%D{$3!Om|UbcRo85x3iJ28f;JYH%@!8 z0`8oa`Z^FXsG;K5E;Y14ZK;%Q0d5%l$x!bcr!BDbPuw?{C?T<@RSD0i*7)&Ql{o`& zr0V0qU^aV1D7~H0elOVlD|KN09z!9(f4PVG>${{!J%cfhF`ZY_=i-AJvS}$*>3k#` z@H~?%y#P3F<+Gl<8DEfe_1&*e2sp0m-Q+sd-J(1#F=wa!lub{aOS^F^v8q$UUbIB# zMFt&%gZc0!@6oI8yum?fviw(*n91Rl1OGNy{>t=n&E*jVtB?)BO4;vPr2q5EyRA(0 z=<#h!IV7-ddzP2jb>*np4u88UJPu%%xgYMYpDfP&B4S5fO9ZYVf0%|LQG8TN68Xu{ z?^lY!5HBBnkOl`=)Ylntq>gYK0-n|X;E(JHQEIAg9rMAm*hk>#c!*3i#?y-hAO8GF-dyDDYIINECq z`S*dyqWnZRg(&jR$T6^ZRjSYK5;kpnIN1Ld`)U2{PIgJxV5hRAE+%CJq@AayeZ36V zPo%Q^=zYTM^E7phvJh~KQ%x&OEBM*)TLm`wWvDD(gs?U$<~^?hTNc+mOati*UH zcPk%XVfi2YyYRfmP5l?wGC&rt>{wytw8t~z7~$o0xx2uG$k+G?Rotxnq<^pMN0C5b zCFJFZ7zLD_fG9k4b9g0%Adg7Tr`>w<#j@^H?Z=6~9`Rq3hXMg@F|q-5`0Z*v;k22d z)oErkX1|&AeSb5#WEcXG$4#a=`n$G_lAc{(GLLG*J~WzNXZuBXQpb-@+=XiG4=Rt~ zV;P}1-k{kVbum6w^QSZ4GYp5~PyHLWt(>MSRn5f2UZ5Xn3b-D9LF~rcu|r@x1YU#t znhq6s`_0r6I>lA#yqBCX=do}P!W>f>L9W#L9edF3_>Hq?{GV^ON|9c>Q9iaJSNmjz z-?ee@3;`cleoR$y%~dn3^|@!ZETqnr28@WIn`f<=UpBu>@aQ_?`&h)=HSm5^{RLio zK$Y~Mtv3JDNV?hqr2I|W6CQNJwxh(zmYM^z)pTBxRE80SrS`y!>Slm9Fpu`!7>S8{ zq%g}#R~?y57kRWv5knm|(k&)ujN5M0TeOPK=O>cMb{hF4OF`w5>DPT#oML|a_MaEV zV|_l|O0x(Matz@0`oUG#f^FnWGZ=7tq*ESPT1H7$&NZA?zC<1b`c7Rk;FuJQM)j7G z16I0NyWv_|=pZ8t!b|vBCe0CoX{~s!I6Cz#?*`eH`PHH@n+Pe0n8R-`_4p;_7dQmI z@{IawHjc*gRDI^REt(TUo^P@qW%F;M^V;Zdz>r%cN!5aSzIf$sd-em0HwvhstGc+W zP=1E(lUS};GfS|LIt|JIT>S|VbW?Y-q#~?9zL6^79GBYcmQi%7EdcCl)|KD)`_t9d zbbZVB2G9YpiEjHgHxoY}+aSSUgus5qZ53V(I3SFC|ErxBk$O~gmKkeE%Eo+V$z@T+ z+J#?2qjC(t#QPaB@zI$D!nc_B+`^es|GQZIP`l^vSgYCXgR0H%Yq08xPs{xQ>c%4M zoo67GCxppU8Mcb7U#?`?K(I-QE%O?iO6=$}A>}s!9NaiW&VsoD#%PMxqAnArk(jX5 zj>je%?AD9Uy}D{`YGCmN@3BNS2kgmTsBCL3FvfqMYOtm3yF3>E{G>UPAw z+IdiUG<0LR^sWofU8BoJu$KIA%<=i^u9yw|6{m^x#@y{TeKok%{)U|z6wG3OG_mU# z*gAREcB5@(?{-%wXHE}6TG)ywz2EkZ>l2C-B|c!0hjbBhPJI}TYRn&CnCluOvDxhX z6Z2Ozw5P@D?@g^HUby48i!m>~wnzEi&T;APn6I6eS3Pg!f}EzBR)q}pYOPEbZ4G%C zJa~fv3Rcr*@+2lKZY6<^9D(Wjk}Seht}JD@|jal zFTDuC^pl-p`~4v6;o*&HerFI%8`taTS1rL<5O1XXq9qqm+%k*2Vc7<}Y&0dAnpzl> ziQu`oe%WUage$qHHh2^U6}&%8@u`CD)&q_&*X)GkoSW$ zWT{GI$0kmnmILFv0CL7r8o~P0apJJ|<$)A9&q6w=*cXTVmV&QKJyXKND4$M4MQhyxDUPN`e_oLLE z$(|`0c#|Grtm@lfJO+9-t0V7k>A8dDT-1oWYaojwxPfm`{#*@Ir9SJ`VtaA_xgm$x zC0zgsIB(T`0d3+N>wSTej>j|HN}2C>OfkBhNa9JfhesB2vm~oS&uN%HT;<` zg6`&iA{1B%DR9|U2(@KURpR!PcVxYp!cVS=secO8-TDFV6n*6DDfUz8QV}NB;5`+_ ze&b3`Y>nPG+|%VEZQPmsdyX&BlA&Zs7V$y(9m*A26T>XcRkHS8`U-pa)3IPTLe=uL zN-|KgD$LYSXM;|yxJI55==X#-m?c=mrb>EaR=pn2YVtaL=_FK+Wc1*{B*f}L6xIB3 z%L};}9_7B%WFnonhcD@P;2c6>eeKVM_`p2%6upElUXBNjJTzbcq*10@UNp~I(HHlj zI`a+s2~V3c_fEpcUl|W1PvMQ2t8DGeK*h)yudE{S4ymH<;jWWRJC1JxrxI!4YbL@} z|EEzeyo+iCv&UXuh_#|pTMRST*b-`z?8Us_i!P}qm$7Fm))PZqI)xvvz7x6v8a<8> zCYyfrp8K2hsDRi?O6wG3*R^G0)@KqQ9Xnat_I`t+*VGq}j9OUef2+A<^;Nz5$ngRM zgr@hFC)z5Lf7<8$1#4ib2Q4ZhLdm>~S_YSP)Y5%_U8lvVk``On*;GejU$Mv;ht8xj zrO`D%jV~&yy_y29Zb1;U?zrc2`H%)wA()hEJ!O$Rc~e^-6Lr-8Mb`6F!f;9^HDj(@ zK~o?FB;D=Lp@ z6}l#vXl@$Q+0cs1K4xQ$oJ)Nn*W2vyr5OteuIYN zuchbbTtE}4AJ3miGPZVe7XHnQp!WXWBkS&?`SvQn>?=6=`j`!%U8ikk5S^Gd9$prFf7!N%NVCFsQiG+Z7gX)oI1{a(V1+ zU5GB_{vWO7-~2^gH6#MR0`<*(OJ$>>1P^>?>x*bLf4Am%(y-QSgcB10L z*pA7MpjvpS+c)T9VSY}pZIPi~Dr9ZhSA-)dx8FqZ&=2uO(jPrTO5{C0zRj$BUD+ZS zkN@-c#iw88GXcmfoVELd?RPW$;^v^fi4pr!!YE3N{WHrsaf%M)W6DlSB_{gL zcUK&`_V1=z@0}?ueba>ou#WP1N~X9&~iVl{?f>#|`s>vu97A)UxNz=(iN=y0h2;e6+tJT~)m{xi2m&(7!pUHR9Nr6*k zLzcd%;*y4bA3p1>l(D=d8qH}^+^R4F_49C>x%u(rNbCX8T&3!YB;Ul?tH?R1dW4I3 zkV$-Of5Xg`NHPnqc`hRS8`TG=i+H=OEf!fdtyN?m1zThP6WNVEn$4xgtipSJT6Xkg+3{%yT&lju~0>Jwz;|v*g9Io3IjPWF&Bw$Os z9Za0MTkg+88_|7fs_)MX&;PSj}9IRjQg^_9CWvMQ$zXQEIc4hk#!W;Z0?ZI(P_B<`P zVEy|mE~^!)Py4_7atqQJp5d(E1D~rqcqM3XLvc@~39aIjT0FO;sy%j~a3n%TEMWBP z_ot8wzKOmQ%Ut(CzJkBMHp9NrjLRYt)#8|$mL^j*`7}q)Fm`Ms1tS=Afu@^fEt`1M z(&=#mxXNv~YC@q*Z=-tr0E|x#i$D+<3&t>8z)zaBC>jLQb=PFmUQu&C4w*gsvMUPv zL;SJ`j)S8!19Ilnr_slQcDIW6Kr@oVu^^7pQc9u6#D##68n&7PRP@Pl#E6<*)(kC` zP@qsi7*z`>FlykXosjRjA`el!w3(LCne;uO(B~IF7IsPb@iU-@bO%r#^O zXf?Q(8`e9vUbt@XA9d6}?K@BsH(pPokEq~oAz_hmbKHOWA`Mf;v6tcY8d?J+G=26S z+Pxu=!XlAH{+DtBE07PLk%)?adrqHqjkqD`msB-ZVx-!6l)j(8ap0kc9w%L$-v4|=j|IR`Po^sRHyg)NJDFIMTsR4k*#6FFMg$_AoRkXfu z@4~s6MSCW zF09p^_&4zj!RGxyVEboUvnOh}m_?IE15nH8JT?u=z`A@yETRw%QnaYPtDLm)JS{hX z6|Mg5Cha|xL=6CWaV2`$oFQoc(bJI}{1R%Xk+{#xIp|K*A9He zFbC%0&k2A?JjLnPeD-(zhX0WN$gG?+UYru#>H~R%Xf9MQn^khXbt`PfRU}qj_}Ax*|<7O);$~8Y6JfGr$PV1jRC^-8~U*dv*KFMO7lvfDLrPRJQs^ z6lXZ#iEXX7Dt!{D=k7Sn7+5u57ZJt80XyE&B(L`;miVH>{52k$K(hkSLikeD zJd{P4aEw6{X#Fnn(%i2Bz`a1g2(0eyOoft0t$HacD@;++PdCvm zQ;@B2B}yUNrGaHOa-S#*)k&9peZi!;O7iZo85ffZ#*=ss36JAQpk{q-VcjeBV2xBg}7DSB5@+8ib)h?Gg+ zmdiTIg+0i=q@!^d>iH>m`&#qu7FZC%TZP|(^}&gFc){p|T6f_zkf45`5hK;g`vzsw0T-24>H*UeIePH`TwUxDDeDTzFNCA V@o%79$$h34psJ_|DFa)C{1+hki?RR! literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/android/settings_aar.gradle b/android/settings_aar.gradle new file mode 100644 index 00000000..e7b4def4 --- /dev/null +++ b/android/settings_aar.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/assets/icon/icon.png b/assets/icon/icon.png index 8dec21c8275cc0a716cb253d03d85d8ce08f11a7..0bef720547ec236e1909fcd5462eaa4278f3a263 100644 GIT binary patch literal 33381 zcmeF2`%EmACdQ+kAnywdNc*uH+*lj6^PIkiOAHxwYIh<93LM$Q?|&qw6@aR z-A(ur=(&k{?M(2xS!D0ln{*;H%ytIEa@#Lg9V+jkkCpSauL;4jgkkeNk9+d}UV(`~ zz=JHI0_fi#vVDMrUq{XlNuOYW` zawDFLcEDV_7IUg!r>Apj>BQh;Px!~PrWbfp9@o?qS2Vdo6A1UY+uyfhmDdli1Lyqe zr9Sx31e{hvk#@bX73B*lHwKm~x}eTS-3z4AmlDL?eTzx?UD2q4RBQV&r&VpU+ILg; zN3Msq4!wUaD{Q_CNN390ws04Rosy zeF*(}hx*J0>(4aJ-skYjQe;_2#jl8>%a+p1$~{$2j?KR!9Dmv?VatOTe_N34$l=?7 zx!!{~NH0gSJLPaN?+e4f=*%+y*1<3hWFjMQJmu2RuXZ^#iK-w*mcR5zt-KaE+TV8{ zmG6sjbtOtBs;3^COrW}sRy!@Pq4%~iN==k6H;*_;RrMc9bqpG}ejJy)JIH?(&G8+~ zC{%e%aJ=L&?|!1;2P4r{tAU|RX+mw~_3BMOA_JBRjyExKo00a=KLMVIW|5MPO_TET zA{`k<4Opu0uc0I&Ff$e`lI1@a@=Y-hO1c&OsFea8#`#;R9m6wBvh}8P0x}xiKa{hz@Ur&@UXv;{?*~rcB3*zIe#{OnLw@t~flQ1FLUw!wp z&0+P=SIZMPa%i;!dl#vB*jO<8H}d`7{R>i0zL`C0|)9PjFSFMp4;s3A}A-&+UhDyD_K6csdO>dUbj|x7z}l$G4l~ zrlc>Unc z@kG)udnNcQ(x9j$(Jr?fH!v)$Tf3xfwx}JgvtJbNbU5qJw;Sx?A*YywnZB(p5cB*I z`|sAtLnH%y@gHQUa`R-A;1)_Qjpl=@UJv`|I7z>}`-xE?o~Ns`$HoY@imXF}I0r=F zePPoIW*q^ctveLB#Y92$e?D8`m~zF##4~lliv8j%-EqWU!c-yJ)xMjv1EiCRKy@}m zX3O{~ch-mKMs7Dcw)=I!)DGOW1D4q3^j{QQ85MKdGe7{JPgoIfd-e7qT6ZzvyE#71 zcaEjnkOL8$Aj4Lh_SQA4OE1KV5Se%|?`%jXL}p{o6nbxk1S1FAF_FthevM8^?l+56 z75!{}fZ3pYU;c-JnuQ~^TkLRJ?;Z3-%?yamCzq)kZY0-Cv4+k7?T)gsBfuG_Z z*dDD%gDm}%*H-WSj*FBzD_7fgCXB^w*wjKPa6gjWYV$QJFoUfah)|muuz{Z>p16DU z%%ltYi~mlfbh~aXtaW)yN2^@W@A9wM=-=lv>}$Zs{Z<@Z8#u~5?x~MHo=or6eey@F zHckgpWj@db=`I!o|J$N45WX5dtmNLlN%kzfsorn4*dYx2fYCkFguBX500TjBhkY3`uf$~ zQ&d8}?#G)W8gA!Xe#1vK5c0My_f*CG3%g4zJFr=Jx55jQ2l5Db0gdQ}B*Q!MI8&)# zLZ?GA`MPi#Dzm;xHtf1>O~3$q-YeyDN&z9p2`W))Afd5m&m@KGla`F1(w^JwKN}lK zvy0tuH*3Y6ID^#eoj{iEd}`|ynayr@7iOcoQvfkNyYhQ%{fJCi`e0UDDpHp(NfDSU z^g0AFJGQ;=2enyRKkC>bFNg_TJ4t7D-kzAzm9<#;@KA&6|oAIIb6Q*2ezCnezSOr<&bd#jAFKo-QhSAa09hygc)+lf|m9xTYSSidY<}d0h{X zHQz*n!j3)>kwrbGSS-!gt|P^ycZqfg4tCs}o_=ukdwqykT=NlrE1^B<$pGIZcQn~* z(LijEoc~<=7qqQPPcrNvznK7+7A81;sh|BS@^SieZfjHkduxZsji0PVq{JFJxoX;T ztcfvXoWAhHNY;GG4V@+A=d&METC5zzScE8$#%NUvYnhcFNWuFkmmSj$^nYnWMQ`8h zOD`>V*$NF)@l9d6d2>U&%rExu;VXtS9@NkE{yQ0ObtVV9dr-8R)QJqg@Y`*ZHeRoh z8|L~wc26UBuEpxmM2D`716kIRqbgesLiaQ7OG1($GNQ(HMH41syGmSio7jRJe`vz? zR%#myx~m3+H!`RV&|<2u^l=(F`E!G@+c{b_sJ8@Ond_kcv+jPYz`L>9Way0WLGppl zFaFHyObUaY5C&g+n{~>fm@hO3fWyB^U|SoWyLcUIlp^`YZPF4rIP=dQT#P+DgeN?t zz3#@tssdSV#!C<_8T7#`bx@BCZ3e&$EWqEUMrC} zPscu00a?&2{Z-w2simLKnf|R7ibTRI?-Mw7=-wvHJ-6cbRbU+YiR*We@1z^hMKiJ|c`&n=4k=>wt(pYS}Yx7bkfD$>7EQD`8fQOX{dUKW-#qSPmizI_J8V zZbJYb%i)0ntl7DX+Yh~eAGNGVnT+w|pP=q8R0$fc&+u)-~c^s!j zbyugy_wlt&QSu6kA~{POzUY z2L%Nw2Q?u^gEGFnhTFa(43imDCg7C1ANrbp5G(08qWhz0RO;sB#Nfk%@i54vS`lD_ z6hU}&>UNDbf$=MLFLPhyl?O9{>^$>@x&uXA3VHl4dVjkX?Y|Q2MK?DBu ztRIWFqOw3pQB*=-h(oSBQg+LS4`Udf>JSev$Cz;==oKYQSyT8zYb5BBz`NB%Qb1 zqlHe%2bX1W`!JN-BPs`*W?y-lCjVHRH0AI`RKSSDH`6!L$A_b@jXmRd;2k~2?LIPlW%lu$+`nKls(Zo;nh9(PCzQ6k$wMokt*SLT~;CfMPiI^kI23#HCu^Z`@v)WhgaN}l#n&?+V0Y%g1P^>ul~y>uN6#OU28OeL{9ojP$90(%cT zZFf%b(zHN1^2+@sPSs}ibIIQ|I=v^W#asLjtXCy!O!R~rRLQaK5D+5z;>NVk@)3zx ztYH`{x?5DAzaQ|s&yBs_b%RIVSHKP*j&B>J4RjO||LraNv%6Zok@x$T{{l>k)Ohot z>276?h%BSEa$q=KCRo`o+>1pGe3CsS%@&b+ihB5j2ZWGn7*t|Nx9{@7H(X#fOkHdk zcwYKrp^1vJ(LV(Jm|Ls0*^@+ED!73}youbxpxNGJ$F#1Or-S|S3NN}cbEsS`?(Yu9 zoUf4tJQtG^hnW|{1TC$>^Rr=-RdxG>m4xoUWIA0@z~m~Pz%kp+fyLq*HPJBzcxSCR z^fFyik3Aak8*8+LDPTuhi06Y!bh}^OWu9-t#8O-q4zMJM_o~E)6KWU!n)KK;%irR^ zTs!6+bu07~C1P@y2U7aU?2w5R-mk6Skp;p1=5RdKc(U4DN63dxGUg6V4pN+>YpVxN zIoJ$%k0e_w#fIuBrx#~vwFi@r^t;Ir1|$DMCQ`rf&N?Ki^tH1C+O__qwO|?nv~d9Q zQvB@q$G86V7;|Dj2kBIJe0N>Cs>~R)N8KfPs8u#do>B+WRr`3ddc*Y6^Pp`@_z>9&n&`C zoz{l{cP}(Yzg0jccjEs;i5t!i3fw{4!E;AWyE1`v1S`=BWT}#58XRx2MO>y)MeJrs zMI28dB&tF*D^oiAS~IgewaoOHI(68DWao4sA{~%66nFJ@Bj<|dz2opr<=kHI9KAO~ zT&KvYLst`as+d%?sW@5fo0b-NnzT@>PBFCQKi@6XgD_vtS3wJ@PV;1bpt}v?Oxn%7 zX1rDAjjWE#olKJQnt2e4srvKxX@}km^FEJ%%?FyLi(6WB;Is!%#^nV?Wxu7yqzg}| zSi{6KR~cDK_b&l~X?BvUA%PjN1UMR2>tO(c_xHs9%GLIPk<&8HW69FW>s~z?&FN9! z=+?V&?8R>wQu}I7n)!^AB@v*qA~|23};MxpWdFd)QM>4*gMn#Ylf7-2Nj{?S9dnVfKDrchBCO>D1=4E`dY1 zkCZLXHP&(W; z6r7}6JRRew=m-Y_Zf5!4v?jNT!I;%q2A*xJl21#dADi14Vf3gmW>*i8b8wZ7Y9FRI zm*z{lub}rgnUvn&g78wkr{(b(y`{Z4ckI2tQMLC5HHWG(S6ez{E!9C2m2ofiaoBz% z7z(`C&SjB0XL1^r`=PsQ`wSw*$P_^4EnB8# zuU?X9Ww&^b;B(M%Ke47>eH}KwuxJXUPg)eBfi5j1GkBK7LHStCqI5#eVecTIgf0!2B=Nm zypjRStjXj<$G>K>E^V}_ZGVll{lJQ70m`UxCMfAQY#FmZf~+0buIr2Fjkoj8|C%cz z(-K3s<5Yh#;vSyPp9S#x$ZiLjY0M5IN%4c}d%7J8yuOIywY|A8HViulI*-Py1J}7- zHuN2i5B0Yd>TfuD`RUe?wOCo#8UA}wb&vgI_80B<@IYw-*B}y0v`Q2ib33;%9KN-B zO|Crg-ggH0h=4Py``@P`nfgCsd97x&4Vl|7CWXDWmfrvo4sY}U$2&LG^z!km7ehV$ z+$^1>pY}{MX&spNRQyjsN5Jkm^0*q|*xtAS1mc*IJ5#}rUbm6iWk1H&&oskTqX;OH z2Jym0uu9OohMjt%B4?KrEl!P>3do1%4_*f`YMx|&`(d8WsAv_O7t`}d!Xxu$>S0lW zme1dO5G@dc%vX=^)OUS@<;4sTu}~o$cG1r!v|1MHdj2%Ikyq_H zXSt9?ee|0fj2p-n+xU_z?fhBlo%E(U^ms%J?YmI(%s#pBqU@3=8RU0G<127>U|dCZ>$6lH96g4MGlpQeuS^(WT5QChlC8 z5PnG_(Na{Hk(rV6X2Mkb{usz_`@u=M!Z$q~gL9>A$vfX-bn(fUR3BV){pL!f1Ci)` z`KLqHN`e<y$&4hs+O7gc8O(Ph{OZXlCTnemB3@K9=R zV{(Muljy0?Wpge;@TWL${sLX~4(ID~tE2CJNg}X&HfF;#S%RpG)6u6b&6zu`Gp%z5 zj8g8G5$Ge+CNfXGr!t!SH*3({lMW+jo_sFCeEDfa(-(odhU9w%y(yX7Wy=1$?Cy(LPO<}|9-|#p5^`iJY8Lt3`6EvnKOF91?IL2m zAj(l+xmZ6?ggHbS=d-|z@&NSZ$gf;)nSa`Zb*qc=phY1F;Pr4kl#PWT+D&@Mn*x_M zH#pnD+;m14bI{89MYyoLm9K79gHm_OC*$Lr+zjDhY(slETD&UhVI9iIMVW0fO~=_b z{b^Xx-wef_M4mMv*#QckEs!&-O>YOfy*8saUkiDS=UrS5{DY=Vf|^j7FUQ-Cr!{oYY}?8GLUPvQtXg zhXM-FvrHT9pg2oZ!jXP8u`R?%EXOQr{z{i5%7VdB0{7+b>0X3rac%70FKfP|VCDHH z<)6R5DRBhP;!~rJ%r?<8u{*vfNT>O8?`$Bl^u^I@w=ydZ(z@x|BEmOCUH_pDsYda4 z<`n1wCs5tJvUEqx+yGu)G~KPMBs}dL{pCi`pjOUbG2t54mSjF12_}A}zd4>s5zsic zpgol3Yse+!=wIgmV}j<;x-8Qw;A&+M`Hmq+Mx#iXjlnJxqwpggua-bOw*hV)`H4$V z+P#l$sSfS{7mW)U^$il`tqd7vZ1<~G$t3Eq1V4zZUH&XQvnvVvQ$ld>k~+f^enJBw zknwN?YvI@&it%U8Fhvm4>O$OMXbf3(E`CTK55Ak!(-0|>Q*gjJam=?TMe@bD25d~0 zNNpm6SSJgQ$0WpN=)JQ8-(>3U#YwiJd_9{1mW+8{5WQq!eH}3+Lf~zcRiwI_8NTB8 zwZ@5lu0oAias~-%LXv_vSF=MhN1elwI%ZAOeHO@GRt^$y1pA+$XV;bNcC@AD`qX-Gf1q#yF6vXK>|O z6sX8HI$<9(@Fj<5xWCwyI&|Kje(C-JbPDM5H8Cn9X!L zG(5xko2$+O_`#{Z!1@;6<0R9#W&-CuQ2uAm<^vXP5Z}J4&7Q|*I6>B=*=^|QQU4q*ZjX`#sE4R9ak2;9!2)BvqO z8m!R0!3`kPPC0FW7tP%fW5&mQdBlq%0 z$JBJ{YQ4OptIHi^7YjDc3;owgw5X%-?{9|?%0W?2@O4lIRN}Iw$$7}XRKI)@A_e1y zadpr$x508RCS7!3&rums314n>svU1*SNf#e(fc)VoL4w@e{Q~zCU6#dGv&1WSa5}+ z{36^w$4!jiz2@miF#-@W@jJGX&aZAQjjl6DU0GXFsud;E4$NGlwdnDE0v*i6nuy+` z8_KJW1`|7S*4Zk69s*X{z2+|dLRw7Cf_a&UKh?375x#fsV}U4;{E$ykzUTX1nof2~ z6{wAvwrs@q#=BC}B$IiZ`e;DV=sIeS6Smy@%O5J`pTt;I+bn82eo`BWfus%15CJr++$H_76{?Q+)cX`TEZpN1LdhnItqqVMeDF-^+3t zAUBpqNfroc6?*-i){gBo;SMUQ%4ohSEeZ|gfMy-=S}qP8M2jwPT^6^Kv({l{$t#8; zQg!qtlDLl5R?`=@zsr7EywPEAGPGTG9qdG+Ht_}3z}TOsti?JUl_hkAAVC$3x?x(x zL+*z~$bz$ikA*60$`Jy%#n&f;p&7)tsx|Lv4>e0_alg-%NeMG4yu1PQDWYmBUa1rK zIqKsZo)eyrP_;etls50paD$z2Qa9cW^auGR2B)Q!6Gi4Riktf!R)&J;lP{tZ`PBp&;D#p&I^YZszjO;`fx-zlKev8Ro6l%fJ@ zWs|5+h=Op(clOR|CE8SObIZmYkIlEg?rKszyUqV#rA7NC7)O|==7C{UtEXC02J6B! z80t=Ou#m9*!j!!(H1-f@mf$uVlz;gh@zO9XCy(mnTZq|Lv_Dy1@4iN&A0W-oUcHh9 zGu~i57Fxzoz3m(N#}3Tl7#{Tsy?^Cf8Onb%*hdF-hVtQK$=5#! zsq;dJg2uv_i6HTeB@Udv)HP;lrTgv95x9{W?ur31_J3D+PkZHl_Bcg(M-GI0uHGr1 zs(=}plOE2?T+1xNZ~BrG$Bl8jO}okA)UBVIrS;ff)r|UAQ zb-dcCZKPeMo?(8+1bVCsv*o(Bio0v9k>vQM{|ds#kP(db1Ap->)CBbR75r8wF8&3L z+y)^ds;xy;x%J!kw+Tn@6FFa)+y~iSWKP4A_uh1GpAxe$OFXeYn&sv~MyZ1)iTjE& zM{vnk)JUFy0LTAC^8g4##>Nj2mQRKhZvTJ*OrBNG^P*U6A{BCH{Vfa_gZX!ETszcJ z6}k2|<&v6v>Uve%jYT9ukSe#BUgkn!2yvEvPsrQGvm|HTa_^^oT`p%gWG1!j%Eiaq zM!5_3#>~FtTbeDFnj_KXd}N8bzk#+ z&77sMBv~>XLa^}o{FE+BxGlLBAwO{}v?8`T9ppg0vQsk=nmLlFhF@x1_E8Z*?rdH# zX{;d*&>yBGNB)5z=42C^qj!)Zy9Aji%38|<=0tMu62^!26P3Hs`AW}&gz2jfweyNCbH$4 z`=?5kr?5eP5EJOsko8TLG(%rkI44&DU0nG( zR)5=n9iL$LATgt7q);#NZ)a~FlKwoG%=ad^K(R?lb*lqJo#x|dzeV-e(LrTtjOoAS zi3xG1koFS!p^@m%wN_us^8^QV5fBT!zh*g*c+1{c-x}FwLNAB^?)TmKzO9wn=e}Fm z5H?0jel`Y3wV% zVA8~VO(T9Ho(|n>t|d=MojvEBS(P$^M0bw2jG6%w@kHWwV!`pg(vYX$kw$ zcLFt!vWYjSP-~`UJt@uOq^rsb z--=hnFZ6wEIeS;AgEhrV-gmxXNrQyTd~%^gSVb(w+3J9nyx3nFRJMVG5c<1HA`ylf z%@TX@JfI`sKB9acnp6(&;n~hJ@XZ zd(hzrd>CSfT>vbR`U^~=ynUrEwJ1oudf{-lrY)cuI3rKng$pt>BIRV}BXoGU68Bdn z6?1duC{+1-e-nH*yYkcI%gcqGPmhx}pry}K0tI_J#vY0SXbKD#dAE~==aFmhgm$Qc zAV=KRO8U?(+IuW}EuEBT4W&0UYYfy)%*2R)`TNgzj}x<~P#!T<)|U(s#_xehez@f2@AU@S z{oqtfqYk$PC*K$dI7^U(b+dni;wxWzSVK@T(>X>lA6FMF?^Ae0b$^7b;d1(X_S(y)GV3ECunM)KB2tfhyD0AyRje&rc6pAh;4)l_x!7x&7ld>Mm#RDldrg8UfwBrT0!U2zAEe| zHl;!D_&O7a`l8f?SK0yubV`Zaqz3Swy!=l?wBO4$36MnWY=hKm!|%G$EcTL~>pS=I zKN*0CWf3!@#>`B14zy++W?~A85j0bM^iCI-^gYKqa12 zg%g1g#=EvuHO4CWi0CG3~hPT$}FeLunZ4@Y2<~TlMLmyj$J`{aA z)sps_a^A;Gc&a3?Mri9350NPeQlp(KQCtm8q)&GWf|M<^PrQ>*U?gP-NE1d?^oJ1k z^XA9@mZ#^@Y_mtiO3~v7MvgOK-rU8URkz1%D_!NmBY7z#QJ-wFujdax=I-MNe_x;N zAVg8Q{^X(vsFty7*DKRkZxr4xVc!4RKG0J`>!a$vK3DChjhvVtq)BZ*?r<>teUZHa zS8;y38+vim9;A*_0FXXPSBW*3JFuU${JAji0(I_e=^SSm33X1xro{YizHShtORMzZ z{RBkKY<16P1?mkC5k0E}P=gv=>0+P7tA?&oU1tZ$it;62Z$r&$CIS%xwsu7Yzn8JU zPV^^D<-LM37o-rN$lqq&@8hVKHFy>JKP_17qyrh(V^m{^iPP3R{6-`(`5Uv_oxtj= zwKl_Mk7P+iuHaazWq*9wjwC{@RG=x?u-3+DvTJNNn9%z!DiW$k{dEdeR>oES`&8GV z)Mw>Jt>HI(=ek{{!uD#JEUe^5OrW05FzCf+VOM~Y8JP^t45#h%RkdqA*jBGYkU#6> z)7Px=(-*N=Q8WDu*d_j)qc#rm{ffp{e@#uKoQ$n{UQ&nWfo~sdRKr+urIBUKCOnaO z>m``+FAwR4BmBH|@JYS@TmtuvWe*BJYy#!bGo4hGy}DZ>sGSbHUy6lW#i;&bH%6k6 zZ-h34kBB2)f34rWHsI-H`jA-R1f+<5pfA>|dEcKil#wVX3Fi^J{$cfIY28)kL^DSe zI;Cp=5o1oIC_BkB7&CR;`o+-LzWbA{?&7K>W&9Izm3~#wSzu$($bS5NOI9o;T0BsW#%t+;_S`LsU)yo zcd(hZtk&L82Cp&c2aytv@tvyf`>%Ob-B9j!mWMZ_uQC<3NjxVOSL+kVDDU}K53Umbho(eeqKP0d&j?ce=~@9SwXptQbZlZ^;Dqs=koAQqC4{z zEV}M?0Z*TIIndNsJo@`waO8LmT=kuTjx8;IwiKxlLWCR(w7uI*vzr+)hoBnt6j?No zL^AX>;x80MhGT}b_q8jURISjyz|kgL)c9k|B%ZmavE?81;{DmHc;jjdt9e$;wiH02 zkIA~L3GCmebt1BBN8>jr6q8Evc<@4603|n; zlC5A(5jP@~!6M*S(#6v@U4+R24K1U(_G|CQ^`_W2V8*)W(?x*oxk-7%@`s=m{<=v= z_8}uC+7ZquCXJ))%cYHO*wvr`>ii?2_lp3Uh+?Z>vHFR z^$nv?Om+5L<%Dkuu;y3G5Cz58J`x+hTKe;f1uRW3qb8@>F;z1(_f011koSpX@~w`5 z{F9LaTl|9JEyU7WpQ}mEWVdH$5{Dzm632&sy)Ca_(bjA)GEF}XGI#szL#?UI>r9t7 z{mIXFTh$SEl8;GQ1QB;>po}{ED2Wd@uJhLSSUeL-AL##3X`=%^ivQMTC#M5B12Mp( zd3H@FT?Be~1AuFV-Z$3ukh45VQI9Panw94o4)y+fM?^{vb#`0H8W^y8&yzF!90QtvKbdE4*EUSsa<~Fv#-cT(gMhXW`XpVvNyj z0SJ&wkxYUox4T=#8+7mLWsWEhCQx@R)c21(MXakH)3aL*Z?_eP^8pKYG^RZVn6&p8Je1Z3Au8(lO~_*BhsonX1tCo)Q1#)>?h2)2tp$w{ON|lt z&1GxcQFZg9NNER&JM18xIDMIBX4MUVDXN^pwTaA&iG!4{fs+tmUPzV8fbX7$q1Yni z%1HzQm+9Q-Ah{kpwYgglgv)=3ISstsiAzC`owSMlYly@0yY`7kda5JGvj%vA(G!KS z=qIGp3{hT8ppJBuSLS9dL{xVS%eB?HfNntLpi!|;hMLs=79V-Q(7)0I@ZgbWPYXQn z5W^+IbW8a`{C8N=Vf+hY)M;Gdz%PC(Md4z+{|}FAyn|I>8u(YsxfcII2haTeuxT3`V#)d@CP70{tK0`g}Q_uM!D+K_rH4(VJw7!l91$wDJx@}~2 zI+B{x&+t4Uu4Wq{gGyZ}9+>Iz?BpsSvRr_c_85C*j59w=r?0Uhp&+VTz2 zv&Dzq2;!@v^N_X49hp8=p{??L1Z&BI%^N~kpeC{Ax)1=pe`F^4W6g9be#|PQu2es% zk_YKZTyQCu{a8*)8%ZEuBvZEEH}~S5E9~u#m0q<5*__J+NUy+`afR$IsileD&x+I-eR#%2kS^vHdho;HZ=9x%pOjUZ>+AP^C># z8FGfraNRp~h6Y1>RW+=?8^$^u2s11bU$6uTgCxlR5Z%_JWW?E7F|h+QZeW~cn|3!b z1|R+%pfgri!)z}b&5j?(wgr^l+3oV35~^LL6rV>|xMmhKbcNe9U=arV1pvV_Ns22M z|Id;(m!8TK^pT=W=zNQAmOs*=k)R0B9o^wy;hW`hIEBxK^gB^!8@$gVUqo7-U4Dy* z4N@YPF(s`b?9^B*TJkrmbr5POmz)gzE*nT5LUj&SR}yZV$^Z4@NmsWR&;UrS-NEc| z3IZApX+l*H8Sm7`+p%NBL2$Q<D^_=)Xrnv zapW!9dzRq#(cf$0OgW$aV|L9-a1)BYivkRegLHM`A_!<8Bz4&nlsJe4exv(i`3+c2 zb@+_NNmxA(CJOdyShqwT?f@1KbUNhHE0ijjkkl^0>^b$s<&ee_#@d;}D(=!|^#q^q?((eNo0lk9F zb?#c+F9LB!gW&FzYuD8$VG0y7+l1L&y@MS#Qn`|GZK(6$eTrwMoVPWR*7~BPc41N9 zBH72<5cwbvev@PrP+A8>f8;!MP6jhpsed`7lFRA?S2 zV@eiD>t4355XN|UutExDIZM!*iI)nRse>8*?*ZlvgJQuf)eKtO-HI%MP>RF6g&<*% zd&kTzN`R#~5b+8+5HD|~`!jPhSI4Rx2t$FpL{?a}A?L^VznRqDv;gOBkw1O7w5SEZ zLNlT=h;IPSaYYD05BWjNi{zJdNin`oeze2Mvx!u?klyU%+?Iu(0h+vL(KXlEdX||4 z<3YPV3kKi$?Th1;P6WWbIwEmC%RZh`#aYpbA+a!I6Ie)h?)lk9lz#V-(?^2(AVWD~ zqRhp2uzVPrDr^yU7#1`x8xawAS|1)s>r1vK2o{w6Crs`uV4&jLC zVFKKWA#W2-q`PLqGbAocI3l-$k2(L&5F8H(n#%^@m=GNX&Cz+AMN(Y^ zK{qXuQXJKgE@#cgz0-d$0q^UNXrczKU}2fkYA0f2e->0i=1u7L_RuF^e?Jl?lTf^F z>Y!h;nH76qwNn(>K4Mt0I*FmXLGWq*#Oqy*Txp&WEJ{|V_mpMLNpFt`tBKqSIQm`d z0?M3|z}f!?xZ)WKG8vOjg6}fDoSQdyLC z8a`s}C1AphuPY-!8n$o&dK1-&T>NPV2o{QLT&H zizAl5dtJe{e+flG2xwXx1E;bV! z1Uj;eBW~ACu19dz>M(7Qtl{8OBLNAGnYEP+hO4g|1a0sY2VDjS9K{i_u7hvMiUq(v z_c8`etcb$XK76x$e9;G0J2q$b545uP%?{lmczG&?Mjlv2lDE?(zKZaM=Yn6nCDNj| zTz>X7pyxj1fob=>hTNtt``iwnZ=;VDS>(71odNe~?>yj*`8 z0_CmmPzNQ$jsY5EAz~}RLs?5Zb{$@}RJ#hm;e3H5jIta-BcN$Aj&=d&ui%=&2?j3! zyJSNp9Q7_;^cyH(X7yfa^62GSZRta;WT5%sV(6er$8j$`?iT_syP)^we~(YuImOf& zhlT_OYtkwC43=kX(c;Iez|ZoVz9M5Xvfl1bUnZvanC*jDg~G}Qf)=?=H}A*=xq5j{ z<+R7xJ#yvhYEwp?d-(jf_w?jzAm+ut*wzI4)?o-Ks}QRX%S}I@Kf;086RF18CtxTl zZ88yimc|*C2mKmZeC10NI4o@hXIdpe8{JGqh9*vMpoT$aj3fvc&xlNWfHK}91e<3(-z>eLW*+Y;&jg0Wa!a1gycE|0>{!@j#igD9mc~5^A`o)bW~>De%c3FuH7#-8>iEgEqD2ZI=wjkM)87C5&E4` z6wg?+XGpQf>UAAjhuwAdMLYAyZaulFA%T}CFrC{%mXJpm=O{1oZ%WYx1Nf5pQ{N9 zs(&ArAD^Srsa*q2sw?NIsLB^@>m$gDt&IkrIP5~Q8rDU|E9NV!x?G=h@pPS^vY&DX zWyhpY!u)}XsKJes|Gw{Tq0ktLX7{}x#mz~iIHAaG0UjA3jMr~tbtMz)u>}oA|$;UA@0kp)X%T%o@ zqu4m6(p5g>jP~O1TLNo#c{4kSeE9+-emR(5_-5L{v+|;&wYwoMD`*gwM7C$~twiAt zve9ZSsxvqa3?tEr229r6_MuW1ND00`Hw<*>pumE1i{potBy`+Rp!$rdb^5jv9BiGE zK?g7&uTp5!p$28=MW_qr0I;o8@0HsGO_#~%AJCTjmd5qoxBq7uz%yAhQidzYdCC+; zs^C68gr(yXFj+MZFlR2vW!8xYJu@6k3}T$^UOkWzgK^$O(Q$A^M+4L)-JF*vG&2y`ZnBXcZ^Okp8rZ!&l)2-1kh0%kx=|X7g;sUfMoPih> zOU9ox1{_Z(k2;H3A^f#;=G_@nnLmI$GsxS0!PxC6_K0LfoLEVt6~6JI34D+J@JI$V zL6Jf?2yQId6?9`s=HfTI8I6;!w9MT0(`$fC=dXs-%sQ2xiRt;;$sZ~lOKLX-aCv(L32*BM7b_3rIpp;__L-H zZ-p}#FbcPR$o0av@4prYOz-=lKWLv*bv*_lQ1YLDfkL#KE32A|xVA-zdc_?U-z2o$ zq!NA+qhR)D5E-KR@SXy>9%o|C3v}VVws(>R;U8429EU>QA2TC7H0Gn$TIJ^La&QQG zO+O4%Usx9!M1cC3s$SteHAVK_`~t6Jgzmq~9e2?Sh@)y>ssFHO)fL)~*pgbJdkADw zwNxVBqcA6;DGukA^iS&XX*)a^Hpbyed)oC)M{BwIY;f5U@u-;h5?vv4VCpl3QGvC0 z+21UBDZnw#L9{KBitxI;xu1*gZ8kgB`W3n6byuy_d;xdF^Ub(4uJzjldWSD!ag4hC z;;D5by(GK#XO-iKV7pY;PTSh@sJeW z%j6L>c+vLr7P?R{{pP1cq4xacIEvHo`Uc8MdNu9$$&0t9A9@Q+Qx@s@obdj&ejN94 zLHI6BP;p+#hfEd`-U$?pbmL0S_8{hb-R;Qn^AA6Xdf%8S5SCLNSObYElk2d!r_^0P z``FB7#==~fS0INGmGbB_9yAqDh{!D1=As%aU|BM*zDAE}k}DoLq?$>|YOrp(t+}3~r}C*m)hhFd^bXfS zra}NL$GhNHgmn=r9y0pq12AOzp;Fg(dTxgl;k^i^qF`ib0-A!E8MClxNlmP-&MtD& z6$0oRMobC=%n)fmCR;DpXB=IhrB8^vN~mgv`8oObRerv3gVBk543S=@hk~I)f~y$7 z?C=M+%BMJxgJ{J7DfmHd&S7L$IF0J*t*{HiaR^L`$IZ= zsDBVucl-P&=u2<(a}2Q2dRua=S$7Tf<+2FF^hm(Mp@U)lf!+#XkDlO_{dWgiiFreEVVu5nb zSOaP_RKwuuxA40v@9e68Lyu0Rij4VZkueSn9$I`0Ij|opnhvh@gM`|?N%-;;NL$s^>Az;@NE%JdX zOzB6}fYOXJ+7J%ZPr2hIgmgM69i{^!PrM1+yU)T~oRk}AP{w}hqOh5Qp9l&@qC?w6 zc;&GvrsVoJ;+`8HEfAp)qQpaZ@wf-l2=f5I-Uf~p1Ss8$i>t2exrxSn_3{6DB`-mn z(b+{Gs!zMl8Bu7D&qGg7g_JIKMcaNi?Gk3Y%D%$DP64mymUxs zus$mkE4swol4nsXSM4fEq4E>wX+OrBkb3HaQ6a*76?*GOOZlxrxYks+`VYg;_hCw z#WhfhyHi|>6)W!U?gTZ@U2;Fwt1EKga3ciQHYiS{#rf=Cegc(*(4$}{&f~PQ_0_pmYWQ*Qwek)r?l>44 zf6kqHO7$~6K=J6Vbk|Ng9kCrxToxG|qk$tS$tA84K(hGr*uUBnig*dlpp&w$$H9Jp z4-39OxUZNY;8)~2>~OKs*Jghcg^LPi%$f83_ev$aMF#^5Lukt%Fa^d@B8E-?dED}Z z-B9;UeQihPa7NkUsgU?p$d{o7kwaBsu0Mgpr`=e-lYt`@ms9rAsVi56Uqu;6H+EgTtR6*q(*W_0pTr12Xu^*$D)g zygzGtjq39aX&f8%_^O|(EvoJ`@+cB#ON+}^S)efy`T}jAI>n!X6cR<#tf>YONRN ztk@KA`scQwUq8qzHlv~$+|rkN3s_0pu{6VK<%E`SI(uy>M<%q7~&0y*`_z*MfSDg1^sSxy(H8~K47}`{krCKCbsd1-}F=f=wr=w@`<{xkRq-Pv91IG|cfWno#RieN9;P6i!D!M-* z_MP6)Tm3?I(hJBB93OcFFDE~OGbU_S2NAq-h~_a-Pzfb~GH3uj8>M9GUA5 zX?|T-byO+hSM7o3aBRD66Vpr#>^TdMgxkTa<6Q^qciT zhbRzvFjC4q`gu$UG5+Y_5BG5566iyK@yfoN$DvMw7*MLiE#=MJ@|#nfA$)fey6WeL z8Shs&23A9xewr4~bQG9h1EnvX_2N~8H=r19{DQR5YOoB=p+&aF0+;=7gZ>`>7~W&v z1#heG@GFgo!-~Smu!%&&__E42COO~)4|%m&T)U=J7~vjfB+eV*^TCtHi9s!&4ry;n z`RG~RpdE1T6AfkiP-1zeX?IbCE&~dP<2CF=4FPNp?^B{Iaq!tCHz~K`$6Jy2q*bp9 zLWXjA+~z$Nt7Ox-^cXH@C0(KrR=M<&<{1_M7voK-e}4C&MenoMR8=& zU=Z+Y+t5;?!$Bm*=+~XaXbp{wbFE_2MRY=Ni%)6m1-H-^3I~JF(|lr+Wsf%XQuoU9 z6?cz>rlW?M;Z`Cg)&Ehbr%of zV!UaZO#kh5n0_rUAd3yZGJF*$`b=_7<`zrB1IR@0`OLi%-GLHZLz<0TN+L5owXHUO zk}UQ(6z)tnL#sbaBjP@ldCYsXXttva6cpV6j*7!Hy*ey6_5Jx}jR*9ZMg?#SYXX$n zO=yKg3n6%EJ5_+d>+dWiTKE*vj%opUhQk{D#Wh+_w5x;;M~_8VsccMol58~TBPpJ+ z`sexEL*!=!F;GLcWUUUrG(Yh=v`BMKTV(>_3G7wN{Ovv1plidYpVKyUi<^2!J3qXD z0`NU*5vUF!Pj5$-@~7l^y#{VXBhXO0XjV)@4oy4h0t^m~Jm(FaqSC_ z@r(lc#fAXl%VG_w&I2ye!@6|`xS-GYa6I&@i9DsO|ii)YR-Lvlsx7kJNHC21IsY)RICbzDmqz{1IhUm66 zqt>LN+=sw{e$8ajAim1z18+AMp@q&^h$rjjd6Y(Zo5fAFV_{|xnWHnXVcVTB_J_V8V~lIL^Z6n5VnRa~9-%dU)?Wlxhf z|MNqo0v4dF>G~52(FfE|=2$3QTubE0IHS4=pr^ItGy^+}e2rZi{UuG@3W)d9PronY zR%&?yKH(WUFX_PUHlyC6jg4}7kv`ZW8PPI#FZUw-JL8qLD!LX=;i%4?RNHUo9m<4C zD}3ha`04|lUZY2*R8-R9k@aF5M8{DTmx&c8^?w~+&EZ5YnU2kKhu!aFNhRJcsl}rQ z4FF~~gX_ThVV%VD2}`*UX>@RP2SR1(Xn-*kbk_c8416Rb)Fh9c2qmG@i_z}L&+sc1 zR;1BhQs*Ei-y_Ss0TW)_xC6dkf4O+)lDiYc2Jjy`tj0X>9o(_eUJ^oIgSMvtwP*$w z+JTSM``jxvs^B*#7!N?3yLozrUP@W%K!`Ewy_A6Cwpkp1D~Fyj{YNvuErs96sX(UM zIS@%_;9b&b7j!y~X zwHd$t8bqAeea6{)Q8;H@#Th`F--fn;4nN-g(Ovg6UO{w!(;p>#Sxhdg2jx?Gf-z{< zdLMnG36go%T-P1=bgsfo{9mN)X`X7Z7qWXgiavoyx`Y_bZ}LKD=)|Q1k3JHWwcWm4 zLOSIA?^$sAFd|RPB*B<7!>FT}{GBjh)~#-b0eO5+19j(a)wH*Noye^ZTp=339XK#7 zex+b?CItG*vkhH+UXnn|XCR=Up?|5zmxr?ppRyHrv@{Q!*TB?KYFdC~w;7O26SP=k zradXqyP;4&(Od3={ZR7@1|{z6bV=7*(S&TYjh>qAbU1Y!q+e71Sf>8-$_a4U)5qPy?C zQcC0RX<>-tby8H|nQU~8Sa$7V{HCtUHP(|Rqa>Rw_E-PtD$XUxp?9#H~k_*1p>yrKO8A>0CeLMhU&&`07@Yy*wC4>K} z5Z2vuIaiKDb6DkVgW_LLbec)_(Y`v{P-bCgl)PRanan|`&*)Z&r4?W-+d^SLJtJcI zP}>@m)Adbuj@{Q97LZtnn)4_81>3iKHY_B37IF-DdXGd^20wEQCr;ys+4IV!$z_ze?TKlhy>pVaP3D7&znb+pQ z51=wyJD!G^YXvfA1=B>l?@ASdzj;nMe);Gq55D2ei+ihFRl_^R9g@*@vD(OX;2lS1 z3uv_4!JSA&GZd10jK4Q!dw>4x<3;a>`O6w`9BJCA zs6Mt9Z(=&5Gg7&po3|3u%GhSqVgRlLM;hofgOhM-e_S>APega75->!L9%jKNAV746Q)<_(;i0$+k`+Y)) zNTvxDdI$6(X2^cOf&X5gRBaV2x#STN@#qOe*M82@l?*4Int%Vv6X}=$>Fo9IQ9?l3 zUueK6vzy7!03_POifu~On=#){#_27N?TQ6v=f(Dp4OKtW_fZ?*CVS@cWpbECpL>g5 ze@ccMGADvtsHRB+{wM(^zMuk#_sfd#x)-x2IyQkq>Z%e!lJy{&cJX*I4_MBlb^L{P z9o|dNj+DRjyIhv9chM?h;vg-cw~m0={mt7Fk*1Z7hv?d>`zynWu`)jk;y(BI^6t{d zdD53%1<=z09vn@+6KmYunE})9S)L~3ri9`86{i&U=%$(Mg4azp>1${< zC1^beg9+~WsHxW1y`6^U@z@>m;5#Ctq*-;gAJI+EZz*yxcXF>-sU8wc+SULh*ih@F z=iDF|z|zAwXu+VZbU91QYWg~HA1##8TT1Ih&!da7TK{Teqk#>n z6|iZ@n8&2-2)W1bKN0)mDCTxMosA{?mNBfnRXn+4Un}yPF+KJj^=>22yaJWkpG5J_ z(8NyMk5GC3uMFE|CQ+83^Sw!FR?xb#FHumHhKz5*1bF2l$rz7`8tA!zc2B1ih9wty zS0VY4BRiJ_h6{TH$c%->osp}1H+!4EYJwgwENy$Q#K7igUHn~t1PO|mNoc?i#ss{% zeb{x4@j-_RY#Ccx_ht)Dh#$mHyO{Vs_zuxe_N$C{ywiKt%OeAz1%_=2$K9KQpK=)hg^IG{bC3Fq3<*|^rJf_408Zs*i|&_gvY<+`T6TSD5+0aH zxB}W^MsIhSz1m;u*edOHZsiL8D4eH9Wak{!@TS4>qrUh&6vc4^A3T7p4Dq^P0KGku zm5n3ryD#nc%ZRl-0i;|zJGPm-yeErhyuXBH0}nv9=~?S$e=G0HX19@J+4k_}`M*iD zULZp<5y6N-zH;0QCoyg54-jO^r`{vuI+ap%gofeik8=6rufF-JgsY;WVpynVOr1k8 z5|p;DyjN!LSa+9CHof&TW#Z@5 zf^f6|ySnXFEHub7?SvJusFNt7zBp2%-l=`i4F8zbiuI-S3l1^$MdvzRr<`6Lo?jZT z7~1%AJPtyLz>!D}(d4_^T9`}cl0=30Wo0m?Kdp~f$#iS5^GLSq2{WUw1R=L9h__hG z6+RLj8}uE-6#?jLbk9yjN+Be4Nw*4ZY=lb#A2;EGGElvZV8~J z|M}Y(2~aHP^eCKQ7isTEFq|TC>$ZvWg3dd@`R<~OH@S^ZC;uLcd4hkH{LwfCr&oRc zk@5v@)i!0!1X6OnY2LL_72gz*Oy3Vdjm?NxJ&{2gI$J;u%ZZKzdcQL7tLRwjW;p_8 z)zh~7r2+eROBNZyc+l%FL#QDk`+EoZNH72BPRcsZV+wmaTskiWB0k_#=X-45ui3J*u2 zpaEm^9zHzT0xL_(BtXuph;L_XPXJII3d>7fNEK zBMKByPe=-<;8D?cUCHc*0dhP(hK=Or_XioO5E6(or}MHc+09kz%8>dVpu4OM{{_@c z3sA$DeDsmri=V@}M8$E-KF3Rj$rXSG!JN#R7Mmj9Y19NFUZN1GzPO$2keNb5IcL4c z+PTMjcfSx4sAX^Xas0FyHZTUk#SRamwV;0Sw5#02~A>()FcoBsyNUP_AhF zb840cdg)X2d5^vxBp|u52Z#wu1~*De*)An9pT7K&9T+GM06IqDctPTg||^X=r$`z)n;qC808Wq4}Dxf7-Xm()99pL3RHLNnNa zv`&=g*AJX%-PI7L-twnxB5Rr`nPa;mY^bbPt&jrsTV~&}Ud%qSD%W55Ie{sw2 zqSYr9NWM1~zWO;v7zCL9xWs}0d+pOhrJ<{e0Y6x{}jxFDs!; z%>w!Dxx@!hc02CcvQ&}mdG+WXc}rX)wl>)}6~gWQ@A7@xba9R?TY?U~9B({(OK_tX zXvF;Ck!PS9lyUUjaL$YmuM4j&3v%P3>vm}lvJUCa_TSabMU$=I3M%R@~ymf?(C%pUxu#N#M z(Q!Q|Z?U)ffUL5F4R=LW_$Gc14Q^TvTiW>iLqcBn?C{wehrBTjDu6;}AOY6<&6y`#vA`=* zikjFr_yl_mh#9NepTC|{CT|x$6R`0$M*IP6Y|Y#$qYJ^YProB?(&L~4Apz&KORzbW z_!&wystDqdvR|oB+vBUj&n&CS+3McSqIzzni;Bs&!;^{6->72L<$qYIm30He%e%uX z(y8Ts%X~$Qv2PPF;&bJe%p`qprfobsIwG&UW*8!ERFIOv5qOa z;y{fLQ$rb>{~0SyJ84E>@k{?X^|@f68uLn*UIu>9dF~%rps+${PF@uR$1Bp1p>fK*AuCfNs4T;nwBFiab8xKY;G`GgXfWdwezUuFK?hO6Xv zaVm)bvpZ7+uf(?Bv>p9NFPf(SWb-CMp2Ud$C)n(l@-2W-Y$7BR`VE+~3WsVt87crl zr4C5RelX*le+N2rU1D{4q5U+E=G(7Mx~Eu%HLk_1EA@#QmOwI$B1_p>h6f;Glkd&y z#Kh$yLA*K9N7X)g)*aM4(=j%hMcvKN){a#GBkX>$QS9P5qR#o1T`H5wnTUQ#JRkr5 zB+(vKA(9WICI&>_JX;#A!hG049bc~74u$J8^cvlRlVFoxPA|(#(*0?d4y*}EY!Yw< z0Z`wByH-Fy|Jw{>p6wAKJ_9C0D|9fY4Ya~Ji`m^RRM+3(vNkswXI&|_6WckbR%^7t z^Cn;*oP3Dm%Z(BCEU$P%<m0VS_3`#7;O~lc=am*uy4U3X zZcw1g!K_P=qube|RpKom6fxsHkFFa~$AD@}$hx$Hm4pnf5+O>h1{j^D>Crt5eT?IC z{ucowSA0)r=G;u;$6qERBzL}?n}DbMKEEV8x`1`}Hobg7X<=?q;O6d0y~UHqyX?;Z zqOu@YxGM%~wiF;n6E1MIHOLSNbVaJI10vB`JJO0ul6yiGLxJ~m(~~shJR-R*)zYxR zUY~~#meYT$ACPrZV4n_DsX23l1JgVG0Zx_k9pK2y63I}wV6q6o@U+b5XALgBD&6U0 zgBY`Q)akZm7*dAG+fw{F?UagbK9vG-Eiese26;tiUS|y&R6et(#6k}zFz*J4ufLU^ z`JL1x`UWn<$jYA}2~*myN-X6AfP)4Ut<^#)hs**nwaGIjbb{>5XF z>am6BM_4()0yLve1^Ds`SDsR2fXWae2)Eub7mlK=Fo?LV#UX0|*ci=^+;_t_tm6=D z@u$~F;_>>de?Vl+q=nkV&jO%`w}5PS3qUP8yw-z-N5+t2yhhbQen1av0>sfRrn|9X z({kGY$?o@~!{z4fvV$bQ7CO#95sNFiY7S|5E#>KsfakUPe;i(bH~n~*YbW^$N#T-` z+me-(8lMfq)_v<}JmUCT%&*!Y@z*ce7Rd0pa+eW0xOL9I_>HE06a}eqKGfU2e6_*& zl3~`($6F|3MYdaN&$0e(dElzZg?I;HFIUC@izRa-GGgS+G6wJ0-xVhbS^2N4vvdob z^DQXK8{7-w_bYSen~KKrJb}AxuPDWW=q1h*!tQL}Lt<`d=IuXs$(~$ev9Dkq6S-xg z>qP=lP>2N183xp(O_&+|rwb(kQvli)?D+7;?_cfRd~Tg` z*4kE&&$~x|(b(hR;4Xdv&5Q#O(N<*_()!RJ^`ppJ@~|!gJll{Qi@4KM)4Uk|xVN)F z^*60px%FY^jtRms>?2xqS#VUj7{@~qRTI}zWQR7%ex;*mOVZre$;Ode5=NY zt-Wq7wDr`g(+^xTs?pPdI$>Y{PY`TDbmMJl)KAhxI37N_0jk^ap*{LZe$&gAgJ9IP zBsqblN0W*XBod8K!dBK%lWEhx)%N#7GBQyeX%z94rgM>Jg*&0_J}&YE{7(x23j?6l z23!9k=+V2UD|6^}4znJsx)Hh2)HQi%BA_7go0Ugy7mbkn@N#UBC~}i>P}=8=Bd-R4 zxugFGAmx}77GVmQU$%NRh{3)>lrJrp1t_198QA}*vFo*vON{cWgc7iVM@~A>>Zx&j zA&WUb3@~JuC>7fkT(&+EcjKU!h4o~l4;jJ-I`GdM=PQ)DVHDfdW^+@dN2!;V3onckP%Cti>GpuMu7I)= z`_M44o*2o4y8k`B$1*l`7n_V&_mCBpI4K-eZpKN3wb>KkfH`Z8$|Ujso0VC6FmS(G zQfc(*$DQ@oG}053JG}(jVCj1w0}YfzITL;_JkH_4x>OKR-@#m-X`56B^y@xcQ*}w9 zd&|1fE*}djo@_YHjM`bL{to`@X*v)sh3^oIz;omY}KVrYOVH zI1*fxMsl~8OZnMG73>#H#GsJY;R1Dfgda96(kg*Me8+X^fhJJrL283l-nya!erD!D z4q$k$?tH#Gw6ofj%?(TKB7DQYKzG|8<2%RGX#zlW9khxaG=OPCIBbha^Zatl7$`zy z%Rm#P#*zVS>5oYLM@lE}SB9KWZ~{qx_Xmwl_%z-Qr!L@v$_R@e&_W0Agh)Qckqi4>@sLr z|K#-+iV3{%harGD7ry2t$5zX+91|_S1nQs*Nbi-_b|5EQ-?7U?4s>4zM%Ck$gV-%n z9{_5&Wd>4NNsZ#yhXBgvfdFCw39*D2)F1O)3v$Ve4kw_-y|EX}v7tx(3*_21t($x7 zv*y-(&<|vh2w)NnR)U%xib^;=UU*AzA(6;>7^VCyFr~sUTg(?67g9x;hOevjF{@#H zPXaYCrRQ`+;Y9@``rYp(h}7g6pEb z;QHNI(y|<&w{O@18lgkL z)18l58Y98^+*7~RZyZ((OgS=-vgD$Ur}Yal=Ej-VKtV;U%D6Xa|FacR@8dRfG4F|T zmkCIOfhe#IfKGcT;M_?PJgAFlBVrx`&1IPQnhOD7vsqENGeBfg?};9+rdHF6Kj=iX zoKFWLo*n-RdZw{6)0Agg$b%TkeTI{6%22L8DVQ zZNy2*{(6}LlQP^QkC&m|Ng6YK=l)yQ(-Pt+A6}^tWAsVT;NkO1KM4_MnUIfXcq;x4 zEricG z5A%zOeB*^?Tb|}}k;PnGf_7|B6Qv7&g_Dbh4R=Eu+d|VH|8Wn*`9ynZ#fur&?&A$1 z-DBgOT-|R-ht4B9e;)M2^E{vCZY_*v7(yu7EgJk#NZw=@u8Qz58ZmUhOh|r-vw{v< zTFgd?^P+rf@T%lzdLlya2wJN3%|#{0!raIY=vx>5LFcZAwnfH|8X=PqNM(XPGR>Ng zR1HM9gPIGQBhDT8G!s;(FP@58+aSsWuyp`&uyn=;Ms4sG6+#I!A+uCDy9Hk+J)zuB2It!w_ML|{QpWV6Eq z77Q12y~fYT5}uW2qc){eI@%y8m`dW{3k18YAXSi_<0@0o2emOT^mT5>W8sdg5*G49 z!zPz5hu3gh3o&oDg5)IohbMt)pn!WPOo69+E`$&HCzZO;kf-tsH6_YpQdhtAo;5DCqC)QHl@TWOJf0pVHdvZU@65d^4ho#o` zcKiojif5r@*66?DV2Z9X8JVspl7H(X2ga`}2WZHXUV&zhG!}n`@zs9n%BlF5TxDHC zM>KufUEur5k4dTD>RJG1>A7A9Df&n#+Ak$0Ew}_s7g9Spred$T^+d4l_1WJ-hufRX zZ%S%6cIOY|q1Ubmm}}(+>K2#Q>1R{_8W*lamG@*ooxX+yw|bmwiA0#RH2zUpd{Ze* zlX&CbnF!$C!C1dBt+K*A+AQrHntu)@IteZ+TTS#BV#qC&X5Rb$EMKgrPyJ1ELyam@ zH(dz7*^w6o^yX<6)FFm~Q}CGWOzgd;Cfw;T-V4i=nxHM}3zo_S;x z&T*$QWL-|o^L%N}zrB4q`zSY$v#oA{|K**$4PQkbqRob&V?MDW6CEVHHVtxRoCHr= zS&?;EN#V4CIb;sJXKfXUb{b5D(9xi!eoRA9N@vc=f5tzhCG7g@YMVmyYzK*kf+V~% zh@Mgg>$GDAFFkR-Gj`fcUp2`=kvWd4x6aW>CF?44hK{#2@L*%v_`y~*3z#stNAFf< zv;kWXo($}|FpJsce5~{&0H#?A%@FlaKhd7X%IVe=DIZg)J&JG}o4=&fYV`Mmc@gW1 zRS{wGoH<_`ymW8$t3__2!GW;QS4oG>Wm;dx^4J{?Pr$0L!}~%zb7g3B6Zr6#2F#-m_C&3m2S^YCdcJgIEv$ z9{k+scy(jdIc{c57w%nqN)~1m5VOu5uwkWOX~PEXnc10D#^;3W2wGj9e;AyW{zAKa z;1hv{eysZI7T#Ojpjft1Jd1kWq|^ql<`_M}6=`)!7Q}*W2)q$9F@c*^e8&;J zB3gZruHi~tt_E!=ZfMi{mqZvQ#xaUUB0Y^>D+hZ0XjX1om{%>@4A|Qw$E^1UnL(Z3 z5|c1au3}g4jxUK6o*((g;o3pWe?ve4@TK3wrAfizNzKWw1QzMkAf-%!@27OU3pQF- zDjvUiHpg~4k+PhonpmA-?|;HWLNF(RyRa{jHn%T9-`%!T{+VhWX8l#^zUZFSzHV@~ z#n0WK@Cxb?tC@USK&f$BYarvk7~3N@U*MZzr+6klb5X-&r(=i5_XgKu*!eVPHy zEuU8I`c%vNEL@4^TtbPmYme)BXbxT@!O1?K<+)Zcvw@H2dNU5}CwLfvZn(kl4iJxYxmVmJp zD8QyXfj4Ol^_=zkbZ95&b`O4OSolr5L* zd2&S_qoABR-sAa=y!t?Q!9tJU6yglw!KdY8rj*PuU1wqo%7NWf^8IU+V zE~@p^xbas;G1UD0#RN+wk@#2(LF+2K20qa3g__;^%5jMk|s z$f(xT5Ix|&fr~6ep-oA*ZGuEaqpx4#c)RV?l^Q&xhW7nMne7nn!znAsL7-~8y%ICT z;c$@xAHJ~iZ$A}i(s7=Vfs|A6FkD?^=1blM3KYpvj3d4aOCswAVg* ziS1I8r+*mnCOAOyH|}eVs*=2z!coZI%On9`U%O>nk){zWzpU1z%V22a9!f02>T zh!{t{rN`b5l+I0ODfL=epLBOBfmpClYh!&+?#+?qqe;yj?^zwvvR20BQoJOJYIhg1 z4%?b844){!PPOViTAVUF4ILM*c!4GcM2pdRRb7=ul#F34C(9SU~|i34@Aw&;+Pl*Ql8U9SJ%ty(qATW{VXnnb;?Vor96`yC`vZn zu{Wh)QTi2k@xcFkt7(klt=A9tadkY~`XtRJzlc#^;IL=i38a!P3{kBq@{R*JeiV4j zHky9vN318DudOaS;I=HTRWgVjf4IrKN#i?H2~<^S{*(k#Mh^~1-l^0l6b(nLT>M_i z!AzrlHg%d6i~GrdXE_$~uu7a0UpC*aD_1(Rb}4`cKm3wrL{KwD!(DsK8vqJ;zA9Se z+zp)kM$F)6dbS(NtETGPHL;TW>jlo^2WWKP2iGdM2Noc0o6`f-iSPER#(+^Jw}@I& zK5i|3e`~c09Xle;=ewV&{%zBK^(p)H=(O9?0{ESOwUgZ0uFyQIh#^$ynRSjun20yrLWQo@ml*VQRSTnTs>p9W{k$}^ z=;n%>8h#z1n&dxqX5ojHJxiht+{9QeN>OHy)&}2GG+Nb#2Si((!7Oo6#;}kb)=n-) z(pC5cRtVAe5Y<)(XQ83rqIw^MT64f$6|FBE@(IW86;r9N>MO@;LBI~3vju&A5T6QGnI5I< z>3=d2Bg2rQAMn#d9^7C&lx~VP;H{ze85v@u@8J!~Dbz{Y;t3aghneuPNu|9oPg{_B3Y zKCamWDlJ4V9N>DH{tc&?4h-6wzAqfAdLl?JTK_s9MQkZiW(ZbdrxN_eVYufF9Xben zs);?Ns?A4vKzmKWsJ95vghYrl5yzR03e#=qy7W0=0igJVl-R-p#DoZCv!+(9&-D_J zbf6w`*LJimc2s<*^B&E(v|9Z3$p_daq8dh%ybaCPkFQwCg%epD%C~B3#&+@R?z-OJ z{~LrjgrbPdkz;?;B|=3N-_d}1`PX^5yhz4pZ0$oKFHSBzlilu`vS!X z0$rs}sS2k$k^q5-R|K)kpFDw5mlcepjaiTLvI1c5d8gy)%wGKqU z{_10(u@QyGGA5sgeb8lNnPu)~SkNNu?qcmys15v}wD-9>^1bcC0abFHYkfZLl6}7t z-AmBcn(IwtZNudNyI!MnmQg(S`r$_k?)sE^>g5^hYri4O%k4$cdoi@O2G_duys^Qz zb7;UIa**s&B(NvK@_#}T*4@QzXsKNMp8VAQcH(8F?o^e9sGdeoD&X?+Y~(LzDndAV z@T}`{YEw3VatLD|gJMEYSW6h@&EVtR$~Ajx`d+YgxiXf|cLIb|ATD{m^n9xxbu-u} zL2Ps`9P19bX-NVMwL1|O;jQCXd4!4sF}}T0eZ^is1?2dwmB@#~1=d0oG~Lo_=5Pg1 z;h`DtUg(u+vBwdyy$$-#>uKK2hD(gc$4+Q5bZB=NSni%wBi5U22U|cJSVrxvbFf&5 z^X4;$xo&0Ht->bmk5~JFT-&#!ZSyt`;XQ4OKm=YNZ_`%Zt>)|QQs3zJm#lEg_|F1Q z$q-Cva&A|f)Z~O=2=rfh7lH)SJpdSdin0GI(a zMLB(M^SxH03|kWefp69Wu~|>}p72#xwD{)bgOWZwz!99_m*1jsX{q}I^Ju4t2@7No zTCb*Jq6fGkq~b3?a*NPRFzDqsX%O`Ox1{n?diSc4s*#}q7S_M-v}~1gtPWbkThF2* zE2I}^EQ}2HzMOqHZ=aU6%bn<6yyfSweNk;ltX@p1csJ85iOzes?J(d2XPY)vODafa zki_uR(Ih$g%%66^te->bN-#!~q}RSJzt=T)v=ss(j%rrDS&pMf?Ob^0kC;Mp3OYU< z)z-iT|LI=##7yMNNbTm!!_i$=&((2I`W**?7+Ii0UAq}UEjQY)t$}d^;1gD4lmkJx zg?G4bb$YhktTKjS*0Pyi{3DB@@IBSP-8k^%gS{i(n7Uz^+b_?FvbCF;TL!!j2j9JF zJ(8Kt%)MB%hG&dywgGT9MqQv|9aWd8xd_Gi{EUXtsJ~l9YchBk1c=_eyUiv7#zI%v z_5#CF-0e95ZtMa8FvCPEZ?e)k`6)YItImc?6`|!L6TktshuRl!U(T_V!#Jk(C4v0o zsDmz>W3f2thgGZ8{q0D&{X6Q0y~HmBY-Ifapybtq7iO46KomW|9L8uD^ecIi9>5PR z9n7uA%`=F~zhawDD}br73Q&H2Mrm#ZMUfwh@AC;ozF*A0l}AhI%32LX_2EvEn&p@B z2#%AM$rMTtEyc)d;{eekTsUs~4B&8vF;Y~huu&MlT9$w>tM+H|wZ7`id)zk6gw64F577jL1Qmuagepi19X%KxS|dSs^d`aEKboA-0c z1W2ei;+5?9;aB#A4@aZ?UN4S*{p`Mt61VktxX5N_#4bl>!-==P+7UK(LOz=gtCC;F z2S3*ldfB^u#H?gt)MGUNgiOOi0&we-(FXC0$>c14oYYepi}N5ae&N)bK2cPyw{SEbpE|(H6_z_!D3+g3;{k@QdR0 zzeFem7O=rFaoqA7=igkE+Qek7LUc~Viu@*(0MKy~MG|=*lo`x2akOL=8DK8ommb_4 zaWoo9;6woLB9A7|&Ji1%s;={NCyOV!nJqhAw$S+e^goc>r>hNxaFXV4Do52Wuf3={D zG*~!;dkqMJ)@tKW?fpq86suFt;_MM{-sA2OMP_5|?u8RBIrdl}6YeT-7CFXmokVF1gL@*2D|8;y=0f3nc6uTeNijifH#;sTNJw(@D>iq zEAJ1vlc(TqtH=DS?N%OrRvgi~Pk|nfd=e@jDG=JPwwKQf@F7QfLbnq>Mhg4B=sxFX zrQx)Gft0>?=F}gu`_5je&saZM;VCa;Y))dsg(wv=3u6n`=+ZJR^Dli#VCPRnviwuq z9~f)8jQ{+v3i8!c2Qq-a;yafEa{~#9V?LG?LkRoe~J@Q1;pmYi=umKPq_2oRmkiCm7A?AJh z$4IwZZ=LC;NMk}Ee$53|*l{W)@;CCeO1Y(k4-iMd*}*w(L!HAd^GYsgV)DIF3alW( zk|Ddh(C>cuEZ2O~(P(W5FF_=2eQ>2^ zB&iGsZ2N&v7^5;p&S8@k? z0qg`e)D9MdS8vv}34tp^a~7a>kPi%a`KeYp{k2J70~yICy1icvPVyJQ-}e@}xhTU; z^d45O1&?8Oc1UFaSgK%de_0L4Xz{aq)pKp6$UgC#4J=w|QSby-w33i=Nq@i0q#9+y zcmVDK+&rrYcIHFj5C_otvY<*r(yXR?293x)pN5r3y}4vI;WTYUOA1D*K8WFVqz2-;J)835_~Y{reY*kNVP)d<`)`d!@4NaNJ*u zTineD0>ZqgiH-{xST~xy3V1@^0pg(OZDxb=Cpg2(V&!Aa6(`?y(HWgf@_X0oRb21p zN_%dgbVH2vjm-s80HiH_YEg#(PUHJLyWl5IsqKs<1DW=%E^(H%?CS+N;YFVz2b@Qb z$(}88Z1;GB02jqA$FKJOUehMyM2`@*Vcc$ug`^#~jCn$qG4(YaH~MY(@3Uq&Yp8)) zKJKV`aI2l5jSExZX8ZY19@H2lVY}Zx@RdLvw~Xd3o)`C{Md5XJPi~R*mxr5R;03X0 z|516}GxGQtuZrN}$IEoIb*%3JpeX>ua~3B<2a-FZMV^NF;loYLd4SrhT=^;n4{ni@ z*f*Pl^{DH^bki~EeaGj_0UBS=;6i-YQImhk~3Rc-2 zz!fv!go`q)&6ZK8H?r>?^q&q_Oz8X2uyQ`A$BongP!oE4fGR3J1)B}HcT;SMJN|Yi zyU<>HRaOe^^5~m1^|+b_F+m7USdD^ z_3io6*8?x&ho87Zxm`NvFR2K3ujup04=-4)>jD%Gxdymycxy`TE&;%X*wm81sBKvh z|9O(|4e5_B^XLp!S<&blshM` z0{~-Cms}GD;7N8XMbfM9YGfF)e}gQ4DkQ}ex>FxLS?n&FDCD%{mEqmXpDfg2pJe0Y zgvi8!<@qSipA(=8U_YAx)uTRdh8X1p#!hx$5BIYsp$wnA#p7HIaYQ2_e>wkM8la?cx`;LEJ`!eUa~Hg<%36iP z7^2>b);RJ^#+5ulxhw%M8{cRn!dw4FK!f4F7EXsgm7=+`Zr{PqEiLn3x|KYIr{{aC z;6c5=wt>GQ8}wxjRQa$0HC3F2%YJ0>?b3y8=EpaZ`v}FtwZjr0I%ltN$CDTq#huAJ z6TCh7o`(SHh|8_H=x@OO#JyX809Er{0HD~*B2mlRTeL|{2f=l&AD`f=ClJ9E)^Wf5 zy$Ii$AqB(^z8;%NnZHaoK*~qA(%qSXfuGT;ARQVVHwSj}kGRipJL$>m#0NlmqybjU z%|HxUjFLwpd$ra_4SEA(8pP$H-3w+J66=C~P#*V^&T+dwM7GaogO7irR*9?uHjFt6mZdXW2#=HFABt0jCK z<%F0}H(%*!?pDT69qjNLSD(y4)#ZecZXMqd=ZMJ`cZ_yj2csuIs`al>g0WbkXB+qr z!8j$zuLj+}qxd0@eWg`+ot7eRp_H5Ww$2sqOSbC7e^R@JXceN3zk5XKq5q_a7e zRnZv^=1{=WcN+d^_Tk`SLt-mcr!Z7Y-b14wE=8?=a2HXbN}9~m-&pcl?QUZB$q$gI zRROU9D0Cy?Lu9$vD*ueQfyIMTj1tR+e6NaP`j^ARW6&paj~*QYz#!=@+}Wu2*$P($ zfC@&)?_KKg(nsa!_(;>@S>S2xbF2QTdc#L))uqS>l(b^62QP0wfldYss<+&34%JU# zDZeQJgmHh!eOlwTjVlJ_gxz-nzLZkp+iEl=H+~`*MJO;!!=8fUPaVbbd(EHm>c^iC zdd*`;*%-dZ{*hyzk@(fF)W#%(xkbHNAbVMBr)!({IU*FMR5=N?nGrc6#}Qr;LPd9{ z_21QfYH>3%J7&|g1Ab-;_0}XX#4@-hWDJZ`&9Z<2XXrE0Je?lsmNQaa{+It&%>bmR zTdbRf8~UmyHx#;7ZaYef`t@%FP~fwERiLoVbJ7n6{&_DSq(Sc^V{3Ow_)}qRS6K&f zl|#?aQjTo}R}5i{1VG+V?+72eFNs1PI?_v3%fy)g-odN@V~7wez+DQ#i`fHQae&EF zD;2qU{b!@(RXD_Jc5Qw?`=W95zOBBCgD|VfDkTtUX*hFkJ9ul1K^D46OM+F|U@shw zyuQ8z>Q`YZ+KK0i3;=bMtrURM$9=S=xI~RJKv%7vI4_*fYQcq44U`!v zWbh^GS6OO9j0k|2k#mo&wz|aiTM9&2L!x zGITsCPk-GY`ip+BuBDLK=WD*&HMN=QVPVoa3V@S2>FBK`%32f-i2$p@#%;yH%UOmm-7I#7H(~Fj1j20?1b9-4jIju~1`E(x|42#3fO+H#a8MFD> zHkj~&=c2d~hRuMO?^3E^t?f!%{d3DWr8#6z=@v@Ie-c1~k_t-u^Ui!ZwyC#00K9>a z0_Ddz{7X(q*|cH@kgAtfQ8kjoH&dLH!AndcyWQ@3zf!|Go%dJSvo^zq_%|R1X?1 zdITIWEbxl+0Io)%jC@u&N8z%~YLm{Ll0X;UUVTFF(l%rv*OJRhm@36(qZ=}v+Y~7e z)9;}VlYcFzhlVjcL%$;Es9$miP)}h@YYN&@c!DTAOp+Avp_=iLl_m7cdsZI8AEjUo zkgn`-eT((Fp7P~ONjmj}uVaZ@N4@`=ZLFXSdap$oGrT&t)IjBC$hw!MGkbDBX%+oK z3rY?9;SL=adm3lrJi-|6SkL{78B7h}?o7m~nOgWT`E8=gtnHwDi=MXpm zUKY*wsSW2s`Nd~G^Lc5<1q=EMI?L(g>oVM>%~%$U(w9Ts1hI83*D4r{s_5VJ4}mKQ z#2?1shi1N83ydYzT%U;sBaMAVnUtJydP|zcMc!yu#ie0#^)YXhe+t)>8No605a&3xT5r@cmv|5g-Z#Y%T zWL$!O7|A5w`9gqMoDo~{5*M}ZI0k$r)eoM84h6k@^2yCxdHTH-c@dV-Lr{k`K6eR< zE}w6JVF;<9pCy}H*eH;gQ4rN0k(e(2)WMh#IerF9W_~X>e<}QIRE%kZ<^_|LX3de$ zMtUMjV}}b152!?m_ZxpQ1K`IMvopBw zBkW_-G0F+=k9?3Us+uH*?%9;{FSai1lgSZ6#G@ObXOf$5witCuoX z_8o#2uzvOGol{^ynKwl=1}F?Jn9QcGDDVklZ^b%?jn*~#*td>mF(e_cm|T0P4B?F=Y(p64j8b);E&wv5P_}@;Jt9IZ7Ex ziTNA>vlm&6Z##Kjn7_RB{ff(MVwoTb#4Zi7&~LORFV91nh7{oNLK6p1;NFuC;mg%% z#L+~BVigo#Gt7j7^<9NMubYtsO5)jg@oZ3MIn9zX`xkm=Fabbl?nz(_MaZ*(wfH={kdMa=H+j4v~Hv7E&CeR{YC z!TLw`0F^_?-jWfqVv~g{xnLklsg`k1S(7jYsH|JkKTQ zr3lsc7`!`8p5(({Tt8vcXn*$8Y|9kL z=abhc@4JNZsV?AjYgT1ER70)e0`hF;Q~?#vsctt@puB;QIJK*qH=Y?9dD%Xh#CSu3 zqNvN3@R30tn>(HF{+Gk+TnRln4K?9aayQzYG~1*(NNch=iYeC?QY2#_>kgK$`sIGs z>P6i1ZRy_~>UcX}oFvFAu{@&K?N%nTMXQ2xheIEng(ofRwJ4eRH#ioM#|Y+i2X;&ZuEy{EiKc=&L0jjRhPYiWj~Kaj^ZN z@kY3V(X9kQB5$92E`Gs?p>gtbyJppQ%=gfk^2*$`bar+wpet43;wHMfBb2ycm~sA$ zBZG{AvW}HzY3^ZrCuYxtN}13<{}(_`YT-j1~(m6so#r zoKJPL(~N}m%IEuaHdhUA=OC2T++hWIUT3aF-a1|$(d>_$j8sh+V+Ve-Q9(J|$FxLm z{cnC%skE^+?3-oCgaYfTf4vCcf9}`^OA>OThA!iTm^>tbt**SR*|0OYH(vzC7$NSO zj#*^u$+8{4JD0c&s|u!-zo`KV=`>9DE9BLWDof38YHEC5>&ya)A|O)`^tJi~p-Vf- zucU7)l7RYUead2}sjbRwQ+wEo71{9i`Ihc-e-%S{8XkH znKb}$$na9iST&lnSQ+{+8;N`&G9P|JwqM9r-`E=B38Z2+)YHz@k73yZ_Il$31Tyyk zZo+{;%GCA>lap)h2MUj3R8aXzLsAY5s1>Lk2_xGz zwl{dr8E`G>pZsp0G;*9tm`y5BP%)6~HkN@&3D&C1XYDwA|4Fvt!wnkdb^rV{Si?z? za#;2cv5X($?M{a?dJKTN5_IL}_Qf-gJEpN{;R+22n&DWEaly2nW##+>HdIWTBEQ+X zk)#B|inRAir#4YaFUN$mHP|@us1fx0Za=76Ag3%(b}U0AaK<8Xf=0xb*V?#LORHHw|Z@Xt=mK_ z%Fx=~r;18s)<@klp8rTGtXMnK96 ze-DWkF|fq+m>oh%=EBs5HKo#oF@SAXLy^VIYF^%2x9q!dE&h z1p%ZN=zYL`L9F?XXRSI9OEL!M=LnS@HHeyaX-Sd~C8)sN&@6Iw(pUa+wb74B;R(Yg zI>e8`Q5GPx=yug9L_OvOfZ9pn5z$K6)aI5cK_+hrV@mnZbfVk%NRm^E^PX+$78b$o zht1zxNdfV$4}BXnBH$ni>6e?EoEkr0jL#y{kgq!-MJg76Wp$at@v~9dG6}y{+~i}s z4eLk<6Eausd?Ii|?hh=DZ95+?T12IcMjtsWcaxjIy9{uynSN5CheeHrKR^pdI#o0X~b zUSn|!I`5WkZS(_K!}e+O_us*gCW6s&H{b8l_lNH4Pvmu_D z7|0SL3>s*9#%?p8_2gXgh|6#S@YB*qHE+y+?2e9>*NFHj&Z~m}NAQ8!xKz&0=69pv zr()3;8vbrvYO!{so5JZ|f@uO3!@Ju|68DnMC)B`!$+vZysOvtmu94&SoG3 z0j`s)e)`zK3XR;Ju$Ucw`Tglp2ArSnGtV_S+qN zZJ(MDaIQ*B7jLE&lrF)(`j^3<@DzlP@c0g495#)R#H9>9Vk#NaQcSc{XYG-+Is~X- zkFnD2l!J38srO35kJfM@1ImQrw#+Ii@z}B1^8*YS&9c6)8LH%kU78 z>n#0Ao#Z<3IOhMbvW`~lMrmE@=C;L&26)RbqT!hb&`-WL&9XrO3m2&Unr)1WZ|&pI|92&4(~ zMznuKA7G)}uEIi~333JpPy;q`0gbCY;%n~p*0ybL`{Ci=(RE4~=mH2)NAMSf$coHq z+-Cb6-B0AaHEFD(zHzRW@i325t?1De&W+C2!o^>SCgSRB&Z$q8`DbGlk9aWdZB74h z$W2fTU4htqH8hF_r81tlKq+PL6V|*rHzmFGe2qd3dAttfVOa^7hbnDFi>WM9crRF#cMp9uvOFu@v|RE| zD@yu)>uDxaP~+pUAjr}FxF+fMw~3~vL-vk-0~W^xm5;DNL$Y#KLvra181Ll@3lh>* z($-tBI#*5_h7&V?7HPc02f&r5-ZxR!(*}~lWYb{LV|s6(12S=}30dD(%inaVg)LYt zhW8r%=55#SdY(bBzU!4FZiROK?@t$&bs6-plPy+M zv~H!(+_P^5$X`^x4PWPTV8n`DdobLk`&?=>TYLcOvi?b@r5GRPb+$!NW0ax*Gc^O- zr$Z9Bx?U=^yfWqT8N)*D#SYlsMa=3#uG@7_sM?V|A}L4(tiES%x=aV`#u#&?|RY6hF!8G|FQop5qCwf8h^UvS|@OgGg6teTGB5f<$n zlh~Y=$@oO;#m=?^0Izp?9rTYoxy<{YbmNf(t|LX`*!U;cYC@?*MluTNw#`PV_6NAA zK3^NAZ#c0sUJp6jH|bKHHXaS-YYV4&g*i-!;fHejzoM$82E=dVmT&HgWXsjk`CxX^ zqJ|&)1Gj*(Yqk>Gz5|yVVRCBuYxOTGqn^M3Az?YDfij05BuVk_R*Y2SVM-Mlhhmw5 z$r?@G4f3#j?A-9o^62SFZBz3*!izkxO~S*7ayu;rpIY0$b%z6Ff5sxTyBd!8;s{z= z=}aVr^(*U2dUDtHN$Oc&_1&j$pGQjveNzkcM5cb#@=wo%`JiZ7Y9g9d!)sFi;kPNU>#tV<9~W_$XCP z2kiZB3z!9ok0Hzd5M}uH371U`MGR!h!Az_W7n?nxu$(n3zGUQMI*x0mkXPHFKN|$2 zV>?4$bs+-!iqL!klDC^~z3CNJlpa(s#nk$miRq4OA>whOxUy8>)J+mMf#)o?=vDBn zG$R-Q7nQmw1v&5iA5sk7!*KVt!D@a)YUPexNM(3`~o5JiHs4i;quAn zWUR*oJQwE8?RQ3}JLUE8kyYgSk&pmU5`C_4qV~{ui!IIL02Wj^vXC^U{fYKGU*#Vm zyve2!xM#SRv+D%oPxZunI_hyMEx3o~=9E~7cHP|*2VG3i7xLs&9z5AFFK#@*cvz6< zY-2VIYoAipxf?%Id1WqtX>-M*o-oLyBqK8iiiFB7w=D^8M>9)Dd<~`T044LrZv00$ z%S_S85PF~WzLTr8+IV70aWCs3D%12;zV9jXE?@9m=zB~{NudAfa)pr0lrvOkK}vq0 z#)WCHJJYx`zoCh-0+&3*D(pqdkOkx`M=sgZ>T0&P1O63ODOG(~@t!&pp|!Svg#G=+ za_By^dHQpSlj}!W`l0`b0q(#RHWfwWa?{W5pJw|;AkCAP0eO!N!nW;3 zJH~Dz5a)yjR$tKvm1KI-YO90|OckAIV5(h)_I~t@#3R~i5cv?p5G>A@x=5n*&Xwdd zY?`OWl5a>eVU(F(P-84)g6b;n*<(Y34w|t~(L{eJmv&ogrQGp}q`y41!WWYE1f5by z)WGiOkGmEOEmv~|l0k5hT790*sV5~?Ye|JiL2^@kwqc%mNG2dLt#B1K(i37>rLKMF zbREKDUe;I~OFW)WIH5ym{U$p6w~g-E8CN(7m=zs;@(xjXGFk^tqM%H>NO(^ST{EbQYpk4WtMLmb{cmMQsN*8XHa zc!KKn_Sstkc%neosHnr5HkEb}KTy@Bf~1u!Q;d>5r{jajRjLgsybiQt*4>;@u4;_d zr|NvY_!alrxJppt$MPB96$wJ4eRBoZJ%UoJr3#QoePf{ff>=p{x)Re^Qf^?(TU*^* z^6N}}ro8CF?ItW&G6~Pe=nad`gDt*UpP!@u!+COWYWCR1V=~^yjvi2<_>jD~W1f?N zWfe9Z*F9c}v_}b)iBTI)RiakQ2Albx>(gHo>4LdI`lXdeDxu-8>BHT7kIaQA^k+-F zjD+;V$@-JfKe!gYb`RAgzT&>j_PGDO;0ld4rOK6cb1CXioB@yNU21bT{Seq;;K?6R zx+)A+a=GP}9%ur%r~Le5pMt1+ngRl!KOKIlClxeHIn>$iWQ1^oHW1Wad^@SVNpram z%-RXeQ)YNiu*b^2ddO>Y%|$>@3R&KneJX3)%i{9`lESY~03Q|%Hs}~Jl)(oSdKDt$ zRU+-Ei+~P@u~0w9ZQ$0T=s?n zJ!frCkl|*)zvokTQq|@M6=-|+gBa+s#Ca~{QDc?iJ1tE2-8b=6BS`Iy?G2xiF_ze4 zApUT(RXzQBNbtx;Kd>YlQcBzN*F#fxUlR=I`%Zv||1Kx%OzkLgfC|1+@vkOW4-P{B z1fEvBnvpG9u|GS4ggk>NVmLxnUP%fFTATa&mS6*U{jmOnWDrGwl;sXV0e=uh8A($M zNEmL(X*|N1&l?}`>htzodlR2$YcnB7`}^!<;>2lLZ{9`j{*d>-S){0a|E75Fr|%DL zJhiU&Kj$g#uT}IUt|n@t_>P<*$(Xccj{xYOOQIaB2RX;pWI_$y zh*l}$-f{wYYhv+Hs%ZB3RA58`xgwNt-)W*$yA2EK*5bxz0N{jwYFQX(sQu#w#mm>M z7JZkI=j!1OY>u>f&ykz-Rjo*au9DN7$h#qLEVcFy63+Da_hm(%NAlR27KaE=O4PMG z(L~Ctq+`E2`o)}ogjaebYNMN{W=@?Qc-)N_8sq0iHWBiX@u{zF?~Nyo`*U{NM(5xI zTR2*?lY%STx6bhVGI4zf}4R-HXX2BZ3&k>Tzx~lc9TGA$Sv==MKC*YX z>daxE^u5>jh`69=}`n0=7ia^lEaEANUy@!^+k( z%KS$lU5y=uP){@_kjip>G<|6T_9odS{P@jt)xx*9uLvynj#h=vTx`f&Ww+E3(^L>} zRJg509r`jzAV3uWDlAHnh_!R_Me`ux%c6_QQ0>wHJUoTDe&uvx0O9xKrSi594v_L& zgGR4A4vps%(yd_e4nW|(6``@3GWf?--sa>8x$T`;MXNB;#G$XSNrR@y8I?!)p=IX42HfAuz2w^FvNW1% z8<=Y{9?im1qr9THIm|v`h--QKa?|qs(Y_0iD$8P(=EzZot@BjcIiW#*r1D>#Z#m@# zQhpT?y=O(XC~&l7K`WV)bS~Ci)eHKUQXVGA$4QQXbbxYd1@NA59X*@+tI?8& zCcI=Tr%7c@fdvg+@7@PQme}bDy+^H-I5f+pH|i;PME&e9-H+*TR#sF5x^^sTBEJE$ zPy@7o$Dx9XC1!zZ&HyF z-gU=(8jCD@>$2w^fx(yyFx9{M|)Rb(Nj-HtUMh$T;h zshG!w#Yr<2j9yrE%w&z4WXM}A(PW!ypbM$MeEpR|?kC)_GOtL6u9@fyMijsu6VtE? zGDwO5yzDn<_mmX)q;0MOD(0#ZG9!LJYN{q0sBlq=2Q*7TH0;Dc%A>)=4NVi0E6Meh zSRQjJkuK-W^Erlm3Rqv7Ti_mN!eRr3NFSs$*xY+v+8J3KpQLfaIBE1f`7H8IT0eYT zCBAE`yD!hT08*S(moD{gi|;6V#Yl&25UhgB{eed4p4a5@?v;E`?iu52LgYOwCLUm5 z9$l-DZ?)gSCBs`wH_xQ`h+Ycde!MK3Hp)7XQ)*si71r)7+M3Oq+(dA%;R-jq<`VHuu4Xxr7M4J_K2h1YUW-evV^wRW`P zKjA*`LP(V`lDp(jMjHWg&Q$7{Z(O>lbaFqxM=HY82r292R*neR2-#r5>B`SvlWWR_^ zlk*<5gak0&=4ri2dNEf2lFX`*oB{YDKQ7iTzF$qAIgimX);$31>0?;|JCge>__E^( zbxYO^wDG@Z{Utiyr{#`EzdKTr!z2&E2Jg;j8?CkzXjW?Q91U*E0;O~Df8uV?==W71 z7zMjKG@i=(iqDJEeb4d26NU`vaf!P-Hr9JK@X;kBy~W$cnbuZl&-px>%|d=yLxKZsLZUskOsMFn)5*rtxYZ1I2GDTw9Ly8b^+l-NCb~Nj*t1)_ ztt5JetfgzGAb*Zjnn&~6Y7!v;5#4SDAQ%hm z6d$*Dh4s$qkaK5r3EIi!jh*uA?Iazca z4$wwFt~~Gob1_lyJNNk*#I+~!r24zheNov!3iazu0p+`)bU~nFc6?*b7-XX%6iC)v zBl<@_Y%r1RLB$WQ-gZ{NdoS~e&{ee!qM})1D!wTd78WU}u{^Tako%0t>J5>QO$EzS z40ffgX#Ta#CD9Poixc73XXeM4F32aNjhMCHrn4boMxzRE8}g?shz;_;@;+j^W;*(K z0EGP`^z1etk0|S75(A|yiltp~r%m4Cpbn}m!NG-4;s1P?MtF#0j+EXhSE_auphKl_ zptVdcjYhVdP&p!zlI^!$6(Kk(NXS6CXzOzNZxdwq;CW0Fj>sogUi(}yBqd2#$66%0 zJ>qO85#zqr1GI|fs=-w^zK{qV^{8cd&)a_Iu>B_K&%6FL^=2@3o}dKlSdZe~%*}Ck zy7n8t94oqP+X3>3#g{Rlxbw8~wtwA%o}@G4XBc(RN`?K?+|M24NShX-;WsZruhK7= zAnG_Y`|2NxnZnsDuMW-1xY76b=5q^-B)4@JUjIqVE!MX0?bp)28z4zl847DFX2zP$ z7$CArQ?er%?D)fLKdcmpar5sMZL9$RBTEm^UT~KtG?nn^ZJHHb?o`6rZAK-|_P_(< zyCnY>J1?uFUngU;9WdGv0|!NmlVh_yVe|TJ+Hs0b+Z9Zp(trgHT|f_=hKv(EZzh>e z@9mI3ZotRD$5e!kdp04z;AB%u09P^94;H=tAD;jFAovDt}H zkMB=1Vx!Pmiy3^LWw4?a+CexJ+uv|^KM#Da|bM$q#O>-rhE(qAm>I`*1JUtZwI`EbOyf`qyD#7)i z2DtUPBj$D0EMAb@dN1!AW|bxbZwf+V-y58%H-DnlK}W@Aa`Ql;N09sYq<0)Ta{cLbf-a`ifezQFtEBgZ4*( z!(>&M=F!}!ikWq$wnah>*t>SBju)2PS8G#bYosjwTkpXZtI{c~Qh=E@Hc%*9z0W2p!@M-Dslq>DnR&8%VoJ{^WppTiww)bVlz+% z4IPmM9dl&h%nmR6=ESthgoXUk1Nrvn-yL^P;M23S7VHC(gn6@z1OVOo*~O!V zU${;tNjZb3$%+BTal#kO!w0;^t8Xc@LSp0{K_>lj@8&SgtM<;-kUE}H- zFkZO zF6SCC$BHWBF{`L?P~Lcp+(94IsXm{tXb2Sn7df{ zkXm6YC!UWVJwmh})ibHw(bdc?7H)zHsBqF3YYD5BrB0jImM1o^637Bv+IVi)yK7?F zLSNel#!S6oIZg-ly7tZ`IBW z#-0)San3%kK7-_241JgFP$)n$1@!Z` zDia9=df%JA_4+jnIxJ?Iu&C$Ls|yI*w}1r1w_%?r&CcsBBhx_I)-AoR$!q40G_o(g zOaE@{PBJMjgwJky(Cj{uE806}I=>5+4!wj#RSDn^qSWyCRv7mo-RYa8Ff&JG`M5c|Ri%WddH$F}JyrKD8_{Bd4Qkfc<2=?Rd%ki97kDm^l$i4%f5Gw}_T^ z_a6Apvgk#}q{@N;=3!TXw$u|#LL?+pP$$IE3;4!QsAN24#hy(v*wf>u2>rZ*Gm^9T zWJ&yl!eHy+dv&-UIW8*Zz{1E>yq-_>;~hO8Z%{Dz6>Z}F?}F-tz;&Z%WY3R{N-BlU z-*Qf|;ID@V5)zg5aq=z#c^WQLFxRd=%q&@g)HhGBa&? z27Zgkc0`JGc=V#5()}qNUp9&=@sd3rFEv13*W9Q#a;HwE;sa#9y9yrHSuD-e6Ge}f zW*J?Qw9jKM4R9QlMg=pqw;)F@?4j)hwYSTj#(w?avxpFGbO4P#xU1qqBgd3+VQevA}Wy>?4w?MI>zifDttO985;?L0h$K}l2IK5fboq156p3U5)UPh9oi8* zg#xwwm7Y()n;{-ZNtQLHJ?VN#FX5Md@lorY^_^7 zx0Hk$nYY*9An?>`eV?!Pbne-j7+yVJ!)u4^X<0T`!~SA^sXpA{LQ5ML#mXCak3-kNmAtfX1})Skjp`A!QwzMH!jdl8~Kj z&N)^}AtIFQRd#m9v4!lJb!^9WI5-Z@`JVUZhwp!I-}gE9b-%9Xcw9f0%`QTYwmOYZ z7m4Db^#db{N2;2=!o2p%{a)?y&(}p6`LqIFyawG&cH87q@?MsdKyO9~pp(>4^x8(4 zT8XU4k7B%OR9eniq)Z8~RSl$)ohd{V?KO(M*8Zmt+HQ%l2*7!E~aDLR}Zlp*bp%s_wR+Z)K2GOYz|K2tz4A|#Rb@JjlnGEttX z*h@m8O~ibdr&Ne_sSnKU_S9{RpCotL1Xp%*BiFDFC|@EAbgEJf-8H| zOZf4W74Gu!n}bJ-tiu#_2MmqCKr;B>sbzXiE(03VU@~r^>7f-1%D8uv2AuQUpxgJ2 z;3!2*t4Fwwgov;T-=ArVg~+%BuMQltf@F7F_<31Bve4KA$3hsZtZ?O}vWbQ1qH^(~ zWL~ql^*?-Js(~B5&JGwW?LP6U&HH!WPpAdxgd0>#;F>c)0FrD=sTfd~0AY^?T9BOH zx-?G_Xk*Rpba2L3E6!(O(}>@6I|mlgdtMVcwbK`@!6^F2sC$#AS$)On$$Q$X+mL-$U`^B^ADTOfYp8H=u1S8<*^vhiN7)dG7N2UU zG0GS7B!@kg_!6q(WiU@Vy)T_NvXztVd~P23(&Ghs>t)JoFOy3R1hSaso*o!2kYwwB zHRU)B@W>xtH+Bovr3ZIy515Z$+Oxi`P_6^t#0B&>;aiV;kM@{dr>rVZTjghPe?@l7 zcB>$_UX+Z42EAF}Gk+Ruj%uLm_S%*1|4sRznhPgss!JT_WM%L(x9f_Cx7N}XKwMYR zRvuv+M>Z8C0QKwRvWbGT>XutebT2fwv2}3ml34K@|H^gaZ;mpUvdu+23@g;sI7m~i z)+x|-y{V|>eJso6jV9e0X-hWTPK5;Ai6FcctarE%Ielv!J)>ift zr}lfIuVqqeq>g?+1mB&rw;N>=Oz3T|D75bj7endM-jG{ak>T2GuR3&2VVK zf{q=_ef81QkyNwknLjF`jEeEG*$0lpo^Ni&V?9Wp_Op6`GcNheJKNB)K7n_5 zU0H5c^Tv-t%VWe9QU-F5B~vQa8aRmY^TFC8$@E&CgJu3MPt}F2vQHMQ%%ry+U#_5N z^0dys%V$Mo^TPgV85k+qIJDppzV5ULMumt zqG2lCf(PFEI7X(@uT{}2)l?fY0n3~<5z5;uQDm8BR5aki(@9L4$%^^VfTrzbM#7Tr)ak=lPben1#d;i z54%QAU5!yI=v#ew)U&ngz@rS~-EM~z%>zon+ho?taWtx|rt;Mz56v2|qP>fzht-lI zl~kpQ;?cFUhmHPzrjN^1;CpjBhKMqHCA)>UJ(hxaej_q!OFBztX|1dQZimoo7%KNq zF+x}JPzTP4 zd>59fIC)nH?DIBsn+2@dpJnxOun2hb5O*RY{*3oUJPOpYVMh9u{oBZlOWXeWLW6N- zz)J=EaXV?WRFKf~Pv`7Xg)CQk*ut)+C@C#Irr$Z|lcyivA&&yV8@8b&ucm1WvmDSa zS61gNBw-!|^*!me@m}YKGutTuFeZQ1wiZ!X*=B#~4XZ!0`?T7K=}n2g)9Mnm8k_wr zV#RM|E|&*GdOmQgPYH=o#J$rEDxSxCmC~+{QfneD z5>E9UD#=nTuj_V>9tgw7@XpaU`@KKD$G#upoUvJq-msJ1tT1_7pO)e*`1!S{IV+LJr&wIwkpFR<(d|h*Bu4l+ARUh8=5Zo{8 z#L-+x9y!g>u~aKBro$iZlPI1++c%{1;RaAi0Og?w=v+P(7zYUc@Ko=~jLl4VOLa(P zh(Cq@@P5xijBSwgLcU0>s!#|r18bjFQ8KLNjjidod)1E4QU(b!aP4Ek6u_rFVQY(8 zB|b5Px~g#9r^Rt|KutVO?>5~q;+h#kMnbRn`c@~Z{ z->E$2^P6c6Yck$@WlmYF{C+Cv%}D=JZKO<~Bi-A56>dVKveEL|cm_xw`OQ-vl=c^v04)8fm1I(0hxom@cemsx0sB=~RSYJ*X85<2^d(*6|Liuvb#VzkhEMYxEl zz#qNSuQsYV&hQT{+O3dk$;}gaNK~K1npX~fjmDP4Z>OqX^W@t<*O}Zq^_cVC^8Hrn zdqFRk7qfNBmp@+4XidXe@H)PZD)+23Z)$raPD2b(+gsm4O5sNRAJj~aSa`MVFU%Pd z=GojAezSVT8A^Lx<>3yk4HK{n$X~i^;je3Hd!d1xJ$$l5r+0Pn$2Z@^)}%6IO$3f| zOcM=XiEJ_%%&(jgxP1(VdEOSf5ID+1wOZwAFq{4yy}_r#9k6Amkb{@D^4Xbv<5!Y5 z`lGEMnEWA5Ypp^l$iVlWoe=mzEwDg51K_z)8u4nsCL4dQ=e<>(YJax>9b59Q(3wh+ z=lfN(&_zHQwR{cXId17|mEF0d!I$NUitlgx)8+#h6nSrEmu4KO&z7W4r{wdIga6Aq zu^i4UHcub)$7|BLzj;uUsloUTrrWLg!&+lIlG9=of8zgU1K%s%;rV7_UzhZ2$Y7vX z(yEuqGix}>q(sfiUBZlGul>?2Cov0Rcqgm;>sRuEkR=0kn83J>_!jnA|B3dc{mPWH zg2SruH?$cj8tQW8i!#RU)f2x{N4|=ds|N3EX)+uaXiRZ&7T%{3^PWdWL#^~c5CkE}@2Li<@BhY@by+0j1-L+9zvtCY3Ov>%YR0PwpBCTcl*VzaLew~W}9JQb78 zRxndBV59o&GOS)OJEVr*DyymM=c!<329Kclc$d#8Y1rr@zKdDZ9`&G;(GRGp$Y@EH zNc@CnYz%HU>5_$xf~9VwjU`DZl8pMpPMH3|R2^aoqJ*BEc&u-(Z{k$|GO#p{CI z0!FFXqi;t#3dgmYy|;-yP2mdNjNkQ=9MgK#MYmA5RLFIgl4Gr^nLe9b&b)tnB0aUd zf~;si{jM|;OJ8@}nknRA#GfC-#Vd$m#>c8b)a2zn@P6;cE5+0$I7_^8QiJ^{yI8C` zqH**ilGg$@Y#Blm<70Hh5ozsNd^e1`#c-JAAx3RkK`#JfoR>axu0`TO%5Mf4m+3pbwfmQ=DLbz$R+WK>>OA{ zmkoQI$GYtTfy@h{jHcMh&!jTwwMQI{u0s0o?_|01kKV@ncPBd;H$~Kq#jt65F}h!_ zD!N182;!~p9JWTj07rfODXq?THRR>=i^Ny@J~-0+I17C5BRj4nKN+mdnKx=d8pL%GIv)POv75{oRSF z>I_`IGIl}Dw8jPyat#LV@a@2+709m3A3d^P%Ic6Ceoq!3H zxQno@*?;5*2(dQa%&rC{hz}k62}?Rf73S?NwO*cDcY7U1qCRD!-lJ;+mS}*&gzTd) z{Hm*vS!5P2(-EySazDh8_6|&;FOMoM4wJ6@n%#tpFnXP&1QrI`9(7K<#=q1LiQO#< z|4!mi7Tw)#vE@Abnhq6EJwZ}{CGF=v?!aWf^HW2d%E#2T2=HHp2|ukT}Tm2Il& zM{CaRFnr|bYa2LLLMKOQjOnaATty|!)lWL?d6}s`qz-|3U~3595+r;4%6 z>5NYre)OLShaq;olz9O|L7&BBN9&iMOOZV-K4;j!GFGdY@0`1F6fQZ^M^>iwOk&1^pxew+@^vhj-rT8sHXGOv_l-GyLE$FhW7V)$6rT9tROD)y% z-}jF6E(QDyuG?cB1Z7ULh!J(0x33#tK>iJd{JIM=@6NxLs*j_-<3fyeU;>?arWRW{ z1Hgt?lvq*IVv^s)U65A6ZC1P! zFfR64OUALhdl|!Sx76!O>(fc}L+II69JLw~GOVng%wW5;o2QZInq{KCQWw}y@u#@n zR!3!M5#(GIVT6d7zAA3!@#pA>s`T%E0e;6zC8r8mf>m^E6y43PnpAx#mR|Yecm78j z9>^?iUmjZGJBj52)eT#_nNMi>Rn{o6ve-><`f8B^C)9`pacEYH+PCAJcZ<1Ms7D7W z2#fgP{i59y=WF+4M^g0fd|WHBF^_bF$dM99C~e`O{k7kiUcJkXom1R5;6CW@vspyf=yz#VndpYTcIh zmX)|68Z>&Om5AQ~RF%(25d}GSG6MS^6)zb2D$5E=7^?Td?3tOb1c9a1Dix@-Q}~uJ zg*SSR&UB7MWcI+0Frw9fZIw40;QK5PbvX(pOvuK!qdIkb$GMbfwRX=beqP3%b|epB zTi#J00H1W0Udt;gMFhIAXwmM){x%FVCe!S3L36b*-8*)yo(deBHD>UXHULWOnY@@% zO)1*yfCk2l;xUF~_!CKq-8DIJ!eVAbs4~UsDj=p+;X!o78?Vs3v*A#lshjY}$9r%4 zAA?_JDN#gD)Abxkud62Touhl-Lx1$Ey?C6FXsk zllLru#M#bk)Tfml|N44eD+(5mcrW?noTB1-RQe`&OgQtYbh_}S#0^%><7ezcY;9^S z;KItUa3;A{(Vja;E{jn{g z&+&@L%V7Qa18(@jd~dn`T~QxF4*b~w@%`?|Kw71h*U%kFjBDCdRu$F! zKm_!SWW?%LA9a(&jvL*lMD;u+{elm?=I@Ct#1_c58*i`^*`OL{ys=qk@rwsV{`S=O zw}t^gWRuJLB(;9I%RIp0^=-=~F2g1=!v)U=_s1O)&0+`dwAo5pUg{b0Np|AUcQOz@ zz|edXxtl0`LO=nw#2`Wxodps}>^~hk=s4nHci8kin+89^sBo7YQcp5hMy=KRd(g!r z)`W-wi}wjH&OxQ0E;o)!03f76ztZZ06Y#E8e`Gl0?9%A_D!%Bj;y#}?&AKz+y*FLX{pjT&{5&t%MWBS*YJE70o5=r^T`aWI!qAHtkY5((zw1=J3d#_B% zdv9}Frcub?YhhF$t5aAVZGdtyc|e%2BsqDih{VWzFIi9g$LA}5(FeeGh@J=E{5d%f z{FV8qLTa0%U{3N84RqNf1)ORdnmrS~d_h|Rf~za>$3p+c-5*2~ITRDrnNQIUAtU)n znsUr2IC(bbP!ngN?yv*N(aGwz%jL^jDqgUN{I~hnj}7)z3xyuxi-xY%7woakuOhd- zSDm+If}jlA(?CC6=(6-v*q|=eT~T04-*j1mp{!kjSCKaE)kX%{FjoB}dIV|Z+IGYz zwV_X+kFD>jFodeCntfA^&SbFf8{-R^zxVeN<$mG!q&-4+In`0&b#ox@c1+QTV-q!? zPNM_jVCtnARB(Q<&n7+EY!O{wKLamNxK(V9FORkUncy-EJ4O6`;Mari{*}=@)<=0} z>TfA?8$qEE>dCc#Of-5H+t@=%{!K6r#!4v#gq70PLwEQ?R|}T|zu6}c?gyG=un@Yy zLL?w!+DC1hENWu-!DY7k9dZm8aRp+^fOgj!a(+=Uj`$%$&K7H~LyVBX3r+h;N^$oc zUUkn4k_!py$5_kh{n0jJtlQ&`LWLuUSJyGbgZbk2MQ`Zx4%J)$oi&dno>)+`+QMbR z3XCG$2rcwy7e$gpsgg!MVN>`%emxIyi(hZnBOsqv&pc&$syCr+kD>U%IR3G4f5aqT z8k*aS;&PG19a$SU%jML68@__bLFu9VBa!KRnQ;k|U#u6F>a(b|WA!h7lB$7OM0!y= zosHZX&#m`vPl1I$!}H9qz94JJPNaiMZOJ#{cqj}6DD>&tc8~w->p`7<4eZ?iv3%OD zCwULer*!yr9_(X#SHSoh7lQ>$j0Y13t7s~gJ@(haE7c`vNw6z)U< zf48>ZXk!t&puW8aXT+zxK&GX#uvRR9#3GP67qp$|EG364RX|5&_VPK8KD}3q;$1LM zOjAmO{(L(7BjtB*gRKQ|!^2_f^))`f-Og-yQ~)vnt0S|@T9wALXjYupX$1Ww@gp6*kfs8DuBedR|J`eQLshj^9$vKr!_ zS?{68jD2WdOYf1q@2HqSHvD3hZ!J;+Ow^d-nz(6Kb@{dKN4aI1L_3Hr<*tTJBU^}} zAv;G{f9j2_m(j+&H#>KaH|$Y8U;VZ-RKy-L^(J!xz59#N-xd*6)1eOR#8eg_Ft$uf zW3&7+=>2B3%#1i_K8OIq?iy<^cWi+~87upWeV)%xvDd9okmfOyYV7EY!#v>cR~cqz z)UlGFzw@uTds;nc9VxC>bBb`11Wx@cu!?Kxm?Cz*qZm z{M?i4Bji6m)Q5sFnQafKwIar#^-$l0*BOKZ}Z&tu*!<4!ONb#U-}_Al_KC*Jdj&)nUx zfl9#dchS$8q&D|9w~IOti{MofO{DYm@5j((Jtf>vBx<$S0Y?$P{_xq}s?rwz zDn$iuY_}M$b9JKlQMwjkmP*R4>-$e!Gi$m*X6osYeWWZxXOk-Q2$InG?}A>v^C+8t zD*U;AIwy3wOu`#2xPwMd+?FwHh}{*7sw9f^9&wvYZKeo6I@-TM$^u{e%&9l@NIM4X zuWoPUZz=*;hW{La7!nuU&lR0Ii(F$on{5#9saaqaCI!_eTA6oF)S75}vlJ-SuN`N4 z;k%@R)ezT|rSq zgl2(A+h3cILsWfvCuU)5nD@fuFVmFz#WNjPCM)J>OFR@4)8lYHD_+AyamODcOa`P4 z`Lp{w;MX_#gQMlU3d&%6)G89biI>`06qy&%#a09|X^dpKoOYiZJyGwXN;LP>g+g1)z zv8o!6KijC)z#otC+F?(Zu}{JmMqgtR?M!b!rm@F}47|c9w?WE7hD|l2_s4S;OfNaD zv~Iv|fw*CK?vL}Klq0uE({^JPI?u0kQ6{PTgfA4^+N?UADtEtB!+nwdV(KPz_?t8^ zAw9?1Ykc`DxV8ia2q#W44WVci%?yE2_cIIcTr9@$g(po{QXFetTqO{yuS$N zDnt1V8TPEHsg|!oGI(T&Obf{GKk=%sXIE>k&UDo%N5~W;3p==w5WZ1J zg|h3P7!&({F2J{~R?lOu?}I)kCFQ~p3PVbS0Jqh+OJ+^E3o&{Kr+=gSpysQ=dhl$L zDH^-$<8k%hWZie8=5&5gP#?Tu{NuNHO=8T)4veI%;q^Dlro52kZN4pLXaD8*UY0R^ z(J%4#S(+4W^+%i7q67n@J<*gHT?i*T4>yY>o-cHttkm{Nh|Nb0NJ){4g#8{*NhQA3 zwC0B2KMf7SY>IR@Oeoa&NLV{yKU$R73=gX0T_`G}NVZ#-6n%W^NsLkw8~w{naQNu0 zqX0P&HFtC4B0PHfPwSz%W_Q+vms2x|D0GX(q-f4GuSz4Y@=&LyXlTEk8Sg?T!pNTckJ=!k^hT4e+oRBkFbHX)v(u)5}v>8-d#6&-(V=r%K9rR>R^s_tYkZ?rshhBM_x&_CNn9UTa-U_-E(hf{Zn|DiD{~g{S?03Mp@wvw=2vNO1BoSp z;%-wevGv&o7tZy>>x0O|B^UsASP<72ynVQznr^Y?>O>Hg{jSfd%++7l<4v0saRN$( z;6)ghzjsxzVBIk!j3GI7*8n8knpyZ6mknV^^ z*!pJ%Eo&gVy~eVNgL6L0c8jj7Zgc!l70HyN>dn0W{afLGPYRgqYWA4`TSUC8qE5R| zGPv`7G#UI|I3`I@=NyU-*v!GFlr`iQ@LZwaJxM!seTl2>U*J9 zj}~MyWZP2M@T84WSH~i^5U%ef3u{R14U!uicBz<&71#J~pNy||KaLWHP7w#9bxTHG zbCqUdR8eb!)WKdZS1(tK-Z^s^=17vNqDyZ#oQ!t<@S=DTgX;;xH15!N*;V~Q=^?wk z*u3>l9Di3(60V`GNbX(ryXD+TQ9aIKgvy_8YpMrqikJdwHr~~gOczSv#wzjEu5r|Y zQB#l^{d0x>lIBAl>$?iyDzX1nQ}V7-`o3A_TdixI-Hx1gxRA|5R6$E;@ zD>y8}GGo5W&P_237hH;h!ivr6^$1L@8nd#B*Sy!Pv`tSw9&z!*bTO7|Dn9{!xm6Q* z&K@df{nx0dbOVT|9)GTQtHq~15XBIU=y+pJl6D#HD09xk9Fu}LS{uEFFbLa=9x}fw z#ap!THg0qzoM*9RSD7|grY!Vti8o(F$1s53T0G3F2N5H_RF-j=-tWmak|IR~?B?MG zef5Q{y}Yu#uqMHv=rNrb&o+WB66WBQDhE^@etPWryAVqAqwj1yWCH$SK)ridbB{ zm|i?ixC~f&%G`RkE+JDlBj>N4&-$7ee1v9`-K{(iUGG3$h`g~1EgMc=;vt;TPJAAY zpj=thMpXTS`yxWgIoTNupe&z6yHld13RWg()T#f0ifPU5_X|XG{1d)%j{G{}x>tdl zk-@YOYv;EFF7UjHMp0(D$*r{=!@TKpV2Xv75O!k8Cx-_*In-TYLXmOt@i{ko2 zO)`Yo9S1$`dQXwy`j7{X zHUAO9BGi(B0c+kQ=9UY#z6C|(y-z4r%{Gg0gAsz? zL23jV3}FoOM6#?kRvqmKcPt*_$Eo8VIh za-TpH$_=(m?8Q3U1=mmCReKF3GUZ%gV;c%?AKu|7rJKlq7SSWgmSzStrA^hiLBKr{ zfJ(YbxHM8gEceCk3A+*67-kr~9v?9L0MqJw4HWOEZSA~Z03Bv|tg3}S%o@m? zCR|7|AnAnv&B6{r??O5S3+MEi>0(B+~aDP-)pIYuzyvLL&T^|w;z;m@m;afgk z*U^ZRe`Wqw)su_I`y1;&iMV*Dw2MZfYfYCq(|9NO49GnF$(q&@c2IdTEPR85kJI~~ z_zh&tb&uS)9FE1wxbpe?5o#&SZcVrXxcZPXNg5iv#b=trO&@~yz2sA=Z1s&jXN41-9* zq`oj57C1x}dL?pJ4RBn&ScmcJJJy0|D(*2f5p(!7aovt$Dz4+}T_s)3#jRG79MGkQ zmwpC)_06T2kY>iusHefhtaLzwt|M5JVQ-J`&wDh|0vTD22ozD>Z01V6Y3~tAWIoWo z%>1q@F`v5Wg5Q>E3&1ae8@6}iio4LlTg?aw*4OZu>o;j^DYXhO!Rbr8E#ymK5GAU( z2f_A*;?@Hmi63que6Hnsk$G3#5Jxe>@1z?v+-d6hwgNlkt;K4#9WgF=7DISJ@c3Bb z&}*ovg&aIPt&WeAM6pCIBvJrUP-kHjq40N=c($f(47_jhx;pRaTyss z55z)4*-*CG!&TCvy!0q~BHg9Y?jCsZZ&CP@!T4J`=2~$rr2xEcObniz#oaG9 z+&Y%4`*Q2#L*+@d%pNS(qnOpmsg%V0YDnHNDS%K$b2@nNFNy+D!NFs=UVw_f^Vayb zG0MR)_gvkU2PQIfTw%Z)ZU9rb3jY<~`YE=maUnuh`Zsg#vFtr_mkYNY$eZ5&{Dl4& zVExOEn;iFqAtN^@s}8+{ydTdWI}#;zLpB%j4(GU?L^dW0qi<_^X8LipBDb24ly`?# zL()wuz8vc0JnC>(WbnKH25#)eJ2 zkO9zSK*E{_-Gb{V$_;2UjbO0P79o)`__}(NN|O5CI7y}Nrqr$GZDqOouU~H!xHMt~ z4J=90uKHGGUNg5OzMMl4$PUBAh23&jH%F*i*5jR`R+0KrztYmNg+-q%>}f{h)tql@eHEu@D2YrP`iF zJ$&%7lsXgF3QgsC`#U@DPk^1R`FcJ2#}kVOOdM=b6V*^A)1Wtm6U6xWG$9mY>PZs1 z$z`^TNnPV%e1DmyZ-emNJTAMufBb0e`9A}h2bzSxS8j*+&DsPC?RAGP!qA>l<)PAM z&NB$vh*;RlRJ0Hu^+e>3V4{M?sKV%XJo*_2Z1Blo@Aj0imY9^Gr{)ys=hUMtTwW4ka=kNKNf zg2#X4i?BEf)n#>%w|u=i@G=hv7cyw3Kz zv(sfWOKFDNbgD=>3@l)*Mw~kw&!~v{&9wG(aK5f zR&|{%C&(K;_a?G!WX^Iw8{XmG?${7DTDI|!s&DzXJoa}jRF$q&J_VXBj$;>{?D$}Y9T{J39EnSf2n|+>rB^E zTYpKm>s%ht1-8YoEMDn(v#CQpPoc$d?N$^68o{wL$1S*T_?jQMFJ<`jZOuy57r7(+39}aWtaHR2G{mey-Lg?uu)=;8K zU!D_ebBC)cJ{%Qp%Lg$2%x>!e=2_A>Az8Up#uIkr9I_1iI{+Y0wL`jOV~ zI9R2*l!>#y*}Tb(avx!M33OG?#Mw3G_a?T=gyi!vU0_c|nTvN?ZjKGwfwqw8#$Ai$ zvyr2M-Oa7lXFf=L$+)*eIX5X>pSW9N31B~6nwS2k>R=@+tyu_VbF3K0zepSEyXO#<$4g2xN0D+sGk3#)6 zaOZ10rvVe*|GIpmIg*%UX6fQL%p_C+m(6mXIy-O$R+gJ?!HZ*q2!`n|O5sZ-)BykK zZr;PgN9)6Pp1a?yuGK}fbLe2^{t0Rfu>b6IV#2s7OfT_4pL6T3pKfN#18Q=^mtI*h zdjuBa-r*~pLhwehNZCvN6>cKF9zR!T-sqj#%)S|&lL)56;jG8pH~t9E0%ChF>d6)&|mVUROkiMbm|trAe{2n z&QPO@#pS}W&s4S8hf`Wt^F8CY0j(}fcVA*RA2m$Wp%Xt;9;NOvykgCfE~I+aS*t{&dj6c) zI+MY9pKWFFgz=ThzEHaG1IoR%tgOCVY!~s{?|y{-5{@RV&tv{eGz~13BrE9Q-ocw5 zH?OpH0KzW!$IxTSMUXvq9kUQ}SYuw%vBX9Xh@DPMkUFWx^%LOE{h`r)MKXzcnG2(L znvbJDSBBEBC@MmCT?6!3L!T{ z?>d~rB%ftjPK6$D9Y1DYD%Lk~IMou(_CLwqzL-11W7(89%D8U3v9vKi<+Fwz*@)dg zcBsp{)cV~TE46bW(mcLYY}*93Lr2}YRjJjN_xu{;fz z2FgK9g_%CIgT|H&zOT=BrqMb8fA)F?h~3+keyjGs(x#Gm9}ht9F<3R3F3t@brQ)~; zwW#uAipxHNEbTeK>Ol-R08gFo_F$wO;~uOhZ1!Z`(j~f_GLFVXt?}2<V`&IQ9P4Gy)AHh+JtMNP^1l?Ty@)W9LYPn(iHj5>cnx&Z?h1;$2JpWD z#NM%$VI;GbCC9=a!`C|Iq}sX@N>~5<2DEL0d6nfkNa5QiCzYhcL+%oYO{{r00xL1C zCgkDtd*b1VtZTG;3FXb>S806Tdd;OiLfMMLPBu70vG-47bcI>ptg3SXyOPAxF3}V@ z6^m^hpl52$3(@A2Czl;gug$73d?8^fuF0?%Kn8GVSAh+Gk^BLH$ggr^w2z1qI+Hc- zZ$aQI<0ZC1-y?9ZCVOvl z8b}Sxx3q%04Bn6(PN;_>EEq_q+Rp_W97gbpnkKfh!8ZXWliI);} zH%fLnDpMJ_dYBn)e(Q~@!&mhQ(8g-g<839}4T}ko*j8&D-7s{EID>x8nxeN6aKKU8 z2sE*|e^iJ=I-bi>K6A0hTk}bD+BHXePR6Ha- z!@&z!dQzbjkE6N?Y81fKIa9P+NfiUoy1{2` zK|%VN?!x99^bhtv36Li5grN8@Qm*i!^3gk`w#Befsx-Gd{SiZ3_L^}A#|R%Yi~v9N z!31^cFGg1Y7*`%9!XuDgntmo!)98;kY?}hLQPgY3)p`bg=-T?3(x>Su1 z%XG~-OxQx6ge2h)73emV0G%=z-$~Ee7v94~iXC3_^}(n2NKDk!&)z{1u}S$Aqg}6J93?Fy^qog&9aeocYy;>$}!p*H^|iAg*>uZXWeTX#N%% z@s62GmKqVppM*=sx?5iseH5w%;Q1@4M>4BY|t{p@Mb2Sq4v-iljF+Q zAIj;){$h1bz9J#CG>~6^jd*P16|p@`6_#s(mLZ-@0;uH-FDn!c&G6(?j z0W!bG>tINUt0Vw__9=<+Hm4ST=m)ksbkdVM!q|wy-mtt|gp z0_i?TN|5P^&fpGqb~!IS5661%FY>p!5!hQu)rh~06|hN|dsd9>IRID+D%Okcq?yJ(VImE6eq+XEN_JY_x$$g9~wj$y;K+*1)%x56g-^z^3O$>c+{-Q zE3_=IeoYBjI>Hm`&v*=faj!QbqXw5f7hBG@#ce*3Q92~iStvi2(I#{JcNoeoqbx)6 z(ZivV4*F1?shv!arVk$Ko*M+Gsxu-HY$GGR!KF!0t>8Z7>VKpp|LtXPQxjfyL8S@C z_onOBPyFH4e=1ZXZ&g!L?ue9gpQ%v3yQ3;MF|(zfb5O>Z zd6Mb->H43fnWw1Flwi4}mEm**RdZ_?mpJhII`*zpKahC;*Om83=ifMEi;J-h)@l(3 zumLl!?&5cHy;BX?ahf~2f%Oya;ravC)cJ;Y$B5tc)_UtXV?%y#*HXFz)J?BhRF&~T zw3u`UpGa^*f*w8}JaRdBPv<vZM z$bJreI`_f^IDPL>Pq94@8Ma>^AJ9G<7$6Z&@}uK=#8cd{$e>~LD&CF^xWRZxo-y{f zUBY=GunDU%5ZEOdJRmQEOC zd1mi&(XKI4I_1%FMgo#y;?+;_uyiSLtf5mfdJV~St@0^|GR!A;-t0T$ z&Ja=X`{MP?bs~5mwQK@9oPa3E3yNX5SVBQ#|972^3ADfi%U7wzxer zFCBqOp|dI7zX})!PSn3I=*SU&VRNBmJM*C_bK?5L2Rd0RKW>PW--|wa`b_-U6_$~J zJQd8#+8S6YJ^NlVXhy-u`ZD9ZB)eexZZk=x!5v=}mx&M$hM5AGU0X-YMvAQ5w6MHs zoEYelVS#!|YH17h^59TjM?ebvGXV8V_xX?EQe@l=+_E=tI0u$*YM_uig z$2;WI2(gp#!OQ56DRPHs#8zkD2bb0NKh2lf&u7hnl(^WZV7M-%DMFWc+A%-yNb`Y7 z>GxOQypz9X89uAeUQGSOI7RgxFkA>+Po6~-Ni|;yoN5?&_?+tWrVy-q=9~P7)6Nuc z#ggjXU`l46DwuaP=YG(uv37lqH&jF9({jj%z^R>$(K=5&XVmg4Q))K)#R~t;BW<3_ z*;1Farl(j`3Tc|EXy~K&5gK9N;+kHk1rEAm=^BfBV{U1%AB-)#CH(w};)1&||JXrU z-ByCLzTmPT@&W+H2$t^UbEoVQLQBLyuEJVzz@+n^OHqlP2{XdHHGGp{WkmQ&x1oQE zKICQpf7jscqHRl({h}@8Zq=;J1RI?&o(=o+u(~bY-F%^~5UMOm=X{u0f~&fdM7Lh@ zb9$R+AT6l(O&J#$Vv0N2d$JV(DW?#WW>BTQswcoOyAyj9|jqDoI^C}J9bGZVm0{Yx#jpCUnxceXHJ)mrA^Vr?P zfXd8W=aeLV?K^E9z|pkxV)_iu$gZ#VBJK8_{!Q_Ph=ggjFZ zLeYK@R{bLWE!@=^x;BP*5*X&{0~k{18ERV}RNizOiVivEAnX{M$ba`j4Vc}06ZwE|OVtK{^1{ZHB;rrhPsikK-R0f?qvK5;0dlFKyVw}Jvan+3+}<)-JRgU-7UBWcN>@)cD~)SKj8K0e%)Pl@2%>p zM~W@5t<^Mg!S>VXf&WP9^3~I04PzxyXet+H46XrG0azrD+=HRJG`#Pg`s{lF7Jiya z6y%Ky*z}5K0jO^eU|ocGyh15WpWkpKAC(5wYf_2-qwN@>S1nK~X9?2z#$Uo*xoh(Ox8XS_66w9Sd1%?ey` z?7F7~Ab2LZCAffZxcqqo(vu!c=MdT2UES@NTq);)s@4LUmo?WSCEo-WW}+@7{-1wH zupKPy-*Sfx`x&9&b=ZBb`|yz*4V2x#dc1AyT>k0ANqpB5V2hu#FHq%aPZMMXgo;oZ!u=rOK8)XXxE!`fscH_ft zP2aSX$G>3*Prj(Q?h?FlTGmXtZ>UPb&=V8V(ptWlIgeR)$Wh%aDHTZMoWyMb7vaq# zLfHfr=(!*}5(0Mx)Hb!%i-6u7Eqg{4q$C|d34)YMt)X?%b77pB_$n25QD_Xhz{Odr zXOZCCyN+k{)!0kQ9cu~f1hD8WD;D3WcZk@J8ZH{yfCldTRppd#v^>5zK<9Tk41VRn zSJ;>ch$}Pmo1O5WH|D#Z8zN?#j+bwGdzN2%9!JAC?&h|+Kc4{G6tYgP?c=vx`kKv0 zkfcg!0C@u690tC>I26m%7^PPKpzCeeao(CVzQNh+mJT{;P>m=ve?A>Eno}CC@q>gK z2u0^Gz{{@5CeKFwLow7FR@0;Q8>P7D2EIzJ8e& zJ@3b(T2 z!R^#|{?Lw?M;<>yPqs!_o=bPLs~T@Jq_UyBrfqMcKK9f2%a+>~hiAWst4IM>VXc6z zE``~Rdgt~HsSBIK>cofsIRdr?KLKRomo{9F&Rq}iZ$I{BFEx+lHE9*w`c$yP=_lt6 zB8~1g+xx~o>dq5jML~pn29@tPXH)jFmgKxIRXNv_1~va}Y2UvheO5p`|AfWs#{Iyq zW%{lM0ikBDl&6XxYZ>pC6sd{Lmvan%K~iDLf+WCKjr6=K{?b)dzT4dCKrLKlPsY6` zP0@x(Y1r`LGN1(spzmWFV;Bh|f|RFKUN!EZnL#dmEJ(U*(d|+LS zwJFuHqUPTQ|SZKZRth8B@$j z$V1^T2!!cZBBb~5IEfyPJxE8dA9qaOQu3MbCVE|S^*2!2J*e1eZEY+njCEKkdDyL& zcCVwbwnQRjw)Rzj9rl>O@=R|3s&-7Z#Pe9~D&KAYc!8(6H?;3to@!_YD?r@#wVlQ5 zv&QpfgRYSUt-55iBIZ^9_ylAD%bqvpK{ozaPN-4veKu_&{eAkrD0AmTK21OFVzYBp zo+dcY>_aumcDh4W|11@Wt1mLkc%@|XLTGRt?l*Jv#}d$lJL^$Nzl z9%i?|t#8K9c8OXqeHD$73AqOJbwDpED%4kxN9qr2cM^n6=Y${bCyfdO9`C8~N9o0i zBWi2z$Xrp)TwOqc<-Cd}P(hnjGj)mz9>Opn)6Hpv1OHrP|1yPmiQ%hrZ(hVDq}Fcx z7x~+2`|Z1VZVo^+HSOD*wu~opQX^3MYph?{?nCPR-f*1tJkY)yiVQvZfkLR6Ew%Gi z+}kRUIVl-a0rMSny#J`(!{L4c6N+z6cH|5Y``j__2H&2H)jxz2Trcd6TEES$N{j8O ziI(E1L!0S|!W65u(lF_!xTrc#&{x@yR)X2-kT8C!-4W*^!!B(OIUbxF3$vQf>@el^ z{fS{bD{xrD`Kkt1pqSq6U&hY+rM@RidO4U&;`ltKCgyhwK~D@Th+~4vYoeOg3P(P? zH0z4i$G`76Clpe++V0K~1|%V{XK#}(0+BU(nj+K5OPdHV8pC*I(FLDJ9TI&n)$ok3 z!2PQq`nhuUwpM!89Q3}FnDLZ{Vf-6pI0;yB9s0K@Trtrj0w7X+T}r**`4`ue3B{uP zk~@gUYII$AJ2aKc6|R7U{ipE2QSKZ!plVuNhv#T~sAKFG5QWg*G*s*auF?JA?N1+F za_Q>&?+5Obk%Z)XVR-tv5_dY);BbTmTpLGwk2xaann zAA76P5G8N*Z}ML0RjU;Vrf4&Tke&dkXyEDHU)KK+=gN`BzmMcf$tEbJ1}=!jo`Nru zX3uE?-)DRF0<+(BJfP22Tb;^@eE=^`8aan^vEm_80NN507^D8y;;pwqfK6s1@Yu!22w55Ehy#0ACfzhn=`eRFf znFe?ipfFUaiQjWg!v?VScMMCu#RLserNWxSBIaW$0DK`NX)nEc=aDnd;VbN>P9H-F zZ~O=Y2&HJgato)gT8KGykeVZck{$MQ5dHq)V13u+W=A^PHgD6GR}Xu>E?LtoHC%XJ zx+SE0jqCCPsQqg>3cpw@_3I>2ddul|AX6ON4MM5UPA?Ul=R1Y|yI3!>%JiFg(X2#1 z88oVhck-4*<^z-=O-K!0#%wS5)W?>$$|Gw4h|Uk1e#?HPk{;~S>~?{_yL~XedJL<& zw0>(8#oSA{*%gf?+Uh-7$s2Hsb%e-5_m;KHls)Q9rj>p*>rsX{fEA_ZaX``M0YzB$ zZx3dU+-plX7;l2imsxgpc)-BGSAc3hq+XM!}r!^W|m%rGeZs*#g>W()`7ZRT0{=sEbn|=s^I2{Y$ zivo7WrDt!S3{KJBhM){&fpr`62*12A1M>LH64IH>Z9`jeQvNZ&^Pgl&DmgzR;vq#L z3d?Ew>{rqCoGTpAy#;i913;gchD{yrh}pTK3953nWk6D7Ve}8&q`W$pQ7EAxADi=* zC*oDLw)-2A^;?enX;>NL?W-@s?PaF=QoL-B2G_Dj-;i_*Z&dvuye>T|hU%$mWbyq>z>;)5T=@2L&f=efZki5L%hy>}jF zXR(MZY+U8?CUr&E9RqojQd&zsQpI+_qx9 zYcKuwT+y#_cnR!Dx;{fh{w4g8OXGl{8~nOL3>~>I+jt}M$GPK8v)e!Bl2`jT>M=+K zjL&JkBoEzGUb0lEhCRJi=&V1ip6{@7a9k5mz;t1JUsQxA1M^_sMk5hBSc8Z{`5`-AgD~|ks?d)`>)}%InRz6E702g}b z;tPgryWsT?H|k?uiZ9Sj}vZwGa z!&tlf@AuNJos-?x?p|^}2L%4Z)?tB$p-kvKYt}16?8p%T6~Uh-j}*8lHlj6_*llsP zLemd7MWYUMdGL@M?vKpg@hFjTFG^&{JgtY+vHDYAewulG2|jwM_A|c*UD-|}D0!|4 zP5rL?ZkO7lX+-RkluYMBea$eF&ojH@J}t58xOU(>V&ikeu&2rXcvG6f@u8}}4%;e(zeKTC3HW93X7yoA<9UQoK@7~+n8;GB|HPZ5)F1`|Yk*n5 zfqnBvk)qSlf>R;0!*Z>Q>63Y(;Be0KJ#T_T$HHGx?IG^XhJZg#w-UxKXBClhzTWy! zJAOYpU*X6p;OH)4?b&eOyN!Ak@Mj}XjmcpsQM00EYh4X4yLPz>q z^|}Iuivp0A#?{iDpaCeutr7Y1Ac#Kn@-ihBgCoViH|B+s2*=l z{z^KJp9L`aeUh2Od7el^lq5^$$PB*$TR^c){;r#r4DQ1dhG>lI!uRIQltN4w|~kMF6r*1ZESU)h;V=ozg{x!`^yRr z$e}2a@9CB(y+{K2d?r=S&-A2n;b%u9IyE#|As{L6y)y`>XE-W?`{HzKeHATll;#9O zN^PRoo(ODrD|B}!ar9c4zly-vz#uOod&0tupw!_$0!4H7hM^ju@RSc}OzLGBx(%mYd{>%tSfA2y+47y){I#rfk~8i%!? zHieN)PO{#vKQxH^vw^MIV!8k0bW(WA$sf5}<`{NC_PM~QmKcW+r*Gi+b z$RtLMZ*!0w%$UH^wiN?tB$z!6-;B(0qsJl z)RZJBQ|j_V{N1q>(-h~`xr~M`taLPZl^bWB`r7}7j15YT6ZO?qQTV7O$^$KoE>W4{ z0UjtwYqv*avdtM)nEaaP$kQ{489+BOire)sqU&9oE&8#%PHacXUM)$9U3H|izby(L zbfJb&WvcF@rV9wXHU>#%{z@6;_wtL)=iu*#V)yOiu8OHX!r`W1aB=2=rCZsym1(Ei zVH8;|k>k+4Wx>5|GdaQNvzCXb?e?Ef69n6UUJ401%;sr?S`i$lhIinQ#xwLJWR36g z@Fr$iizVd`F6Sb5HPUY9GxwRw>T)nH8mb?|WR%d^&n{JG8+Z{(_lFpurL*(rTJs59%B^dxyxY_cj)xQ4AqroX zcQ@6ahJ4b+T+shheLvF`YEEt^)S5st<{2SE?9*R?3KR=Fl1@h;Xt|KW>L^#yUH+%o z&IfEWyw1b9b9ia=$v|JMO^5FI(PRB~QDOe6O*Fs(4vN5WZVp zPRsW%KLGgo+AW54A^zF@yTflyM8`K;PE=|=E5_LOZA5#J3jLki+}NL|evp9&|VhBfk zmHanEt-Y57&+NL^Vp|t4`tbMG?*0}kAzwz6Ppli_Am9Q{u6`t3znG7N%zI|Rq7utA z+#UgC>67q+oY9Vvp@414#s8l$_@H%@;R zek4HCu(f48%cq%SJjH#hLpHhHIDI-85v8Ltb+VW)15t%F{o4|aDpvYvoqbO=w2Z7# zA#%TGdDUP{;iZ%Nc1>CMPQHK+%{>wqJ|*lr9*lSY1wLYOXK>$f;?G)ZM)o(4&BSY^ zb?&+~ZCc*ZBuCg=tfiFtR!2sOwne}AvWCSrPs)lBDQ$bir1|?E_RO+2z;Jzz@x1Et zo$~SM_VC6bgC#x5(`?3v!1lzuT&X zkssg>f?P+|uFAizEHq!txVh3b!9O;A$iC|sv`fp{?RC9xqREX8#R0c^hASZsmh?_Z zpV?z3UAL+Ru2iI%F~fTpp$MJq+3@{a^Rz@mlQ}Q1aQWta^74V_B_i1O!cU95`?<<~ zA}d)^k`}-41`7-D!~KAV7g{|M=cKVyic~rEw7HXr82V~Uv};3hA~8EWxcRQaXMIW- z5f0rQaY#P*=6#(CQA3e8a9w>0ZkMNaYLn zE3b?)3)lw(#PCW*&C|}gw`+C z#M1t0!|Yp~q4kDD&1175A6wtU(oZ>aO!8TogUkMv|)G40wFCpu_`DyJF`u z7Pu;GhN(KOB=iRY`<_VJ=hOI82HkV#LUKh4nl%s{?>)BWsYQ03d&+qgs9(7oh4~sV z6U%cJB6Zz9M49sDpg1jsjP7aXbL9{FCdP?LzzV^EHZ!Y3omj*r3f zoXuM9Lf~I7)UlM!*UA(HH87t2#MwHgp6Jxa$0g@gj^{B>v#{V`K%!GQ8Dq|_ z9f~`cG7QN*@gO``zq<3g?1A@KH6ixaZl_wNB@V2@vxKRBe3T1DQb))`ZSUWCoCdOh6_9si{A&iJ?g z%n89fjtvBQzF#?D=ecHmEUt5r!t!%*67+j6!zI$at0VzsF1BJhLkhATVe|f?=6BUS zskyOP3nEF^8*cXGLp36i6EuQb&`Q(_kbav!7s0o$C;=4d?Nbn1$EQu>y6a#H`Yn!F zYXjegBEG8+mJoxFaBOt%6(QR@Vi*HvLt~6n8{cD6ugG)H5852%ngZt{!cA!FKcPV3 zhZYohv7z=)DTC9Lo3SsHtC55CpES@K8B6P(ck?A5iW0d)V199oFG{aK)?3Z;y0oKG zuFc@5=uV&LB|`JA)HT69Z&1@q6i`MB;@M$ zwUg&q3Q?v0mS7l2@w{wnbL%@o9sQrb`J>lO$DSgGDr zojlu)pqdl?se z`TLSBfxk&MF!5sl{7Sxy$E!u@WFFX}X%ho}xZ^rmMox$Bm%O(CMoXR=Zl|a_Lc_TV z#9OMY{<$9ZGft*KgcFM=W5TH7`U4OZ3D?pdYd7w@b{}LQiAy}U((Kluhg!Wq8Izea zu}hWuY>Q54+pnh?5UH=4`Q4PpjId$NIqi4D$~@OXRb7oTf7xoWeBqdwnomE%=Cpt# zMphgs2|H10&phq(Bd*2qm!o;qZ0T|@TNYOHY!$b^s4n}2J>?B~WmeB?`=i2THT z<~FRN^*xEsNt)0izvSmO{TxB9kq?dyn8ysLj`q{duEUr;9FPl}Rve#`$0#*$%U$9U zOGD20_)Dz-K`E;cw=Zed^`qr`ZhXI^IBd~1VirQ%HU}Z}cpd~*)L#`6H+Bx5h*4;& z!Zo`F0i(;Yg=9A})XfER@#!ZKgfi@7Ki@@ABgmf|oI>v<`0l)+Ba~xOUQtF}-vd1) z?=}bYRc@vv{45AtpIQBEDWgneCOM4bo`nmpRxSncs|dlK;pV{?^?DL4#rm< zqM~bDt4(g zo~U4y+9whbJ~XEe3v-3@uL_af3-yv#mILf4*h22;zNrsr4Fxmq{CZAGI1VS11E=+WL9c^y z=$peCGt!Q;$2k`acu3)kXU%#YN$)vFo{Hw=3JA!ofa%3TelykFh;cHYz;~Euz@hPqSr9Hw7_>wgzPf*Gx8fZ7blfPa@j$)em0oBa6=B>umiiwc+%%Ds{#q;u7fskR}`in(9tok!ZV{z$O zeW*49>N=DgZTNyDXkF~z(?xG4WQs{`-hO>~P1}nQ5QtNT5Uj}L1M}t9YIhxd(zQUk zFVbfsj8FRZ6UWv9Vr)_>ICtdz0BC2skaA;us!LJ!G#Oce43*2>jts?ZvnpQeb~wZT zsnU9;@ohw9pZF*wBxg5NROQ)0xG}k?#bJ;&)amP+6mmMmKzQ`M40k0Hq09`qAzJ_5 zy~b?^*lUJH6jtp8@}h0Zr7cNae^7&-6Y8_RRfVq9#P z3-x@DF2OgQp|_e+dJael2M!R9u)(+~+E=U>UbCg!0*l?2p>WKe9EJyzBRX2y7nz4> z2D!i@R%p874gU8Ec#R!L{p{jP=6O8wH-i!H6?-7a6_UK(2rgWad`cIEd@dE)dYzHR z9wm)dW>O7DzuVA+l};r~S}(pCkJ~`$i77MN%A#xGHC)DXb^1>JrK$+&|6DnCcvj~6 zp+>nG@P!A)2wA0C2&~t<)PL0clgRClIk#R?jtEe5K1RhCuz4zJuz$?;fBl$ZuN`g1 z4j|4g z_i-48moIGOhVY2g@7iipa4a3s#kj+TGpEwivG>Q1z84JhYW#q2NbulwbdBM~LzhiZ zUmRTBp#^WxtSl456Bw{Fdrhb?)r~InxtnjwP8lw+XF;N(UNdcx2Pv{Y96U^MI$S_#0)%{EIK8S6Dy3t^Ejp;}5IBsq(QR9qhnj z43F}RyE;$(^w-=#;`v28%EY7Wo_odP7Ntc*iG6MZ+#es zp#wm{^Rf&wV9`_068AHQf^-PJ&&+e{Q+NoK!~jiF;R6&Q^h13xgv(+}L}8OdvR;~d z=j|F94?$7ezMOmMte1uE`2gRJvJP%5HC+vpJ;EH2lp3jM5Q@A@b=@;@*khvvJqcQg z(tMlKg-KM|taQzcl9y4N*I*!S)ezoy{2r6xhH+h2%(I?I;BEhd5I&8%^;;6y{cU1o z@83VR=V^un6DpJjx21Ulb|C!k8JGc)s*|f4hjlCmm=>E{AIF)DLeLDBzD2(uv$^n!Y(mBJMt0?Lb)it_u$#m4lcS zCX*tDl5~cD_s*Eo>n7iHM#6Z&715d}ZA9u>vppiw4_JbT9pA1G=0u6@?MVW}Ob`Jr z_&9+OIQBFUj2#=haQ%~n5h*3SsgZ;sVt_&Z`$b{KX^f;*NaZ%}M_h2OzAFpG@s!JX zQqRTfV&Nw}vZrg(SJ@ROQ-9wyfBWn?o(MK@xef)E05&!9h99N&HDIGMft2K{$| z$1Wv%g;ylI04mG~Kg_Q&*JUWU7Jdz+Ih$~?@o)hY8LN^gMuK~Kud8GwTRa#<#^)W@ zYK-z+QmN@pANOkU^2&%K7?}z8qw8u^&8+*MVFC})Q9TOX%zJ@jntZSM<5DxXKR1VB zQeBaY9u6mRF?m~Q;r<>#z(_JFkBD5)Wb=GUpYSr(jy0P#Q^ZHa5dArV{&W9>vvLMA znd{zXe=?sw@Z;+y^>fZ&sv`)L@j62k$I!kw4i3s_R?_*tFUtQ~*i1wS_eLCgeI{Zi zCx#N_%_Q#j%6L7U+bPFOw3g$5T|L#FWw^zL+tRlsW|fwt!g``h#x9wk)Q%%xfT0F_ zXPMwcu+yPZNah+7d~yNrjd(KE5V8M?Q;p~94M4mPqZQGc%GKUgw=LVM-`kG#f&>M> zQ}Oyu7}_}mubgkOFF|sbq;+l|ann~RkqmC#ujn~P?f#1)lVcHuoo%?3W?rNE<<>s+ zX)ZCRc|rMj{2F$AK&NKkWdyi;Ykckeou?1+*} zF4sP7oiXgEo{XpW;Ba%t;KK*zct^Q}h}usg{Mr~Z*@&=IsEvsp6wQ@S)@#>gGj|Z< z6{AllR&S3@736gJXQmopj@t0fYnG#(aKmSeRId5&M(=Y`1+7T3ui5D;W~i-UD%pvBYy~508=~C?2Wht*BYep#M+#^=|B544LC`sqyogz{DHIq(wf{bt?gD!f zG~2e^l$heAw$C}JSKMQdTGLn9T|MjZ4Z&`BjpHV=|2zL&0Ucs3*yhhrHa7k@7r6dW zw;AmxYVkxwPNGQ6am`ygB8Navs`6{;!EPlpsMd=72kN_PO5{krlJ=MT(yM0A&7did z(vyvQ7X5c#*XUotqDKiQGz1XZgdrcds<3$N6D9TzerJw$L zWN@<`3;7)*VKZ|%rk=qE z90`2WMrC`^KQYp;9z2~>a4cf8x6kxkBUS})+wD#4Y`HXnw0UGQB7|XEX8xd4 zr%Zm_K*l44GWpn)zC_6RvR#PF>NTHvj(E{~h~#hg+GUUg`syRh;C#;z=3-}0wUI*@ z94(j~X-c3W#V}g=`(0r_Uhl;+XtL1bh?qKTv&Vn27_p6yg&)O>CP znkH2~AXqX$i)(vI1eXL{3_loc$A!iN$9O0f3acCvr+LjL+Kf#I!kZBDG7}sMOCdoh zD41wFgO!L_R5`=D!~g25*@$1uxH&gkgSjYOtk#ZFKY@QSD}nYVn+lRIM)MwjNgVk< z00vfjPUg>&CDna@``!@1<9zh#$+imIOIw-iv!{G#UY&y>;wBQ?V0=SD5takUtPA9g-gb4_ z=Q(1}Cyb3ev#QQyi`c+mo7O-qj?o1*gYf4gspA1Kk_VrBpbW zJX@##g1n0Xc#^C$F-Zm(pUYLkGs1}~LcTY!l4GjUYmxid&Z0XDwRn`xaO&S`>>Mn& zXoI8fp;KY*##bTz_~HQ<{mHWW`)!6Gbof6!Yl}H6*sUwK*;sH}R3*N>%noi7;j0MS z?Jd7?9_sP-UT=Xirq{@=%b(epVzXa6fN- zsLtjD`*a`cX;GoFamf=3%U^xkAz#o$$sM>+LI9Gu8Ex}ReD5;UJ#y+Edm`MFCTZhP zkP3)|`v6eU`|qWM9B|dR53JPfhIjy0Mb<%S%#$yx$2>Boe9UMei7MJ5;T7>iklBWV zuHBQ(&C>hDsT*E!&6X|#{*R;1R2j0s#^4nS@P zI1MhY5}sqi4KGrXC+)!jH~*n^0gcw_!k>{7oLn}Xo zxTz|0UU>jKt83spvUPw;^Y+zanKp_B%o)S^GCSsM95D8itdPH`Dw#{3>GLhB zQ*Aw(`Uh)LN9;J;NyDo1R>LOk3zEM*$Bk(IB$wso@$0z+=;H8c3OJVG{{28(U@?$j z_D0m#YS&NN4?7=t?bW$Pl&c$brDkrU-5gKUV}tcr_-o zG1Og5p|K*ZsCX}54P#_xiyI9;g}Uxp5x7GLvd05h)f4cI~$r2MYcsS7nSvi=}%FQlwFAB;v`c~fYIjki5s^pEA% zvycKl`Cr07-%9Fw&(r)(7gN#NzU<(#N0mF>_0W%DL$#@oMrE9kp_Ap zKe(a_@WaN(2Op@(fj zPrEeSZpVir48QE{f5fezUXLYk{28EuBF6Be#KOd>c`Yv1fT6!)xaX7Mz!?sAcQQbF zk29&NTm&a`=)H39*G=>Rwbi|yFF71OI@7ii%Yz$7ULGV|{n}Wy{KkpAN%8_~M17=O%Uj70^!Hu7bil#>TB;qTk7HVE^^m(@ihMQS`wXYQTF1YB(I zBjj>G^da*8sKo-@kaanb;};r)wY*%;+F;Os=TEyjajvq_f~L$N~t6_|!GV(tKaA z;dI~H$0V;|djQv|R(pH^+j*p+TLp6QVNVg^IQA2qK%3#3&v;c4|3@sLe}E&nJO%@V ztx&$(IFlsKxDPb(6PN($&1TLoPAd!8T1&C2oCIMgtbX4qxS6EZV|1I196zSZ)S|QQ` zBZ+n_dXu+t&he=`-K#z_S&7{g2DR42P@{;iQYA1SI$GQag|LOu@%LA+jnBUfNCf{a01LxtAndOe|1zwt*NHY5e3IU@hm6R#?~hr^L`WOvuY!DnHf2%M@ z|Dl42X-TL{tOZ`+dMolN>_#@7y4o|bZ8=>1vtvU^4f9uhZ&An;bO4IOnBf{jo(qJf zAewT2YU8EF7ls>dzJaXWJXh|`89x<;@9IW--lu8Z#$*TJUqmwGq$Wu=5OHEa@q}t* zq#qKYQ0wniY=F!D?6RMO5-Y4TeWe5=O(XF?1vd!W;tdDi_#MU*(Z!_c;j!0qe5bnKK~bKh6T(?z(;gM zwvle4+nMaQL+vHR7AcN#3oBBhbagUhooD}c%v=?LBVia-L<(LFsMQ#;WOn~QVYd*W z96_qFN?l`IeWJ%3mnB#GOEdMBE*VeY@b|Y|r$v`Cc~$k9$N;Xq-J#)BQ9-}-zfX@y zKjGfhb*MyOe}oJ6GnLVoVdYKT!-4t)Y!93HHy4=a58pBzesf3iOOzJ8PaOXMaHNTo z-+bOmW&vRM=Ym}RwL}Ntz_+0;aQ7{aHGqK6>7o$BdT*FK&3Bk6k|C;y4k5~-PAYQO zsETu*+N?0hvV|rN72A6#)le+8iH@64_%}PP5msOcCLF&l2_meFT$S1M$ezEs zxMITPkl)&MA&8>N8ipgpgfC-{5B$1F>0gFHRI)PJ@1>P9`S#T?02yq1TOya#JD2IB zX*=D~0T_r1#DFx$lLGe7)K)2SeVP-2yGGYDW6-Zkh?IX0FMNd{13 zdYTFK`E3QG3HlN8{k}vHqgH{tw)`)Z0 zIfP>CS+RCs*t)3p&}SPl;>Hz;BGl%&%j(fLJtV77KyR^`Pl+pQa}=Oem~X|Re~q?x zzvPJkIQ~qd7>qrAI`%$B6f7AN&hdFsMBL_i!HL#J^GTc1`7%Qs_RlkX9@$Qq zD9k1*6-U6yY^6ODV0Tn0+wVS&U_~9*Ogcj(liLerv-f1mX45SVLx#{(A!y&^` zcU=%X^*aC8njT>upW_B*f{m~3=%uP+;N^AZ^sR8NcxWZgZ~3zhc$-x66)qg9fFQ9C znE-WQTB~sFy^4JKW+)dzrP}9H6#@N$vkr^@Ld(Y@fgJWShI@}=7wvPqVae7gy%X&g zU7ilHq<-s}1Xu6lqcH)ghrZG!iV+4WzeoL)`dC!|mKp5{@=tVolO6oMiTy^O9K(25 zfDCfly=0(jM%+de1$Oe?x*KDZcq$Xry#-uFk-p;3VZ7T-70?PAlO@G^b)c*?)DC%i z6(@E6KFBDJIaEKyuD0bsXhe~WPGiX^(z(RWP4_y5&PW?CaJhuGvgTSm0W)%)ahhp} zR(X80sl;g0}D?JgX~zjMt>!>97pu z_BW^ajYKOZ835l{RkCvsMUy=}JG?_&OCuZ4RT-OR-Sgt2j$~ew@(+5JkUBRh7B-p4 z?fj8{)qpmlsQ1$k9*1<2sVPRQ(Y^F=ll#Zpgq zC>#*Ul)X{g*F+sO39C~Gc>6bA24y!H+4NWQc4)NN?SFx$@bfZU&&;2)p|s=ca}%lf&x)%p-LomkaY8pTP@$AK{T1qZFPw_U{EY#%CXT$JV8Iw0f->25iy*@ zRP~krmwx_fO{bL%v!mMFSmF)*5>gDCzV@I`V|t7Tq9&&18r6cEr~m zSgbARjm&tn7O$Tg8tVhUPwDI4LvXuJY6f4xHqn3Zw4D^pW0Hh1JCyNhu)d>vd1H_< zf7hYFUzlyl72g}VBvR}3kSxXCK+LNBx)LFCufP2)h8uHs4u#^WTxH(- zs-q=;0?Kk1uUh=Mcc{+iQweDMStcTO-RS+x1)V$<#IJw|V2|s)?v2g0#w8Jo;a|S`oY!n!3wTz%6;hU%s2^6GKK<#Y#}6 zQFj9-uJZLn3Aye&Oh?4<>>H}A31@@HB^BKu?QeJdqT$JiaGOe=9%gM3-}EpmP6=eF z=;vwncOeULEK?YMfEIeS@Ld^P~cfRoKe;(YFK?#t9m00Y+q1Oj= zEp5bj^Mw}wWhbqKyubVMAfRevIm;sZfKvo*n5Jk?(EY2nv{gy?O~K1Ns=gV-AhR3< zkiW8NsqeetLPSFd^o57~(T5_L3sX_FoQzpr#mE>~D=rjCa`7UALogqS>mC*tS5f=M z1kMw`kl(Bgb&CMv{|dXz8~aeXuY~?Q=0rq84g9JBfY4_knI@nU7o!ppM4BZhFYM?r zs%zdZW4+@C0I6!Gkq#iTqxi+VxeJtxT#fA{|-rX>I1nEWAkn z93kClon8h0w82a2_{ki%>laI5gN~$C{m&a)406#an%7358_}%*Em=qXo5#eN3P1JbqhAB8cCjruhTXa91v(8Hus zHNG;hfvo~X9dt{4noEQEqV|7BXA;&@2Z`=AfREzH$6Q8QbBY-tK^*f<4e9L<^AEdo zO$uQ00HPO+8)DG1BtW^Gl?0^0!l+0>Q^U`ukZhg%KC+fz49gre-t<045hVcFGmHOk zDq5@no}^1HewdGn%@vkLogDp@MsOt@D5}mB2?6N@o->#Ex+=dN$CNWqf)^5~0x4_5 zSKUG^6b?lloa~PoP(}JG)#JKxm9R{;M$=`fM@OV-I*|sT?L}Ys59gXuD+3!&vAeZ_ zB7+EHOIg8wakSjc<#AEq;S3)*s80*C;zEp&fQui<>0du@e~Uj-{CeF_i#uFfnNL<;E*#07wWHO<&j&t18tB^p4x{U-1$ z3V@B+RXmfd&V#{#q~R0NBnKLK>E7~S4e9ceI=krHVCV}cVzk%|fg`+HDzL~JmEFc6 zi&T5;DbWGuh*AD9KO}hg#=p@5vU#mEBx=!_3H3DslLkUV1LgtL_H|{r6B=R!t=%fO zrMtS9c^ORerO4O+b0m#yt3U>2BdO=7!>@OkIOh^cA9F}Fg>4q7s(Sw)x{Sd3dS%B55;qRVhZ zx7azUV+5RKBoQ?CKIkAFRfx9n;*M8&waC5kTMs~{z0@TrW_}p zl#&1c^mgr!P-cDndB$Lf$+)y;O&RgJl$bJ;X{XJ#VTzVzNu=pA7mJ#CH(lS&Ohh6H ziL8t}LrA%{Wi(@0a!F{=CPQ~BC6RdF^Njr)-sjhIzR&rd&-tA1`JV4N&-Wqr`oO#^ zzUAy^F8IcGeJx9*E2lS<&W_sWruh;oPxrqj%#H*a9_?!U7hpw$GjpFm6aqccA=j?1 zJ9n4BXeZlXLu&JJMSn-O=b~xu3HVP3(8lm-j72_5FMVjlFU`hRPw^hlErTEoeBegS_@%yx2Z=Z;32eQpFL`-mNwZ~cL-yg{Xs~o!?W1j{p6@oIi^`BI z?|Jhejz@J%XUV;lo)H1yw2hK-n=+p*3*|E(Yz2x-)_?{T(!R{pE`b@N==X!nI*bpY zVne9iE6?Ygw)d!GzV{92&oqaHOF>&tP)Z z%e`8BrW|=IaSN!QLI_45{{GVnQtGP@k!}orb=}FP!g>$W?zz49yKaM8&S#NnREifr zhTASrI~GVwsJx-dMQZcNmwU9qnf+}&1`c4HEFhs8_~J}iW#a6)^QorHrIhOL7rg!9 zK5-9xGu&{u!%DgUNAe&JLe7tc9h*K}O5jjAEOTL@#LBDX5v9xuX%xV&TE zu9`o3-_RJQi?R^MfNLp=t?<`0UL_zOv>DCFv7Q@J8fmT$9lxX&^#bX46UJB_O4r(Z z$W@HL6LvZq|H`F(vMi=8D2~7{HZ828EM6K6TRU2xBr`_N7Js=Mo#_uTT zC)_}-hX~Bg@o>-%1b$aZ1xjL2gqsuR*kFgjrxc~l;tJo}fi`1lys>G*xuHx=L@Ttg zfAR2^<}LMHE40KSalbyvBFJ7GF#!ozI~n~993&EI0R!CMwPecyvm=S_K|h$W>SEu| zo5u?P~~#nQVKIFWYKCL?iLAitJmNoDXy`s3WZs!w&~+t_PWj|a*# zX-HX%DiR*-xBA_&?^yALHv?`o$#W<2Ow>a|ls|pMFoyt-hzx}3#Bd+Al*Ohvdk6LC zdV9C?(Hvkl=z?Swzp;CZRx#h=em2tC;pw_v_;NlAUu4nN9~0LWwol^ zI_b&{{8zu}@|AiGvQeE379Maxgx5PyhD5vOYADABMr$3sR%Fqlber)SiGgzK!I|(m ze(`9MG={|nXvCU>w00>x+d}1Q4U#UtBE7REOmCGluQ-|~hr>Gnx*&9poF`HTlAat} zu;9#1XAbBFzL_K41n~#Qx`Se1q$HRVIApUfj!9J~{(w!2&uIB93sJrtlLGl9=Ly7P zTpjPRcjW1jskQYfZgKsBzgp*>d5z}n&mse95(o5 za=xMs8?{t59ug7yK9pqJ+Vw*nY)amU=iBFggszPU&#isXEq{4id(?UQPtBzA}qY<2MMPg2vco3iS-ZmXkG zb2DN?EwAbC@sI!0o6ZSqwf@A3Hyz_L15`N45&`+9l}E17C=!L1tzs;=H8%mQw2*nP z7of$nULZ$c$$P@*vAW%bU@QeV?ph>nSbeh;c31oi)4riiGPeWU0fn#j(go5n4oLjj(Jihg`TD5+a*5Ca9G-xy zJ#gX4tg8vI3}K;<9(A`7^fdA(yup*W<=ViF1L-a#))~eP?$Ho^eR(@VNwBW!3S|M1 zA}<&u!dDRmQFWI1%obv5b{AY+78c+3m;Trc@0kLTNkTLQ2%dU`L8z0IGRX0cR|pINSaMEAYhrpRbwwukM#27CocR Q5CRWl`!4rNSLWIO0eYPYIRF3v diff --git a/assets/icon/logo.png b/assets/icon/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a764538703e49d2ca3491cf8dc1a72716f5a21ba GIT binary patch literal 8191 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 Q5CRWl`!4rNSLWIO0eYPYIRF3v literal 0 HcmV?d00001 diff --git a/assets/images/logos.jpeg b/assets/images/logos.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b12c3be830bca36788d6623afe8a5c4cd31a68f9 GIT binary patch literal 73394 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 z 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 E4>c=fcmMzZ literal 88702 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

~(0x6*HGUo6z5u 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�oS$_+phSf^?d5%e+w(v-cvM+fg=IyjKKwj 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 delta 2474 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png index e3f4134b631dfb7b705047c0ec35ae5b32b21309..1ba5f31682922989ed844e83f21321c250113d4e 100644 GIT binary patch delta 1064 zcmV+@1lRkT2)qc8BYy+~Nkl}(X8jT%Au~$??G@=BR zh!yN&2ODAsyXZew6s*{=VU4|Dk3A7PYOKWXW9D>u+{?QR{BrO1_V(MGotfQ4Wn^SX z04ol9fYu-elm_#_RPYMi0w=+4@HEn3Q4yXO14}_KkkjXRZhuh8=mr*ngJ2YRlvPo- z&j9y8t1yComR-~vv0ywH2fhUnEeQ627T_*e52geZrELepKwA(GI)mq#i539IZKkvu z5@3x&>^xXyzq$UWL_gr4uq&Da>~sV@t1h}eCBYex44&EVccMYXcUoHi{Gx95tUTBU znuxjD6`cUu__R-2Vg#qOQFL7Klc-XNlI9;)&8d?ZGZk0;GdJHp44mQi!0RMT_S17O)Jo z1A9Rs@Coz-6+F?x;E-s7(~TQNL!C40Vgr^J4XARNh<~Qr#26c6KqDJ(Ef^x2LX7BY z6zy(q;5w}ljkHCMAT17Dh#-0u)OGHgf@z?hXduN|drykCbUGF_9)}D_H}4m9c{t-b zb_i*E?2PGIJVk3e4Xm9j4A#_=)=p2P+wTKlF}N&RZ-%1ACWVxhenCFxu&xi=y8_UTbh?nj{)n)kJrVv@n96F|`=6vqhI9 z!FlG6`!mYErijn?NLMZT&Bb27lH+A?NoSigLeXeQhS{%KMg0f;v>1Djb(tBk*{&=$T-#WRGBTN;eMJie zw|^|UdW8*gDGP#be~OP3^`w`U9Q(Rg@R@tPMe8Q_LslOi#Ab*dS+ZiUMb~q(UEMk` zi+?;(7JGi#D7!CfFAM~qvnWdAa?yJgoHp)YM_f@Fx35;9j@=hCVXnzg@F$=k18{7} z*gOCX^KRS+tRh{(Y0)pGF=bYQ>7v^bD}R!AT;Wz%M*bgHxPLN7*NLWzSJN4&45GJw zqTY=7wFhjl0bn&~V9(>7zC0n$4SAn|$ekuZ)SdKBCvd~<j~A>iEc&dYabf!T*=^CNKNPM*q<<@p7|c1kiKjo7OqNT!?jft_ iM!?d^d^~8^Ozkf_U*crbHH>Ni00006*qPS3Fz##}x z6bwX(e?SOsL?l`0N*5xoMBErRx)pIHx=<7ZBciCN42jV}QAr?(G0_>iGt=Gm=vP&F z?yatORnNnmqUowz=brDLbI&=qq?PxNcq9m~={*s#&;SODWjO$Ck7e*IfOfMq28%R z#tY!vdMyw%07a9sljVIfuDx^>l?Qd`k5o~rl|tRU^;G?Ooc0GgM* zaj4^A>*G!IzwALdpkV%F1In@tmB53FfMI8h8}D^s{eNO57CrdGhP7s)d`Qa+Z?-Jr zo_F4D!(26>-l1aYxhC%Z+Q#9tT_~1|5he55F%3UGyNr#u);S~yF_ZpReGW}$a~7If zEd#O<<{<+f`OpXxM;-w8e_}$IcvwBPz`cbN*%|z9!=rZ)qtIr;oA%bcVEV@Q%TSs! z4!_Y2fqzrW{Ql7ACVoCvhH|@#!6iGi!)kld9z&wJ2~Sx$L@-h`9Q42F`JP@LaHC>F zgf{k2rI3b8jF-cRvfCoP1wUKGc@Y(=XQorCix9M!n+%HB0KcPuU*GC&n)5m6LZiz4vcw$d&q#s zcYnTq?RcFhUJ-B#&6W)Fw0y4ydo5Y;){iEvGbWujWu9EDBe9Tj4@pnEZw`&87mH~j zw4h`bPA}ow^MAqZM|;b4sSfSmtmv5uc~yI?j>c1q5F}xym${w>P?55Anf7q~)$4E! zCkZAIshKMWR60#m=tp%rdE{^b+j~0WJbqN~Qqg+-RY$>p+#Q~Hyf0M=7DZ9BrX2|en+l2gu-<#00000NkvXXu0mjfCCK^o diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index 6c73170750df1103df3f44f49fe4ce6b33b8e41f..099918e3f8d418be2412bbba058323200a0be672 100644 GIT binary patch delta 2801 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 exRR?Fp#KAIBfKO>pqbVZN_lzkdC` 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 KMNUMnLSTX#Mt*hx diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index ee350b6ef398038639cf33b81ddf2765b12ace73..0209ca335bd4b0618b832ebcb0ecc51f1978ec72 100644 GIT binary patch literal 6791 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 literal 5297 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 literal 5297 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 M07*qoM6N<$g6IvPiU0rr diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index dfa31ec698fe098a2922002c6ac74d96b48edfab..cc65fe894595f23482078bb31dd7ea69a07418fd 100644 GIT binary patch literal 4029 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 jQpfw=jL8_t> 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 b(Zc@$RBZD^MYk$800000NkvXXu0mjf6UawS diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 04d62c64429016b7a51474d4cae66bd2b6b4c021..03732abfc5638d6bf440fa23e521f8bbc8fad33d 100644 GIT binary patch literal 8635 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 N002ovPDHLkV1g{kJ}v+N literal 7249 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 f7%+OxCv%&Z+C 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

1!~o8&g`pV-hn;QT#L( z8c;bn7~-=Eo-twUq3K}*e; zYl_lwSwjyPQyG1m_~9wa!Xzk0!>S)*G6z=Gu)Y1P)uxr`aBqF9+=6zkwUN0lGTs30 z&=OnMVXbRtMoQG3j&h`i(8fGX{K$?wfEXN^Q}pJk8c{0xqOJ@lUlNiBOsN&Fi61(w zc`p$mT~bn-oEeP&44{sX4;6|T(bM;siXtSU$>*^5che#R&X54Ym%ABJ9#eq|N z01+^m)6IJKW!uJp83(W+kZl?^3>a|$0r;nL4j6C%k5FUI0pkr200K|^7+?TV^qmua ifB_5)m~()>#s32twY3+zabZsY0000 diff --git a/lib/constants.dart b/lib/constants.dart index e3ae786a..2b4709ec 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -12,6 +12,7 @@ class KStrings { 'https://github.com/sterrenburg/flutterhole/'; static const String githubIssuesUrl = 'https://github.com/sterrenburg/flutterhole/issues/new/choose'; + static const String logoDesignerUrl = 'https://mathijssterrenburg.com/'; } class KIcons { diff --git a/lib/dev_dependency_injection.dart b/lib/dev_dependency_injection.dart index 5e37fc23..9a6ae8b3 100644 --- a/lib/dev_dependency_injection.dart +++ b/lib/dev_dependency_injection.dart @@ -114,8 +114,7 @@ class ApiDataSourceDev implements ApiDataSource { @override Future fetchClientsOverTime( PiholeSettings settings) async { - // TODO implement - throw UnimplementedError(); + return _overTimeDataClientsFromJson(); } @override @@ -236,9 +235,9 @@ class ApiDataSourceDev implements ApiDataSource { return TopSourcesResult( topSources: { PiClient(name: 'localhost', ip: '127.0.0.1'): 3204, - PiClient(name: 'openelec', ip: '10.0.1.2'): 324, - PiClient(ip: '10.0.1.3'): 216, - PiClient(name: 'laptop', ip: '10.0.1.4'): 96, + PiClient(name: 'openelec', ip: '127.0.1.2'): 324, + PiClient(ip: '127.0.1.3'): 216, + PiClient(name: 'laptop', ip: '127.0.1.4'): 96, }, ); } @@ -359,7 +358,7 @@ OverTimeData _overTimeDataFromJson() { "1588227900": 250, "1588228500": 40, "1588229100": 745, - "1588229700": 1151, + "1588229700": 851, "1588230300": 210, "1588230900": 229, "1588231500": 243, @@ -501,17 +500,17 @@ OverTimeData _overTimeDataFromJson() { "1588227300": 0, "1588227900": 0, "1588228500": 0, - "1588229100": 0, - "1588229700": 0, - "1588230300": 0, - "1588230900": 0, - "1588231500": 0, - "1588232100": 0, - "1588232700": 0, - "1588233300": 0, - "1588233900": 0, - "1588234500": 0, - "1588235100": 0, + "1588229100": 400, + "1588229700": 550, + "1588230300": 561, + "1588230900": 212, + "1588231500": 218, + "1588232100": 56, + "1588232700": 123, + "1588233300": 145, + "1588233900": 156, + "1588234500": 130, + "1588235100": 53, "1588235700": 0, "1588236300": 0, "1588236900": 0, @@ -595,3 +594,165 @@ OverTimeData _overTimeDataFromJson() { return OverTimeData.fromJson(json); } + +OverTimeDataClients _overTimeDataClientsFromJson() { + final Map json = { + "clients": [ + {"name": "", "ip": "127.0.1.12"}, + {"name": "", "ip": "127.0.1.2"}, + {"name": "hello", "ip": "127.0.1.15"}, + {"name": "", "ip": "127.0.1.1"}, + {"name": "", "ip": "127.0.1.17"}, + {"name": "localhost", "ip": "127.0.0.1"}, + {"name": "", "ip": "1.2.3.4"}, + {"name": "", "ip": "127.0.1.7"}, + {"name": "", "ip": "127.0.1.18"}, + {"name": "", "ip": "127.0.1.6"}, + {"name": "", "ip": "127.0.1.9"}, + {"name": "and finally", "ip": "127.0.1.13"} + ], + "over_time": { + "1590084300": [9, 90, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0], + "1590084900": [96, 73, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0], + "1590085500": [30, 49, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0], + "1590086100": [19, 58, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0], + "1590086700": [86, 36, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0], + "1590087300": [51, 21, 0, 4, 0, 0, 0, 0, 42, 0, 0, 0], + "1590087900": [12, 8, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0], + "1590088500": [79, 37, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0], + "1590089100": [141, 124, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0], + "1590089700": [27, 27, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + "1590090300": [92, 38, 0, 0, 0, 0, 3, 0, 6, 0, 0, 0], + "1590090900": [94, 31, 0, 4, 0, 0, 0, 0, 1, 0, 0, 0], + "1590091500": [52, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590092100": [61, 39, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0], + "1590092700": [50, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590093300": [58, 34, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0], + "1590093900": [34, 53, 0, 0, 0, 0, 1, 0, 17, 0, 0, 0], + "1590094500": [63, 89, 0, 4, 0, 0, 0, 0, 18, 0, 0, 0], + "1590095100": [64, 50, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0], + "1590095700": [32, 84, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0], + "1590096300": [58, 74, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0], + "1590096900": [45, 42, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0], + "1590097500": [51, 50, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0], + "1590098100": [81, 7, 0, 4, 0, 0, 0, 0, 6, 0, 0, 0], + "1590098700": [38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590099300": [37, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0], + "1590099900": [1, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0], + "1590100500": [5, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0], + "1590101100": [1, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0], + "1590101700": [110, 0, 0, 4, 0, 0, 0, 0, 16, 0, 0, 0], + "1590102300": [119, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0], + "1590102900": [25, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0], + "1590103500": [2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590104100": [3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0], + "1590104700": [3, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0], + "1590105300": [24, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0], + "1590105900": [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590106500": [21, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], + "1590107100": [0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0], + "1590107700": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590108300": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590108900": [0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0], + "1590109500": [0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0], + "1590110100": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590110700": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590111300": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590111900": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590112500": [0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0], + "1590113100": [0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0], + "1590113700": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590114300": [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + "1590114900": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590115500": [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], + "1590116100": [0, 0, 0, 4, 0, 0, 1, 0, 1, 0, 0, 0], + "1590116700": [0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0], + "1590117300": [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + "1590117900": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590118500": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590119100": [15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590119700": [2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0], + "1590120300": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590120900": [1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0], + "1590121500": [2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590122100": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590122700": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590123300": [0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0], + "1590123900": [5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], + "1590124500": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590125100": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590125700": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + "1590126300": [0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0], + "1590126900": [4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0], + "1590127500": [2, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0], + "1590128100": [2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590128700": [15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590129300": [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590129900": [0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0], + "1590130500": [2, 0, 0, 4, 0, 0, 0, 0, 54, 0, 0, 0], + "1590131100": [1, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0], + "1590131700": [3, 0, 0, 0, 0, 0, 0, 0, 84, 2, 0, 0], + "1590132300": [3, 57, 0, 0, 0, 0, 2, 0, 19, 0, 0, 0], + "1590132900": [88, 93, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0], + "1590133500": [62, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590134100": [48, 19, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0], + "1590134700": [72, 70, 0, 0, 0, 26, 1, 0, 1, 0, 0, 0], + "1590135300": [74, 24, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0], + "1590135900": [82, 31, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0], + "1590136500": [28, 14, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0], + "1590137100": [15, 23, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0], + "1590137700": [5, 8, 0, 4, 0, 0, 0, 0, 6, 0, 0, 0], + "1590138300": [30, 8, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0], + "1590138900": [19, 14, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0], + "1590139500": [75, 34, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0], + "1590140100": [82, 17, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0], + "1590140700": [29, 13, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0], + "1590141300": [3, 12, 0, 4, 0, 0, 0, 0, 1, 0, 0, 0], + "1590141900": [5, 10, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0], + "1590142500": [16, 7, 0, 0, 0, 0, 0, 0, 86, 0, 0, 0], + "1590143100": [7, 18, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0], + "1590143700": [23, 3, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0], + "1590144300": [48, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0], + "1590144900": [30, 0, 0, 4, 0, 0, 0, 0, 5, 0, 0, 0], + "1590145500": [88, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0], + "1590146100": [56, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0], + "1590146700": [69, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0], + "1590147300": [34, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0], + "1590147900": [25, 0, 0, 0, 0, 0, 1, 0, 53, 0, 0, 0], + "1590148500": [99, 0, 0, 4, 0, 0, 0, 0, 35, 0, 0, 0], + "1590149100": [47, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0], + "1590149700": [10, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0], + "1590150300": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590150900": [32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0], + "1590151500": [0, 81, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0], + "1590152100": [0, 62, 0, 4, 0, 0, 0, 0, 9, 0, 0, 0], + "1590152700": [0, 14, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0], + "1590153300": [0, 38, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0], + "1590153900": [0, 41, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0], + "1590154500": [0, 31, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0], + "1590155100": [0, 15, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0], + "1590155700": [0, 28, 0, 4, 0, 0, 0, 0, 5, 0, 0, 0], + "1590156300": [0, 13, 0, 0, 0, 0, 5, 0, 11, 0, 0, 0], + "1590156900": [0, 12, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0], + "1590157500": [0, 17, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + "1590158100": [0, 23, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0], + "1590158700": [0, 17, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0], + "1590159300": [0, 38, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0], + "1590159900": [0, 9, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0], + "1590160500": [0, 22, 0, 0, 0, 6, 0, 0, 2, 0, 0, 0], + "1590161100": [0, 16, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + "1590161700": [0, 9, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0], + "1590162300": [0, 16, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0], + "1590162900": [0, 18, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0], + "1590163500": [0, 7, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0], + "1590164100": [0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590164700": [0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "1590165300": [0, 7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + "1590165900": [0, 12, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0], + "1590166500": [0, 28, 0, 4, 0, 0, 0, 0, 6, 0, 0, 0], + "1590167100": [0, 20, 0, 0, 0, 0, 2, 0, 5, 0, 0, 0] + } + }; + + return OverTimeDataClients.fromJson(json); +} diff --git a/lib/features/home/presentation/pages/summary/widgets/clients_over_day_tile.dart b/lib/features/home/presentation/pages/summary/widgets/clients_over_day_tile.dart index 4b36e220..6afbb9ee 100644 --- a/lib/features/home/presentation/pages/summary/widgets/clients_over_day_tile.dart +++ b/lib/features/home/presentation/pages/summary/widgets/clients_over_day_tile.dart @@ -18,7 +18,7 @@ class ClientsOverDayTile extends StatelessWidget { Widget build(BuildContext context) { return Card( child: LineChartScaffold( - title: 'Total queries over last 24 hours', + title: 'Client activity over last 24 hours', lineChart: clientsOverTimeResult.fold( (failure) => CenteredFailureIndicator(failure), (overTimeData) { diff --git a/lib/features/home/presentation/pages/summary/widgets/graph_legend_item.dart b/lib/features/home/presentation/pages/summary/widgets/graph_legend_item.dart index 9eeab515..985062a3 100644 --- a/lib/features/home/presentation/pages/summary/widgets/graph_legend_item.dart +++ b/lib/features/home/presentation/pages/summary/widgets/graph_legend_item.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutterhole/features/home/presentation/pages/summary/notifiers/pie_chart_notifier.dart'; import 'package:provider/provider.dart'; diff --git a/lib/features/routing/presentation/pages/about_page.dart b/lib/features/routing/presentation/pages/about_page.dart index 0e6f06cd..4f5f292b 100644 --- a/lib/features/routing/presentation/pages/about_page.dart +++ b/lib/features/routing/presentation/pages/about_page.dart @@ -7,10 +7,183 @@ import 'package:flutterhole/features/routing/presentation/pages/privacy_page.dar import 'package:flutterhole/features/settings/services/package_info_service.dart'; import 'package:flutterhole/widgets/layout/animations/animated_opener.dart'; import 'package:flutterhole/widgets/layout/lists/list_title.dart'; +import 'package:flutterhole/widgets/layout/lists/open_url_tile.dart'; import 'package:flutterhole/widgets/layout/notifications/dialogs.dart'; import 'package:package_info/package_info.dart'; import 'package:share/share.dart'; +const Color _jpegBackgroundColor = Colors.white; +final Color _iconColor = Colors.green.shade900; + +const int _subTileCount = 2; + +class _Spacer extends StatelessWidget { + const _Spacer({ + @required this.width, + @required this.color, + Key key, + }) : super(key: key); + + final double width; + final Color color; + + @override + Widget build(BuildContext context) { + return Container( + width: width, + decoration: BoxDecoration( + color: color, + ), + ); + } +} + +class LogoInspector extends StatefulWidget { + const LogoInspector({ + Key key, + @required this.screenWidth, + }) : super(key: key); + + final double screenWidth; + + @override + _LogoInspectorState createState() => _LogoInspectorState(); +} + +class _LogoInspectorState extends State { + Color _color; + ScrollController _scrollController; + + @override + void initState() { + super.initState(); + _color = _iconColor; + + _scrollController = ScrollController( + initialScrollOffset: widget.screenWidth * 3, + ); + + _scrollController.addListener(() { + final offset = _scrollController.offset; + + final pageOffset = (offset / widget.screenWidth) - 3; + + if (pageOffset <= -1.5) { + setState(() { + _color = ThemeData.dark().cardColor; + }); + } else if (pageOffset >= -0.2 && pageOffset <= 0.2) { + setState(() { + _color = _iconColor; + }); + } else if (pageOffset >= 3) { + setState(() { + _color = Colors.purple; + }); + } + }); + } + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + + List _buildSpacers(double screenWidth) { + return [ + _Spacer( + width: screenWidth / _subTileCount, + color: _jpegBackgroundColor.withOpacity(.2), + ), + _Spacer( + width: screenWidth / _subTileCount, + color: _jpegBackgroundColor.withOpacity(.4), + ), + _Spacer( + width: screenWidth / _subTileCount, + color: _jpegBackgroundColor.withOpacity(.6), + ), + _Spacer( + width: screenWidth / _subTileCount, + color: _jpegBackgroundColor.withOpacity(.8), + ), + ]; + } + + @override + Widget build(BuildContext context) { + return AnimatedContainer( + duration: Duration(seconds: 1), + decoration: BoxDecoration( + // TODO perhaps not white if we make this image a png + color: _color, + ), + curve: Curves.easeInOut, + width: widget.screenWidth * 4, + child: ListView( + scrollDirection: Axis.horizontal, + controller: _scrollController, + physics: BouncingScrollPhysics(), + children: [ + Container( + width: widget.screenWidth, + child: Stack( + children: [ + Center( + child: Image( + image: AssetImage('assets/icon/old_icon.png'), + width: widget.screenWidth / 2, + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: ListTile( + leading: Icon(KIcons.info), + title: Text('Original logo design'), + ), + ), + ], + ), + ), + ..._buildSpacers(widget.screenWidth / 2), + ..._buildSpacers(widget.screenWidth / 2).reversed.toList(), + Container( + width: widget.screenWidth, + child: Stack( + children: [ + Center( + child: Image( + image: AssetImage('assets/icon/logo.png'), + width: widget.screenWidth / 2, + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: OpenUrlTile( + url: KStrings.logoDesignerUrl, + leading: Icon(KIcons.info), + title: Text('Logo design by Mathijs Sterrenburg'), + ), + ), + ], + ), + ), + ..._buildSpacers(widget.screenWidth), + Container( + decoration: BoxDecoration(color: Colors.white), + child: Image( + image: AssetImage('assets/images/logos.jpeg'), + width: widget.screenWidth * 2, + ), + ), + ..._buildSpacers(widget.screenWidth / 2).reversed.toList(), + ], + ), + ); + } +} + class AboutPage extends StatelessWidget { @override Widget build(BuildContext context) { @@ -29,16 +202,36 @@ class AboutPage extends StatelessWidget { children: [ ListTile( contentPadding: EdgeInsets.all(16), - title: Row( - children: [ - Text('${packageInfo?.appName}', - style: Theme.of(context).textTheme.headline4), - ], - ), + title: Text('${packageInfo?.appName}', + style: Theme + .of(context) + .textTheme + .headline4), subtitle: Text( 'Made by Sterrenburg', style: Theme.of(context).textTheme.caption, ), + trailing: SizedBox( + width: 56, + child: Ink.image( + image: AssetImage('assets/icon/icon.png'), + child: InkWell( + onTap: () { + showModalBottomSheet( + context: context, + builder: (sheetContext) { + final screenWidth = + MediaQuery + .of(context) + .size + .width; + + return LogoInspector(screenWidth: screenWidth); + }); + }, + ), + ), + ), ), ListTile( leading: Icon( diff --git a/lib/features/routing/presentation/widgets/default_drawer.dart b/lib/features/routing/presentation/widgets/default_drawer.dart index 7aea81d9..d311c768 100644 --- a/lib/features/routing/presentation/widgets/default_drawer.dart +++ b/lib/features/routing/presentation/widgets/default_drawer.dart @@ -79,19 +79,24 @@ class _Footer extends StatelessWidget { final String footerMessage = getIt().footerMessage; final PackageInfo packageInfo = getIt().packageInfo; + final textStyle = Theme.of(context).textTheme.caption; + return ListTile( title: Text( '${packageInfo.appName} ${packageInfo.versionAndBuildString}', - style: Theme.of(context).textTheme.caption, + style: textStyle, + ), + leading: Image( + image: AssetImage('assets/icon/logo.png'), + width: 50, + height: 50, + color: textStyle.color, ), subtitle: footerMessage.isEmpty ? null : Text( '$footerMessage', - style: Theme - .of(context) - .textTheme - .caption, + style: textStyle, ), onLongPress: () { showAppDetailsDialog(context, packageInfo); diff --git a/lib/features/settings/data/datasources/settings_data_source_hive.dart b/lib/features/settings/data/datasources/settings_data_source_hive.dart index 6903e8ec..0df5e66c 100644 --- a/lib/features/settings/data/datasources/settings_data_source_hive.dart +++ b/lib/features/settings/data/datasources/settings_data_source_hive.dart @@ -128,7 +128,7 @@ class SettingsDataSourceHive implements SettingsDataSource { final box = await _piholeBox; final index = await _activeIndex; - if (index < 0) { + if (index < 0 || box.isEmpty) { print('no active pihole found in storage, returning default'); return PiholeSettings(); } diff --git a/lib/features/settings/presentation/pages/add_pihole_page.dart b/lib/features/settings/presentation/pages/add_pihole_page.dart index 7453ec27..6c06a506 100644 --- a/lib/features/settings/presentation/pages/add_pihole_page.dart +++ b/lib/features/settings/presentation/pages/add_pihole_page.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; diff --git a/lib/features/settings/presentation/widgets/pihole_theme_builder.dart b/lib/features/settings/presentation/widgets/pihole_theme_builder.dart index b3e7d3f5..caa3741a 100644 --- a/lib/features/settings/presentation/widgets/pihole_theme_builder.dart +++ b/lib/features/settings/presentation/widgets/pihole_theme_builder.dart @@ -5,7 +5,7 @@ import 'package:flutterhole/features/settings/presentation/widgets/settings_bloc // Color to MaterialColor: // https://medium.com/py-bits/turn-any-color-to-material-color-for-flutter-d8e8e037a837 -Map _materialColorMap = { +Map materialColorMap = { 50: Color.fromRGBO(136, 14, 79, .1), 100: Color.fromRGBO(136, 14, 79, .2), 200: Color.fromRGBO(136, 14, 79, .3), @@ -56,7 +56,7 @@ class PiholeThemeBuilder extends StatelessWidget { ThemeData _buildTheme(BuildContext context, PiholeSettings settings) { final MaterialColor color = MaterialColor( settings.primaryColor.value, - _materialColorMap, + materialColorMap, ); return Theme.of(context).copyWith( diff --git a/lib/features/settings/services/package_info_service_impl.dart b/lib/features/settings/services/package_info_service_impl.dart index 5c59d61b..8d707845 100644 --- a/lib/features/settings/services/package_info_service_impl.dart +++ b/lib/features/settings/services/package_info_service_impl.dart @@ -2,7 +2,6 @@ import 'package:flutterhole/features/settings/services/package_info_service.dart import 'package:injectable/injectable.dart'; import 'package:package_info/package_info.dart'; -@prod @singleton @RegisterAs(PackageInfoService) class PackageInfoServiceImpl implements PackageInfoService { diff --git a/lib/main.dart b/lib/main.dart index 8bfc6fc1..f2283ebf 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,7 +10,7 @@ import 'package:flutterhole/features/settings/presentation/notifiers/theme_mode_ import 'package:injectable/injectable.dart'; import 'package:provider/provider.dart'; -void main([List arguments = const [Environment.prod]]) { +void main([List arguments = const []]) { // wait for flutter initialization WidgetsFlutterBinding.ensureInitialized(); @@ -18,6 +18,7 @@ void main([List arguments = const [Environment.prod]]) { // Configure service injection List args = List.from(arguments) ?? []; + if (args.isEmpty) args.add(Environment.prod); configure(args.first).then((_) { if (foundation.kReleaseMode) { diff --git a/lib/widgets/layout/notifications/dialogs.dart b/lib/widgets/layout/notifications/dialogs.dart index afd91b1b..d4886e5c 100644 --- a/lib/widgets/layout/notifications/dialogs.dart +++ b/lib/widgets/layout/notifications/dialogs.dart @@ -130,8 +130,7 @@ void showAppDetailsDialog(BuildContext context, PackageInfo packageInfo) { 'can view the code that runs your app. ' 'You can find the repository on '), TextSpan( - style: Theme - .of(context) + style: Theme.of(context) .textTheme .bodyText2 .apply(color: KColors.link), @@ -140,10 +139,42 @@ void showAppDetailsDialog(BuildContext context, PackageInfo packageInfo) { ..onTap = () => getIt().launchUrl(KStrings.githubHomeUrl), ), - TextSpan(text: '.'), + TextSpan( + text: '.' + '\n\n' + 'Logo design by '), + TextSpan( + style: Theme + .of(context) + .textTheme + .bodyText2 + .apply(color: KColors.link), + text: 'Mathijs Sterrenburg', + recognizer: TapGestureRecognizer() + ..onTap = () => + getIt().launchUrl(KStrings.logoDesignerUrl), + ), + TextSpan(text: ', an amazing designer.'), ], ), ), ], ); } + +class ImageDialog extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Dialog( + child: Container( +// width: 200, +// height: 200, + decoration: BoxDecoration( + image: DecorationImage( + image: ExactAssetImage('assets/icon/icon.png'), + fit: BoxFit.cover, + )), + ), + ); + } +} diff --git a/lib/widgets/layout/notifications/snackbars.dart b/lib/widgets/layout/notifications/snackbars.dart index 0b209f7f..4411c437 100644 --- a/lib/widgets/layout/notifications/snackbars.dart +++ b/lib/widgets/layout/notifications/snackbars.dart @@ -1,5 +1,4 @@ import 'package:flushbar/flushbar.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutterhole/constants.dart'; @@ -7,8 +6,8 @@ void showInfoSnackBar( BuildContext context, String message, { String title, - Duration duration = const Duration(seconds: 5), - }) { + Duration duration = const Duration(seconds: 5), +}) { Flushbar( title: title, message: message ?? 'Message', diff --git a/pubspec.yaml b/pubspec.yaml index dc3c079a..9fe1316a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -91,12 +91,15 @@ dev_dependencies: # icon generation flutter_launcher_icons: ^0.7.5 # flutter_driver extras - ozzie: ^2.2.3 + # TODO fixed version until this pull merges: + # https://github.com/bmw-tech/ozzie.flutter/pull/49/commits/88685857e966ea6743fac3134c50b071f740dd67 + ozzie: 2.2.3 flutter: uses-material-design: true -flutter_icons: - android: "launcher_icon" - ios: true - image_path: "assets/icon/icon.png" \ No newline at end of file + assets: + - assets/icon/icon.png + - assets/icon/old_icon.png + - assets/icon/logo.png + - assets/images/logos.jpeg \ No newline at end of file diff --git a/test_driver/app_test.dart b/test_driver/app_test.dart index 67ef200f..b72ecc85 100644 --- a/test_driver/app_test.dart +++ b/test_driver/app_test.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter_driver/flutter_driver.dart'; import 'package:ozzie/ozzie.dart'; import 'package:test/test.dart'; @@ -42,14 +40,14 @@ main() { await driver.scrollIntoView(find.byType('TotalQueriesOverDayTile')); + await driver.scrollIntoView(find.byType('ClientsOverDayTile')); + await ozzie.takeScreenshot('summary_middle_1'); await driver.scrollIntoView(find.byType('QueryTypesTile')); await driver.waitFor(find.text('AAAA (IPv6)')); - await ozzie.takeScreenshot('summary_middle_2'); - await driver.scrollIntoView(find.byType('ForwardDestinationsTile')); await ozzie.takeScreenshot('summary_bottom'); @@ -59,15 +57,21 @@ main() { await ozzie.takeScreenshot('clients_all'); - await driver.tap(find.text('10.0.1.2 (openelec)')); + await driver.tap(find.text('127.0.1.2 (openelec)')); await ozzie.takeScreenshot('client_single'); await driver.tap(find.byTooltip('Back')); + await driver.tap(find.byTooltip('Open navigation menu')); + + await ozzie.takeScreenshot('navigation_menu'); + + await driver.tap(find.pageBack()); + print('done with screenshots'); - exit(0); +// exit(0); }); }); } From 4082f76538a5c2289c6454b54cebe24f8c92a7a6 Mon Sep 17 00:00:00 2001 From: thomas-sterrenburg Date: Mon, 25 May 2020 10:42:11 +0200 Subject: [PATCH 11/11] Updating release notes --- release_notes.txt | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/release_notes.txt b/release_notes.txt index 27cb3452..e01a3091 100644 --- a/release_notes.txt +++ b/release_notes.txt @@ -1,9 +1,21 @@ -* Fix: Pi-holes without a password and API token can now toggle off the API token requirement. +* Adding new logo with an easter egg 🥚 -* Feature: the queries/clients over time charts are back. +* Adding apiTokenRequired field, fixes #79 -* Feature: errors are now more verbose. +* Remove index shift from QueryStatus toJson/fromJson, fixes #82 -* Feature: query logs are searchable and refreshable. +* Adding query log page -* Feature: the query log is back. I intend to make some kind of live query viewer separately, this page does _not_ automatically listen for new data. \ No newline at end of file +* Adding queries over time chart + +* Adding clients over time chart + +* Searchable & refreshable query log/client/domain pages + +* Status indicators in Pi-hole forms can be tapped to show error details + +* More verbose error logging + +* Adding drawer footer and better about dialog + +* Adding DoubleBackToClose \ No newline at end of file