diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/routing/RouteResult.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/routing/RouteResult.kt
deleted file mode 100644
index 1fae56b588cdaa4ec6f035f4e1a782b2a27ba339..0000000000000000000000000000000000000000
--- a/cardinal-android/app/src/main/java/earth/maps/cardinal/routing/RouteResult.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Cardinal Maps
- * Copyright (C) 2025 Cardinal Maps Authors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package earth.maps.cardinal.routing
-
-data class RouteResult(
- val distance: Double, // in meters or as specified by units
- val duration: Double, // in seconds
- val legs: List,
- val geometry: RouteGeometry,
- val units: String = "kilometers" // or "miles"
-)
-
-data class RouteLeg(
- val summary: String,
- val distance: Double,
- val duration: Double,
- val steps: List
-)
-
-data class RouteStep(
- val distance: Double,
- val duration: Double,
- val instruction: String,
- val name: String,
- val geometry: RouteGeometry,
-)
-
-data class RouteGeometry(
- val type: String = "LineString",
- val coordinates: List> // [longitude, latitude] pairs
-)
-
-data class Maneuver(
- val location: List, // [longitude, latitude]
- val bearingBefore: Double,
- val bearingAfter: Double,
- val type: String,
- val modifier: String? = null,
- val instruction: String
-)
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 1fdea8f85773cd2a9ab33990597ba167c9ee37de..6a6c2dc744f342ad57b2b66a0c56100ade5fd30d 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
@@ -547,7 +547,9 @@ private fun NearbyPoiRoute(
rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState)
CardinalAppScaffold(
- scaffoldState = scaffoldState, peekHeight = state.screenHeightDp / 3,
+ scaffoldState = scaffoldState,
+ peekHeight = state.screenHeightDp / 3,
+ showToolbar = true,
content = {
NearbyScreenContent(viewModel = nearbyViewModel, onPlaceSelected = {
NavigationUtils.navigate(navController, Screen.PlaceCard(it))
@@ -579,7 +581,9 @@ private fun NearbyTransitRoute(
rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState)
CardinalAppScaffold(
- scaffoldState = scaffoldState, peekHeight = state.screenHeightDp / 3,
+ scaffoldState = scaffoldState,
+ peekHeight = state.screenHeightDp / 3,
+ showToolbar = true,
content = {
TransitScreenContent(viewModel = transitViewModel, onRouteClicked = {
NavigationUtils.navigate(navController, Screen.PlaceCard(it))
@@ -834,6 +838,7 @@ private fun OfflineAreasRoute(
state.fabHeight = it
}
},
+ showToolbar = true,
content = { snackBarHostState ->
OfflineAreasScreen(
currentViewport = visibleRegion,
@@ -1240,6 +1245,7 @@ private fun HomeScreenComposable(
onFabHeightChange(it)
}
},
+ showToolbar = true,
content = {
HomeScreen(
viewModel = viewModel,
@@ -1306,7 +1312,7 @@ fun CardinalAppScaffold(
peekHeight: Dp,
content: @Composable (SnackbarHostState) -> Unit,
fabHeightCallback: (Dp) -> Unit,
- showToolbar: Boolean = true,
+ showToolbar: Boolean,
) {
val density = LocalDensity.current
val snackBarHostState = remember { SnackbarHostState() }
@@ -1326,7 +1332,7 @@ fun CardinalAppScaffold(
sheetBackgroundColor = BottomSheetDefaults.ContainerColor,
sheetContent = {
Column(
- modifier = Modifier.onGloballyPositioned {
+ modifier = Modifier.padding(bottom = bottomPadding).onGloballyPositioned {
fabHeightCallback(with(density) { it.positionInRoot().y.toDp() })
}) {
Box(
@@ -1338,7 +1344,6 @@ fun CardinalAppScaffold(
}
content(snackBarHostState)
}
- Spacer(modifier = Modifier.height(bottomInset))
},
content = {})
}
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 fd043399efcf332215fe69cc1218273158fd0402..fc594c6d32ef4c0be49d759d7e08f8f1fa8790ed 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
@@ -25,10 +25,15 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+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.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
@@ -61,6 +66,7 @@ import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
@@ -122,6 +128,10 @@ fun DirectionsScreen(
val coroutineScope = rememberCoroutineScope()
+ val bottomPadding = with(LocalDensity.current) {
+ WindowInsets.safeDrawing.getBottom(this).toDp()
+ }
+
LaunchedEffect(Unit) {
// Run this in our coroutine scope rather than viewModelScope.
viewModel.initializeRoutingMode()
@@ -153,7 +163,7 @@ fun DirectionsScreen(
Column(
modifier = Modifier
.fillMaxSize()
- .padding(horizontal = dimensionResource(dimen.padding))
+ .padding(start = dimensionResource(dimen.padding), end = dimensionResource(dimen.padding), bottom = bottomPadding)
) {
if (isAnyFieldFocused) {
DirectionsScreenFocusedField(
diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/NearbyScreen.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/NearbyScreen.kt
index 125616b00a1bbd3f005127ba7120ebff8b8cf888..73db2822e155e2f6276acaf8bc73a5df74b5c1a2 100644
--- a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/NearbyScreen.kt
+++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/NearbyScreen.kt
@@ -25,10 +25,12 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
+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.padding
+import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
@@ -52,6 +54,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
@@ -71,10 +74,14 @@ fun NearbyScreenContent(viewModel: NearbyViewModel, onPlaceSelected: (Place) ->
val error by viewModel.error.collectAsState()
val addressFormatter = remember { AddressFormatter() }
+ val bottomPadding = with(LocalDensity.current) {
+ WindowInsets.safeDrawing.getBottom(this).toDp()
+ }
+
Column(
modifier = Modifier
.fillMaxSize()
- .padding(horizontal = dimensionResource(dimen.padding))
+ .padding(start = dimensionResource(dimen.padding), end = dimensionResource(dimen.padding), bottom = bottomPadding)
.onGloballyPositioned { coordinates ->
// This would normally update peek height, but for nearby content
// we don't need special peek height management like other screens
diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/TransitScreen.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/TransitScreen.kt
index 6311a5619e2426504d051d13618239559e511cd2..e0d38c01cb2d0f676264acf8360f5f3ae3f30640 100644
--- a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/TransitScreen.kt
+++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/TransitScreen.kt
@@ -32,10 +32,12 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
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.fillMaxWidth
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.pager.HorizontalPager
@@ -60,6 +62,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
@@ -99,6 +102,10 @@ fun TransitScreenContent(
val departures by viewModel.departures.collectAsState(emptyList())
val use24HourFormat by viewModel.use24HourFormat.collectAsState()
+ val bottomPadding = with(LocalDensity.current) {
+ WindowInsets.safeDrawing.getBottom(this).toDp()
+ }
+
LaunchedEffect(secondsSinceStart) {
if (secondsSinceStart % 30 == 0 && secondsSinceStart > 0) {
viewModel.refreshData()
@@ -112,7 +119,7 @@ fun TransitScreenContent(
.padding(
start = dimensionResource(dimen.padding),
end = dimensionResource(dimen.padding),
- bottom = 36.dp
+ bottom = bottomPadding,
)
) {
DeparturesHeader(viewModel, coroutineScope, isRefreshingDepartures.value)