Cover-Farbe, Teilen aus YouTube, Android Auto, geschärfte Typografie
P3-Liste aus dem UX-Review: Player nimmt Cover-Farbe auf, "Teilen" aus YouTube trägt die Adresse in den Downloader ein, Android Auto blättert durch die Bibliothek, Laufweite der Typografie geschärft, Überschriften vereinheitlicht. 533 Tests grün, flutter analyze ohne Befund.
This commit is contained in:
+29
-1
@@ -22,6 +22,7 @@ import 'player/mini_player.dart';
|
||||
import 'services/baka_auth.dart';
|
||||
import 'services/logger_service.dart';
|
||||
import 'services/download_service.dart';
|
||||
import 'services/geteilte_adresse.dart';
|
||||
import 'services/melo_cloud_service.dart';
|
||||
import 'services/offline_mode.dart';
|
||||
import 'services/navidrome_service.dart';
|
||||
@@ -61,6 +62,12 @@ Future<void> main() async {
|
||||
androidNotificationChannelName: 'Melo',
|
||||
androidNotificationOngoing: true,
|
||||
androidShowNotificationBadge: true,
|
||||
// Android Auto zeigt die oberste Ebene als Reiter statt als Liste —
|
||||
// vier Ordner passen dort gut hin.
|
||||
androidBrowsableRootExtras: {
|
||||
'android.media.browse.CONTENT_STYLE_BROWSABLE_HINT': 2,
|
||||
'android.media.browse.CONTENT_STYLE_PLAYABLE_HINT': 1,
|
||||
},
|
||||
),
|
||||
);
|
||||
_effects = AudioEffects();
|
||||
@@ -143,6 +150,9 @@ class _HomeShellState extends State<HomeShell> with WidgetsBindingObserver {
|
||||
int _index = 0;
|
||||
late final AutoScan _autoScan;
|
||||
|
||||
/// Adresse aus einem „Teilen"-Aufruf, die der Downloader übernehmen soll.
|
||||
String? _geteilteAdresse;
|
||||
|
||||
void _goTo(int index) => setState(() => _index = index);
|
||||
|
||||
@override
|
||||
@@ -160,6 +170,18 @@ class _HomeShellState extends State<HomeShell> with WidgetsBindingObserver {
|
||||
// Geräten sind dann sofort da.
|
||||
context.read<SyncService>().automatisch();
|
||||
unawaited(_frageBenachrichtigungsRecht(context.read<MeloAudioHandler>()));
|
||||
unawaited(_pruefeGeteilteAdresse());
|
||||
}
|
||||
|
||||
/// Sieht nach, ob die App über „Teilen" mit einer Adresse geöffnet wurde,
|
||||
/// und wechselt dann in den Download-Bereich.
|
||||
Future<void> _pruefeGeteilteAdresse() async {
|
||||
final adresse = await const GeteilteAdresse().abholen();
|
||||
if (adresse == null || !mounted) return;
|
||||
setState(() {
|
||||
_geteilteAdresse = adresse;
|
||||
_index = 1;
|
||||
});
|
||||
}
|
||||
|
||||
/// Fragt das Recht auf die Wiedergabe-Benachrichtigung, sobald der erste
|
||||
@@ -192,6 +214,9 @@ class _HomeShellState extends State<HomeShell> with WidgetsBindingObserver {
|
||||
if (state == AppLifecycleState.resumed) {
|
||||
if (Platform.isAndroid) _autoScan.pruefe();
|
||||
context.read<SyncService>().automatisch();
|
||||
// Ein zweites Teilen startet die App nicht neu (singleTop), sondern
|
||||
// bringt sie nur nach vorn — deshalb auch hier nachsehen.
|
||||
unawaited(_pruefeGeteilteAdresse());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,7 +227,10 @@ class _HomeShellState extends State<HomeShell> with WidgetsBindingObserver {
|
||||
onSearchTap: () => _goTo(2),
|
||||
onFavoritesTap: () => _goTo(3),
|
||||
),
|
||||
const DownloadsScreen(),
|
||||
DownloadsScreen(
|
||||
adresse: _geteilteAdresse,
|
||||
onAdresseUebernommen: () => setState(() => _geteilteAdresse = null),
|
||||
),
|
||||
const SearchScreen(),
|
||||
const FavoritesScreen(),
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user