diff --git a/fastlane/metadata/android/en-US/changelogs/70.txt b/fastlane/metadata/android/en-US/changelogs/70.txt new file mode 100644 index 0000000000000000000000000000000000000000..7e7ec941dfd19e8147652ea0534891d2d08eb9ad --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/70.txt @@ -0,0 +1 @@ +Use navigation tools from flutter_custom_toolbox. diff --git a/fastlane/metadata/android/fr-FR/changelogs/70.txt b/fastlane/metadata/android/fr-FR/changelogs/70.txt new file mode 100644 index 0000000000000000000000000000000000000000..ab67504d93c0b1747466f9e3366d8db90fe96cb3 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/70.txt @@ -0,0 +1 @@ +Utilisation des outils de navigation entre pages depuis flutter_custom_toolbox. diff --git a/lib/common/config/activity_page.dart b/lib/common/config/activity_page.dart deleted file mode 100644 index 7af76c4f550a132b7fa9e364d4b2f7fa2d0c5fe7..0000000000000000000000000000000000000000 --- a/lib/common/config/activity_page.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:ionicons/ionicons.dart'; - -import 'package:scrobbles/common/ui/pages/discoveries.dart'; -import 'package:scrobbles/common/ui/pages/home.dart'; -import 'package:scrobbles/common/ui/pages/statistics.dart'; -import 'package:scrobbles/cubit/activity/activity_cubit.dart'; -import 'package:scrobbles/models/activity/activity.dart'; - -class ActivityPageItem { - final String code; - final Icon icon; - final Widget Function({required Activity currentActivity})? builder; - - const ActivityPageItem({ - required this.code, - required this.icon, - required this.builder, - }); -} - -class ActivityPage { - static const bool displayBottomNavBar = false; - - static const indexHome = 0; - static final ActivityPageItem pageHome = ActivityPageItem( - code: 'page_home', - icon: Icon(Ionicons.home_outline), - builder: ({required Activity currentActivity}) { - return PageHome(); - }, - ); - - static const indexDiscoveries = 1; - static final ActivityPageItem pageDiscoveries = ActivityPageItem( - code: 'page_discoveries', - icon: Icon(Ionicons.star_outline), - builder: ({required Activity currentActivity}) { - return PageDiscoveries(); - }, - ); - - static const indexStatistics = 2; - static final ActivityPageItem pageStatistics = ActivityPageItem( - code: 'page_statistics', - icon: Icon(Ionicons.bar_chart_outline), - builder: ({required Activity currentActivity}) { - return PageStatistics(); - }, - ); - - static Map<int, ActivityPageItem> items = { - indexHome: pageHome, - indexDiscoveries: pageDiscoveries, - indexStatistics: pageStatistics, - }; - - static int defaultPageIndex = indexHome; - - static bool isIndexAllowed(int pageIndex) { - return items.keys.contains(pageIndex); - } - - static Widget getWidget(int pageIndex) { - return BlocBuilder<ActivityCubit, ActivityState>( - builder: (BuildContext context, ActivityState activityState) { - final Activity currentActivity = activityState.currentActivity; - - if (items.keys.contains(pageIndex)) { - return items[pageIndex]?.builder!(currentActivity: currentActivity) ?? Text('oups'); - } else { - return getWidget(defaultPageIndex); - } - }, - ); - } -} diff --git a/lib/common/config/screen.dart b/lib/common/config/screen.dart deleted file mode 100644 index f73facee0bc8adf5dae59d23a016b9cc5bb98b50..0000000000000000000000000000000000000000 --- a/lib/common/config/screen.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:scrobbles/common/ui/screens/about.dart'; -import 'package:scrobbles/common/ui/screens/activity.dart'; -import 'package:scrobbles/common/ui/screens/settings.dart'; - -class ScreenItem { - final String code; - final Icon icon; - final Widget screen; - - const ScreenItem({ - required this.code, - required this.icon, - required this.screen, - }); -} - -class Screen { - static const indexActivity = 0; - static const screenActivity = ScreenItem( - code: 'screen_activity', - icon: Icon(UniconsLine.home), - screen: ScreenActivity(), - ); - - static const indexSettings = 1; - static const screenSettings = ScreenItem( - code: 'screen_settings', - icon: Icon(UniconsLine.setting), - screen: ScreenSettings(), - ); - - static const indexAbout = 2; - static const screenAbout = ScreenItem( - code: 'screen_about', - icon: Icon(UniconsLine.info_circle), - screen: ScreenAbout(), - ); - - static Map<int, ScreenItem> items = { - indexActivity: screenActivity, - indexSettings: screenSettings, - indexAbout: screenAbout, - }; - - static bool isIndexAllowed(int screenIndex) { - return items.keys.contains(screenIndex); - } - - static Widget getWidget(int screenIndex) { - return items[screenIndex]?.screen ?? screenActivity.screen; - } -} diff --git a/lib/common/cubit/nav/nav_cubit_pages.dart b/lib/common/cubit/nav/nav_cubit_pages.dart deleted file mode 100644 index 9ad7c65d866afaba35f0bfe6ad0521488d58e90c..0000000000000000000000000000000000000000 --- a/lib/common/cubit/nav/nav_cubit_pages.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:scrobbles/common/config/activity_page.dart'; - -class NavCubitPage extends HydratedCubit<int> { - NavCubitPage() : super(0); - - void updateIndex(int index) { - if (ActivityPage.isIndexAllowed(index)) { - emit(index); - } else { - emit(ActivityPage.indexHome); - } - } - - void goToPageHome() { - updateIndex(ActivityPage.indexHome); - } - - @override - int fromJson(Map<String, dynamic> json) { - return ActivityPage.indexHome; - } - - @override - Map<String, dynamic>? toJson(int state) { - return <String, int>{'index': state}; - } -} diff --git a/lib/common/cubit/nav/nav_cubit_screens.dart b/lib/common/cubit/nav/nav_cubit_screens.dart deleted file mode 100644 index 77f3b613f72ab3cf724835b96f755abd8d411538..0000000000000000000000000000000000000000 --- a/lib/common/cubit/nav/nav_cubit_screens.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:scrobbles/common/config/screen.dart'; - -class NavCubitScreen extends HydratedCubit<int> { - NavCubitScreen() : super(0); - - void updateIndex(int index) { - if (Screen.isIndexAllowed(index)) { - emit(index); - } else { - goToScreenActivity(); - } - } - - void goToScreenActivity() { - emit(Screen.indexActivity); - } - - void goToScreenSettings() { - emit(Screen.indexSettings); - } - - void goToScreenAbout() { - emit(Screen.indexAbout); - } - - @override - int fromJson(Map<String, dynamic> json) { - return Screen.indexActivity; - } - - @override - Map<String, dynamic>? toJson(int state) { - return <String, int>{'index': state}; - } -} diff --git a/lib/common/ui/nav/bottom_nav_bar.dart b/lib/common/ui/nav/bottom_nav_bar.dart deleted file mode 100644 index 9449caf4ca9dda4cd4386968cde0456d607c82fe..0000000000000000000000000000000000000000 --- a/lib/common/ui/nav/bottom_nav_bar.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:flutter_swipe/flutter_swipe.dart'; - -import 'package:scrobbles/common/config/activity_page.dart'; -import 'package:scrobbles/common/cubit/nav/nav_cubit_pages.dart'; - -class BottomNavBar extends StatelessWidget { - const BottomNavBar({ - super.key, - this.swipeController, - }); - - final SwiperController? swipeController; - - @override - Widget build(BuildContext context) { - return Card( - margin: const EdgeInsets.all(0), - elevation: 4, - shadowColor: Theme.of(context).colorScheme.shadow, - color: Theme.of(context).colorScheme.surfaceContainerHighest, - shape: const ContinuousRectangleBorder(), - child: BlocBuilder<NavCubitPage, int>( - builder: (BuildContext context, int pageIndex) { - final List<BottomNavigationBarItem> items = []; - - ActivityPage.items.forEach((int pageIndex, ActivityPageItem item) { - items.add(BottomNavigationBarItem( - icon: item.icon, - label: tr(item.code), - )); - }); - - return BottomNavigationBar( - currentIndex: pageIndex, - onTap: (int index) { - BlocProvider.of<NavCubitPage>(context).updateIndex(index); - swipeController?.move(index); - }, - type: BottomNavigationBarType.fixed, - elevation: 0, - backgroundColor: Colors.transparent, - selectedItemColor: Theme.of(context).colorScheme.primary, - unselectedItemColor: Theme.of(context).textTheme.bodySmall!.color, - items: items, - ); - }, - ), - ); - } -} diff --git a/lib/common/ui/nav/global_app_bar.dart b/lib/common/ui/nav/global_app_bar.dart deleted file mode 100644 index 9fc602b870f9a12d2fb2fc29eb2e707e9ce510c3..0000000000000000000000000000000000000000 --- a/lib/common/ui/nav/global_app_bar.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:scrobbles/common/config/screen.dart'; -import 'package:scrobbles/common/cubit/nav/nav_cubit_pages.dart'; -import 'package:scrobbles/common/cubit/nav/nav_cubit_screens.dart'; - -import 'package:scrobbles/cubit/activity/data_counts_by_day_cubit.dart'; -import 'package:scrobbles/cubit/activity/data_counts_by_hour_cubit.dart'; -import 'package:scrobbles/cubit/activity/data_discoveries_cubit.dart'; -import 'package:scrobbles/cubit/activity/data_heatmap_cubit.dart'; -import 'package:scrobbles/cubit/activity/data_new_artists_cubit.dart'; -import 'package:scrobbles/cubit/activity/data_new_tracks_cubit.dart'; -import 'package:scrobbles/cubit/activity/data_statistics_global_cubit.dart'; -import 'package:scrobbles/cubit/activity/data_statistics_recent_cubit.dart'; -import 'package:scrobbles/cubit/activity/data_timeline_cubit.dart'; -import 'package:scrobbles/cubit/activity/data_top_artists_cubit.dart'; - -class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget { - const GlobalAppBar({super.key}); - - @override - Widget build(BuildContext context) { - return BlocBuilder<NavCubitScreen, int>( - builder: (BuildContext context, int screenIndex) { - final List<Widget> menuActions = []; - - if (screenIndex == Screen.indexActivity) { - // go to Settings page - menuActions.add(IconButton( - onPressed: () { - BlocProvider.of<NavCubitScreen>(context).goToScreenSettings(); - }, - icon: Screen.screenSettings.icon, - )); - - // go to About page - menuActions.add(IconButton( - onPressed: () { - BlocProvider.of<NavCubitScreen>(context).goToScreenAbout(); - }, - icon: Screen.screenAbout.icon, - )); - - // refresh data - menuActions.add(IconButton( - onPressed: () { - BlocProvider.of<DataCountsByDayCubit>(context).refresh(context); - BlocProvider.of<DataCountsByHourCubit>(context).refresh(context); - BlocProvider.of<DataDiscoveriesCubit>(context).refresh(context); - BlocProvider.of<DataHeatmapCubit>(context).refresh(context); - BlocProvider.of<DataNewArtistsCubit>(context).refresh(context); - BlocProvider.of<DataNewTracksCubit>(context).refresh(context); - BlocProvider.of<DataStatisticsGlobalCubit>(context).refresh(context); - BlocProvider.of<DataStatisticsRecentCubit>(context).refresh(context); - BlocProvider.of<DataTimelineCubit>(context).refresh(context); - BlocProvider.of<DataTopArtistsCubit>(context).refresh(context); - }, - icon: const Icon(UniconsSolid.refresh), - )); - } else { - // back to Home page - menuActions.add(IconButton( - onPressed: () { - BlocProvider.of<NavCubitScreen>(context).goToScreenActivity(); - BlocProvider.of<NavCubitPage>(context).goToPageHome(); - }, - icon: Screen.screenActivity.icon, - )); - } - - return AppBar( - title: const AppHeader(text: 'app_name'), - actions: menuActions, - ); - }, - ); - } - - @override - Size get preferredSize => const Size.fromHeight(50); -} diff --git a/lib/common/ui/screens/about.dart b/lib/common/ui/screens/about.dart deleted file mode 100644 index f7a14a9a7e574a7b6f9ed181f38d08ba8c2285fe..0000000000000000000000000000000000000000 --- a/lib/common/ui/screens/about.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -class ScreenAbout extends StatelessWidget { - const ScreenAbout({super.key}); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: <Widget>[ - const SizedBox(height: 8), - const AppTitle(text: 'about_title'), - const Text('about_content').tr(), - FutureBuilder<PackageInfo>( - future: PackageInfo.fromPlatform(), - builder: (context, snapshot) { - switch (snapshot.connectionState) { - case ConnectionState.done: - return const Text('about_version').tr( - namedArgs: { - 'version': snapshot.data!.version, - }, - ); - default: - return const SizedBox(); - } - }, - ), - ], - ), - ); - } -} diff --git a/lib/common/ui/screens/activity.dart b/lib/common/ui/screens/activity.dart deleted file mode 100644 index 7eeb5faac7eda65d7a38b1abc0f4b0085c8c4e5f..0000000000000000000000000000000000000000 --- a/lib/common/ui/screens/activity.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:flutter_swipe/flutter_swipe.dart'; - -import 'package:scrobbles/common/config/activity_page.dart'; -import 'package:scrobbles/common/config/screen.dart'; -import 'package:scrobbles/common/cubit/nav/nav_cubit_pages.dart'; -import 'package:scrobbles/common/ui/nav/bottom_nav_bar.dart'; - -class ScreenActivity extends StatelessWidget { - const ScreenActivity({super.key}); - - @override - Widget build(BuildContext context) { - return BlocBuilder<NavCubitPage, int>( - builder: (BuildContext context, int pageIndex) { - return Swiper( - itemCount: Screen.items.length, - itemBuilder: (BuildContext context, int pageIndex) { - return ActivityPage.getWidget(pageIndex); - }, - pagination: SwiperPagination( - margin: const EdgeInsets.all(0), - builder: SwiperCustomPagination( - builder: (BuildContext context, SwiperPluginConfig config) { - return BottomNavBar(swipeController: config.controller); - }, - ), - ), - onIndexChanged: (newPageIndex) { - BlocProvider.of<NavCubitPage>(context).updateIndex(newPageIndex); - }, - outer: true, - loop: false, - ); - }, - ); - } -} diff --git a/lib/common/ui/screens/settings.dart b/lib/common/ui/screens/settings.dart deleted file mode 100644 index bd02cded6845db72d9f4ff6659ea5b426d1a5ac0..0000000000000000000000000000000000000000 --- a/lib/common/ui/screens/settings.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:scrobbles/common/ui/settings/settings_form.dart'; - -class ScreenSettings extends StatelessWidget { - const ScreenSettings({super.key}); - - @override - Widget build(BuildContext context) { - return ListView( - padding: const EdgeInsets.symmetric(horizontal: 4), - physics: const BouncingScrollPhysics(), - children: <Widget>[ - const SizedBox(height: 8), - AppTitle(text: tr('settings_title')), - const SettingsForm(), - ], - ); - } -} diff --git a/lib/config/application_config.dart b/lib/config/application_config.dart index f1f6704d1f41c526f3146fc5de51f3ad86a92045..7cfbb9106d2913196a0154b4fc51eeeac73b3907 100644 --- a/lib/config/application_config.dart +++ b/lib/config/application_config.dart @@ -1,9 +1,22 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; +import 'package:scrobbles/ui/settings/settings_form.dart'; -import 'package:scrobbles/common/cubit/nav/nav_cubit_pages.dart'; +import 'package:scrobbles/ui/pages/discoveries.dart'; +import 'package:scrobbles/ui/pages/home.dart'; +import 'package:scrobbles/ui/pages/statistics.dart'; import 'package:scrobbles/cubit/activity/activity_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_counts_by_day_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_counts_by_hour_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_discoveries_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_heatmap_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_new_artists_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_new_tracks_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_statistics_global_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_statistics_recent_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_timeline_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_top_artists_cubit.dart'; class ApplicationConfig { static const String parameterCodeDistributionDaysCount = 'distribution-days-count'; @@ -49,6 +62,11 @@ class ApplicationConfig { ), ]; + // activity pages + static const int activityPageIndexHome = 0; + static const int activityPageIndexDiscoveries = 1; + static const int activityPageIndexStatistics = 2; + static final ApplicationConfigDefinition config = ApplicationConfigDefinition( appTitle: 'Scrobbles', activitySettings: [ @@ -94,11 +112,102 @@ class ApplicationConfig { values: allowedDaysCountValues, ), ], + autoStartActivity: true, startNewActivity: (BuildContext context) { BlocProvider.of<ActivityCubit>(context).startNewActivity(context); - BlocProvider.of<NavCubitPage>(context).goToPageHome(); + BlocProvider.of<NavCubitPage>(context).updateIndex(activityPageIndexHome); }, + quitCurrentActivity: (BuildContext context) {}, deleteCurrentActivity: (BuildContext context) {}, resumeActivity: (BuildContext context) {}, + navigation: ApplicationNavigation( + screenActivity: ScreenItem( + code: 'screen_activity', + icon: Icon(UniconsLine.home), + screen: ({required ApplicationConfigDefinition appConfig}) => + ScreenActivity(appConfig: appConfig), + ), + screenSettings: ScreenItem( + code: 'screen_settings', + icon: Icon(UniconsLine.setting), + screen: ({required ApplicationConfigDefinition appConfig}) => SettingsForm(), + ), + screenAbout: ScreenItem( + code: 'screen_about', + icon: Icon(UniconsLine.info_circle), + screen: ({required ApplicationConfigDefinition appConfig}) => ScreenAbout(), + ), + appBarConfiguration: AppBarConfiguration( + hideQuitActivityButton: true, + topBarButtonsBuilder: (context) => [ + // Go to Settings page + AppBarButton( + onPressed: (BuildContext context) => + BlocProvider.of<NavCubitScreen>(context).goToScreenSettings(), + icon: ApplicationConfig.config.navigation.screenSettings.icon, + ), + + // Back to Home page + AppBarButton( + onPressed: (BuildContext context) => + BlocProvider.of<NavCubitScreen>(context).goToScreenActivity(), + icon: ApplicationConfig.config.navigation.screenActivity.icon, + ), + + // Refresh data + AppBarButton( + onPressed: (BuildContext context) { + BlocProvider.of<DataCountsByDayCubit>(context).refresh(context); + BlocProvider.of<DataCountsByHourCubit>(context).refresh(context); + BlocProvider.of<DataDiscoveriesCubit>(context).refresh(context); + BlocProvider.of<DataHeatmapCubit>(context).refresh(context); + BlocProvider.of<DataNewArtistsCubit>(context).refresh(context); + BlocProvider.of<DataNewTracksCubit>(context).refresh(context); + BlocProvider.of<DataStatisticsGlobalCubit>(context).refresh(context); + BlocProvider.of<DataStatisticsRecentCubit>(context).refresh(context); + BlocProvider.of<DataTimelineCubit>(context).refresh(context); + BlocProvider.of<DataTopArtistsCubit>(context).refresh(context); + }, + icon: const Icon(UniconsSolid.refresh), + ), + ], + ), + displayBottomNavBar: true, + activityPages: { + activityPageIndexHome: ActivityPageItem( + code: 'page_home', + icon: Icon(UniconsLine.home), + builder: ({required ApplicationConfigDefinition appConfig}) { + return BlocBuilder<ActivityCubit, ActivityState>( + builder: (BuildContext context, ActivityState activityState) { + return PageHome(); + }, + ); + }, + ), + activityPageIndexDiscoveries: ActivityPageItem( + code: 'page_discoveries', + icon: Icon(UniconsLine.star), + builder: ({required ApplicationConfigDefinition appConfig}) { + return BlocBuilder<ActivityCubit, ActivityState>( + builder: (BuildContext context, ActivityState activityState) { + return PageDiscoveries(); + }, + ); + }, + ), + activityPageIndexStatistics: ActivityPageItem( + code: 'page_statistics', + icon: Icon(UniconsLine.star), + builder: ({required ApplicationConfigDefinition appConfig}) { + return BlocBuilder<ActivityCubit, ActivityState>( + builder: (BuildContext context, ActivityState activityState) { + return PageStatistics(); + }, + ); + }, + ), + }, + ), ); } diff --git a/lib/main.dart b/lib/main.dart index 06168fd7a9b34b8866fb100f7d343a6b9d0fb639..35984999ed72ecc7a344c472952215503582546d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,9 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/common/cubit/nav/nav_cubit_pages.dart'; -import 'package:scrobbles/common/cubit/nav/nav_cubit_screens.dart'; - import 'package:scrobbles/config/application_config.dart'; import 'package:scrobbles/cubit/activity/activity_cubit.dart'; @@ -55,7 +52,7 @@ class MyApp extends StatelessWidget { providers: [ // default providers BlocProvider<NavCubitPage>( - create: (context) => NavCubitPage(), + create: (context) => NavCubitPage(appConfig: ApplicationConfig.config), ), BlocProvider<NavCubitScreen>( create: (context) => NavCubitScreen(), diff --git a/lib/common/ui/pages/discoveries.dart b/lib/ui/pages/discoveries.dart similarity index 100% rename from lib/common/ui/pages/discoveries.dart rename to lib/ui/pages/discoveries.dart diff --git a/lib/common/ui/pages/home.dart b/lib/ui/pages/home.dart similarity index 100% rename from lib/common/ui/pages/home.dart rename to lib/ui/pages/home.dart diff --git a/lib/common/ui/pages/statistics.dart b/lib/ui/pages/statistics.dart similarity index 100% rename from lib/common/ui/pages/statistics.dart rename to lib/ui/pages/statistics.dart diff --git a/lib/common/ui/settings/settings_form.dart b/lib/ui/settings/settings_form.dart similarity index 91% rename from lib/common/ui/settings/settings_form.dart rename to lib/ui/settings/settings_form.dart index 83acf816003928609c51c688a29168c06c135b88..e1d2639f15877db3d5a7a4d49030dc89a9868c9f 100644 --- a/lib/common/ui/settings/settings_form.dart +++ b/lib/ui/settings/settings_form.dart @@ -1,5 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; +import 'package:scrobbles/cubit/activity/data_counts_by_day_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_counts_by_hour_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_discoveries_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_heatmap_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_new_artists_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_new_tracks_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_statistics_recent_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_timeline_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_top_artists_cubit.dart'; import 'package:scrobbles/config/application_config.dart'; @@ -161,6 +170,7 @@ class _SettingsFormState extends State<SettingsForm> { } }); saveSettings(); + BlocProvider.of<DataStatisticsRecentCubit>(context).refresh(context); }, borderRadius: const BorderRadius.all(Radius.circular(8)), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), @@ -188,6 +198,7 @@ class _SettingsFormState extends State<SettingsForm> { } }); saveSettings(); + BlocProvider.of<DataTimelineCubit>(context).refresh(context); }, borderRadius: const BorderRadius.all(Radius.circular(8)), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), @@ -215,6 +226,7 @@ class _SettingsFormState extends State<SettingsForm> { } }); saveSettings(); + BlocProvider.of<DataTopArtistsCubit>(context).refresh(context); }, borderRadius: const BorderRadius.all(Radius.circular(8)), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), @@ -242,6 +254,7 @@ class _SettingsFormState extends State<SettingsForm> { } }); saveSettings(); + BlocProvider.of<DataDiscoveriesCubit>(context).refresh(context); }, borderRadius: const BorderRadius.all(Radius.circular(8)), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), @@ -270,6 +283,9 @@ class _SettingsFormState extends State<SettingsForm> { } }); saveSettings(); + BlocProvider.of<DataCountsByDayCubit>(context).refresh(context); + BlocProvider.of<DataCountsByHourCubit>(context).refresh(context); + BlocProvider.of<DataHeatmapCubit>(context).refresh(context); }, borderRadius: const BorderRadius.all(Radius.circular(8)), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), @@ -300,6 +316,7 @@ class _SettingsFormState extends State<SettingsForm> { } }); saveSettings(); + BlocProvider.of<DataNewArtistsCubit>(context).refresh(context); }, borderRadius: const BorderRadius.all(Radius.circular(8)), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), @@ -327,6 +344,7 @@ class _SettingsFormState extends State<SettingsForm> { } }); saveSettings(); + BlocProvider.of<DataNewTracksCubit>(context).refresh(context); }, borderRadius: const BorderRadius.all(Radius.circular(8)), constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0), diff --git a/lib/ui/skeleton.dart b/lib/ui/skeleton.dart index 74f49653d2f8a50ab818a102be51d66f2129aff9..2ed7c6d75c7eca742f405842d723a893931c1345 100644 --- a/lib/ui/skeleton.dart +++ b/lib/ui/skeleton.dart @@ -1,11 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/common/config/activity_page.dart'; -import 'package:scrobbles/common/config/screen.dart'; -import 'package:scrobbles/common/cubit/nav/nav_cubit_screens.dart'; -import 'package:scrobbles/common/ui/nav/global_app_bar.dart'; -import 'package:scrobbles/common/ui/nav/bottom_nav_bar.dart'; +import 'package:scrobbles/config/application_config.dart'; +import 'package:scrobbles/cubit/activity/activity_cubit.dart'; +import 'package:scrobbles/models/activity/activity.dart'; class SkeletonScreen extends StatelessWidget { const SkeletonScreen({super.key}); @@ -14,22 +12,47 @@ class SkeletonScreen extends StatelessWidget { Widget build(BuildContext context) { return BlocBuilder<NavCubitScreen, int>( builder: (BuildContext context, int screenIndex) { - return Scaffold( - appBar: const GlobalAppBar(), - extendBodyBehindAppBar: false, - body: Material( - color: Theme.of(context).colorScheme.surface, - child: Padding( - padding: const EdgeInsets.only( - top: 8, - left: 2, - right: 2, - ), - child: Screen.getWidget(screenIndex), - ), - ), - backgroundColor: Theme.of(context).colorScheme.surface, - bottomNavigationBar: ActivityPage.displayBottomNavBar ? const BottomNavBar() : null, + return BlocBuilder<ActivityCubit, ActivityState>( + builder: (BuildContext context, ActivityState activityState) { + return BlocBuilder<NavCubitPage, int>( + builder: (BuildContext context, int pageIndex) { + final Activity currentActivity = activityState.currentActivity; + + // autostart activity + if (ApplicationConfig.config.autoStartActivity && + (!currentActivity.isRunning)) { + ApplicationConfig.config.startNewActivity(context); + } + + return Scaffold( + appBar: GlobalAppBar( + appConfig: ApplicationConfig.config, + pageIndex: pageIndex, + isActivityRunning: currentActivity.isRunning, + ), + extendBodyBehindAppBar: false, + body: Material( + color: Theme.of(context).colorScheme.surface, + child: Padding( + padding: const EdgeInsets.only( + top: 8, + left: 2, + right: 2, + ), + child: ApplicationConfig.config.navigation.getScreenWidget( + appConfig: ApplicationConfig.config, + screenIndex: screenIndex, + ), + ), + ), + backgroundColor: Theme.of(context).colorScheme.surface, + bottomNavigationBar: ApplicationConfig.config.navigation.displayBottomNavBar + ? BottomNavBar(appConfig: ApplicationConfig.config) + : null, + ); + }, + ); + }, ); }, ); diff --git a/pubspec.lock b/pubspec.lock index 91a1880b3b585fe144fe60ea4a1b0c5846eee77f..21a3edd49e1d4f684ae2b6019ad16046bee33244 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -130,11 +130,11 @@ packages: dependency: "direct main" description: path: "." - ref: "0.5.0" - resolved-ref: b8164a50489ba981ea57d9f02e2334f09cb8c6a7 + ref: "0.6.0" + resolved-ref: dfe0f6b7b49f9aa32f085e4a5d3ea320b3611eed url: "https://git.harrault.fr/android/flutter-toolbox.git" source: git - version: "0.5.0" + version: "0.6.0" flutter_lints: dependency: "direct dev" description: @@ -148,14 +148,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_swipe: - dependency: "direct main" - description: - name: flutter_swipe - sha256: dc6541bac3a0545ce15a3fa15913f6250532062960bf6b0ad4562d02f14a8545 - url: "https://pub.dev" - source: hosted - version: "1.0.1" flutter_web_plugins: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 9a265b5b1fc0dec12034468de4302f117a4b6995..abd616587dd94dccaadc4c972c6568f4c31c79a6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: Display scrobbles data and charts publish_to: "none" -version: 0.5.0+69 +version: 0.6.0+70 environment: sdk: "^3.0.0" @@ -16,11 +16,10 @@ dependencies: flutter_custom_toolbox: git: url: https://git.harrault.fr/android/flutter-toolbox.git - ref: 0.5.0 + ref: 0.6.0 # specific fl_chart: ^0.69.0 - flutter_swipe: ^1.0.1 http: ^1.1.0 ionicons: ^0.2.2