Loading cardinal-android/app/src/main/java/earth/maps/cardinal/ui/navigation/NavigationChrome.kt +44 −1 Original line number Original line Diff line number Diff line Loading @@ -7,6 +7,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color Loading @@ -14,6 +16,9 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp 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.config.NavigationViewComponentBuilder import com.stadiamaps.ferrostar.composeui.models.CameraControlState import com.stadiamaps.ferrostar.composeui.models.CameraControlState import com.stadiamaps.ferrostar.composeui.theme.DefaultInstructionRowTheme import com.stadiamaps.ferrostar.composeui.theme.DefaultInstructionRowTheme Loading @@ -27,7 +32,16 @@ import com.stadiamaps.ferrostar.composeui.views.components.CurrentRoadNameView import com.stadiamaps.ferrostar.composeui.views.components.InstructionsView import com.stadiamaps.ferrostar.composeui.views.components.InstructionsView import com.stadiamaps.ferrostar.composeui.views.components.TripProgressView import com.stadiamaps.ferrostar.composeui.views.components.TripProgressView import com.stadiamaps.ferrostar.core.NavigationUiState import com.stadiamaps.ferrostar.core.NavigationUiState import dagger.hilt.android.lifecycle.HiltViewModel 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.ExperimentalTime import kotlin.time.Instant object CardinalNavigationUITheme : NavigationUITheme { object CardinalNavigationUITheme : NavigationUITheme { override val instructionRowTheme: InstructionRowTheme override val instructionRowTheme: InstructionRowTheme Loading Loading @@ -89,12 +103,15 @@ fun CardinalProgressView( uiState: NavigationUiState, uiState: NavigationUiState, onTapExit: (() -> Unit)? onTapExit: (() -> Unit)? ) { ) { val viewModel: ProgressViewModel = hiltViewModel() val now by viewModel.now.collectAsState() uiState.progress?.let { progress -> uiState.progress?.let { progress -> TripProgressView( TripProgressView( modifier = modifier, modifier = modifier, theme = CardinalNavigationUITheme.tripProgressViewTheme, theme = CardinalNavigationUITheme.tripProgressViewTheme, progress = progress, progress = progress, onTapExit = onTapExit onTapExit = onTapExit, fromDate = now, ) ) } } } } Loading Loading @@ -148,3 +165,29 @@ fun navigationViewComponentBuilder(): NavigationViewComponentBuilder { }, }, ) ) } } @OptIn(ExperimentalTime::class) @HiltViewModel class ProgressViewModel @Inject constructor(): ViewModel() { val now = MutableStateFlow(Clock.System.now()) private var cleared = false init { viewModelScope.launch { while (!cleared) { now.value = Clock.System.now() delay(DELAY) } } } override fun onCleared() { cleared = true super.onCleared() } companion object { private val DELAY = 5.seconds } } Loading
cardinal-android/app/src/main/java/earth/maps/cardinal/ui/navigation/NavigationChrome.kt +44 −1 Original line number Original line Diff line number Diff line Loading @@ -7,6 +7,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color Loading @@ -14,6 +16,9 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp 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.config.NavigationViewComponentBuilder import com.stadiamaps.ferrostar.composeui.models.CameraControlState import com.stadiamaps.ferrostar.composeui.models.CameraControlState import com.stadiamaps.ferrostar.composeui.theme.DefaultInstructionRowTheme import com.stadiamaps.ferrostar.composeui.theme.DefaultInstructionRowTheme Loading @@ -27,7 +32,16 @@ import com.stadiamaps.ferrostar.composeui.views.components.CurrentRoadNameView import com.stadiamaps.ferrostar.composeui.views.components.InstructionsView import com.stadiamaps.ferrostar.composeui.views.components.InstructionsView import com.stadiamaps.ferrostar.composeui.views.components.TripProgressView import com.stadiamaps.ferrostar.composeui.views.components.TripProgressView import com.stadiamaps.ferrostar.core.NavigationUiState import com.stadiamaps.ferrostar.core.NavigationUiState import dagger.hilt.android.lifecycle.HiltViewModel 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.ExperimentalTime import kotlin.time.Instant object CardinalNavigationUITheme : NavigationUITheme { object CardinalNavigationUITheme : NavigationUITheme { override val instructionRowTheme: InstructionRowTheme override val instructionRowTheme: InstructionRowTheme Loading Loading @@ -89,12 +103,15 @@ fun CardinalProgressView( uiState: NavigationUiState, uiState: NavigationUiState, onTapExit: (() -> Unit)? onTapExit: (() -> Unit)? ) { ) { val viewModel: ProgressViewModel = hiltViewModel() val now by viewModel.now.collectAsState() uiState.progress?.let { progress -> uiState.progress?.let { progress -> TripProgressView( TripProgressView( modifier = modifier, modifier = modifier, theme = CardinalNavigationUITheme.tripProgressViewTheme, theme = CardinalNavigationUITheme.tripProgressViewTheme, progress = progress, progress = progress, onTapExit = onTapExit onTapExit = onTapExit, fromDate = now, ) ) } } } } Loading Loading @@ -148,3 +165,29 @@ fun navigationViewComponentBuilder(): NavigationViewComponentBuilder { }, }, ) ) } } @OptIn(ExperimentalTime::class) @HiltViewModel class ProgressViewModel @Inject constructor(): ViewModel() { val now = MutableStateFlow(Clock.System.now()) private var cleared = false init { viewModelScope.launch { while (!cleared) { now.value = Clock.System.now() delay(DELAY) } } } override fun onCleared() { cleared = true super.onCleared() } companion object { private val DELAY = 5.seconds } }