diff --git a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/navigation/NavigationChrome.kt b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/navigation/NavigationChrome.kt index fa65527097ccb857c0472588dcf625c981d1bedf..ac41b22290bb600f9f180e952a69340ac76fb4d1 100644 --- a/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/navigation/NavigationChrome.kt +++ b/cardinal-android/app/src/main/java/earth/maps/cardinal/ui/navigation/NavigationChrome.kt @@ -9,6 +9,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -20,6 +21,8 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.stadiamaps.ferrostar.composeui.config.NavigationViewComponentBuilder +import com.stadiamaps.ferrostar.composeui.formatting.DistanceMeasurementSystem +import com.stadiamaps.ferrostar.composeui.formatting.LocalizedDistanceFormatter import com.stadiamaps.ferrostar.composeui.models.CameraControlState import com.stadiamaps.ferrostar.composeui.theme.DefaultInstructionRowTheme import com.stadiamaps.ferrostar.composeui.theme.DefaultRoadNameViewTheme @@ -33,15 +36,15 @@ import com.stadiamaps.ferrostar.composeui.views.components.InstructionsView import com.stadiamaps.ferrostar.composeui.views.components.TripProgressView import com.stadiamaps.ferrostar.core.NavigationUiState import dagger.hilt.android.lifecycle.HiltViewModel +import earth.maps.cardinal.data.AppPreferenceRepository +import earth.maps.cardinal.data.AppPreferences import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import javax.inject.Inject -import javax.inject.Singleton import kotlin.time.Clock import kotlin.time.Duration.Companion.seconds import kotlin.time.ExperimentalTime -import kotlin.time.Instant object CardinalNavigationUITheme : NavigationUITheme { override val instructionRowTheme: InstructionRowTheme @@ -85,12 +88,22 @@ object CardinalTripProgressViewTheme : TripProgressViewTheme { @Composable fun CardinalInstructionsView(modifier: Modifier, uiState: NavigationUiState) { + val viewModel: NavigationChromeViewModel = hiltViewModel() + val distanceUnit by viewModel.distanceUnits.collectAsState() + val distanceMeasurementSystem = if (distanceUnit == AppPreferences.DISTANCE_UNIT_METRIC) { + DistanceMeasurementSystem.SI + } else { + DistanceMeasurementSystem.IMPERIAL + } + val formatter = remember(distanceMeasurementSystem) { LocalizedDistanceFormatter(distanceMeasurementSystemOverride = distanceMeasurementSystem) } + uiState.visualInstruction?.let { instructions -> InstructionsView( modifier = modifier, instructions = instructions, theme = CardinalNavigationUITheme.instructionRowTheme, remainingSteps = uiState.remainingSteps, + distanceFormatter = formatter, distanceToNextManeuver = uiState.progress?.distanceToNextManeuver ) } @@ -103,14 +116,22 @@ fun CardinalProgressView( uiState: NavigationUiState, onTapExit: (() -> Unit)? ) { - val viewModel: ProgressViewModel = hiltViewModel() + val viewModel: NavigationChromeViewModel = hiltViewModel() val now by viewModel.now.collectAsState() + val distanceUnit by viewModel.distanceUnits.collectAsState() + val distanceMeasurementSystem = if (distanceUnit == AppPreferences.DISTANCE_UNIT_METRIC) { + DistanceMeasurementSystem.SI + } else { + DistanceMeasurementSystem.IMPERIAL + } + val distanceFormatter = remember(distanceMeasurementSystem) { LocalizedDistanceFormatter(distanceMeasurementSystemOverride = distanceMeasurementSystem) } uiState.progress?.let { progress -> TripProgressView( modifier = modifier, theme = CardinalNavigationUITheme.tripProgressViewTheme, progress = progress, onTapExit = onTapExit, + distanceFormatter = distanceFormatter, fromDate = now, ) } @@ -168,9 +189,13 @@ fun navigationViewComponentBuilder(): NavigationViewComponentBuilder { @OptIn(ExperimentalTime::class) @HiltViewModel -class ProgressViewModel @Inject constructor(): ViewModel() { +class NavigationChromeViewModel @Inject constructor( + appPreferences: AppPreferenceRepository +): ViewModel() { val now = MutableStateFlow(Clock.System.now()) + val distanceUnits = appPreferences.distanceUnit + private var cleared = false init {