Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5bdecc0 authored by Ellen Poe's avatar Ellen Poe
Browse files

fix: respect user-set distance unit in navigation

parent cfe122aa
Loading
Loading
Loading
Loading
Loading
+29 −4
Original line number Diff line number Diff line
@@ -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 {