diff --git a/lib/screens/cloud_screen.dart b/lib/screens/cloud_screen.dart index 8d4c208..ecd61a8 100644 --- a/lib/screens/cloud_screen.dart +++ b/lib/screens/cloud_screen.dart @@ -43,7 +43,10 @@ class _CloudScreenState extends State { Future _verbindeCloud() async { final user = AuthService().benutzer; if (user.isNotEmpty) { - await widget.cloud.login(user); + final ok = await widget.cloud.login(user); + if (!ok && mounted) { + setState(() => _setzeStatus('Cloud-Login fehlgeschlagen', ok: false)); + } } } @@ -91,6 +94,7 @@ class _CloudScreenState extends State { Future _upload() async { setState(() => _ladt = true); _setzeStatus('Suche lokale Songs...'); + try { final dir = Directory('${(await getApplicationDocumentsDirectory()).path}/music'); if (!await dir.exists()) { setState(() { _ladt = false; _setzeStatus('Keine lokalen Songs', ok: false); }); @@ -110,11 +114,16 @@ class _CloudScreenState extends State { _setzeStatus('$count Songs hochgeladen', ok: count > 0); MeloLogger().aktion('cloud_upload', {'count': count}); } + } catch (e) { + MeloLogger().fehler('cloud_upload_path', e); + if (mounted) setState(() { _ladt = false; _setzeStatus('Fehler beim Upload', ok: false); }); + } } Future _download() async { - setState(() => _ladt = true); + setState(() { _ladt = true; }); _setzeStatus('Vergleiche mit Server...'); + try { final dir = Directory('${(await getApplicationDocumentsDirectory()).path}/music'); if (!await dir.exists()) await dir.create(recursive: true); final localFiles = dir.listSync().whereType() @@ -122,7 +131,7 @@ class _CloudScreenState extends State { final serverSongs = await widget.cloud.listSongs(); int downloaded = 0; for (final song in serverSongs) { - final title = song['title'].toString(); + final title = (song['title'] ?? 'unknown').toString(); if (localFiles.contains(title)) continue; _setzeStatus('Download: $title...'); final sid = song['id'].toString(); @@ -135,6 +144,10 @@ class _CloudScreenState extends State { _setzeStatus('$downloaded Songs heruntergeladen', ok: true); MeloLogger().aktion('cloud_download', {'count': downloaded}); } + } catch (e) { + MeloLogger().fehler('cloud_download_path', e); + if (mounted) setState(() { _ladt = false; _setzeStatus('Fehler beim Download', ok: false); }); + } } void _setzeStatus(String msg, {bool ok = false}) { diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index d03970d..60e9474 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -9,7 +9,6 @@ import '../widgets/melo_header.dart'; import '../widgets/statistik_card.dart'; import '../widgets/tag_leiste.dart'; import '../widgets/song_tile.dart'; -import '../widgets/navidrome_browser.dart'; import '../widgets/playlist_sheet.dart'; import 'download_screen.dart'; import 'cloud_screen.dart'; diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 0840bd9..c50fe45 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import '../config/app_config.dart'; import '../utils/farb_theme.dart'; import 'cloud_screen.dart'; @@ -15,6 +16,17 @@ class SettingsScreen extends StatefulWidget { class _SettingsScreenState extends State { bool _diagnose = AppConfig.sendeDiagnosedaten; + @override + void initState() { + super.initState(); + _ladeDiagnose(); + } + + Future _ladeDiagnose() async { + final p = await SharedPreferences.getInstance(); + if (mounted) setState(() => _diagnose = p.getBool('diagnose_daten') ?? AppConfig.sendeDiagnosedaten); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -84,9 +96,11 @@ class _SettingsScreenState extends State { ), value: _diagnose, activeThumbColor: MeloTheme.rot, - onChanged: (v) { + onChanged: (v) async { setState(() => _diagnose = v); AppConfig.sendeDiagnosedaten = v; + final p = await SharedPreferences.getInstance(); + p.setBool('diagnose_daten', v); }, secondary: const Icon(Icons.bug_report_outlined, color: MeloTheme.rot, size: 22), ), diff --git a/lib/services/auth_service.dart b/lib/services/auth_service.dart index 8023c2d..f46eb70 100644 --- a/lib/services/auth_service.dart +++ b/lib/services/auth_service.dart @@ -21,10 +21,15 @@ class AuthService { String? get token => _token; /// Auth-Header für API-Requests - Map get authHeader => { - 'Authorization': 'Bearer ${_token ?? ''}', - 'Content-Type': 'application/json', - }; + Map get authHeader { + final headers = { + 'Content-Type': 'application/json', + }; + if (_token != null && _token!.isNotEmpty) { + headers['Authorization'] = 'Bearer $_token'; + } + return headers; + } /// Lädt gespeicherten Token beim App-Start Future initialisieren() async {