Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • android/org.benoitharrault.scrobbles
1 result
Show changes
Commits on Source (4)
Showing
with 253 additions and 23 deletions
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
app.versionName=0.0.34
app.versionCode=34
app.versionName=0.0.36
app.versionCode=36
......@@ -5,6 +5,7 @@
"bottom_nav_home": "Home",
"bottom_nav_discoveries": "Discoveries",
"bottom_nav_repartition": "Statistics",
"bottom_nav_settings": "Settings",
"global_statistics": "Global statistics",
"statistics_total_scrobbles_count": "Total scrobbles count: {count}",
......@@ -23,6 +24,18 @@
"top_artists_title": "Top artists ({daysCount} days)",
"settings_title": "Settings",
"settings_label_username": "Username: ",
"settings_label_security_token": "Security token: ",
"settings_label_counts_by_day_days_count": "Counts by day: ",
"settings_label_counts_by_hour_days_count": "Counts by hour: ",
"settings_label_discoveries_days_count": "Discoveries: ",
"settings_label_statistics_recent_days_count": "Recent statistics: ",
"settings_label_timeline_days_count": "Timeline: ",
"settings_label_top_artists_days_count": "Top Artists: ",
"settings_button_save": "Save",
"MON": "MON",
"TUE": "TUE",
"WED": "WED",
......
......@@ -5,6 +5,7 @@
"bottom_nav_home": "Accueil",
"bottom_nav_discoveries": "Découvertes",
"bottom_nav_repartition": "Statistiques",
"bottom_nav_settings": "Paramètres",
"global_statistics": "Statistiques globales d'écoutes",
"statistics_total_scrobbles_count": "Nombre total d'écoutes : {count}",
......@@ -23,6 +24,17 @@
"top_artists_title": "Top artistes ({daysCount} jours)",
"settings_title": "Paramètres",
"settings_label_username": "Utilisateur : ",
"settings_label_security_token": "Jeton de sécurité : ",
"settings_label_counts_by_day_days_count": "Répartition par heure : ",
"settings_label_counts_by_hour_days_count": "Répartition par jour : ",
"settings_label_discoveries_days_count": "Découvertes : ",
"settings_label_statistics_recent_days_count": "Statistiques récentes : ",
"settings_label_timeline_days_count": "Timeline : ",
"settings_label_top_artists_days_count": "Top Artistes : ",
"settings_button_save": "Enregistrer",
"MON": "LUN",
"TUE": "MAR",
"WED": "MER",
......
Add settings page (username, security token).
Add days count selectors in settings page.
Ajout d'une page de paramètres (nom d'utilisateur, jeton de sécurité).
Ajout de sélecteurs de nombre de jours dans le paramétrage.
class DefaultSettings {
static const List<int> allowedValues = [
7,
14,
21,
30,
60,
90,
];
static const int defaultCountsByDayDaysCount = 21;
static const int defaultCountsByHourDaysCount = 21;
static const int defaultDiscoveriesDaysCount = 14;
static const int defaultStatisticsRecentDaysCount = 21;
static const int defaultTimelineDaysCount = 14;
static const int defaultTopArtistsDaysCount = 14;
}
class Settings {
static const int countsByDayDaysCount = 21;
static const int countsByHourDaysCount = 21;
static const int discoveriesDaysCount = 14;
static const int statisticsRecentDaysCount = 21;
static const int timelineDaysCount = 14;
static const int topArtistsDaysCount = 14;
}
......@@ -3,7 +3,7 @@ import 'package:hydrated_bloc/hydrated_bloc.dart';
class BottomNavCubit extends HydratedCubit<int> {
BottomNavCubit() : super(0);
int pagesCount = 3;
int pagesCount = 4;
void updateIndex(int index) {
if (isIndexAllowed(index)) {
......
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:scrobbles/config/default_settings.dart';
part 'settings_state.dart';
class SettingsCubit extends HydratedCubit<SettingsState> {
SettingsCubit() : super(const SettingsState());
String getUsername() {
return state.username ?? '';
}
String getSecurityToken() {
return state.securityToken ?? '';
}
int getCountsByDayDaysCount() {
return state.countsByDayDaysCount ?? DefaultSettings.defaultCountsByDayDaysCount;
}
int getCountsByHourDaysCount() {
return state.countsByHourDaysCount ?? DefaultSettings.defaultCountsByHourDaysCount;
}
int getDiscoveriesDaysCount() {
return state.discoveriesDaysCount ?? DefaultSettings.defaultDiscoveriesDaysCount;
}
int getStatisticsRecentDaysCount() {
return state.statisticsRecentDaysCount ?? DefaultSettings.defaultStatisticsRecentDaysCount;
}
int getTimelineDaysCount() {
return state.timelineDaysCount ?? DefaultSettings.defaultTimelineDaysCount;
}
int getTopArtistsDaysCount() {
return state.topArtistsDaysCount ?? DefaultSettings.defaultTopArtistsDaysCount;
}
void setValues({
String? username,
String? securityToken,
int? countsByDayDaysCount,
int? countsByHourDaysCount,
int? discoveriesDaysCount,
int? statisticsRecentDaysCount,
int? timelineDaysCount,
int? topArtistsDaysCount,
}) {
emit(SettingsState(
username: username ?? state.username,
securityToken: securityToken ?? state.securityToken,
countsByDayDaysCount: countsByDayDaysCount ?? state.countsByDayDaysCount,
countsByHourDaysCount: countsByHourDaysCount ?? state.countsByHourDaysCount,
discoveriesDaysCount: discoveriesDaysCount ?? state.discoveriesDaysCount,
statisticsRecentDaysCount: statisticsRecentDaysCount ?? state.statisticsRecentDaysCount,
timelineDaysCount: timelineDaysCount ?? state.timelineDaysCount,
topArtistsDaysCount: topArtistsDaysCount ?? state.topArtistsDaysCount,
));
}
@override
SettingsState? fromJson(Map<String, dynamic> json) {
String username = json['username'] as String;
String securityToken = json['securityToken'] as String;
int countsByDayDaysCount = json['countsByDayDaysCount'] as int;
int countsByHourDaysCount = json['countsByHourDaysCount'] as int;
int discoveriesDaysCount = json['discoveriesDaysCount'] as int;
int statisticsRecentDaysCount = json['statisticsRecentDaysCount'] as int;
int timelineDaysCount = json['timelineDaysCount'] as int;
int topArtistsDaysCount = json['topArtistsDaysCount'] as int;
return SettingsState(
username: username,
securityToken: securityToken,
countsByDayDaysCount: countsByDayDaysCount,
countsByHourDaysCount: countsByHourDaysCount,
discoveriesDaysCount: discoveriesDaysCount,
statisticsRecentDaysCount: statisticsRecentDaysCount,
timelineDaysCount: timelineDaysCount,
topArtistsDaysCount: topArtistsDaysCount,
);
}
@override
Map<String, dynamic>? toJson(SettingsState state) {
return <String, dynamic>{
'username': state.username ?? '',
'securityToken': state.securityToken ?? '',
'countsByDayDaysCount':
state.countsByDayDaysCount ?? DefaultSettings.defaultCountsByDayDaysCount,
'countsByHourDaysCount':
state.countsByHourDaysCount ?? DefaultSettings.defaultCountsByHourDaysCount,
'discoveriesDaysCount':
state.discoveriesDaysCount ?? DefaultSettings.defaultDiscoveriesDaysCount,
'statisticsRecentDaysCount':
state.statisticsRecentDaysCount ?? DefaultSettings.defaultStatisticsRecentDaysCount,
'timelineDaysCount': state.timelineDaysCount ?? DefaultSettings.defaultTimelineDaysCount,
'topArtistsDaysCount':
state.topArtistsDaysCount ?? DefaultSettings.defaultTopArtistsDaysCount,
};
}
}
part of 'settings_cubit.dart';
@immutable
class SettingsState extends Equatable {
const SettingsState({
this.username,
this.securityToken,
this.countsByDayDaysCount,
this.countsByHourDaysCount,
this.discoveriesDaysCount,
this.statisticsRecentDaysCount,
this.timelineDaysCount,
this.topArtistsDaysCount,
});
final String? username;
final String? securityToken;
final int? countsByDayDaysCount;
final int? countsByHourDaysCount;
final int? discoveriesDaysCount;
final int? statisticsRecentDaysCount;
final int? timelineDaysCount;
final int? topArtistsDaysCount;
@override
List<dynamic> get props => <dynamic>[
username,
securityToken,
countsByDayDaysCount,
countsByHourDaysCount,
discoveriesDaysCount,
statisticsRecentDaysCount,
timelineDaysCount,
topArtistsDaysCount,
];
Map<String, dynamic> get values => <String, dynamic>{
'username': username,
'securityToken': securityToken,
'countsByDayDaysCount': countsByDayDaysCount,
'countsByHourDaysCount': countsByHourDaysCount,
'discoveriesDaysCount': discoveriesDaysCount,
'statisticsRecentDaysCount': statisticsRecentDaysCount,
'timelineDaysCount': timelineDaysCount,
'topArtistsDaysCount': topArtistsDaysCount,
};
}
......@@ -16,6 +16,7 @@ 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_cubit.dart';
import 'package:scrobbles/ui/skeleton.dart';
void main() async {
......@@ -49,6 +50,7 @@ class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<SettingsCubit>(create: (context) => SettingsCubit()),
BlocProvider<BottomNavCubit>(create: (context) => BottomNavCubit()),
BlocProvider<DataCountsByDayCubit>(create: (context) => DataCountsByDayCubit()),
BlocProvider<DataCountsByHourCubit>(create: (context) => DataCountsByHourCubit()),
......
import 'package:flutter/material.dart';
import 'package:scrobbles/ui/widgets/header_app.dart';
import 'package:scrobbles/ui/widgets/settings_form.dart';
class ScreenSettings extends StatelessWidget {
const ScreenSettings({super.key});
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
SizedBox(height: 8),
AppHeader(text: 'settings_title'),
SizedBox(height: 8),
SettingsForm(),
],
);
}
}
......@@ -5,6 +5,7 @@ import 'package:flutter_swipe/flutter_swipe.dart';
import 'package:scrobbles/cubit/bottom_nav_cubit.dart';
import 'package:scrobbles/ui/screens/discoveries.dart';
import 'package:scrobbles/ui/screens/home.dart';
import 'package:scrobbles/ui/screens/settings.dart';
import 'package:scrobbles/ui/screens/statistics.dart';
import 'package:scrobbles/ui/widgets/app_bar.dart';
import 'package:scrobbles/ui/widgets/bottom_nav_bar.dart';
......@@ -23,6 +24,7 @@ class _SkeletonScreenState extends State<SkeletonScreen> {
const ScreenHome(),
const ScreenDiscoveries(),
const ScreenStatistics(),
const ScreenSettings(),
];
return Scaffold(
......
......@@ -54,6 +54,10 @@ class BottomNavBar extends StatelessWidget {
icon: const Icon(Ionicons.bar_chart_outline),
label: tr('bottom_nav_repartition'),
),
BottomNavigationBarItem(
icon: const Icon(Ionicons.settings_outline),
label: tr('bottom_nav_settings'),
),
],
);
},
......
......@@ -4,8 +4,8 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:scrobbles/config/settings.dart';
import 'package:scrobbles/cubit/data_counts_by_day_cubit.dart';
import 'package:scrobbles/cubit/settings_cubit.dart';
import 'package:scrobbles/models/counts_by_day.dart';
import 'package:scrobbles/network/scrobbles.dart';
import 'package:scrobbles/ui/widgets/card_content.dart';
......@@ -17,7 +17,9 @@ class CardCountsByDay extends StatelessWidget {
@override
Widget build(BuildContext context) {
final int daysCount = Settings.countsByDayDaysCount;
SettingsCubit settings = BlocProvider.of<SettingsCubit>(context);
final int daysCount = settings.getCountsByDayDaysCount();
return BlocBuilder<DataCountsByDayCubit, DataCountsByDayState>(
builder: (BuildContext context, DataCountsByDayState state) {
......@@ -28,7 +30,7 @@ class CardCountsByDay extends StatelessWidget {
'daysCount': daysCount.toString(),
},
),
loader: updateCountsByDay(Settings.countsByDayDaysCount),
loader: updateCountsByDay(daysCount),
content: ChartCountsByDay(
chartData: CountsByDayData.fromJson(jsonDecode(state.countsByDay.toString())),
isLoading: false,
......
......@@ -4,8 +4,8 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:scrobbles/config/settings.dart';
import 'package:scrobbles/cubit/data_counts_by_hour_cubit.dart';
import 'package:scrobbles/cubit/settings_cubit.dart';
import 'package:scrobbles/models/counts_by_hour.dart';
import 'package:scrobbles/network/scrobbles.dart';
import 'package:scrobbles/ui/widgets/card_content.dart';
......@@ -17,7 +17,9 @@ class CardCountsByHour extends StatelessWidget {
@override
Widget build(BuildContext context) {
final int daysCount = Settings.countsByHourDaysCount;
SettingsCubit settings = BlocProvider.of<SettingsCubit>(context);
final int daysCount = settings.getCountsByHourDaysCount();
return BlocBuilder<DataCountsByHourCubit, DataCountsByHourState>(
builder: (BuildContext context, DataCountsByHourState state) {
......@@ -28,7 +30,7 @@ class CardCountsByHour extends StatelessWidget {
'daysCount': daysCount.toString(),
},
),
loader: updateCountsByHour(Settings.countsByHourDaysCount),
loader: updateCountsByHour(daysCount),
content: ChartCountsByHour(
chartData: CountsByHourData.fromJson(jsonDecode(state.countsByHour.toString())),
isLoading: false,
......
......@@ -4,8 +4,8 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:scrobbles/config/settings.dart';
import 'package:scrobbles/cubit/data_discoveries_cubit.dart';
import 'package:scrobbles/cubit/settings_cubit.dart';
import 'package:scrobbles/models/discoveries.dart';
import 'package:scrobbles/network/scrobbles.dart';
import 'package:scrobbles/ui/widgets/card_content.dart';
......@@ -18,7 +18,9 @@ class CardDiscoveries extends StatelessWidget {
@override
Widget build(BuildContext context) {
final int daysCount = Settings.discoveriesDaysCount;
SettingsCubit settings = BlocProvider.of<SettingsCubit>(context);
final int daysCount = settings.getDiscoveriesDaysCount();
return BlocBuilder<DataDiscoveriesCubit, DataDiscoveriesState>(
builder: (BuildContext context, DataDiscoveriesState state) {
......@@ -31,7 +33,7 @@ class CardDiscoveries extends StatelessWidget {
'daysCount': daysCount.toString(),
},
),
loader: updateDiscoveries(Settings.discoveriesDaysCount),
loader: updateDiscoveries(daysCount),
content: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
......
......@@ -4,8 +4,8 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:scrobbles/config/settings.dart';
import 'package:scrobbles/cubit/data_statistics_recent_cubit.dart';
import 'package:scrobbles/cubit/settings_cubit.dart';
import 'package:scrobbles/models/statistics_recent.dart';
import 'package:scrobbles/network/scrobbles.dart';
import 'package:scrobbles/ui/widgets/card_content.dart';
......@@ -17,7 +17,9 @@ class CardStatisticsRecent extends StatelessWidget {
@override
Widget build(BuildContext context) {
final int daysCount = Settings.statisticsRecentDaysCount;
SettingsCubit settings = BlocProvider.of<SettingsCubit>(context);
final int daysCount = settings.getStatisticsRecentDaysCount();
return BlocBuilder<DataStatisticsRecentCubit, DataStatisticsRecentState>(
builder: (BuildContext context, DataStatisticsRecentState dataState) {
......@@ -28,7 +30,7 @@ class CardStatisticsRecent extends StatelessWidget {
'daysCount': daysCount.toString(),
},
),
loader: updateStatisticsRecent(Settings.statisticsRecentDaysCount),
loader: updateStatisticsRecent(daysCount),
content: ContentStatisticsRecent(
statistics: StatisticsRecentData.fromJson(
jsonDecode(dataState.statisticsRecent.toString())),
......