import 'package:flutter/foundation.dart'; /// Erkennt von allein, wenn sich der Musikbestand des Geräts geändert hat — /// etwa weil Dateien per Kabel übertragen oder heruntergeladen wurden — und /// stößt dann einen Scan an. /// /// Bewusst nur ein Zählvergleich: der Scan selbst ist der teure Teil und soll /// nicht bei jedem Wechsel in den Vordergrund laufen. Werden gleich viele /// Titel gelöscht wie hinzugefügt, merkt das erst der nächste Scan von Hand. class AutoScan { AutoScan({ required this.geraeteAnzahl, required this.bekannteAnzahl, required this.scanne, this.mindestAbstand = const Duration(minutes: 5), DateTime Function()? jetzt, }) : _jetzt = jetzt ?? DateTime.now; /// Wie viele Musikdateien das Gerät meldet. final Future Function() geraeteAnzahl; /// Wie viele Titel die Bibliothek kennt. final Future Function() bekannteAnzahl; final Future Function() scanne; /// So lange wird nach einer Prüfung gar nicht erst wieder gezählt. final Duration mindestAbstand; final DateTime Function() _jetzt; DateTime? _zuletzt; bool _laeuft = false; /// Prüft, ob sich etwas geändert hat, und scannt gegebenenfalls. /// Gibt zurück, ob ein Scan angestoßen wurde. Future pruefe() async { if (_laeuft) return false; final jetzt = _jetzt(); final zuletzt = _zuletzt; if (zuletzt != null && jetzt.difference(zuletzt) < mindestAbstand) { return false; } _zuletzt = jetzt; _laeuft = true; try { final auf = await geraeteAnzahl(); final bekannt = await bekannteAnzahl(); if (auf == bekannt) return false; await scanne(); return true; } catch (e) { // Kein Grund, die App zu stören — der Knopf zum Scannen bleibt ja da. debugPrint('Automatische Erkennung fehlgeschlagen: $e'); return false; } finally { _laeuft = false; } } }