From b2bfe9655908b9a5f3856b0d352e465460c78bd4 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Wed, 3 Jun 2026 17:33:01 -0400 Subject: [PATCH] ui(android): LazyColumn stable keys for in-place output picker row continuity Co-Authored-By: Claude Sonnet 4.6 --- .../player/output/OutputPickerSheet.kt | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/output/OutputPickerSheet.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/output/OutputPickerSheet.kt index 173fcb46..4a9039c3 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/output/OutputPickerSheet.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/output/OutputPickerSheet.kt @@ -4,8 +4,11 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -69,12 +72,19 @@ fun OutputPickerSheet( color = MaterialTheme.colorScheme.onSurface, modifier = Modifier.padding(vertical = 8.dp), ) - snapshot.available.forEach { route -> - RouteRow( - route = route, - isSelected = route.id == snapshot.current.id, - onClick = { onRouteSelected(route) }, - ) + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .heightIn(max = ROUTE_LIST_MAX_HEIGHT_DP.dp), + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { + items(items = snapshot.available, key = { it.id }) { route -> + RouteRow( + route = route, + isSelected = route.id == snapshot.current.id, + onClick = { onRouteSelected(route) }, + ) + } } if (permissionDenied) { PermissionHintRow() @@ -198,3 +208,4 @@ private fun defaultSubtitle(route: OutputRoute): String = when (route.kind) { private const val ROW_ICON_DP = 24 private const val HINT_ICON_DP = 20 +private const val ROUTE_LIST_MAX_HEIGHT_DP = 400