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

Commit 435c335c authored by Ellen Poe's avatar Ellen Poe
Browse files

feat: new navigation overlay views

parent d78c17d6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ import earth.maps.cardinal.routing.RouteRepository
import earth.maps.cardinal.ui.directions.DirectionsScreen
import earth.maps.cardinal.ui.directions.DirectionsViewModel
import earth.maps.cardinal.ui.directions.RouteDisplayHandler
import earth.maps.cardinal.ui.directions.TurnByTurnNavigationScreen
import earth.maps.cardinal.ui.navigation.TurnByTurnNavigationScreen
import earth.maps.cardinal.ui.home.HomeScreen
import earth.maps.cardinal.ui.home.HomeViewModel
import earth.maps.cardinal.ui.home.NearbyScreenContent
+95 −0
Original line number Diff line number Diff line
package earth.maps.cardinal.ui.navigation

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.stadiamaps.ferrostar.composeui.config.NavigationViewComponentBuilder
import com.stadiamaps.ferrostar.composeui.models.CameraControlState
import com.stadiamaps.ferrostar.composeui.theme.DefaultNavigationUITheme
import com.stadiamaps.ferrostar.composeui.views.components.CurrentRoadNameView
import com.stadiamaps.ferrostar.composeui.views.components.InstructionsView
import com.stadiamaps.ferrostar.composeui.views.components.TripProgressView
import com.stadiamaps.ferrostar.core.NavigationUiState
import kotlin.time.ExperimentalTime

@Composable
fun CardinalInstructionsView(modifier: Modifier, uiState: NavigationUiState) {
    uiState.visualInstruction?.let { instructions ->
        InstructionsView(
            modifier = modifier,
            instructions = instructions,
            theme = DefaultNavigationUITheme.instructionRowTheme,
            remainingSteps = uiState.remainingSteps,
            distanceToNextManeuver = uiState.progress?.distanceToNextManeuver)
    }
}

@OptIn(ExperimentalTime::class)
@Composable
fun CardinalProgressView(
    modifier: Modifier,
    uiState: NavigationUiState,
    onTapExit: (() -> Unit)?
) {
    uiState.progress?.let { progress ->
        TripProgressView(
            modifier = modifier,
            theme = DefaultNavigationUITheme.tripProgressViewTheme,
            progress = progress,
            onTapExit = onTapExit)
    }
}

@Composable
fun CardinalRoadNameView(
    modifier: Modifier,
    roadName: String?,
    cameraControlState: CameraControlState
) {
    if (cameraControlState is CameraControlState.ShowRouteOverview) {
        roadName?.let { roadName ->
            Row(
                modifier.fillMaxWidth(),
                verticalAlignment = Alignment.Bottom,
                horizontalArrangement = Arrangement.Center) {
                CurrentRoadNameView(
                    modifier = modifier,
                    theme = DefaultNavigationUITheme.roadNameViewTheme,
                    currentRoadName = roadName)

                Spacer(modifier = Modifier.height(8.dp))
            }
        }
    }
}

fun navigationViewComponentBuilder(): NavigationViewComponentBuilder {
    return NavigationViewComponentBuilder(
        instructionsView = @Composable { modifier, navigationUiState ->
            CardinalInstructionsView(
                modifier,
                navigationUiState
            )
        },
        progressView = @Composable { modifier, navigationUiState, onTapExit ->
            CardinalProgressView(
                modifier,
                navigationUiState,
                onTapExit
            )
        },
        roadNameView = @Composable { modifier, roadName, cameraControlState ->
            CardinalRoadNameView(
                modifier,
                roadName,
                cameraControlState
            )
        },
    )
}
+5 −2
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@
 *     along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package earth.maps.cardinal.ui.directions
package earth.maps.cardinal.ui.navigation

import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Box
@@ -107,7 +107,10 @@ fun TurnByTurnNavigationScreen(
        // Only display the navigation view if we have a route
        if (route != null) {
            DynamicallyOrientingNavigationView(
                styleUrl = styleUrl, modifier = Modifier, viewModel = viewModel
                styleUrl = styleUrl,
                modifier = Modifier,
                viewModel = viewModel,
                views = navigationViewComponentBuilder()
            )
        } else {
            // Show a placeholder or loading state when no route is available
+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@
 *     along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package earth.maps.cardinal.ui.directions
package earth.maps.cardinal.ui.navigation

import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
package earth.maps.cardinal.ui.directions

import earth.maps.cardinal.routing.FerrostarWrapperRepository
import earth.maps.cardinal.ui.navigation.TurnByTurnNavigationViewModel
import io.mockk.mockk
import org.junit.Assert.assertEquals
import org.junit.Before