diff --git a/fastlane/metadata/android/en-US/changelogs/16.txt b/fastlane/metadata/android/en-US/changelogs/16.txt new file mode 100644 index 0000000000000000000000000000000000000000..c20ed39173f1690cb6181457fe5d4c6cc0a061ab --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/16.txt @@ -0,0 +1 @@ +Use ActivityParameters widgets from flutter_custom_toolbox. diff --git a/fastlane/metadata/android/fr-FR/changelogs/16.txt b/fastlane/metadata/android/fr-FR/changelogs/16.txt new file mode 100644 index 0000000000000000000000000000000000000000..f732ebd3738d66fdff72e28b0cf0bb4b0684e030 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/16.txt @@ -0,0 +1 @@ +Utilisation des widgets ActivityParameters de flutter_custom_toolbox. diff --git a/lib/common/config/activity_page.dart b/lib/common/config/activity_page.dart index d5bf44cfc6aeb8a84355bc1514ef55c7e866a653..a20810217e14cd90d210241b4a2925c921235e4b 100644 --- a/lib/common/config/activity_page.dart +++ b/lib/common/config/activity_page.dart @@ -3,16 +3,18 @@ import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:spotifyplaylistgenerator/common/ui/pages/playlist.dart'; import 'package:spotifyplaylistgenerator/common/ui/pages/home.dart'; +import 'package:spotifyplaylistgenerator/cubit/activity/activity_cubit.dart'; +import 'package:spotifyplaylistgenerator/models/activity/activity.dart'; class ActivityPageItem { final String code; final Icon icon; - final Widget page; + final Widget Function({required Activity currentActivity})? builder; const ActivityPageItem({ required this.code, required this.icon, - required this.page, + required this.builder, }); } @@ -20,20 +22,24 @@ class ActivityPage { static const bool displayBottomNavBar = true; static const indexHome = 0; - static const pageHome = ActivityPageItem( + static final ActivityPageItem pageHome = ActivityPageItem( code: 'page_home', icon: Icon(UniconsLine.home), - page: PageHome(), + builder: ({required Activity currentActivity}) { + return PageHome(); + }, ); static const indexPlaylist = 1; - static const pagePlaylist = ActivityPageItem( + static final ActivityPageItem pagePlaylist = ActivityPageItem( code: 'page_playlist', icon: Icon(UniconsLine.list_ul), - page: PagePlaylist(), + builder: ({required Activity currentActivity}) { + return PagePlaylist(); + }, ); - static const Map<int, ActivityPageItem> items = { + static final Map<int, ActivityPageItem> items = { indexHome: pageHome, indexPlaylist: pagePlaylist, }; @@ -45,6 +51,16 @@ class ActivityPage { } static Widget getWidget(int pageIndex) { - return items[pageIndex]?.page ?? pageHome.page; + 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/config/application_config.dart b/lib/config/application_config.dart index a81fea3a050678786eca57fb86c3582a2fc080c2..7fbf93e9cdb20ae0bb4bca24d1551eb9b323c8cb 100644 --- a/lib/config/application_config.dart +++ b/lib/config/application_config.dart @@ -1,3 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +import 'package:spotifyplaylistgenerator/common/cubit/nav/nav_cubit_pages.dart'; + +import 'package:spotifyplaylistgenerator/cubit/activity/activity_cubit.dart'; + class ApplicationConfig { - static const String appTitle = 'Spotify playlist generator'; + static const String parameterCodePlaylistType = 'playlist-type'; + + static const String playlistTypeArtists = 'artists'; + + static final ApplicationConfigDefinition config = ApplicationConfigDefinition( + appTitle: 'Spotify playlist generator', + activitySettings: [ + // layout + ApplicationSettingsParameter( + code: parameterCodePlaylistType, + values: [ + ApplicationSettingsParameterItemValue( + value: playlistTypeArtists, + isDefault: true, + ), + ], + ), + ], + startNewActivity: (BuildContext context) { + BlocProvider.of<ActivityCubit>(context).startNewActivity(context); + BlocProvider.of<NavCubitPage>(context).goToPageHome(); + }, + deleteCurrentActivity: (BuildContext context) { + BlocProvider.of<ActivityCubit>(context).deleteSavedActivity(); + }, + resumeActivity: (BuildContext context) { + BlocProvider.of<ActivityCubit>(context).resumeSavedActivity(); + BlocProvider.of<NavCubitPage>(context).goToPageHome(); + }, + ); } diff --git a/lib/config/default_activity_settings.dart b/lib/config/default_activity_settings.dart deleted file mode 100644 index b58425a81947d26fc305105fb077cd057aec9314..0000000000000000000000000000000000000000 --- a/lib/config/default_activity_settings.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -class DefaultActivitySettings { - // available game parameters codes - static const String parameterCodeLayout = 'layout'; - static const List<String> availableParameters = [ - parameterCodeLayout, - ]; - - // layout: available values - static const String layoutValueFrench = 'default'; - static const List<String> allowedLayoutValues = [ - layoutValueFrench, - ]; - // layout: default value - static const String defaultLayoutValue = layoutValueFrench; - - // available values from parameter code - static List<String> getAvailableValues(String parameterCode) { - switch (parameterCode) { - case parameterCodeLayout: - return DefaultActivitySettings.allowedLayoutValues; - } - - 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 deleted file mode 100644 index d92229c2e02064684ed4a2caeb272ff63325776a..0000000000000000000000000000000000000000 --- a/lib/config/default_global_settings.dart +++ /dev/null @@ -1,28 +0,0 @@ -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 []; - } -} diff --git a/lib/cubit/activity/activity_cubit.dart b/lib/cubit/activity/activity_cubit.dart index c4fb7572e9e398c303db8bfc0d7fca05f6e04af1..460322c48138c9a5bb9cda438ffb683e07fbeec2 100644 --- a/lib/cubit/activity/activity_cubit.dart +++ b/lib/cubit/activity/activity_cubit.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:spotifyplaylistgenerator/models/activity/activity.dart'; -import 'package:spotifyplaylistgenerator/models/settings/settings_global.dart'; part 'activity_state.dart'; @@ -21,7 +20,7 @@ class ActivityCubit extends HydratedCubit<ActivityState> { void refresh() { final Activity activity = Activity( // Settings - globalSettings: state.currentActivity.globalSettings, + activitySettings: state.currentActivity.activitySettings, // State isConnected: state.currentActivity.isConnected, // Base data @@ -34,12 +33,13 @@ class ActivityCubit extends HydratedCubit<ActivityState> { updateState(activity); } - void startNewActivity({ - required GlobalSettings globalSettings, - }) { + void startNewActivity(BuildContext context) { + final ActivitySettingsCubit activitySettingsCubit = + BlocProvider.of<ActivitySettingsCubit>(context); + final Activity newActivity = Activity.createNew( // Settings - globalSettings: globalSettings, + activitySettings: activitySettingsCubit.state.settings, ); newActivity.dump(); @@ -48,6 +48,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> { refresh(); } + bool canBeResumed() { + return state.currentActivity.canBeResumed; + } + void quitActivity() { state.currentActivity.isConnected = false; refresh(); diff --git a/lib/cubit/settings/settings_activity_cubit.dart b/lib/cubit/settings/settings_activity_cubit.dart deleted file mode 100644 index 0cd0d9456c026273cb42c4726e12bfe217a63825..0000000000000000000000000000000000000000 --- a/lib/cubit/settings/settings_activity_cubit.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:spotifyplaylistgenerator/config/default_activity_settings.dart'; -import 'package:spotifyplaylistgenerator/models/settings/settings_activity.dart'; - -part 'settings_activity_state.dart'; - -class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> { - ActivitySettingsCubit() - : super(ActivitySettingsState(settings: ActivitySettings.createDefault())); - - void setValues({ - String? layout, - }) { - emit( - ActivitySettingsState( - settings: ActivitySettings( - layout: layout ?? state.settings.layout, - ), - ), - ); - } - - String getParameterValue(String code) { - switch (code) { - case DefaultActivitySettings.parameterCodeLayout: - return ActivitySettings.getLayoutValueFromUnsafe(state.settings.layout); - } - - return ''; - } - - void setParameterValue(String code, String value) { - final String layout = code == DefaultActivitySettings.parameterCodeLayout - ? value - : getParameterValue(DefaultActivitySettings.parameterCodeLayout); - - setValues( - layout: layout, - ); - } - - @override - ActivitySettingsState? fromJson(Map<String, dynamic> json) { - final String layout = json[DefaultActivitySettings.parameterCodeLayout] as String; - - return ActivitySettingsState( - settings: ActivitySettings( - layout: layout, - ), - ); - } - - @override - Map<String, dynamic>? toJson(ActivitySettingsState state) { - return <String, dynamic>{ - DefaultActivitySettings.parameterCodeLayout: state.settings.layout, - }; - } -} diff --git a/lib/cubit/settings/settings_activity_state.dart b/lib/cubit/settings/settings_activity_state.dart deleted file mode 100644 index 2b2de42011634e81ae9e6f8bcaa1577f239c778b..0000000000000000000000000000000000000000 --- a/lib/cubit/settings/settings_activity_state.dart +++ /dev/null @@ -1,15 +0,0 @@ -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/settings_global_cubit.dart b/lib/cubit/settings/settings_global_cubit.dart deleted file mode 100644 index 0e3cd030ff5d935fe6223e4dca5722dfe0c0aafd..0000000000000000000000000000000000000000 --- a/lib/cubit/settings/settings_global_cubit.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:spotifyplaylistgenerator/config/default_global_settings.dart'; -import 'package:spotifyplaylistgenerator/models/settings/settings_global.dart'; - -part 'settings_global_state.dart'; - -class GlobalSettingsCubit extends HydratedCubit<GlobalSettingsState> { - GlobalSettingsCubit() : super(GlobalSettingsState(settings: GlobalSettings.createDefault())); - - void setValues({ - String? skin, - }) { - emit( - GlobalSettingsState( - settings: GlobalSettings( - skin: skin ?? state.settings.skin, - ), - ), - ); - } - - String getParameterValue(String code) { - switch (code) { - case DefaultGlobalSettings.parameterCodeSkin: - return GlobalSettings.getSkinValueFromUnsafe(state.settings.skin); - } - return ''; - } - - void setParameterValue(String code, String value) { - final String skin = (code == DefaultGlobalSettings.parameterCodeSkin) - ? value - : getParameterValue(DefaultGlobalSettings.parameterCodeSkin); - - setValues( - skin: skin, - ); - } - - @override - GlobalSettingsState? fromJson(Map<String, dynamic> json) { - final String skin = json[DefaultGlobalSettings.parameterCodeSkin] as String; - - return GlobalSettingsState( - settings: GlobalSettings( - skin: skin, - ), - ); - } - - @override - Map<String, dynamic>? toJson(GlobalSettingsState state) { - return <String, dynamic>{ - DefaultGlobalSettings.parameterCodeSkin: state.settings.skin, - }; - } -} diff --git a/lib/cubit/settings/settings_global_state.dart b/lib/cubit/settings/settings_global_state.dart deleted file mode 100644 index ebcddd700f252257223ca8e16c85202b04f3ff24..0000000000000000000000000000000000000000 --- a/lib/cubit/settings/settings_global_state.dart +++ /dev/null @@ -1,15 +0,0 @@ -part of 'settings_global_cubit.dart'; - -@immutable -class GlobalSettingsState extends Equatable { - const GlobalSettingsState({ - required this.settings, - }); - - final GlobalSettings settings; - - @override - List<dynamic> get props => <dynamic>[ - settings, - ]; -} diff --git a/lib/main.dart b/lib/main.dart index bb76542d5a7957dd5f6d3bd47f1d57ec77747052..a61bd478503ac76f6420fd90965da05655e2a192 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,8 +9,6 @@ import 'package:spotifyplaylistgenerator/common/cubit/nav/nav_cubit_screens.dart import 'package:spotifyplaylistgenerator/config/application_config.dart'; import 'package:spotifyplaylistgenerator/cubit/activity/activity_cubit.dart'; -import 'package:spotifyplaylistgenerator/cubit/settings/settings_activity_cubit.dart'; -import 'package:spotifyplaylistgenerator/cubit/settings/settings_global_cubit.dart'; import 'package:spotifyplaylistgenerator/ui/skeleton.dart'; void main() async { @@ -56,17 +54,14 @@ class MyApp extends StatelessWidget { BlocProvider<ActivityCubit>( create: (context) => ActivityCubit(), ), - BlocProvider<GlobalSettingsCubit>( - create: (context) => GlobalSettingsCubit(), - ), BlocProvider<ActivitySettingsCubit>( - create: (context) => ActivitySettingsCubit(), + create: (context) => ActivitySettingsCubit(appConfig: ApplicationConfig.config), ), ], child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>( builder: (BuildContext context, ApplicationThemeModeState state) { return MaterialApp( - title: ApplicationConfig.appTitle, + title: ApplicationConfig.config.appTitle, home: const SkeletonScreen(), // Theme stuff diff --git a/lib/models/activity/activity.dart b/lib/models/activity/activity.dart index 41d86b707e6b04a013c52a68aec8ef2d9dfe4901..546c03f8542d48fcc484f2f16459d3ac4efc1f4b 100644 --- a/lib/models/activity/activity.dart +++ b/lib/models/activity/activity.dart @@ -1,11 +1,11 @@ import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:spotifyplaylistgenerator/models/settings/settings_global.dart'; +import 'package:spotifyplaylistgenerator/config/application_config.dart'; class Activity { Activity({ // Settings - required this.globalSettings, + required this.activitySettings, // State this.isConnected = false, @@ -18,7 +18,7 @@ class Activity { }); // Settings - final GlobalSettings globalSettings; + final ActivitySettings activitySettings; // State bool isConnected; @@ -32,20 +32,21 @@ class Activity { factory Activity.createNull() { return Activity( // Settings - globalSettings: GlobalSettings.createDefault(), + activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config), // Base data userId: '', ); } factory Activity.createNew({ - GlobalSettings? globalSettings, + ActivitySettings? activitySettings, }) { - final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault(); + final ActivitySettings newActivitySettings = activitySettings ?? + ActivitySettings.createDefault(appConfig: ApplicationConfig.config); return Activity( // Settings - globalSettings: newGlobalSettings, + activitySettings: newActivitySettings, // State isConnected: false, // Base data @@ -53,13 +54,15 @@ class Activity { ); } + bool get canBeResumed => true; + void dump() { printlog(''); printlog('## Current activity dump:'); printlog(''); printlog('$Activity:'); printlog(' Settings'); - globalSettings.dump(); + activitySettings.dump(); printlog(' State'); printlog(' isConnected: $isConnected'); printlog(' Base data'); @@ -77,7 +80,7 @@ class Activity { Map<String, dynamic>? toJson() { return <String, dynamic>{ // Settings - 'globalSettings': globalSettings.toJson(), + 'activitySettings': activitySettings.toJson(), // State 'isConnected': isConnected, // Base data diff --git a/lib/models/settings/settings_activity.dart b/lib/models/settings/settings_activity.dart deleted file mode 100644 index 33ad6d9d2b73307e154b093743ccf3129d383cea..0000000000000000000000000000000000000000 --- a/lib/models/settings/settings_activity.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:spotifyplaylistgenerator/config/default_activity_settings.dart'; - -class ActivitySettings { - final String layout; - - ActivitySettings({ - required this.layout, - }); - - static String getLayoutValueFromUnsafe(String layout) { - if (DefaultActivitySettings.allowedLayoutValues.contains(layout)) { - return layout; - } - - return DefaultActivitySettings.defaultLayoutValue; - } - - factory ActivitySettings.createDefault() { - return ActivitySettings( - layout: DefaultActivitySettings.defaultLayoutValue, - ); - } - - void dump() { - printlog('$ActivitySettings:'); - printlog(' ${DefaultActivitySettings.parameterCodeLayout}: $layout'); - printlog(''); - } - - @override - String toString() { - return '$ActivitySettings(${toJson()})'; - } - - Map<String, dynamic>? toJson() { - return <String, dynamic>{ - DefaultActivitySettings.parameterCodeLayout: layout, - }; - } -} diff --git a/lib/models/settings/settings_global.dart b/lib/models/settings/settings_global.dart deleted file mode 100644 index 9a9be68d2d6a91f986b841190c191f0f8d439e9d..0000000000000000000000000000000000000000 --- a/lib/models/settings/settings_global.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:spotifyplaylistgenerator/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/pubspec.lock b/pubspec.lock index 9203cf6e660f7eedae1f3bd763eb58d1951d2811..d8427bb0abc2eb4e317cdc9d60f6352adb7bbff3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -122,11 +122,11 @@ packages: dependency: "direct main" description: path: "." - ref: "0.4.0" - resolved-ref: eb9c090bd00d73324eab8737f74b3339cc24c9e8 + ref: "0.5.0" + resolved-ref: b8164a50489ba981ea57d9f02e2334f09cb8c6a7 url: "https://git.harrault.fr/android/flutter-toolbox.git" source: git - version: "0.4.0" + version: "0.5.0" flutter_lints: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index 1cd2772f06de239c913ce2a1f3b3809dbb8976c9..889644c37360ad7b7054b03341327cd8388a70e6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: Create and manage Spotify playlists publish_to: "none" -version: 0.3.2+15 +version: 0.4.0+16 environment: sdk: "^3.0.0" @@ -16,7 +16,7 @@ dependencies: flutter_custom_toolbox: git: url: https://git.harrault.fr/android/flutter-toolbox.git - ref: 0.4.0 + ref: 0.5.0 # specific http: ^1.1.0