From 0e8ce0e70d01357ad82c474426353f732b4a5bf8 Mon Sep 17 00:00:00 2001 From: Ellen Poe Date: Wed, 10 Dec 2025 16:28:45 -0800 Subject: [PATCH] feat: new design for search results screen (no card) --- .../java/earth/maps/cardinal/ui/core/AppContent.kt | 8 ++++++-- .../maps/cardinal/ui/directions/DirectionsScreen.kt | 9 ++++++--- .../java/earth/maps/cardinal/ui/home/HomeScreen.kt | 13 ++++++++++--- .../earth/maps/cardinal/ui/place/SearchResults.kt | 10 +++++++--- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/core/AppContent.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/core/AppContent.kt index 6a6c2dc..619e9b0 100644 --- a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/core/AppContent.kt +++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/core/AppContent.kt @@ -34,12 +34,14 @@ import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.isImeVisible import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.safeContent import androidx.compose.foundation.layout.safeDrawing @@ -1305,7 +1307,9 @@ private fun HomeScreenComposable( } -@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) +@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class, + ExperimentalLayoutApi::class +) @Composable fun CardinalAppScaffold( scaffoldState: BottomSheetScaffoldState, @@ -1322,7 +1326,7 @@ fun CardinalAppScaffold( val handleHeight = 48.dp // If toolbar is visible, add padding for it below the scaffold - val bottomPadding = if (showToolbar) TOOLBAR_HEIGHT_DP else 0.dp + val bottomPadding = if (showToolbar && !WindowInsets.isImeVisible) TOOLBAR_HEIGHT_DP else 0.dp Box(modifier = Modifier.fillMaxSize()) { BottomSheetScaffold( diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsScreen.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsScreen.kt index fc594c6..fc42a7b 100644 --- a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsScreen.kt +++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/directions/DirectionsScreen.kt @@ -30,10 +30,10 @@ import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.ime import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button @@ -72,6 +72,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.max import androidx.navigation.NavController import earth.maps.cardinal.R.dimen import earth.maps.cardinal.R.drawable @@ -92,6 +93,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import org.maplibre.spatialk.geojson.BoundingBox import uniffi.ferrostar.Route +import kotlin.math.max enum class FieldFocusState { NONE, FROM, TO @@ -128,8 +130,9 @@ fun DirectionsScreen( val coroutineScope = rememberCoroutineScope() - val bottomPadding = with(LocalDensity.current) { - WindowInsets.safeDrawing.getBottom(this).toDp() + val bottomPadding: Dp = with(LocalDensity.current) { + // TODO: Find out if there's a way to get the safe drawing insets without the IME insets. + max(0, WindowInsets.safeDrawing.getBottom(this) - WindowInsets.ime.getBottom(this)).toDp() } LaunchedEffect(Unit) { diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/HomeScreen.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/HomeScreen.kt index 90e6d10..63af46b 100644 --- a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/HomeScreen.kt +++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/HomeScreen.kt @@ -31,6 +31,7 @@ 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.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions @@ -312,10 +313,13 @@ private fun ContentBelow( if (homeInSearchScreen) { LazyColumn { - items(geocodePlaces) { + itemsIndexed(geocodePlaces) { index, place -> + if (index != 0) { + HorizontalDivider(modifier = Modifier.fillMaxWidth()) + } SearchResultItem( addressFormatter = addressFormatter, - it, + place, onPlaceSelected ) } @@ -332,7 +336,10 @@ private fun ContentBelow( } else { LazyColumn { // Show recent searches if any. - items(recentSearches.value) { recentSearch -> + itemsIndexed(recentSearches.value) { index, recentSearch -> + if (index != 0) { + HorizontalDivider(modifier = Modifier.fillMaxWidth()) + } SearchResultItem( addressFormatter = addressFormatter, place = viewModel.searchToPlace(recentSearch), diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/place/SearchResults.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/place/SearchResults.kt index d205d3c..2dbf3e5 100644 --- a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/place/SearchResults.kt +++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/place/SearchResults.kt @@ -28,8 +28,10 @@ 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.foundation.lazy.itemsIndexed import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -60,7 +62,10 @@ fun SearchResults( ) { val addressFormatter = remember { AddressFormatter() } LazyColumn(modifier = modifier) { - items(places) { place -> + itemsIndexed(places) { index, place -> + if (index != 0) { + HorizontalDivider(modifier = Modifier.fillMaxWidth()) + } SearchResultItem( addressFormatter = addressFormatter, place = place, @@ -121,7 +126,7 @@ fun SearchResultItem( onPlaceSelected: (Place) -> Unit, onRemoveTapped: (() -> Unit)? = null, ) { - Card( + Box( modifier = Modifier .fillMaxWidth() .padding(bottom = dimensionResource(dimen.padding)) @@ -129,7 +134,6 @@ fun SearchResultItem( // Convert GeocodeResult to Place with a unique ID based on properties onPlaceSelected(place) }, - elevation = CardDefaults.cardElevation(defaultElevation = 2.dp) ) { Row( modifier = Modifier -- GitLab