From 44ec7eac8c01a65d1fa1107e65e62a300834cf19 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Sat, 11 Nov 2023 22:33:36 +0100
Subject: [PATCH] Improve "discoveries" chart

---
 android/gradle.properties                     |  4 +-
 assets/translations/en.json                   |  3 +-
 assets/translations/fr.json                   |  3 +-
 .../metadata/android/en-US/changelogs/27.txt  |  1 +
 .../metadata/android/fr-FR/changelogs/27.txt  |  1 +
 .../widgets/main_screen/discoveries_card.dart | 27 ++++++--
 ...rt.dart => discoveries_chart_artists.dart} | 13 +---
 .../main_screen/discoveries_chart_tracks.dart | 69 +++++++++++++++++++
 .../discoveries_content_artists.dart          | 43 ++++++++++++
 ...t.dart => discoveries_content_tracks.dart} | 10 +--
 pubspec.yaml                                  |  2 +-
 11 files changed, 149 insertions(+), 27 deletions(-)
 create mode 100644 fastlane/metadata/android/en-US/changelogs/27.txt
 create mode 100644 fastlane/metadata/android/fr-FR/changelogs/27.txt
 rename lib/ui/widgets/main_screen/{discoveries_chart.dart => discoveries_chart_artists.dart} (79%)
 create mode 100644 lib/ui/widgets/main_screen/discoveries_chart_tracks.dart
 create mode 100644 lib/ui/widgets/main_screen/discoveries_content_artists.dart
 rename lib/ui/widgets/main_screen/{discoveries_content.dart => discoveries_content_tracks.dart} (82%)

diff --git a/android/gradle.properties b/android/gradle.properties
index f0fcf6c..408253c 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.26
-app.versionCode=26
+app.versionName=0.0.27
+app.versionCode=27
diff --git a/assets/translations/en.json b/assets/translations/en.json
index 449c95d..a2823eb 100644
--- a/assets/translations/en.json
+++ b/assets/translations/en.json
@@ -17,7 +17,8 @@
   "counts_by_day": "Counts by day ({daysCount} days)",
   "counts_by_hour": "Counts by hour ({daysCount} days)",
 
-  "discoveries_title": "Discoveries ({daysCount} days)",
+  "discoveries_artists_title": "Artists discoveries ({daysCount} days)",
+  "discoveries_tracks_title": "Tracks discoveries ({daysCount} days)",
 
   "top_artists_title": "Top artists ({daysCount} days)",
 
diff --git a/assets/translations/fr.json b/assets/translations/fr.json
index 1b19c8a..67d019d 100644
--- a/assets/translations/fr.json
+++ b/assets/translations/fr.json
@@ -17,7 +17,8 @@
   "counts_by_day": "Écoutes par jour ({daysCount} jours)",
   "counts_by_hour": "Écoutes par heure ({daysCount} jours)",
 
-  "discoveries_title": "Découvertes ({daysCount} jours)",
+  "discoveries_artists_title": "Artistes découverts ({daysCount} jours)",
+  "discoveries_tracks_title": "Morceaux découverts ({daysCount} jours)",
 
   "top_artists_title": "Top artistes ({daysCount} jours)",
 
diff --git a/fastlane/metadata/android/en-US/changelogs/27.txt b/fastlane/metadata/android/en-US/changelogs/27.txt
new file mode 100644
index 0000000..eeb190d
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/27.txt
@@ -0,0 +1 @@
+Improve "discoveries" chart.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/27.txt b/fastlane/metadata/android/fr-FR/changelogs/27.txt
new file mode 100644
index 0000000..cb3be4c
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/27.txt
@@ -0,0 +1 @@
+Amélioration du graphique des découvertes.
diff --git a/lib/ui/widgets/main_screen/discoveries_card.dart b/lib/ui/widgets/main_screen/discoveries_card.dart
index 838d379..57f0d04 100644
--- a/lib/ui/widgets/main_screen/discoveries_card.dart
+++ b/lib/ui/widgets/main_screen/discoveries_card.dart
@@ -5,7 +5,8 @@ import 'package:flutter/material.dart';
 import '../../../models/discoveries.dart';
 import '../../../network/scrobbles_api.dart';
 import '../../../ui/widgets/error.dart';
