Loading cardinal-android/app/src/main/java/earth/maps/cardinal/ui/navigation/NavigationChrome.kt +29 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 ) } Loading @@ -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, ) } Loading Loading @@ -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 { Loading Loading
cardinal-android/app/src/main/java/earth/maps/cardinal/ui/navigation/NavigationChrome.kt +29 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 ) } Loading @@ -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, ) } Loading Loading @@ -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 { Loading