Doppelten Scan-Button auf Android entfernen (Musik scannen und Erneut scannen taten dasselbe)

This commit is contained in:
Hermes (Server)
2026-08-27 15:18:36 +02:00
parent 94a48675b1
commit 1b096f5227
4 changed files with 58 additions and 10 deletions
+17
View File
@@ -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
+7
View File
@@ -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.
+13 -10
View File
@@ -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<SettingsScreen> {
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,
),
],
),
),
+21
View File
@@ -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);
});
});
}