From 7cdcc352d6050abaf41abe4938936fb757b6551c Mon Sep 17 00:00:00 2001 From: marc Date: Tue, 13 Oct 2026 19:04:38 +0200 Subject: [PATCH] fix(android): Handy-Layout im Now-Playing unangetastet lassen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nachtrag zu 6248329: zwei der Aenderungen hatten doch Wirkung auf gewoehnliche Handys. 1. Senkrechte Zentrierung galt fuer alle Anzeigen und verschob den Block auf einem hohen Handy um etwa 60 dp nach unten. Jetzt wird nur zentriert, wenn eine der neuen Grenzen wirklich greift (Hoehe oder 400-dp-Deckel); solange die Breite das engste Mass ist, bleibt es beim alten Aufbau samt 28 dp Abstand oben. 2. Die Schwelle fuer die kompakte Kopfzeile lag bei 400 dp und erfasste damit jedes uebliche Handy. Jetzt 356 dp oder kurze Anzeige — also Fold-Deckel und Flip-Frontdisplay, nicht aber ein 360- oder 384-dp-Handy. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 12 ++++++--- .../app/ui/screen/NowPlayingScreen.kt | 27 ++++++++++++++----- 2 files changed, 29 insertions(+), 10 deletions(-) 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,