diff --git a/CHANGELOG.md b/CHANGELOG.md index 5246691..8a956c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,9 +105,15 @@ Die Android-App zählt eigenständig weiter (mehrere APKs pro Release). Welche d Inhalt ist mindestens so hoch wie die Seite — passt er, wird er zentriert; passt er nicht, wächst er darüber hinaus und der Rollbereich hat etwas zu rollen. Die Wischgeste zum Schließen bleibt erhalten, weil ein Rollbereich ohne Weg die Geste nicht verbraucht. - - Entschieden wird nach **Maßen, nicht nach Gerätenamen**: `schmal` unter 400 dp Breite, - `kurz` unter 560 dp Höhe. Damit greift es auf Fold zugeklappt, Flip-Frontdisplay, Tablet, - Querformat und geteiltem Bildschirm gleichermaßen. + - Entschieden wird nach **Maßen, nicht nach Gerätenamen**: `kurz` unter 560 dp Höhe, + `schmal` unter 356 dp Breite (oder kurz). Damit greift es auf Fold zugeklappt, + Flip-Frontdisplay, Tablet, Querformat und geteiltem Bildschirm gleichermaßen. + - **Auf einem gewöhnlichen Handy ändert sich nichts.** Die Schwellen liegen bewusst außerhalb + dessen, was Handys im Hochformat messen (360–448 dp breit, 700 dp und mehr hoch): dort ist + weiterhin die Breite das engste Maß, das Cover also exakt so groß wie bisher, der Aufbau + oben beginnend mit 28 dp Abstand und die Kopfzeile unverändert. Senkrecht zentriert wird + nur, wenn eine der neuen Grenzen wirklich greift. Der Rollbereich liegt auf jeder Anzeige + darunter, hat aber bei passendem Inhalt den Weg null und verhält sich wie keiner. ## [3.2] — 2026-10-01 diff --git a/android/app/src/main/kotlin/com/novasonic/app/ui/screen/NowPlayingScreen.kt b/android/app/src/main/kotlin/com/novasonic/app/ui/screen/NowPlayingScreen.kt index cc5db41..154e537 100644 --- a/android/app/src/main/kotlin/com/novasonic/app/ui/screen/NowPlayingScreen.kt +++ b/android/app/src/main/kotlin/com/novasonic/app/ui/screen/NowPlayingScreen.kt @@ -192,7 +192,11 @@ fun NowPlayingScreen( // Zwei Groessenfragen entscheiden das Layout, nicht ein Geraetename: // schmal — passt die Kopfzeile mit drei Reitern noch in voller Groesse? (Flip-Deckel) // kurz — bleibt nach Kopfzeile und Raendern ueberhaupt Platz? (Flip-Deckel, Querformat) - val schmal = maxWidth < 400.dp + // Die Schwelle liegt bewusst UNTER 360 dp: 360 ist noch ein gewoehnliches Handy und + // soll die Kopfzeile unveraendert behalten. Erfasst werden damit der Deckel eines Fold + // (~352 dp) und — ueber `kurz` — das Frontdisplay eines Flip, das bei aehnlicher Breite + // nur ein Drittel der Hoehe hat und wo drei Reiter in voller Groesse nicht hinpassen. + val schmal = maxWidth < 356.dp || maxHeight < 560.dp val kurz = maxHeight < 560.dp val obenPad = if (kurz) maxOf(statusBarTop + 4.dp, 20.dp) else topPad Column( @@ -317,20 +321,29 @@ fun NowPlayingScreen( // aeusseren Messrahmens nicht mehr erreichbar (Compose sperrt gleich markierte // Layout-Bereiche gegeneinander ab). val seitenHoehe = maxHeight + // Greift ueberhaupt eine der neuen Grenzen? Nur dann weicht das Layout von dem + // ab, was ein hohes Handy bisher zeigte. Solange die BREITE das engste Mass ist + // — also auf jedem gewoehnlichen Handy —, bleibt es beim alten Aufbau: oben + // beginnend mit 28 dp Abstand. Erst wenn Hoehe oder Obergrenze beissen (Fold + // aufgeklappt, Tablet, Querformat), wird senkrecht zentriert; oben klebend mit + // einem Loch darunter saehe dort falsch aus. + val gedeckelt = coverKante < maxWidth - 48.dp || kurz - // Passt es, wird zentriert; passt es nicht, wird gescrollt. Beides mit einem - // Aufbau: der Inhalt ist mindestens so hoch wie die Seite (dann greift - // Arrangement.Center), darf aber darueber hinauswachsen — dann hat der - // Rollbereich etwas zu rollen. Auf dem Frontdisplay eines Flip bleibt sonst - // nichts uebrig, was ohne Abschneiden darstellbar waere. + // Passt es, wird es angeordnet wie oben beschrieben; passt es nicht, wird + // gescrollt. Beides mit einem Aufbau: der Inhalt ist mindestens so hoch wie die + // Seite, darf aber darueber hinauswachsen — dann hat der Rollbereich etwas zu + // rollen. Auf dem Frontdisplay eines Flip bleibt sonst nichts uebrig, was ohne + // Abschneiden darstellbar waere. Passt alles, ist der Rollweg null: dann + // verhaelt sich die Seite wie ohne Rollbereich. // Die Wischgeste zum Schliessen bleibt erhalten: ein Rollbereich ohne Weg // verbraucht die Geste nicht, sie erreicht also weiter die Seite darunter. Box(Modifier.fillMaxSize().verticalScroll(rememberScrollState())) { Column( horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, + verticalArrangement = if (gedeckelt) Arrangement.Center else Arrangement.Top, modifier = Modifier.fillMaxWidth().heightIn(min = seitenHoehe), ) { + if (!gedeckelt) Spacer(Modifier.height(28.dp)) // Cover art — gedeckelt, scale-animates like Apple Music AsyncImage( model = coverUrl,