-import '../../../ui/widgets/main_screen/discoveries_content.dart';
+import 'discoveries_content_artists.dart';
+import 'discoveries_content_tracks.dart';
 
 class ChartDiscoveriesCard extends StatelessWidget {
   const ChartDiscoveriesCard({super.key});
@@ -33,12 +34,24 @@ class ChartDiscoveriesCard extends StatelessWidget {
           ),
           child: Padding(
             padding: const EdgeInsets.all(8.0),
-            child: ChartDiscoveriesCardContent(
-              daysCount: daysCount,
-              chartData: snapshot.hasData
-                  ? DiscoveriesData.fromJson(jsonDecode(snapshot.data.toString()))
-                  : DiscoveriesData.createEmpty(),
-              isLoading: !snapshot.hasData,
+            child: Column(
+              children: [
+                ChartDiscoveriesArtistsCardContent(
+                  daysCount: daysCount,
+                  chartData: snapshot.hasData
+                      ? DiscoveriesData.fromJson(jsonDecode(snapshot.data.toString()))
+                      : DiscoveriesData.createEmpty(),
+                  isLoading: !snapshot.hasData,
+                ),
+                const SizedBox(height: 8),
+                ChartDiscoveriesTracksCardContent(
+                  daysCount: daysCount,
+                  chartData: snapshot.hasData
+                      ? DiscoveriesData.fromJson(jsonDecode(snapshot.data.toString()))
+                      : DiscoveriesData.createEmpty(),
+                  isLoading: !snapshot.hasData,
+                ),
+              ],
             ),
           ),
         );
diff --git a/lib/ui/widgets/main_screen/discoveries_chart.dart b/lib/ui/widgets/main_screen/discoveries_chart_artists.dart
similarity index 79%
rename from lib/ui/widgets/main_screen/discoveries_chart.dart
rename to lib/ui/widgets/main_screen/discoveries_chart_artists.dart
index 4e5ed7d..eb76c31 100644
--- a/lib/ui/widgets/main_screen/discoveries_chart.dart
+++ b/lib/ui/widgets/main_screen/discoveries_chart_artists.dart
@@ -6,10 +6,10 @@ import '../../../models/discoveries.dart';
 import '../../../utils/color_extensions.dart';
 import '../../../ui/widgets/charts/custom_bar_chart.dart';
 
-class ChartDiscoveries extends CustomBarChart {
+class ChartDiscoveriesArtists extends CustomBarChart {
   final DiscoveriesData chartData;
 
-  ChartDiscoveries({super.key, required this.chartData});
+  ChartDiscoveriesArtists({super.key, required this.chartData});
 
   @override
   Widget build(BuildContext context) {
@@ -31,14 +31,10 @@ class ChartDiscoveries extends CustomBarChart {
       DiscoveriesDataValue? value = this.chartData.data[key];
       if (value != null) {
         double newArtistsCount = value.newArtistsCount.toDouble();
-        double newTracksCount = value.newTracksCount.toDouble();
 
         if (newArtistsCount > maxValue) {
           maxValue = newArtistsCount;
         }
-        if (newTracksCount > maxValue) {
-          maxValue = newTracksCount;
-        }
       }
     });
 
@@ -49,7 +45,6 @@ class ChartDiscoveries extends CustomBarChart {
     List<BarChartGroupData> data = [];
 
     final newArtistsBarColor = AppColors.contentColorGreen.darken(20);
-    final newTracksBarColor = AppColors.contentColorBlue.darken(20);
 
     this.chartData.data.keys.forEach((key) {
       DiscoveriesDataValue? value = this.chartData.data[key];
@@ -60,13 +55,11 @@ class ChartDiscoveries extends CustomBarChart {
           x: date,
           values: [
             value.newArtistsCount.toDouble(),
-            value.newTracksCount.toDouble(),
           ],
           barColors: [
             newArtistsBarColor,
-            newTracksBarColor,
           ],
-          barWidth: barWidth / 2.5,
+          barWidth: barWidth,
         ));
       }
     });
diff --git a/lib/ui/widgets/main_screen/discoveries_chart_tracks.dart b/lib/ui/widgets/main_screen/discoveries_chart_tracks.dart
new file mode 100644
index 0000000..622911d
--- /dev/null
+++ b/lib/ui/widgets/main_screen/discoveries_chart_tracks.dart
@@ -0,0 +1,69 @@
+import 'package:flutter/material.dart';
+import 'package:fl_chart/fl_chart.dart';
+
+import '../../../config/app_colors.dart';
+import '../../../models/discoveries.dart';
+import '../../../utils/color_extensions.dart';
+import '../../../ui/widgets/charts/custom_bar_chart.dart';
+
+class ChartDiscoveriesTracks extends CustomBarChart {
+  final DiscoveriesData chartData;
+
+  ChartDiscoveriesTracks({super.key, required this.chartData});
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      height: this.chartHeight,
+      child: LayoutBuilder(builder: (context, constraints) {
+        return getBarChart(
+          barWidth: this.getBarWidth(constraints.maxWidth, this.chartData.data.keys.length),
+          backgroundColor: Theme.of(context).colorScheme.onSurface,
+        );
+      }),
+    );
+  }
+
+  double getMaxCountsValue() {
+    double maxValue = 0;
+
+    this.chartData.data.keys.forEach((key) {
+      DiscoveriesDataValue? value = this.chartData.data[key];
+      if (value != null) {
+        double newTracksCount = value.newTracksCount.toDouble();
+
+        if (newTracksCount > maxValue) {
+          maxValue = newTracksCount;
+        }
+      }
+    });
+
+    return maxValue;
+  }
+
+  List<BarChartGroupData> getDataCounts(double barWidth) {
+    List<BarChartGroupData> data = [];
+
+    final newTracksBarColor = AppColors.contentColorBlue.darken(20);
+
+    this.chartData.data.keys.forEach((key) {
+      DiscoveriesDataValue? value = this.chartData.data[key];
+      if (value != null) {
+        final int date = DateTime.parse(key).millisecondsSinceEpoch;
+
+        data.add(this.getBarItem(
+          x: date,
+          values: [
+            value.newTracksCount.toDouble(),
+          ],
+          barColors: [
+            newTracksBarColor,
+          ],
+          barWidth: barWidth,
+        ));
+      }
+    });
+
+    return data;
+  }
+}
diff --git a/lib/ui/widgets/main_screen/discoveries_content_artists.dart b/lib/ui/widgets/main_screen/discoveries_content_artists.dart
new file mode 100644
index 0000000..b608e9d
--- /dev/null
+++ b/lib/ui/widgets/main_screen/discoveries_content_artists.dart
@@ -0,0 +1,43 @@
+import 'dart:convert';
+
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+
+import '../../../models/discoveries.dart';
+import 'discoveries_chart_artists.dart';
+
+class ChartDiscoveriesArtistsCardContent extends StatelessWidget {
+  final int daysCount;
+  final DiscoveriesData chartData;
+  final bool isLoading;
+
+  const ChartDiscoveriesArtistsCardContent(
+      {super.key, required this.daysCount, required this.chartData, required this.isLoading});
+
+  @override
+  Widget build(BuildContext context) {
+    final TextTheme textTheme = Theme.of(context).primaryTextTheme;
+    final String placeholder = '⏳';
+
+    return Column(
+      mainAxisSize: MainAxisSize.min,
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: <Widget>[
+        Text(
+          'discoveries_artists_title',
+          style: textTheme.titleLarge!.apply(fontWeightDelta: 2),
+        ).tr(
+          namedArgs: {
+            'daysCount': this.daysCount.toString(),
+          },
+        ),
+        const SizedBox(height: 8),
+        this.isLoading
+            ? Text(placeholder)
+            : ChartDiscoveriesArtists(
+                chartData: DiscoveriesData.fromJson(jsonDecode(this.chartData.toString())),
+              ),
+      ],
+    );
+  }
+}
diff --git a/lib/ui/widgets/main_screen/discoveries_content.dart b/lib/ui/widgets/main_screen/discoveries_content_tracks.dart
similarity index 82%
rename from lib/ui/widgets/main_screen/discoveries_content.dart
rename to lib/ui/widgets/main_screen/discoveries_content_tracks.dart
index 5dccaf0..9ca8ff1 100644
--- a/lib/ui/widgets/main_screen/discoveries_content.dart
+++ b/lib/ui/widgets/main_screen/discoveries_content_tracks.dart
@@ -4,14 +4,14 @@ import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
 
 import '../../../models/discoveries.dart';
