Skip to content
Snippets Groups Projects
Commit db07fd49 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Normalize Activity application architecture

parent fdd2f5e2
No related branches found
No related tags found
1 merge request!70Resolve "Normalize Activity application architecture"
Pipeline #6687 passed
Showing
with 331 additions and 52 deletions
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,
};
}
}
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,
];
}
......@@ -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
......
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,
};
}
}
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,
};
}
}
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,
};
}
}
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,
);
},
);
......
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';
......
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';
......
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';
......
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';
......
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 {
......
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 {
......
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';
......
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';
......
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';
......
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';
......
......@@ -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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment