From 1b096f52277f3dba293c480921e4762acbacee73 Mon Sep 17 00:00:00 2001 From: "Hermes (Server)" Date: Thu, 27 Aug 2026 15:18:36 +0200 Subject: [PATCH] Doppelten Scan-Button auf Android entfernen (Musik scannen und Erneut scannen taten dasselbe) --- CHANGELOG.md | 17 +++++++++++++++++ lib/library/library_service.dart | 7 +++++++ lib/settings/settings_screen.dart | 23 +++++++++++++---------- test/library/library_service_test.dart | 21 +++++++++++++++++++++ 4 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 test/library/library_service_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d6c055..82555e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.0.0/). ## [Unreleased] +### 🔄 Doppelten Scan-Button auf Android entfernt (2026-08-27) + +- 🐛 **In den Einstellungen gab es auf Android zwei Buttons fĂŒr dieselbe + Aktion** ("Musik scannen" und "Erneut scannen") — beide riefen dort + denselben gerĂ€teweiten MediaStore-Scan auf (`LibraryService. + pickFolderAndScan()` und `.rescan()` sind auf Android identisch, da + Scoped Storage keine Ordnerwahl erlaubt). Nur auf Desktop unterscheiden + sie sich echt (Ordner hinzufĂŒgen vs. bekannte Ordner erneut scannen). +- 🔧 **Fix:** Der zweite `ListTile` ("Erneut scannen") wird in + `settings_screen.dart` nur noch angezeigt, wenn `zeigeErneutScannenButton + (Platform.isAndroid)` das zulĂ€sst. Die Sichtbarkeits-Entscheidung ist als + pure Funktion in `library_service.dart` ausgelagert (statt direkt + `Platform.isAndroid` in der UI abzufragen), weil sich die echte Plattform + in Flutter-Tests nicht sauber auf "Android" umschalten lĂ€sst. +- ✅ **Getestet:** 2 neue Unit-Tests fĂŒr `zeigeErneutScannenButton` (RED→ + GREEN), volle Suite (592 Tests) grĂŒn, `flutter analyze` ohne Befund. + ### 🎧 Song antippen öffnet den Vollbild-Player (2026-08-27) - 🐛 **Ein Song antippen öffnete frĂŒher nur die Wiedergabe, ohne zum diff --git a/lib/library/library_service.dart b/lib/library/library_service.dart index ca142a6..30f1ebd 100644 --- a/lib/library/library_service.dart +++ b/lib/library/library_service.dart @@ -13,6 +13,13 @@ import 'scan_service.dart'; String get addMusicLabel => Platform.isAndroid ? 'Musik scannen' : 'Musikordner hinzufĂŒgen'; +/// Ob der "Erneut scannen"-Button zusĂ€tzlich zum [addMusicLabel]-Button +/// angezeigt wird. Auf Android tun [LibraryService.pickFolderAndScan] und +/// [LibraryService.rescan] dasselbe (kompletter MediaStore-Scan) — dort +/// reicht ein Button. Pure Funktion statt direkter [Platform.isAndroid]- +/// Abfrage, damit sie unabhĂ€ngig von der echten Plattform testbar ist. +bool zeigeErneutScannenButton(bool isAndroid) => !isAndroid; + /// Koordiniert Ordnerwahl und Scans; hĂ€lt den Scan-Fortschritt fĂŒr die UI. /// Android scannt automatisch ĂŒber MediaStore (Scoped Storage lĂ€sst keinen /// direkten Dateizugriff zu); Desktop scannt vom Nutzer gewĂ€hlte Ordner. diff --git a/lib/settings/settings_screen.dart b/lib/settings/settings_screen.dart index f77b984..7aa9e24 100644 --- a/lib/settings/settings_screen.dart +++ b/lib/settings/settings_screen.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:provider/provider.dart'; @@ -103,16 +105,17 @@ class _SettingsScreenState extends State { enabled: !lib.scanning, onTap: lib.pickFolderAndScan, ), - ListTile( - leading: const Icon(Icons.refresh), - title: const Text('Erneut scannen'), - subtitle: lib.scanning - ? Text('Scanne 
 ${lib.scanDone}' - '${lib.scanTotal > 0 ? ' / ${lib.scanTotal}' : ''}') - : const Text('Bekannte Ordner neu einlesen'), - enabled: !lib.scanning, - onTap: lib.rescan, - ), + if (zeigeErneutScannenButton(Platform.isAndroid)) + ListTile( + leading: const Icon(Icons.refresh), + title: const Text('Erneut scannen'), + subtitle: lib.scanning + ? Text('Scanne 
 ${lib.scanDone}' + '${lib.scanTotal > 0 ? ' / ${lib.scanTotal}' : ''}') + : const Text('Bekannte Ordner neu einlesen'), + enabled: !lib.scanning, + onTap: lib.rescan, + ), ], ), ), diff --git a/test/library/library_service_test.dart b/test/library/library_service_test.dart new file mode 100644 index 0000000..ccf64e8 --- /dev/null +++ b/test/library/library_service_test.dart @@ -0,0 +1,21 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:melo/library/library_service.dart'; + +// Bug (Tinker): Auf Android zeigten die Einstellungen zwei Buttons mit +// identischer Aufgabe ("Musik scannen" und "Erneut scannen") — beide riefen +// auf Android denselben GerĂ€te-weiten MediaStore-Scan auf. Die Sichtbarkeit +// des zweiten Buttons hĂ€ngt eigentlich von Platform.isAndroid ab, das sich +// in Tests nicht sauber auf "Android" umschalten lĂ€sst — deshalb ist die +// Entscheidung hier als pure, plattformunabhĂ€ngig testbare Funktion +// ausgelagert. +void main() { + group('zeigeErneutScannenButton', () { + test('auf Android ausgeblendet (identisch zu "Musik scannen")', () { + expect(zeigeErneutScannenButton(true), isFalse); + }); + + test('auf Desktop angezeigt (echter Unterschied: bekannte Ordner erneut scannen)', () { + expect(zeigeErneutScannenButton(false), isTrue); + }); + }); +}