diff --git a/fastlane/metadata/android/en-US/changelogs/66.txt b/fastlane/metadata/android/en-US/changelogs/66.txt new file mode 100644 index 0000000000000000000000000000000000000000..ac2c90e221caf3cf01ebba168fb16a8f31c0253a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/66.txt @@ -0,0 +1 @@ +Normalize Activity application architecture. diff --git a/fastlane/metadata/android/fr-FR/changelogs/66.txt b/fastlane/metadata/android/fr-FR/changelogs/66.txt new file mode 100644 index 0000000000000000000000000000000000000000..1d6843d89ba84ea4147528bc3d62d9ecf1a4a762 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/66.txt @@ -0,0 +1 @@ +Harmonisation des applications en Activity. diff --git a/lib/config/activity_page.dart b/lib/common/config/activity_page.dart similarity index 76% rename from lib/config/activity_page.dart rename to lib/common/config/activity_page.dart index b58d29592d6890feae59b01b48e977be20bdd758..79141ebc05312d6e2087f208daaf5bc66954dbe8 100644 --- a/lib/config/activity_page.dart +++ b/lib/common/config/activity_page.dart @@ -1,42 +1,44 @@ import 'package:flutter/material.dart'; import 'package:ionicons/ionicons.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/common/ui/pages/discoveries.dart'; +import 'package:scrobbles/common/ui/pages/home.dart'; +import 'package:scrobbles/common/ui/pages/statistics.dart'; class ActivityPageItem { + final String code; final Icon icon; final Widget page; - final String code; const ActivityPageItem({ + required this.code, required this.icon, required this.page, - required this.code, }); } class ActivityPage { + static const bool displayBottomNavBar = false; + static const indexHome = 0; static const pageHome = ActivityPageItem( + code: 'page_home', icon: Icon(Ionicons.home_outline), page: PageHome(), - code: 'page_home', ); static const indexDiscoveries = 1; static const pageDiscoveries = ActivityPageItem( + code: 'page_discoveries', icon: Icon(Ionicons.star_outline), page: PageDiscoveries(), - code: 'page_discoveries', ); static const indexStatistics = 2; static const pageStatistics = ActivityPageItem( + code: 'page_statistics', icon: Icon(Ionicons.bar_chart_outline), page: PageStatistics(), - code: 'page_statistics', ); static Map<int, ActivityPageItem> items = { @@ -45,17 +47,13 @@ class ActivityPage { indexStatistics: pageStatistics, }; + static int defaultPageIndex = indexHome; + static bool isIndexAllowed(int pageIndex) { return items.keys.contains(pageIndex); } - static ActivityPageItem getPageItem(int pageIndex) { - return items[pageIndex] ?? pageHome; - } - - static Widget getPageWidget(int pageIndex) { + static Widget getWidget(int pageIndex) { return items[pageIndex]?.page ?? pageHome.page; } - - static int itemsCount = ActivityPage.items.length; } diff --git a/lib/config/screen.dart b/lib/common/config/screen.dart similarity index 67% rename from lib/config/screen.dart rename to lib/common/config/screen.dart index da777c0b3b9a371acb1b59986dbce42b72d9c192..f73facee0bc8adf5dae59d23a016b9cc5bb98b50 100644 --- a/lib/config/screen.dart +++ b/lib/common/config/screen.dart @@ -1,42 +1,42 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/ui/screens/about.dart'; -import 'package:scrobbles/ui/screens/activity.dart'; -import 'package:scrobbles/ui/screens/settings.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; - final bool displayBottomNavBar; const ScreenItem({ + required this.code, required this.icon, required this.screen, - required this.displayBottomNavBar, }); } class Screen { static const indexActivity = 0; static const screenActivity = ScreenItem( + code: 'screen_activity', icon: Icon(UniconsLine.home), screen: ScreenActivity(), - displayBottomNavBar: true, ); static const indexSettings = 1; static const screenSettings = ScreenItem( + code: 'screen_settings', icon: Icon(UniconsLine.setting), screen: ScreenSettings(), - displayBottomNavBar: false, ); static const indexAbout = 2; static const screenAbout = ScreenItem( + code: 'screen_about', icon: Icon(UniconsLine.info_circle), screen: ScreenAbout(), - displayBottomNavBar: false, ); static Map<int, ScreenItem> items = { @@ -52,10 +52,4 @@ class Screen { static Widget getWidget(int screenIndex) { return items[screenIndex]?.screen ?? screenActivity.screen; } - - static bool displayBottomNavBar(int screenIndex) { - return items[screenIndex]?.displayBottomNavBar ?? screenActivity.displayBottomNavBar; - } - - static int itemsCount = Screen.items.length; } diff --git a/lib/cubit/nav_cubit_pages.dart b/lib/common/cubit/nav/nav_cubit_pages.dart similarity index 73% rename from lib/cubit/nav_cubit_pages.dart rename to lib/common/cubit/nav/nav_cubit_pages.dart index 10d729d75d43608c790aa608706bfb86e56d09a7..9ad7c65d866afaba35f0bfe6ad0521488d58e90c 100644 --- a/lib/cubit/nav_cubit_pages.dart +++ b/lib/common/cubit/nav/nav_cubit_pages.dart @@ -1,6 +1,6 @@ import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/config/activity_page.dart'; +import 'package:scrobbles/common/config/activity_page.dart'; class NavCubitPage extends HydratedCubit<int> { NavCubitPage() : super(0); @@ -13,8 +13,8 @@ class NavCubitPage extends HydratedCubit<int> { } } - void goToHomePage() { - emit(ActivityPage.indexHome); + void goToPageHome() { + updateIndex(ActivityPage.indexHome); } @override @@ -24,6 +24,6 @@ class NavCubitPage extends HydratedCubit<int> { @override Map<String, dynamic>? toJson(int state) { - return <String, int>{'pageIndex': state}; + return <String, int>{'index': state}; } } diff --git a/lib/cubit/nav_cubit_screens.dart b/lib/common/cubit/nav/nav_cubit_screens.dart similarity index 71% rename from lib/cubit/nav_cubit_screens.dart rename to lib/common/cubit/nav/nav_cubit_screens.dart index 4376701ab49c280e30ae387c2980aa4414792080..77f3b613f72ab3cf724835b96f755abd8d411538 100644 --- a/lib/cubit/nav_cubit_screens.dart +++ b/lib/common/cubit/nav/nav_cubit_screens.dart @@ -1,6 +1,6 @@ import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/config/screen.dart'; +import 'package:scrobbles/common/config/screen.dart'; class NavCubitScreen extends HydratedCubit<int> { NavCubitScreen() : super(0); @@ -9,19 +9,19 @@ class NavCubitScreen extends HydratedCubit<int> { if (Screen.isIndexAllowed(index)) { emit(index); } else { - goToActivityPage(); + goToScreenActivity(); } } - void goToActivityPage() { + void goToScreenActivity() { emit(Screen.indexActivity); } - void goToSettingsPage() { + void goToScreenSettings() { emit(Screen.indexSettings); } - void goToAboutPage() { + void goToScreenAbout() { emit(Screen.indexAbout); } @@ -32,6 +32,6 @@ class NavCubitScreen extends HydratedCubit<int> { @override Map<String, dynamic>? toJson(int state) { - return <String, int>{'screenIndex': state}; + return <String, int>{'index': state}; } } diff --git a/lib/ui/nav/bottom_nav_bar.dart b/lib/common/ui/nav/bottom_nav_bar.dart similarity index 66% rename from lib/ui/nav/bottom_nav_bar.dart rename to lib/common/ui/nav/bottom_nav_bar.dart index f6d47390df3c30316cb974fe7727b1392149dd40..9449caf4ca9dda4cd4386968cde0456d607c82fe 100644 --- a/lib/ui/nav/bottom_nav_bar.dart +++ b/lib/common/ui/nav/bottom_nav_bar.dart @@ -2,13 +2,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_swipe/flutter_swipe.dart'; -import 'package:scrobbles/config/activity_page.dart'; -import 'package:scrobbles/cubit/nav_cubit_pages.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, required this.swipeController}); + const BottomNavBar({ + super.key, + this.swipeController, + }); - final SwiperController swipeController; + final SwiperController? swipeController; @override Widget build(BuildContext context) { @@ -20,23 +23,20 @@ class BottomNavBar extends StatelessWidget { shape: const ContinuousRectangleBorder(), child: BlocBuilder<NavCubitPage, int>( builder: (BuildContext context, int pageIndex) { - final List<ActivityPageItem> pageItems = [ - ActivityPage.pageHome, - ActivityPage.pageDiscoveries, - ActivityPage.pageStatistics, - ]; - final List<BottomNavigationBarItem> items = pageItems.map((ActivityPageItem item) { - return BottomNavigationBarItem( + final List<BottomNavigationBarItem> items = []; + + ActivityPage.items.forEach((int pageIndex, ActivityPageItem item) { + items.add(BottomNavigationBarItem( icon: item.icon, label: tr(item.code), - ); - }).toList(); + )); + }); return BottomNavigationBar( currentIndex: pageIndex, onTap: (int index) { BlocProvider.of<NavCubitPage>(context).updateIndex(index); - swipeController.move(index); + swipeController?.move(index); }, type: BottomNavigationBarType.fixed, elevation: 0, diff --git a/lib/ui/nav/global_app_bar.dart b/lib/common/ui/nav/global_app_bar.dart similarity index 64% rename from lib/ui/nav/global_app_bar.dart rename to lib/common/ui/nav/global_app_bar.dart index 542643f38953271db04ac004db203d2859cd85b1..9fc602b870f9a12d2fb2fc29eb2e707e9ce510c3 100644 --- a/lib/ui/nav/global_app_bar.dart +++ b/lib/common/ui/nav/global_app_bar.dart @@ -1,19 +1,20 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_counts_by_day_cubit.dart'; -import 'package:scrobbles/cubit/data_counts_by_hour_cubit.dart'; -import 'package:scrobbles/cubit/data_discoveries_cubit.dart'; -import 'package:scrobbles/cubit/data_heatmap_cubit.dart'; -import 'package:scrobbles/cubit/data_new_artists_cubit.dart'; -import 'package:scrobbles/cubit/data_new_tracks_cubit.dart'; -import 'package:scrobbles/cubit/data_statistics_global_cubit.dart'; -import 'package:scrobbles/cubit/data_statistics_recent_cubit.dart'; -import 'package:scrobbles/cubit/data_timeline_cubit.dart'; -import 'package:scrobbles/cubit/data_top_artists_cubit.dart'; -import 'package:scrobbles/cubit/nav_cubit_pages.dart'; -import 'package:scrobbles/config/screen.dart'; -import 'package:scrobbles/cubit/nav_cubit_screens.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}); @@ -28,7 +29,7 @@ class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget { // go to Settings page menuActions.add(IconButton( onPressed: () { - BlocProvider.of<NavCubitScreen>(context).goToSettingsPage(); + BlocProvider.of<NavCubitScreen>(context).goToScreenSettings(); }, icon: Screen.screenSettings.icon, )); @@ -36,7 +37,7 @@ class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget { // go to About page menuActions.add(IconButton( onPressed: () { - BlocProvider.of<NavCubitScreen>(context).goToAboutPage(); + BlocProvider.of<NavCubitScreen>(context).goToScreenAbout(); }, icon: Screen.screenAbout.icon, )); @@ -61,8 +62,8 @@ class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget { // back to Home page menuActions.add(IconButton( onPressed: () { - BlocProvider.of<NavCubitScreen>(context).goToActivityPage(); - BlocProvider.of<NavCubitPage>(context).goToHomePage(); + BlocProvider.of<NavCubitScreen>(context).goToScreenActivity(); + BlocProvider.of<NavCubitPage>(context).goToPageHome(); }, icon: Screen.screenActivity.icon, )); diff --git a/lib/ui/pages/discoveries.dart b/lib/common/ui/pages/discoveries.dart similarity index 84% rename from lib/ui/pages/discoveries.dart rename to lib/common/ui/pages/discoveries.dart index 1df3ff94af915292e9b44ff4c9da94c7b5adb4d8..a4cc4c71aa6e63c4b6c222533b9199ba030f6708 100644 --- a/lib/ui/pages/discoveries.dart +++ b/lib/common/ui/pages/discoveries.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_discoveries_cubit.dart'; -import 'package:scrobbles/cubit/data_new_artists_cubit.dart'; -import 'package:scrobbles/cubit/data_new_tracks_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_discoveries_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/ui/widgets/cards/discoveries.dart'; import 'package:scrobbles/ui/widgets/cards/new_artists.dart'; import 'package:scrobbles/ui/widgets/cards/new_tracks.dart'; diff --git a/lib/ui/pages/home.dart b/lib/common/ui/pages/home.dart similarity index 82% rename from lib/ui/pages/home.dart rename to lib/common/ui/pages/home.dart index c28f4a0346cf3505c9edbdf80a75aa9aa64fe36b..dce7eeb9b9e7136a638667b01d681befa0bf4390 100644 --- a/lib/ui/pages/home.dart +++ b/lib/common/ui/pages/home.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_statistics_global_cubit.dart'; -import 'package:scrobbles/cubit/data_statistics_recent_cubit.dart'; -import 'package:scrobbles/cubit/data_timeline_cubit.dart'; -import 'package:scrobbles/cubit/data_top_artists_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'; import 'package:scrobbles/ui/widgets/cards/statistics_global.dart'; import 'package:scrobbles/ui/widgets/cards/statistics_recent.dart'; import 'package:scrobbles/ui/widgets/cards/timeline.dart'; diff --git a/lib/ui/pages/statistics.dart b/lib/common/ui/pages/statistics.dart similarity index 83% rename from lib/ui/pages/statistics.dart rename to lib/common/ui/pages/statistics.dart index f96aba468101c1b967353e2d5823028e639aaa3e..9c07d8fa9d90dd9ad01e924cce9a4c2fe0d4093f 100644 --- a/lib/ui/pages/statistics.dart +++ b/lib/common/ui/pages/statistics.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_counts_by_day_cubit.dart'; -import 'package:scrobbles/cubit/data_counts_by_hour_cubit.dart'; -import 'package:scrobbles/cubit/data_heatmap_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_heatmap_cubit.dart'; import 'package:scrobbles/ui/widgets/cards/counts_by_day.dart'; import 'package:scrobbles/ui/widgets/cards/counts_by_hour.dart'; import 'package:scrobbles/ui/widgets/cards/heatmap.dart'; diff --git a/lib/ui/screens/about.dart b/lib/common/ui/screens/about.dart similarity index 96% rename from lib/ui/screens/about.dart rename to lib/common/ui/screens/about.dart index 85c38c32d997fc8be43bca5514a2dbd5831bf7d7..f7a14a9a7e574a7b6f9ed181f38d08ba8c2285fe 100644 --- a/lib/ui/screens/about.dart +++ b/lib/common/ui/screens/about.dart @@ -14,7 +14,7 @@ class ScreenAbout extends StatelessWidget { mainAxisSize: MainAxisSize.max, children: <Widget>[ const SizedBox(height: 8), - AppTitle(text: tr('about_title')), + const AppTitle(text: 'about_title'), const Text('about_content').tr(), FutureBuilder<PackageInfo>( future: PackageInfo.fromPlatform(), diff --git a/lib/ui/screens/activity.dart b/lib/common/ui/screens/activity.dart similarity index 75% rename from lib/ui/screens/activity.dart rename to lib/common/ui/screens/activity.dart index c8db336bcfcd67330b657bb825c31e9c48ffa058..7eeb5faac7eda65d7a38b1abc0f4b0085c8c4e5f 100644 --- a/lib/ui/screens/activity.dart +++ b/lib/common/ui/screens/activity.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_swipe/flutter_swipe.dart'; -import 'package:scrobbles/config/activity_page.dart'; -import 'package:scrobbles/config/screen.dart'; -import 'package:scrobbles/cubit/nav_cubit_pages.dart'; -import 'package:scrobbles/ui/nav/bottom_nav_bar.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}); @@ -15,9 +15,9 @@ class ScreenActivity extends StatelessWidget { return BlocBuilder<NavCubitPage, int>( builder: (BuildContext context, int pageIndex) { return Swiper( - itemCount: Screen.itemsCount, + itemCount: Screen.items.length, itemBuilder: (BuildContext context, int pageIndex) { - return ActivityPage.getPageWidget(pageIndex); + return ActivityPage.getWidget(pageIndex); }, pagination: SwiperPagination( margin: const EdgeInsets.all(0), diff --git a/lib/ui/screens/settings.dart b/lib/common/ui/screens/settings.dart similarity index 88% rename from lib/ui/screens/settings.dart rename to lib/common/ui/screens/settings.dart index 678e2901cfbdd06df0bb0ecd088b98f0198d1776..bd02cded6845db72d9f4ff6659ea5b426d1a5ac0 100644 --- a/lib/ui/screens/settings.dart +++ b/lib/common/ui/screens/settings.dart @@ -1,7 +1,7 @@ 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/ui/settings/settings_form.dart'; class ScreenSettings extends StatelessWidget { const ScreenSettings({super.key}); diff --git a/lib/ui/settings/settings_form.dart b/lib/common/ui/settings/settings_form.dart similarity index 99% rename from lib/ui/settings/settings_form.dart rename to lib/common/ui/settings/settings_form.dart index 97372a095871a07f26baa2b570c337e5b60152fc..40dca8d17c389784e7456499bd781897544e6501 100644 --- a/lib/ui/settings/settings_form.dart +++ b/lib/common/ui/settings/settings_form.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:scrobbles/config/default_global_settings.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; class SettingsForm extends StatefulWidget { const SettingsForm({super.key}); diff --git a/lib/config/application_config.dart b/lib/config/application_config.dart new file mode 100644 index 0000000000000000000000000000000000000000..68335d6afcdc1d5a84936100ea1acae81c05619d --- /dev/null +++ b/lib/config/application_config.dart @@ -0,0 +1,3 @@ +class ApplicationConfig { + static const String appTitle = 'Scrobbles'; +} diff --git a/lib/config/default_activity_settings.dart b/lib/config/default_activity_settings.dart new file mode 100644 index 0000000000000000000000000000000000000000..1f33c908216cca222d576d89d07ce05de4a661ec --- /dev/null +++ b/lib/config/default_activity_settings.dart @@ -0,0 +1,28 @@ +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +class DefaultActivitySettings { + // available game parameters codes + static const String parameterCodeDashboardType = 'dashboardType'; + static const List<String> availableParameters = [ + parameterCodeDashboardType, + ]; + + // dashboard type: available values + static const String dashboardTypeDefault = 'default'; + static const List<String> allowedDashboardTypeValues = [ + dashboardTypeDefault, + ]; + // dashboard type: default value + static const String defaultDashboardTypeValue = dashboardTypeDefault; + + // available values from parameter code + static List<String> getAvailableValues(String parameterCode) { + switch (parameterCode) { + case parameterCodeDashboardType: + return DefaultActivitySettings.allowedDashboardTypeValues; + } + + printlog('Did not find any available value for game parameter "$parameterCode".'); + return []; + } +} diff --git a/lib/config/default_global_settings.dart b/lib/config/default_global_settings.dart index 0565d15a1afbf20693e921b52dab4327e96c70ca..f64cb1ff1c153c5f6e4bd6b7607bc60943cd982f 100644 --- a/lib/config/default_global_settings.dart +++ b/lib/config/default_global_settings.dart @@ -1,4 +1,32 @@ +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + class DefaultGlobalSettings { + // available global parameters codes + static const String parameterCodeSkin = 'skin'; + static const List<String> availableParameters = [ + parameterCodeSkin, + ]; + + // skin: available values + static const String skinValueDefault = 'default'; + static const List<String> allowedSkinValues = [ + skinValueDefault, + ]; + // skin: default value + static const String defaultSkinValue = skinValueDefault; + + // available values from parameter code + static List<String> getAvailableValues(String parameterCode) { + switch (parameterCode) { + case parameterCodeSkin: + return DefaultGlobalSettings.allowedSkinValues; + } + + printlog('Did not find any available value for global parameter "$parameterCode".'); + return []; + } + + @Deprecated("Should be removed / normalized") static const List<int> allowedDaysCountValues = [ 7, 14, @@ -7,17 +35,26 @@ class DefaultGlobalSettings { 60, 90, ]; + + @Deprecated("Should be removed / normalized") static const List<int> allowedCountValues = [ 5, 10, 20, ]; + @Deprecated("Should be removed / normalized") static const int defaultDiscoveriesDaysCount = 14; + @Deprecated("Should be removed / normalized") static const int defaultDistributionDaysCount = 21; + @Deprecated("Should be removed / normalized") static const int defaultStatisticsRecentDaysCount = 21; + @Deprecated("Should be removed / normalized") static const int defaultTimelineDaysCount = 14; + @Deprecated("Should be removed / normalized") static const int defaultTopArtistsDaysCount = 14; + @Deprecated("Should be removed / normalized") static const int defaultNewArtistsCount = 5; + @Deprecated("Should be removed / normalized") static const int defaultNewTracksCount = 5; } diff --git a/lib/cubit/activity/activity_cubit.dart b/lib/cubit/activity/activity_cubit.dart new file mode 100644 index 0000000000000000000000000000000000000000..7a0b36cf548a0e254052443c9f749f95e07d1894 --- /dev/null +++ b/lib/cubit/activity/activity_cubit.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +import 'package:scrobbles/models/activity/activity.dart'; +import 'package:scrobbles/models/settings/settings_activity.dart'; +import 'package:scrobbles/models/settings/settings_global.dart'; + +part 'activity_state.dart'; + +class ActivityCubit extends HydratedCubit<ActivityState> { + ActivityCubit() + : super(ActivityState( + currentActivity: Activity.createNull(), + )); + + void updateState(Activity activity) { + emit(ActivityState( + currentActivity: activity, + )); + } + + void refresh() { + final Activity activity = Activity( + // Settings + activitySettings: state.currentActivity.activitySettings, + globalSettings: state.currentActivity.globalSettings, + // State + isRunning: state.currentActivity.isRunning, + ); + + updateState(activity); + } + + void startNewActivity({ + required ActivitySettings activitySettings, + required GlobalSettings globalSettings, + }) { + final Activity newActivity = Activity.createNew( + // Settings + activitySettings: activitySettings, + globalSettings: globalSettings, + ); + + newActivity.dump(); + + updateState(newActivity); + refresh(); + } + + @override + ActivityState? fromJson(Map<String, dynamic> json) { + final Activity currentActivity = json['currentActivity'] as Activity; + + return ActivityState( + currentActivity: currentActivity, + ); + } + + @override + Map<String, dynamic>? toJson(ActivityState state) { + return <String, dynamic>{ + 'currentActivity': state.currentActivity.toJson(), + }; + } +} diff --git a/lib/cubit/activity/activity_state.dart b/lib/cubit/activity/activity_state.dart new file mode 100644 index 0000000000000000000000000000000000000000..887b45e4255fd7de1cc7744569d82a38a66602f2 --- /dev/null +++ b/lib/cubit/activity/activity_state.dart @@ -0,0 +1,15 @@ +part of 'activity_cubit.dart'; + +@immutable +class ActivityState extends Equatable { + const ActivityState({ + required this.currentActivity, + }); + + final Activity currentActivity; + + @override + List<dynamic> get props => <dynamic>[ + currentActivity, + ]; +} diff --git a/lib/cubit/data_counts_by_day_cubit.dart b/lib/cubit/activity/data_counts_by_day_cubit.dart similarity index 96% rename from lib/cubit/data_counts_by_day_cubit.dart rename to lib/cubit/activity/data_counts_by_day_cubit.dart index a676e4bc3ab1a6acd1815f977586f1f268e502ed..59c7482fa99de7b9ed59ef7cee49c5bb3b81fff1 100644 --- a/lib/cubit/data_counts_by_day_cubit.dart +++ b/lib/cubit/activity/data_counts_by_day_cubit.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/counts_by_day.dart'; import 'package:scrobbles/network/scrobbles.dart'; diff --git a/lib/cubit/data_counts_by_day_state.dart b/lib/cubit/activity/data_counts_by_day_state.dart similarity index 100% rename from lib/cubit/data_counts_by_day_state.dart rename to lib/cubit/activity/data_counts_by_day_state.dart diff --git a/lib/cubit/data_counts_by_hour_cubit.dart b/lib/cubit/activity/data_counts_by_hour_cubit.dart similarity index 96% rename from lib/cubit/data_counts_by_hour_cubit.dart rename to lib/cubit/activity/data_counts_by_hour_cubit.dart index 7d817829580c0d1e1887dbebb649b5ff10c9e756..6d07f45dbb43937e29c451164d4a990216c7a23f 100644 --- a/lib/cubit/data_counts_by_hour_cubit.dart +++ b/lib/cubit/activity/data_counts_by_hour_cubit.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/counts_by_hour.dart'; import 'package:scrobbles/network/scrobbles.dart'; diff --git a/lib/cubit/data_counts_by_hour_state.dart b/lib/cubit/activity/data_counts_by_hour_state.dart similarity index 100% rename from lib/cubit/data_counts_by_hour_state.dart rename to lib/cubit/activity/data_counts_by_hour_state.dart diff --git a/lib/cubit/data_discoveries_cubit.dart b/lib/cubit/activity/data_discoveries_cubit.dart similarity index 96% rename from lib/cubit/data_discoveries_cubit.dart rename to lib/cubit/activity/data_discoveries_cubit.dart index 561f32d9efff848f83fb0e7ed9e4aadb8bca0ca3..4ea5c57b84f881b8dc86c0dd3929cad99b7f0549 100644 --- a/lib/cubit/data_discoveries_cubit.dart +++ b/lib/cubit/activity/data_discoveries_cubit.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/discoveries.dart'; import 'package:scrobbles/network/scrobbles.dart'; diff --git a/lib/cubit/data_discoveries_state.dart b/lib/cubit/activity/data_discoveries_state.dart similarity index 100% rename from lib/cubit/data_discoveries_state.dart rename to lib/cubit/activity/data_discoveries_state.dart diff --git a/lib/cubit/data_heatmap_cubit.dart b/lib/cubit/activity/data_heatmap_cubit.dart similarity index 96% rename from lib/cubit/data_heatmap_cubit.dart rename to lib/cubit/activity/data_heatmap_cubit.dart index 3fe1d99c82a3be45db9140e0ce04a5eedcff31c9..3d386c324f81b63b521f50382e1f1ab90db6026a 100644 --- a/lib/cubit/data_heatmap_cubit.dart +++ b/lib/cubit/activity/data_heatmap_cubit.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/heatmap.dart'; import 'package:scrobbles/network/scrobbles.dart'; diff --git a/lib/cubit/data_heatmap_state.dart b/lib/cubit/activity/data_heatmap_state.dart similarity index 100% rename from lib/cubit/data_heatmap_state.dart rename to lib/cubit/activity/data_heatmap_state.dart diff --git a/lib/cubit/data_new_artists_cubit.dart b/lib/cubit/activity/data_new_artists_cubit.dart similarity index 96% rename from lib/cubit/data_new_artists_cubit.dart rename to lib/cubit/activity/data_new_artists_cubit.dart index c01f2f7b12d1f774830e598fd50f444d7fb7237b..c5ae1c94c8ef575d0eb7f549488fa199ba27bd4f 100644 --- a/lib/cubit/data_new_artists_cubit.dart +++ b/lib/cubit/activity/data_new_artists_cubit.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/new_artists.dart'; import 'package:scrobbles/network/scrobbles.dart'; diff --git a/lib/cubit/data_new_artists_state.dart b/lib/cubit/activity/data_new_artists_state.dart similarity index 100% rename from lib/cubit/data_new_artists_state.dart rename to lib/cubit/activity/data_new_artists_state.dart diff --git a/lib/cubit/data_new_tracks_cubit.dart b/lib/cubit/activity/data_new_tracks_cubit.dart similarity index 96% rename from lib/cubit/data_new_tracks_cubit.dart rename to lib/cubit/activity/data_new_tracks_cubit.dart index f786af4641c2efc8ade9f3ab58b61891b50c804b..849ae75b769df053d1f381c9e86815a47db18970 100644 --- a/lib/cubit/data_new_tracks_cubit.dart +++ b/lib/cubit/activity/data_new_tracks_cubit.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/new_tracks.dart'; import 'package:scrobbles/network/scrobbles.dart'; diff --git a/lib/cubit/data_new_tracks_state.dart b/lib/cubit/activity/data_new_tracks_state.dart similarity index 100% rename from lib/cubit/data_new_tracks_state.dart rename to lib/cubit/activity/data_new_tracks_state.dart diff --git a/lib/cubit/data_statistics_global_cubit.dart b/lib/cubit/activity/data_statistics_global_cubit.dart similarity index 100% rename from lib/cubit/data_statistics_global_cubit.dart rename to lib/cubit/activity/data_statistics_global_cubit.dart diff --git a/lib/cubit/data_statistics_global_state.dart b/lib/cubit/activity/data_statistics_global_state.dart similarity index 100% rename from lib/cubit/data_statistics_global_state.dart rename to lib/cubit/activity/data_statistics_global_state.dart diff --git a/lib/cubit/data_statistics_recent_cubit.dart b/lib/cubit/activity/data_statistics_recent_cubit.dart similarity index 96% rename from lib/cubit/data_statistics_recent_cubit.dart rename to lib/cubit/activity/data_statistics_recent_cubit.dart index 86a5def9774d26123670886e22ba13c55a20c918..0b19c0a2c5cd210944b61e2e5a1fcd292e74e5bb 100644 --- a/lib/cubit/data_statistics_recent_cubit.dart +++ b/lib/cubit/activity/data_statistics_recent_cubit.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/statistics_recent.dart'; import 'package:scrobbles/network/scrobbles.dart'; diff --git a/lib/cubit/data_statistics_recent_state.dart b/lib/cubit/activity/data_statistics_recent_state.dart similarity index 100% rename from lib/cubit/data_statistics_recent_state.dart rename to lib/cubit/activity/data_statistics_recent_state.dart diff --git a/lib/cubit/data_timeline_cubit.dart b/lib/cubit/activity/data_timeline_cubit.dart similarity index 96% rename from lib/cubit/data_timeline_cubit.dart rename to lib/cubit/activity/data_timeline_cubit.dart index 45a1bbb0c80997ad0336d8747173b451d31e97d7..724240140ba31ae466b542805dc7972d2ccf3ea4 100644 --- a/lib/cubit/data_timeline_cubit.dart +++ b/lib/cubit/activity/data_timeline_cubit.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/timeline.dart'; import 'package:scrobbles/network/scrobbles.dart'; diff --git a/lib/cubit/data_timeline_state.dart b/lib/cubit/activity/data_timeline_state.dart similarity index 100% rename from lib/cubit/data_timeline_state.dart rename to lib/cubit/activity/data_timeline_state.dart diff --git a/lib/cubit/data_top_artists_cubit.dart b/lib/cubit/activity/data_top_artists_cubit.dart similarity index 96% rename from lib/cubit/data_top_artists_cubit.dart rename to lib/cubit/activity/data_top_artists_cubit.dart index b67fade4a6d9a5570be30850982dde7ba3a9e3ed..4692b8c1145796796853694ee55ce094c51df94c 100644 --- a/lib/cubit/data_top_artists_cubit.dart +++ b/lib/cubit/activity/data_top_artists_cubit.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/topartists.dart'; import 'package:scrobbles/network/scrobbles.dart'; diff --git a/lib/cubit/data_top_artists_state.dart b/lib/cubit/activity/data_top_artists_state.dart similarity index 100% rename from lib/cubit/data_top_artists_state.dart rename to lib/cubit/activity/data_top_artists_state.dart diff --git a/lib/cubit/settings/settings_activity_cubit.dart b/lib/cubit/settings/settings_activity_cubit.dart new file mode 100644 index 0000000000000000000000000000000000000000..e5364926e7e64ebedcafb91f33256ff65392d020 --- /dev/null +++ b/lib/cubit/settings/settings_activity_cubit.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +import 'package:scrobbles/config/default_activity_settings.dart'; +import 'package:scrobbles/models/settings/settings_activity.dart'; + +part 'settings_activity_state.dart'; + +class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> { + ActivitySettingsCubit() + : super(ActivitySettingsState(settings: ActivitySettings.createDefault())); + + void setValues({ + String? dashboardType, + }) { + emit( + ActivitySettingsState( + settings: ActivitySettings( + dashboardType: dashboardType ?? state.settings.dashboardType, + ), + ), + ); + } + + String getParameterValue(String code) { + switch (code) { + case DefaultActivitySettings.parameterCodeDashboardType: + return ActivitySettings.getDashboardTypeValueFromUnsafe(state.settings.dashboardType); + } + + return ''; + } + + void setParameterValue(String code, String value) { + final String dashboardType = code == DefaultActivitySettings.parameterCodeDashboardType + ? value + : getParameterValue(DefaultActivitySettings.parameterCodeDashboardType); + + setValues( + dashboardType: dashboardType, + ); + } + + @override + ActivitySettingsState? fromJson(Map<String, dynamic> json) { + final String dashboardType = + json[DefaultActivitySettings.parameterCodeDashboardType] as String; + + return ActivitySettingsState( + settings: ActivitySettings( + dashboardType: dashboardType, + ), + ); + } + + @override + Map<String, dynamic>? toJson(ActivitySettingsState state) { + return <String, dynamic>{ + DefaultActivitySettings.parameterCodeDashboardType: state.settings.dashboardType, + }; + } +} diff --git a/lib/cubit/settings/settings_activity_state.dart b/lib/cubit/settings/settings_activity_state.dart new file mode 100644 index 0000000000000000000000000000000000000000..2b2de42011634e81ae9e6f8bcaa1577f239c778b --- /dev/null +++ b/lib/cubit/settings/settings_activity_state.dart @@ -0,0 +1,15 @@ +part of 'settings_activity_cubit.dart'; + +@immutable +class ActivitySettingsState extends Equatable { + const ActivitySettingsState({ + required this.settings, + }); + + final ActivitySettings settings; + + @override + List<dynamic> get props => <dynamic>[ + settings, + ]; +} diff --git a/lib/cubit/settings_global_cubit.dart b/lib/cubit/settings/settings_global_cubit.dart similarity index 100% rename from lib/cubit/settings_global_cubit.dart rename to lib/cubit/settings/settings_global_cubit.dart diff --git a/lib/cubit/settings_global_state.dart b/lib/cubit/settings/settings_global_state.dart similarity index 100% rename from lib/cubit/settings_global_state.dart rename to lib/cubit/settings/settings_global_state.dart diff --git a/lib/main.dart b/lib/main.dart index 3dbb8d6dde3d31a12430ba9aa7d2764fb97fd369..02ce7f1b14dbd7d377cc20a0138093204ff0893c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,19 +4,23 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/nav_cubit_pages.dart'; -import 'package:scrobbles/cubit/nav_cubit_screens.dart'; -import 'package:scrobbles/cubit/data_counts_by_day_cubit.dart'; -import 'package:scrobbles/cubit/data_counts_by_hour_cubit.dart'; -import 'package:scrobbles/cubit/data_discoveries_cubit.dart'; -import 'package:scrobbles/cubit/data_heatmap_cubit.dart'; -import 'package:scrobbles/cubit/data_new_artists_cubit.dart'; -import 'package:scrobbles/cubit/data_new_tracks_cubit.dart'; -import 'package:scrobbles/cubit/data_statistics_global_cubit.dart'; -import 'package:scrobbles/cubit/data_statistics_recent_cubit.dart'; -import 'package:scrobbles/cubit/data_timeline_cubit.dart'; -import 'package:scrobbles/cubit/data_top_artists_cubit.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.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'; +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'; +import 'package:scrobbles/cubit/settings/settings_activity_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/ui/skeleton.dart'; void main() async { @@ -49,28 +53,62 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MultiBlocProvider( providers: [ - BlocProvider<NavCubitPage>(create: (context) => NavCubitPage()), - BlocProvider<NavCubitScreen>(create: (context) => NavCubitScreen()), + // default providers + BlocProvider<NavCubitPage>( + create: (context) => NavCubitPage(), + ), + BlocProvider<NavCubitScreen>( + create: (context) => NavCubitScreen(), + ), BlocProvider<ApplicationThemeModeCubit>( - create: (context) => ApplicationThemeModeCubit()), - BlocProvider<GlobalSettingsCubit>(create: (context) => GlobalSettingsCubit()), - BlocProvider<DataCountsByDayCubit>(create: (context) => DataCountsByDayCubit()), - BlocProvider<DataCountsByHourCubit>(create: (context) => DataCountsByHourCubit()), - BlocProvider<DataDiscoveriesCubit>(create: (context) => DataDiscoveriesCubit()), - BlocProvider<DataHeatmapCubit>(create: (context) => DataHeatmapCubit()), - BlocProvider<DataNewArtistsCubit>(create: (context) => DataNewArtistsCubit()), - BlocProvider<DataNewTracksCubit>(create: (context) => DataNewTracksCubit()), + create: (context) => ApplicationThemeModeCubit(), + ), + BlocProvider<ActivityCubit>( + create: (context) => ActivityCubit(), + ), + BlocProvider<GlobalSettingsCubit>( + create: (context) => GlobalSettingsCubit(), + ), + BlocProvider<ActivitySettingsCubit>( + create: (context) => ActivitySettingsCubit(), + ), + + // custom providers + BlocProvider<DataCountsByDayCubit>( + create: (context) => DataCountsByDayCubit(), + ), + BlocProvider<DataCountsByHourCubit>( + create: (context) => DataCountsByHourCubit(), + ), + BlocProvider<DataDiscoveriesCubit>( + create: (context) => DataDiscoveriesCubit(), + ), + BlocProvider<DataHeatmapCubit>( + create: (context) => DataHeatmapCubit(), + ), + BlocProvider<DataNewArtistsCubit>( + create: (context) => DataNewArtistsCubit(), + ), + BlocProvider<DataNewTracksCubit>( + create: (context) => DataNewTracksCubit(), + ), BlocProvider<DataStatisticsGlobalCubit>( - create: (context) => DataStatisticsGlobalCubit()), + create: (context) => DataStatisticsGlobalCubit(), + ), BlocProvider<DataStatisticsRecentCubit>( - create: (context) => DataStatisticsRecentCubit()), - BlocProvider<DataTimelineCubit>(create: (context) => DataTimelineCubit()), - BlocProvider<DataTopArtistsCubit>(create: (context) => DataTopArtistsCubit()), + create: (context) => DataStatisticsRecentCubit(), + ), + BlocProvider<DataTimelineCubit>( + create: (context) => DataTimelineCubit(), + ), + BlocProvider<DataTopArtistsCubit>( + create: (context) => DataTopArtistsCubit(), + ), ], child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>( builder: (BuildContext context, ApplicationThemeModeState state) { return MaterialApp( - title: 'Scrobbles', + title: ApplicationConfig.appTitle, home: const SkeletonScreen(), // Theme stuff diff --git a/lib/models/activity/activity.dart b/lib/models/activity/activity.dart new file mode 100644 index 0000000000000000000000000000000000000000..973cd0343e4160aa421ce8723efbded94c4e60c0 --- /dev/null +++ b/lib/models/activity/activity.dart @@ -0,0 +1,77 @@ +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +import 'package:scrobbles/models/settings/settings_activity.dart'; +import 'package:scrobbles/models/settings/settings_global.dart'; + +class Activity { + Activity({ + // Settings + required this.activitySettings, + required this.globalSettings, + + // State + this.isRunning = false, + }); + + // Settings + final ActivitySettings activitySettings; + final GlobalSettings globalSettings; + + // State + bool isRunning; + + factory Activity.createNull() { + return Activity( + // Settings + activitySettings: ActivitySettings.createDefault(), + globalSettings: GlobalSettings.createDefault(), + ); + } + + factory Activity.createNew({ + ActivitySettings? activitySettings, + GlobalSettings? globalSettings, + }) { + final ActivitySettings newActivitySettings = + activitySettings ?? ActivitySettings.createDefault(); + final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault(); + + return Activity( + // Settings + activitySettings: newActivitySettings, + globalSettings: newGlobalSettings, + // State + isRunning: true, + ); + } + + bool get canBeResumed => true; + + void dump() { + printlog(''); + printlog('## Current game dump:'); + printlog(''); + printlog('$Activity:'); + printlog(' Settings'); + activitySettings.dump(); + globalSettings.dump(); + printlog(' State'); + printlog(' isRunning: $isRunning'); + printlog(''); + } + + @override + String toString() { + return '$Activity(${toJson()})'; + } + + Map<String, dynamic>? toJson() { + return <String, dynamic>{ + // Settings + 'activitySettings': activitySettings.toJson(), + 'globalSettings': globalSettings.toJson(), + // State + 'isRunning': isRunning, + }; + } +} diff --git a/lib/models/settings/settings_activity.dart b/lib/models/settings/settings_activity.dart new file mode 100644 index 0000000000000000000000000000000000000000..c270607eecb196a8d32b5ee71cc6bc020107323f --- /dev/null +++ b/lib/models/settings/settings_activity.dart @@ -0,0 +1,42 @@ +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +import 'package:scrobbles/config/default_activity_settings.dart'; + +class ActivitySettings { + final String dashboardType; + + ActivitySettings({ + required this.dashboardType, + }); + + factory ActivitySettings.createDefault() { + return ActivitySettings( + dashboardType: DefaultActivitySettings.defaultDashboardTypeValue, + ); + } + + static String getDashboardTypeValueFromUnsafe(String dashboardType) { + if (DefaultActivitySettings.allowedDashboardTypeValues.contains(dashboardType)) { + return dashboardType; + } + + return DefaultActivitySettings.defaultDashboardTypeValue; + } + + void dump() { + printlog('$ActivitySettings:'); + printlog(' ${DefaultActivitySettings.parameterCodeDashboardType}: $dashboardType'); + printlog(''); + } + + @override + String toString() { + return '$ActivitySettings(${toJson()})'; + } + + Map<String, dynamic>? toJson() { + return <String, dynamic>{ + DefaultActivitySettings.parameterCodeDashboardType: dashboardType, + }; + } +} diff --git a/lib/models/settings/settings_global.dart b/lib/models/settings/settings_global.dart new file mode 100644 index 0000000000000000000000000000000000000000..666f87e2ef64e655da1bc7fc94b7b29a70b93ecc --- /dev/null +++ b/lib/models/settings/settings_global.dart @@ -0,0 +1,42 @@ +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +import 'package:scrobbles/config/default_global_settings.dart'; + +class GlobalSettings { + String skin; + + GlobalSettings({ + required this.skin, + }); + + static String getSkinValueFromUnsafe(String skin) { + if (DefaultGlobalSettings.allowedSkinValues.contains(skin)) { + return skin; + } + + return DefaultGlobalSettings.defaultSkinValue; + } + + factory GlobalSettings.createDefault() { + return GlobalSettings( + skin: DefaultGlobalSettings.defaultSkinValue, + ); + } + + void dump() { + printlog('$GlobalSettings:'); + printlog(' ${DefaultGlobalSettings.parameterCodeSkin}: $skin'); + printlog(''); + } + + @override + String toString() { + return '$GlobalSettings(${toJson()})'; + } + + Map<String, dynamic>? toJson() { + return <String, dynamic>{ + DefaultGlobalSettings.parameterCodeSkin: skin, + }; + } +} diff --git a/lib/ui/skeleton.dart b/lib/ui/skeleton.dart index 3bb0c805400db0c2745159d523977bd55ccdfd05..74f49653d2f8a50ab818a102be51d66f2129aff9 100644 --- a/lib/ui/skeleton.dart +++ b/lib/ui/skeleton.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/config/screen.dart'; -import 'package:scrobbles/cubit/nav_cubit_screens.dart'; -import 'package:scrobbles/ui/nav/global_app_bar.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'; class SkeletonScreen extends StatelessWidget { const SkeletonScreen({super.key}); @@ -27,6 +29,7 @@ class SkeletonScreen extends StatelessWidget { ), ), backgroundColor: Theme.of(context).colorScheme.surface, + bottomNavigationBar: ActivityPage.displayBottomNavBar ? const BottomNavBar() : null, ); }, ); diff --git a/lib/ui/widgets/cards/counts_by_day.dart b/lib/ui/widgets/cards/counts_by_day.dart index 259fd29804c8316d577c1b511f0f83c24b01a8e6..672a873e77099b0defc82f4652d650a03b48b615 100644 --- a/lib/ui/widgets/cards/counts_by_day.dart +++ b/lib/ui/widgets/cards/counts_by_day.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_counts_by_day_cubit.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_counts_by_day_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/counts_by_day.dart'; import 'package:scrobbles/ui/widgets/card_content.dart'; import 'package:scrobbles/ui/widgets/charts/counts_by_day.dart'; diff --git a/lib/ui/widgets/cards/counts_by_hour.dart b/lib/ui/widgets/cards/counts_by_hour.dart index dee7584d05e1c2b12bf44a810f791a42502b89f5..d7d296a2a4f46b0266aa4f22fc25d8aebbd58ab0 100644 --- a/lib/ui/widgets/cards/counts_by_hour.dart +++ b/lib/ui/widgets/cards/counts_by_hour.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_counts_by_hour_cubit.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_counts_by_hour_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/counts_by_hour.dart'; import 'package:scrobbles/ui/widgets/card_content.dart'; import 'package:scrobbles/ui/widgets/charts/counts_by_hour.dart'; diff --git a/lib/ui/widgets/cards/discoveries.dart b/lib/ui/widgets/cards/discoveries.dart index d1e4baf4734e153eaac9297b05abd040499fadad..3937a509f012ac7d86236b8f96bc003f7511a3e3 100644 --- a/lib/ui/widgets/cards/discoveries.dart +++ b/lib/ui/widgets/cards/discoveries.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_discoveries_cubit.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_discoveries_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/discoveries.dart'; import 'package:scrobbles/ui/widgets/card_content.dart'; import 'package:scrobbles/ui/widgets/charts/discoveries_artists.dart'; diff --git a/lib/ui/widgets/cards/heatmap.dart b/lib/ui/widgets/cards/heatmap.dart index e51a6670af44c02bf2b3cbe44e0a180884bb4a8a..ffc40ff31e836ea8165ec59650f4e9ac11a3e8ad 100644 --- a/lib/ui/widgets/cards/heatmap.dart +++ b/lib/ui/widgets/cards/heatmap.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_heatmap_cubit.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_heatmap_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/heatmap.dart'; import 'package:scrobbles/ui/widgets/card_content.dart'; import 'package:scrobbles/ui/widgets/charts/heatmap.dart'; diff --git a/lib/ui/widgets/cards/new_artists.dart b/lib/ui/widgets/cards/new_artists.dart index 365d5d6ef23381af434dc4e40d6eec4053469015..0ca1c6924babf166e0624065f0343f36707a5a12 100644 --- a/lib/ui/widgets/cards/new_artists.dart +++ b/lib/ui/widgets/cards/new_artists.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_new_artists_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_new_artists_cubit.dart'; import 'package:scrobbles/ui/widgets/card_content.dart'; class CardNewArtists extends StatelessWidget { diff --git a/lib/ui/widgets/cards/new_tracks.dart b/lib/ui/widgets/cards/new_tracks.dart index 0a73fd3b0e76d50cff3ff3c5a42e25a46fb701f6..cbcd99f3933b4becdb2639c7f63d003cfce9d8cf 100644 --- a/lib/ui/widgets/cards/new_tracks.dart +++ b/lib/ui/widgets/cards/new_tracks.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_new_tracks_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_new_tracks_cubit.dart'; import 'package:scrobbles/ui/widgets/card_content.dart'; class CardNewTracks extends StatelessWidget { diff --git a/lib/ui/widgets/cards/statistics_global.dart b/lib/ui/widgets/cards/statistics_global.dart index a1480cd44a9464791e8fa5e224d02d8ac5379613..2eeadf8f5a4d54fa30f634e4f7e0b0a50c226aa8 100644 --- a/lib/ui/widgets/cards/statistics_global.dart +++ b/lib/ui/widgets/cards/statistics_global.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_statistics_global_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_statistics_global_cubit.dart'; import 'package:scrobbles/models/data/statistics_global.dart'; import 'package:scrobbles/ui/widgets/card_content.dart'; import 'package:scrobbles/ui/widgets/content/statistics_global.dart'; diff --git a/lib/ui/widgets/cards/statistics_recent.dart b/lib/ui/widgets/cards/statistics_recent.dart index e3312da69f12f203ac0271e348f1d909cb7ae8f2..219063ce237e6140fc5ca6188affb6eb326cb210 100644 --- a/lib/ui/widgets/cards/statistics_recent.dart +++ b/lib/ui/widgets/cards/statistics_recent.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_statistics_recent_cubit.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_statistics_recent_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/statistics_recent.dart'; import 'package:scrobbles/ui/widgets/card_content.dart'; import 'package:scrobbles/ui/widgets/content/statistics_recent.dart'; diff --git a/lib/ui/widgets/cards/timeline.dart b/lib/ui/widgets/cards/timeline.dart index cf9d6888559c6dd94cb424dc6d360c3e9509d99f..941281706da59f4d13bdba402155a47261564387 100644 --- a/lib/ui/widgets/cards/timeline.dart +++ b/lib/ui/widgets/cards/timeline.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_timeline_cubit.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_timeline_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/timeline.dart'; import 'package:scrobbles/ui/widgets/card_content.dart'; import 'package:scrobbles/ui/widgets/charts/timeline_counts.dart'; diff --git a/lib/ui/widgets/cards/top_artists.dart b/lib/ui/widgets/cards/top_artists.dart index a58127c4be74aac2474ff98c0256c228b7deae11..87f7a49493e0b1d008aa841f0128847bacae2b4f 100644 --- a/lib/ui/widgets/cards/top_artists.dart +++ b/lib/ui/widgets/cards/top_artists.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:scrobbles/cubit/data_top_artists_cubit.dart'; -import 'package:scrobbles/cubit/settings_global_cubit.dart'; +import 'package:scrobbles/cubit/activity/data_top_artists_cubit.dart'; +import 'package:scrobbles/cubit/settings/settings_global_cubit.dart'; import 'package:scrobbles/models/data/topartists.dart'; import 'package:scrobbles/ui/widgets/card_content.dart'; import 'package:scrobbles/ui/widgets/charts/top_artists.dart'; diff --git a/pubspec.lock b/pubspec.lock index abad950f9c2c4719e55bdf3aa796d3e77fa1b54c..03f2aab0ca024f0632a36ccb4e889a2e2883709f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -269,10 +269,10 @@ packages: dependency: transitive description: name: path_provider - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" path_provider_android: dependency: transitive description: @@ -466,10 +466,10 @@ packages: dependency: transitive description: name: win32 - sha256: "2735daae5150e8b1dfeb3eb0544b4d3af0061e9e82cef063adcd583bdae4306a" + sha256: "10169d3934549017f0ae278ccb07f828f9d6ea21573bab0fb77b0e1ef0fce454" url: "https://pub.dev" source: hosted - version: "5.7.0" + version: "5.7.2" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 715fc230a2eca45710f208b1b393c8538e6de98c..5939c74230ea0feda7fe06cb18a336bcc24ecc0d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: Display scrobbles data and charts publish_to: "none" -version: 0.3.1+65 +version: 0.4.0+66 environment: sdk: "^3.0.0"