v2.31 — Login, Einstellungen & Cloud Sync Redesign

- Login-Screen im Melo-Design (Schwarz+Rot) mit Baka-Auth JWT
- AuthService fuer Token-Management ueber baka-net.de/auth
- Registrierungs-Modus + 'Ohne Login fortfahren'
- Navidrome-Credentials optional im Login aufklappbar

- SettingsScreen ersetzt AlertDialog
- BottomNav navigiert statt Dialog zu triggern
- Cloud Sync, Server verbinden, Diagnosedaten, App-Info, Abmelden

- CloudEinstellungen-Dialog entfernt, alles in CloudScreen konsolidiert
- Hardcode login('Baka','') entfernt → AuthService.benutzer
- Gradient-Statuskarte, animierte Segment-Intervall-Auswahl
- JWT Authorization statt Klartext-Passwort

- AppConfig: API-Key defaultValue entfernt (kein Fallback-Leak)
- Build crasht ohne --dart-define MELO_API_KEY

Build: split APK (arm64 19.6M, armeabi 17.1M, x86_64 21.1M)
This commit is contained in:
Dustin
2026-08-01 15:03:22 +02:00
parent 77a20422be
commit 36c744d6e3
77 changed files with 5211 additions and 1067 deletions
+8 -48
View File
@@ -12,7 +12,6 @@ class SongTile extends StatelessWidget {
final ValueChanged<Song> onPlay;
final VoidCallback onMetadataChanged;
final ValueChanged<Song>? onAddToPlaylist;
final ValueChanged<Song>? onDelete;
const SongTile({
super.key,
@@ -22,7 +21,6 @@ class SongTile extends StatelessWidget {
required this.onPlay,
required this.onMetadataChanged,
this.onAddToPlaylist,
this.onDelete,
});
@override
@@ -64,19 +62,14 @@ class SongTile extends StatelessWidget {
),
InkWell(
borderRadius: BorderRadius.circular(50),
onTap: () {
// Guard gegen null-ID (defensive)
final id = song.id;
if (id == null) return;
showDialog(
context: context,
builder: (_) => TagAuswahlDialog(
songId: id,
songTitel: song.titel,
onChanged: onMetadataChanged,
),
);
},
onTap: () => showDialog(
context: context,
builder: (_) => TagAuswahlDialog(
songId: song.id!,
songTitel: song.titel,
onChanged: onMetadataChanged,
),
),
child: Padding(
padding: const EdgeInsets.all(6),
child: const Icon(Icons.label_outline, size: 14, color: MeloTheme.textSekundaer),
@@ -106,39 +99,6 @@ class SongTile extends StatelessWidget {
],
),
onTap: hatDatei ? () => onPlay(song) : null,
onLongPress: onDelete != null ? () {
showModalBottomSheet(
context: context,
backgroundColor: MeloTheme.dunkel1,
builder: (ctx) => SafeArea(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
leading: const Icon(Icons.edit, color: Colors.white),
title: const Text('Bearbeiten', style: TextStyle(color: Colors.white)),
onTap: () async {
Navigator.pop(ctx);
final geaendert = await showDialog<bool>(
context: context,
builder: (_) => MetadatenDialog(song: song),
);
if (geaendert == true) onMetadataChanged();
},
),
ListTile(
leading: const Icon(Icons.delete, color: Colors.red),
title: const Text('Löschen', style: TextStyle(color: Colors.red)),
onTap: () {
Navigator.pop(ctx);
onDelete!(song);
},
),
],
),
),
);
} : null,
);
}
}