-import '../../../ui/widgets/main_screen/discoveries_chart.dart';
+import 'discoveries_chart_tracks.dart';
 
-class ChartDiscoveriesCardContent extends StatelessWidget {
+class ChartDiscoveriesTracksCardContent extends StatelessWidget {
   final int daysCount;
   final DiscoveriesData chartData;
   final bool isLoading;
 
-  const ChartDiscoveriesCardContent(
+  const ChartDiscoveriesTracksCardContent(
       {super.key, required this.daysCount, required this.chartData, required this.isLoading});
 
   @override
@@ -24,7 +24,7 @@ class ChartDiscoveriesCardContent extends StatelessWidget {
       crossAxisAlignment: CrossAxisAlignment.start,
       children: <Widget>[
         Text(
-          'discoveries_title',
+          'discoveries_tracks_title',
           style: textTheme.titleLarge!.apply(fontWeightDelta: 2),
         ).tr(
           namedArgs: {
@@ -34,7 +34,7 @@ class ChartDiscoveriesCardContent extends StatelessWidget {
         const SizedBox(height: 8),
         this.isLoading
             ? Text(placeholder)
-            : ChartDiscoveries(
+            : ChartDiscoveriesTracks(
                 chartData: DiscoveriesData.fromJson(jsonDecode(this.chartData.toString())),
               ),
       ],
diff --git a/pubspec.yaml b/pubspec.yaml
index c6d571c..ad3eda2 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@ description: Display scrobbles data and charts
 
 publish_to: 'none'
 
-version: 0.0.26+26
+version: 0.0.27+27
 
 environment:
   sdk: '^3.0.0'
-- 
GitLab