From 7efa2685be97e822982a7b43060d3ee5cdd5b730 Mon Sep 17 00:00:00 2001 From: Dimitris Date: Tue, 6 Jan 2026 08:25:27 +0100 Subject: [PATCH] Lanes --- .../com/kouros/navigation/ui/MainActivity.kt | 12 +- .../kouros/navigation/ui/NavigationSheet.kt | 13 +- .../navigation/car/NavigationSession.kt | 8 +- .../car/navigation/RouteCarModel.kt | 102 ++++++++++-- .../java/com/kouros/navigation/data/Data.kt | 7 +- .../navigation/data/NavigationRepository.kt | 4 +- .../kouros/navigation/data/osrm/OsrmRoute.kt | 11 +- .../com/kouros/navigation/data/route/Lane.kt | 3 + .../com/kouros/navigation/model/RouteModel.kt | 154 +++++++++++------- .../main/res/drawable/lanes_leftleftssr.png | Bin 5872 -> 0 bytes .../data/src/main/res/drawable/lanes_ssr.png | Bin 1277 -> 0 bytes .../drawable/{left_valid.png => left_o.png} | Bin ...right_not_valid.png => left_o_right_x.png} | Bin .../main/res/drawable/left_o_straight_x.png | Bin 0 -> 881 bytes .../{left_not_valid.png => left_x.png} | Bin .../main/res/drawable/left_x_straight_o.png | Bin 0 -> 5265 bytes .../drawable/{right_valid.png => right_o.png} | Bin ...right_valid.png => right_o_straight_x.png} | Bin .../{right_not_valid.png => right_x.png} | Bin .../main/res/drawable/right_x_straight_x.png | Bin 0 -> 5240 bytes ...ght_right_valid.png => slight_right_o.png} | Bin ...right_not_valid.png => slight_right_x.png} | Bin .../{straight_valid.png => straight_o.png} | Bin ...{straight_not_valid.png => straight_x.png} | Bin 24 files changed, 226 insertions(+), 88 deletions(-) delete mode 100644 common/data/src/main/res/drawable/lanes_leftleftssr.png delete mode 100644 common/data/src/main/res/drawable/lanes_ssr.png rename common/data/src/main/res/drawable/{left_valid.png => left_o.png} (100%) rename common/data/src/main/res/drawable/{left_valid_right_not_valid.png => left_o_right_x.png} (100%) create mode 100644 common/data/src/main/res/drawable/left_o_straight_x.png rename common/data/src/main/res/drawable/{left_not_valid.png => left_x.png} (100%) create mode 100644 common/data/src/main/res/drawable/left_x_straight_o.png rename common/data/src/main/res/drawable/{right_valid.png => right_o.png} (100%) rename common/data/src/main/res/drawable/{straight_not_valid_right_valid.png => right_o_straight_x.png} (100%) rename common/data/src/main/res/drawable/{right_not_valid.png => right_x.png} (100%) create mode 100644 common/data/src/main/res/drawable/right_x_straight_x.png rename common/data/src/main/res/drawable/{slight_right_valid.png => slight_right_o.png} (100%) rename common/data/src/main/res/drawable/{slight_right_not_valid.png => slight_right_x.png} (100%) rename common/data/src/main/res/drawable/{straight_valid.png => straight_o.png} (100%) rename common/data/src/main/res/drawable/{straight_not_valid.png => straight_x.png} (100%) diff --git a/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt b/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt index f498476..24a2fde 100644 --- a/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt +++ b/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt @@ -47,7 +47,6 @@ import com.kouros.navigation.model.BaseStyleModel import com.kouros.navigation.model.MockLocation import com.kouros.navigation.model.RouteModel import com.kouros.navigation.ui.theme.NavigationTheme -import com.kouros.navigation.utils.GeoUtils.snapLocation import com.kouros.navigation.utils.NavigationUtils.getIntKeyValue import com.kouros.navigation.utils.bearing import com.kouros.navigation.utils.calculateZoom @@ -62,7 +61,6 @@ import org.maplibre.compose.location.Location import org.maplibre.compose.location.rememberDefaultLocationProvider import org.maplibre.compose.location.rememberUserLocationState import org.maplibre.compose.style.BaseStyle -import org.maplibre.geojson.Point import org.maplibre.spatialk.geojson.Position import kotlin.time.Duration.Companion.seconds @@ -222,6 +220,7 @@ class MainActivity : ComponentActivity() { SearchSheet(applicationContext, navigationViewModel, lastLocation) { closeSheet() } } else { NavigationSheet( + applicationContext, routeModel, step!!, nextStep!!, { stopNavigation { closeSheet() } }, { simulateNavigation() } @@ -274,7 +273,7 @@ class MainActivity : ComponentActivity() { closeSheet() routeModel.stopNavigation() routeData.value = "" - stepData.value = StepData("", 0.0, 0, 0, 0, 0.0) + stepData.value = StepData("", 0.0, 0, 0,0, 0.0) } fun simulateNavigation() { @@ -310,8 +309,11 @@ class MainActivity : ComponentActivity() { if (routeModel.isNavigating()) { for ((index, waypoint) in routeModel.route.waypoints!!.withIndex()) { var deviation = 0.0 - mock.setMockLocation(waypoint[1] + deviation, waypoint[0]) - delay(500L) // + //if (index in 0..350 ) { + mock.setMockLocation(waypoint[1] + deviation, waypoint[0]) + + delay(500L) // + // } } } } diff --git a/app/src/main/java/com/kouros/navigation/ui/NavigationSheet.kt b/app/src/main/java/com/kouros/navigation/ui/NavigationSheet.kt index 2795cdb..fff0ee5 100755 --- a/app/src/main/java/com/kouros/navigation/ui/NavigationSheet.kt +++ b/app/src/main/java/com/kouros/navigation/ui/NavigationSheet.kt @@ -1,20 +1,20 @@ +import android.content.Context import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.size import androidx.compose.material3.Button import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.Text -import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.kouros.data.R +import com.kouros.navigation.data.Constants.NEXT_STEP_THRESHOLD import com.kouros.navigation.data.StepData import com.kouros.navigation.model.RouteModel import com.kouros.navigation.utils.formatDateTime @@ -23,6 +23,7 @@ import com.kouros.navigation.utils.round @Composable fun NavigationSheet( + applicationContext: Context, routeModel: RouteModel, step: StepData, nextStep: StepData, @@ -30,6 +31,14 @@ fun NavigationSheet( simulateNavigation: () -> Unit, ) { val distance = step.leftDistance.round(1) + + step.lane.forEach { + if (it.indications.isNotEmpty()) { + routeModel.createLaneIcon(applicationContext, step) + } + } + + Column { FlowRow(horizontalArrangement = Arrangement.SpaceEvenly) { Text(formatDateTime(step.arrivalTime), fontSize = 22.sp) diff --git a/common/car/src/main/java/com/kouros/navigation/car/NavigationSession.kt b/common/car/src/main/java/com/kouros/navigation/car/NavigationSession.kt index 791c882..fa043e3 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/NavigationSession.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/NavigationSession.kt @@ -55,9 +55,9 @@ class NavigationSession : Session(), NavigationScreen.Listener { var mLocationListener: LocationListenerCompat = LocationListenerCompat { location: Location? -> val routingEngine = getIntKeyValue(carContext, ROUTING_ENGINE) - if (routingEngine == RouteEngine.VALHALLA.ordinal) { +// if (routingEngine == RouteEngine.VALHALLA.ordinal) { updateLocation(location!!) - } + // } } private val mLifeCycleObserver: LifecycleObserver = object : DefaultLifecycleObserver { @@ -97,7 +97,9 @@ class NavigationSession : Session(), NavigationScreen.Listener { OnCarDataAvailableListener { data -> if (data.location.status == CarValue.STATUS_SUCCESS) { val location = data.location.value - surfaceRenderer.updateCarLocation(location!!) + if (location != null) { + updateLocation(location) + } } } diff --git a/common/car/src/main/java/com/kouros/navigation/car/navigation/RouteCarModel.kt b/common/car/src/main/java/com/kouros/navigation/car/navigation/RouteCarModel.kt index 2aadf31..3badba5 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/navigation/RouteCarModel.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/navigation/RouteCarModel.kt @@ -36,9 +36,12 @@ import androidx.car.app.navigation.model.Step import androidx.car.app.navigation.model.TravelEstimate import androidx.core.graphics.drawable.IconCompat import com.kouros.data.R +import com.kouros.navigation.data.StepData import com.kouros.navigation.model.RouteModel +import java.util.Collections import java.util.TimeZone import java.util.concurrent.TimeUnit +import kotlin.text.trim /** A class that provides models for the routing demos. */ class RouteCarModel() : RouteModel() { @@ -48,23 +51,16 @@ class RouteCarModel() : RouteModel() { val stepData = currentStep() val currentStepCueWithImage: SpannableString = createString(stepData.instruction) - val straightNormal = - Lane.Builder() - .addDirection(LaneDirection.create(LaneDirection.SHAPE_STRAIGHT, false)) - .build() val step = Step.Builder(currentStepCueWithImage) .setManeuver( - Maneuver.Builder(stepData.maneuverType) + Maneuver.Builder(stepData.currentManeuverType) .setIcon(createCarIcon(carContext, stepData.icon)) .build() ) .setRoad(routeState.destination.street!!) - stepData.lane.forEach { - if (it.indications.isNotEmpty() ) { - step.setLanesImage(createCarIcon(createLaneIcon(carContext, stepData))) - step.addLane(straightNormal) - } + if (stepData.lane.isNotEmpty()) { + addLanes(carContext, step, stepData) } return step.build() } @@ -77,7 +73,7 @@ class RouteCarModel() : RouteModel() { val step = Step.Builder(currentStepCueWithImage) .setManeuver( - Maneuver.Builder(stepData.maneuverType) + Maneuver.Builder(stepData.currentManeuverType) .setIcon(createCarIcon(carContext, stepData.icon)) .build() ) @@ -121,6 +117,90 @@ class RouteCarModel() : RouteModel() { return travelBuilder.build() } + fun addLanes(carContext: CarContext, step: Step.Builder, stepData: StepData) { + var laneImageAdded = false + stepData.lane.forEach { + if (it.indications.isNotEmpty() && it.valid) { + Collections.sort(it.indications) + var direction = "" + it.indications.forEach { it2 -> + direction = if (direction.isEmpty()) { + it2.trim() + } else { + "${direction}_${it2.trim()}" + } + } + val laneDirection = when (direction) { + "left_straight" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_NORMAL_LEFT -> LaneDirection.SHAPE_NORMAL_LEFT + Maneuver.TYPE_STRAIGHT -> LaneDirection.SHAPE_STRAIGHT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + "left" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_NORMAL_LEFT -> LaneDirection.SHAPE_NORMAL_LEFT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + "straight" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_STRAIGHT -> LaneDirection.SHAPE_STRAIGHT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + "right" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_NORMAL_RIGHT -> LaneDirection.SHAPE_NORMAL_RIGHT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + "right_straight" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_NORMAL_RIGHT -> LaneDirection.SHAPE_NORMAL_RIGHT + Maneuver.TYPE_STRAIGHT -> LaneDirection.SHAPE_STRAIGHT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + "left_slight" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_SLIGHT_LEFT -> LaneDirection.SHAPE_SLIGHT_LEFT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + "right_slight" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_SLIGHT_RIGHT-> LaneDirection.SHAPE_NORMAL_RIGHT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + else -> { + LaneDirection.SHAPE_UNKNOWN + } + } + if (laneDirection != LaneDirection.SHAPE_UNKNOWN) { + if (!laneImageAdded) { + step.setLanesImage(createCarIcon(createLaneIcon(carContext, stepData))) + laneImageAdded = true + } + val laneType = + Lane.Builder() + .addDirection(LaneDirection.create(laneDirection, false)) + .build() + step.addLane(laneType) + } + } + } + } + fun createString( text: String ): SpannableString { diff --git a/common/data/src/main/java/com/kouros/navigation/data/Data.kt b/common/data/src/main/java/com/kouros/navigation/data/Data.kt index ea3ea24..a61ef08 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/Data.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/Data.kt @@ -20,6 +20,7 @@ import android.location.Location import android.location.LocationManager import android.net.Uri import com.kouros.navigation.data.route.Lane +import com.kouros.navigation.utils.location import io.objectbox.annotation.Entity import io.objectbox.annotation.Id import kotlinx.serialization.Serializable @@ -58,7 +59,7 @@ data class StepData ( var leftStepDistance: Double, - var maneuverType: Int, + var currentManeuverType: Int, var icon: Int, @@ -66,7 +67,7 @@ data class StepData ( var leftDistance: Double, - var lane: List = listOf(Lane(valid = false, indications = emptyList())), + var lane: List = listOf(Lane(location(0.0, 0.0), valid = false, indications = emptyList())), ) @@ -176,7 +177,7 @@ object Constants { const val ROUTING_ENGINE = "RoutingEngine" - const val NEXT_STEP_THRESHOLD = 100.0 + const val NEXT_STEP_THRESHOLD = 120.0 const val MAXIMAL_SNAP_CORRECTION = 50.0 diff --git a/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt b/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt index 9b5ac38..0909648 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt @@ -30,7 +30,9 @@ import kotlinx.serialization.json.Json abstract class NavigationRepository { - private val nominatimUrl = "https://nominatim.openstreetmap.org/" + //private val nominatimUrl = "https://nominatim.openstreetmap.org/" + + private val nominatimUrl = "https://kouros-online.de/nominatim/" abstract fun getRoute(currentLocation: Location, location: Location, searchFilter: SearchFilter): String diff --git a/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRoute.kt b/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRoute.kt index 0d56293..71d1cff 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRoute.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRoute.kt @@ -9,6 +9,7 @@ import com.kouros.navigation.data.route.Step import com.kouros.navigation.data.route.Summary import com.kouros.navigation.utils.GeoUtils.createLineStringCollection import com.kouros.navigation.utils.GeoUtils.decodePolyline +import com.kouros.navigation.utils.location class OsrmRoute { @@ -34,8 +35,14 @@ class OsrmRoute { if (it2.location[0] != 0.0) { val lanes = mutableListOf() it2.lanes.forEach { it3 -> - val lane = Lane(it3.valid, it3.indications) - lanes.add(lane) + if (it3.indications.isNotEmpty() && it3.indications.first() != "none") { + val lane = Lane( + location(it2.location[0], it2.location[1]), + it3.valid, + it3.indications + ) + lanes.add(lane) + } } intersections.add(Intersection(it2.location, lanes)) } diff --git a/common/data/src/main/java/com/kouros/navigation/data/route/Lane.kt b/common/data/src/main/java/com/kouros/navigation/data/route/Lane.kt index a8f0fb8..38039c2 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/route/Lane.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/route/Lane.kt @@ -1,6 +1,9 @@ package com.kouros.navigation.data.route +import android.location.Location + data class Lane ( + val location: Location, val valid: Boolean, var indications: List, ) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt b/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt index fa42b8e..f8087f0 100644 --- a/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt +++ b/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt @@ -28,6 +28,7 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking +import java.util.Collections import java.util.concurrent.TimeUnit import kotlin.math.roundToInt @@ -44,7 +45,7 @@ open class RouteModel() { val maxSpeed: Int = 0, val location: Location = location(0.0, 0.0), val lastLocation: Location = location(0.0, 0.0), - val bearing : Float = 0F + val bearing: Float = 0F ) var routeState = RouteState() @@ -104,7 +105,8 @@ open class RouteModel() { step.waypointIndex = wayIndex step.wayPointLocation = location(waypoint[0], waypoint[1]) val bearing = routeState.lastLocation.bearingTo(location) - this.routeState = routeState.copy(lastLocation = location, bearing = bearing) + this.routeState = + routeState.copy(lastLocation = location, bearing = bearing) } } if (nearestDistance == 0F) { @@ -174,15 +176,15 @@ open class RouteModel() { if (shouldAdvance) { maneuverType = relevantStep.maneuver.type } - val maneuverIconPair = maneuverIcon(maneuverType) - routeState = routeState.copy(maneuverType = maneuverIconPair.first) + val maneuverIcon = maneuverIcon(maneuverType) + routeState = routeState.copy(maneuverType = maneuverType) // Construct and return the final StepData object val intersection = currentIntersection(routeState.location) return StepData( streetName, distanceToNextStep, - maneuverIconPair.first, - maneuverIconPair.second, + maneuverType, + maneuverIcon, arrivalTime(), travelLeftDistance(), intersection.lane @@ -206,13 +208,13 @@ open class RouteModel() { } } - val routing: (Pair) = maneuverIcon(maneuverType) + val maneuverIcon = maneuverIcon(maneuverType) // Construct and return the final StepData object return StepData( text, distanceLeft, - routing.first, - routing.second, + maneuverType, + maneuverIcon, arrivalTime(), travelLeftDistance() ) @@ -247,13 +249,15 @@ open class RouteModel() { /** Returns the current [Step] left distance in m. */ fun leftStepDistance(): Double { val step = route.currentStep() - var leftDistance = step.distance - val percent = - 100 * (step.maneuver.waypoints.size - step.waypointIndex) / (step.maneuver.waypoints.size) - leftDistance = leftDistance * percent / 100 - // The remaining distance to the step, rounded to the nearest 10 units. - return (leftDistance * 1000 / 10.0).roundToInt() * 10.0 - + var leftDistance = 0.0 + for (i in step.waypointIndex..) { + fun maneuverIcon(routeManeuverType: Int): Int { var currentTurnIcon = R.drawable.ic_turn_name_change when (routeManeuverType) { Maneuver.TYPE_STRAIGHT -> { @@ -304,9 +302,11 @@ open class RouteModel() { Maneuver.TYPE_KEEP_RIGHT -> { currentTurnIcon = R.drawable.ic_turn_name_change } + Maneuver.TYPE_KEEP_LEFT -> { currentTurnIcon = R.drawable.ic_turn_name_change } + Maneuver.TYPE_ROUNDABOUT_ENTER_CCW -> { currentTurnIcon = R.drawable.ic_roundabout_ccw } @@ -316,7 +316,7 @@ open class RouteModel() { currentTurnIcon = R.drawable.ic_roundabout_ccw } } - return Pair(routeManeuverType, currentTurnIcon) + return currentTurnIcon } fun isNavigating(): Boolean { @@ -333,31 +333,30 @@ open class RouteModel() { fun createLaneIcon(context: Context, stepData: StepData): IconCompat { val bitmaps = mutableListOf() stepData.lane.forEach { - if (it.indications.isNotEmpty()) { - it.indications.forEach { it2 -> - val resource = laneToResource(it2, it, stepData) - if (it2 != "none") { - println("Direction $resource") - if (resource.isNotEmpty()) { - val id = resourceId( resource); - val bitMap = BitmapFactory.decodeResource(context.resources, id) - bitmaps.add(bitMap) - } - } + if (it.indications.isNotEmpty() && it.valid) { + Collections.sort(it.indications) + val resource = laneToResource(it.indications, stepData) + if (resource.isNotEmpty()) { + val id = resourceId(resource); + val bitMap = BitmapFactory.decodeResource(context.resources, id) + bitmaps.add(bitMap) } } } - return IconCompat.createWithBitmap(overlay(bitmaps = bitmaps)) + return if (bitmaps.isEmpty()) { + IconCompat.createWithResource(context, R.drawable.ic_close_white_24dp) + } else { + IconCompat.createWithBitmap(overlay(bitmaps = bitmaps)) + } } - fun overlay(bitmaps: List): Bitmap { val matrix = Matrix() if (bitmaps.size == 1) { return bitmaps.first() } val bmOverlay = createBitmap( - bitmaps.first().getWidth() * bitmaps.size, + bitmaps.first().getWidth() * (bitmaps.size) , bitmaps.first().getHeight(), bitmaps.first().getConfig()!! ) @@ -366,7 +365,7 @@ open class RouteModel() { var i = 0 bitmaps.forEach { if (i > 0) { - matrix.setTranslate(i * 40F, 0F) + matrix.setTranslate(i * 45F, 0F) canvas.drawBitmap(it, matrix, null) } i++ @@ -374,33 +373,66 @@ open class RouteModel() { return bmOverlay } - private fun laneToResource(direction: String, lane: Lane, stepData: StepData): String { - println("Maneuver ${stepData.maneuverType}") - return when (val direction = direction.replace(" ", "_")) { - "left" -> if (stepData.maneuverType == Maneuver.TYPE_TURN_NORMAL_LEFT) "${direction}_valid" else "${direction}_not_valid" - "right" -> if (stepData.maneuverType == Maneuver.TYPE_TURN_NORMAL_RIGHT) "${direction}_valid" else "${direction}_not_valid" - "straight" -> if (stepData.maneuverType == Maneuver.TYPE_STRAIGHT) "${direction}_valid" else "${direction}_not_valid" - "slight_right" -> if (stepData.maneuverType == Maneuver.TYPE_TURN_SLIGHT_RIGHT) "${direction}_valid" else "${direction}_not_valid" - "slight_left" -> if (stepData.maneuverType == Maneuver.TYPE_TURN_SLIGHT_LEFT) "${direction}_valid" else "${direction}_not_valid" - else -> {""} + private fun laneToResource(directions: List, stepData: StepData): String { + var direction = "" + directions.forEach { + direction = if (direction.isEmpty()) { + it.trim() + } else { + "${direction}_${it.trim()}" + } + } + return when (direction) { + "left_straight" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_NORMAL_LEFT -> "left_o_straight_x" + Maneuver.TYPE_STRAIGHT -> "left_x_straight_o" + else + -> "left_x_straight_x" + } + } + + "right_straight" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_NORMAL_RIGHT -> "right_x_straight_x" + Maneuver.TYPE_STRAIGHT -> "right_x_straight_o" + Maneuver.TYPE_TURN_SLIGHT_RIGHT -> "right_o_straight_o" + else + -> "right_x_straight_x" + } + } + + "left" -> if (stepData.currentManeuverType == Maneuver.TYPE_TURN_NORMAL_LEFT) "${direction}_o" else "${direction}_x" + "straight" -> if (stepData.currentManeuverType == Maneuver.TYPE_STRAIGHT) "${direction}_o" else "${direction}_x" + "right_slight" -> if (stepData.currentManeuverType == Maneuver.TYPE_TURN_SLIGHT_RIGHT) "${direction}_o" else "${direction}_x" + "left_slight" -> if (stepData.currentManeuverType == Maneuver.TYPE_TURN_SLIGHT_LEFT) "${direction}_o" else "${direction}_x" + else -> { + "" + } } } fun resourceId( variableName: String, ): Int { - return when(variableName) { - "left_not_valid" -> R.drawable.left_not_valid - "left_valid" -> R.drawable.left_valid - "left_valid_right_not_valid" -> R.drawable.left_valid_right_not_valid - "right_not_valid" -> R.drawable.right_not_valid - "right_valid" -> R.drawable.right_valid - "slight_right_not_valid" -> R.drawable.slight_right_not_valid - "slight_right_valid" -> R.drawable.slight_right_valid - "straight_not_valid" -> R.drawable.straight_not_valid - "straight_not_valid_right_valid" -> R.drawable.straight_not_valid_right_valid - "straight_valid" -> R.drawable.straight_valid - else -> {R.drawable.ic_close_white_24dp} + return when (variableName) { + "left_x" -> R.drawable.left_x + "left_o" -> R.drawable.left_o + "left_o_right_x" -> R.drawable.left_o_right_x + "right_x" -> R.drawable.right_x + "right_o" -> R.drawable.right_o + "slight_right_x" -> R.drawable.slight_right_x + "slight_right_o" -> R.drawable.slight_right_o + "straight_x" -> R.drawable.straight_x + "right_o_straight_x" -> R.drawable.right_o_straight_x + "right_x_straight_x" -> R.drawable.right_x_straight_x + "right_x_straight_o" -> R.drawable.right_x_straight_x + "straight_o" -> R.drawable.straight_o + "left_o_straight_x" -> R.drawable.left_o_straight_x + "left_x_straight_o" -> R.drawable.left_x_straight_o + else -> { + R.drawable.ic_close_white_24dp + } } } diff --git a/common/data/src/main/res/drawable/lanes_leftleftssr.png b/common/data/src/main/res/drawable/lanes_leftleftssr.png deleted file mode 100644 index 3eb99212893dc05dc91259d2e167b6e11e71936d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5872 zcmeHKdo+~m8lU#wluIh5Tz2g-wcEs)J7zMvxI`Jb=9bGhGv8b?H)GtTQz4X6%4LwY zYhfc2PTCaPy@*IDn$#8&vMbri`DS!o=d5*BYn}67v(|Tc-}m?Y-skx}&->2%#oF2K zSgNS02!p|vT3eYrK+hED(qHlebjKxBw?L0)p-!$M2OtP85b_yp4hR>82tYU(%x1t~ z!S~|r`}+iKmciIiiCzI(vqJOt_8Dqq z`hO>?-Zmh&Bxz9MC*eQ<%!WoPl7ghSr3E9yKnr|d^)e^wgRXa6*H zLjSeASQ2nSsqq{J23v$+o0-{Jo0)xx8;UkPBjMuCdb?H8wNAGjMssvxtmN+;X9!C- z{jg2DQE^W`-uhxnLqg7~!8)T`M@HaFem`7zsC+(NMTIeST{3T+K0W{1i*?sJCF$tj z2@Ge+?40DuWUE(1cAMc^L)Ky-^)-1SvT^!N9Qao*vqn7p&SaPU-srCCO-j>Q-}&x- z)?RSGG_Iom-~pY8<^A?zi$}jq*`BtHzEPaHv3s(q`+lAlbIovG$-V1OQXEYcOnQCf7(4N`|=tJS)dA*qp@9YVw= z?eh^O`_p^UdS^|R#hv3J&$|y{YPMW&UA`ytSN{hIJ@4i&M{DGteKV|83!7=N<9uHy z+6q-qFdM28SBedZ#^)LUbUqa{2<8f)@`1rjwgd|RnlC7VQ$Z%1M@CFssYSrqbTYz) zKtWRkW+01g6)FTBLv5XCp}sUC9kIn!(Il7z5pY2f01xJJc>bhdGD5~ng5IUwC!lP69Oj@uO~@9A*nA#b$_Y^U0U|O20gb~y z_{SAcC?Dy0{_j3x6kQv7sD5e|~_F23iDy zJkk2kDd@D1_JRN*M-~p9h5|Vt7lQgjvtquOa)&j=?xTfN0w$X)kXb=ue}NRS8K1=Z z!Z+!NES%3Bfy_Vheu4fFy9^AWC=`-8pB5l>&)S@fkj_t{^J#24N%l&^&;cACPe+1O z0v?IS7~zpb9K#q%H#Rgv8`F)A7+Ay4sH}PZB7jE&rBo2P0UP3B0B8_LV_=XpDuIB+ z<8V}@F@`}yVi;H~){sV|5%KiTD0U0kP*nn)&%KgT(IF}tjcRB}Km$msk)bgX58$9T zI*p1XpwUDlkicMoI8a7Kr;#lALM{NMlg$N~AWFbv$_Au@leXDelMz@0^rs#>4j^Jc z24sW{n->uLX~2oi1sz3zR85Q#6fzNmGe%?37(9{q3A6_k`a_i{<;0*3a0`M+(?WuR zfrJI5bqW#4ETC9OW~$Ve`x*?S=Yjfas>SrS_@4MTeg(oaM_|D z0knk>{DDAlAz2XD!VrxG@R%U9d%Q2#5B==_PzppENH?Ye3?u^t04RTG8WO-j`NQLg zXa*Gki3ETli|Ql0Kc68A0)*f;CZr>z6;z%wt>8McMCpEs4q}1QEI@)GF<9ik3x;|h zFiN^-e2CZt^>3P($N-;hGLYRuAGCQvdm-xMX82w+$lw3x?|m-*pHsl$-zNDgeZR@| zO|Gv};H$vjs_UCvU!}lTfxlJP|4c5$PoGmD4>|<}K_5$cs_!V!ht_x0T|3NSu!8vY zSg55SuyXTlN}U6 zIy{IiV!@>cMVEsrYhW<>GHdf~POO3PK3~pbXN{(*j#S(J)Vl+mU6pOzD9_c~x1Mw= zH%CXW@u^vKa*fiVwm(8ca-%1sV>ZZprObS{awS2Y)_Gn5uF%;0$GN)JQL*RBt;KCg z zTnC4;GN7jU>}9trm;CC1L5K20wQ8%`Q(i8!_Eq_Hp%t~!_ZO?&aVe^_yy+sMpfroeOn5yRcv^hXg%K$x8iYqw%W3Z&I^|*1T^5V5yF|UWYqGE-Wp`Cvl~IkWB+_u4 zw1M8v)-9dCH=-FI+-rCzSa)Ff7TRS+Y08o}!3Vv(yWReJ_-2yc1DrYN{W5GbXK`i2 zPtmc8LF4ke3ih;<`)g15o=&>tl4e*r5{n8WJwtu3pXd2gt>lGjafBUcM~L>G{F8LG z>s$+W>KASAYdLHsRXDS(&Z}hG&iweStI=1VC)5|m1l^TL(B(grrU>oAtar=>78{?t zG}g1~9l~=gJ!p&f!+i%Xz`GCEgwWR-IZd*f3r!21Z^M6~mA}LWk{)k+-GtlzY8;5Q zcq4w<_H%f~Z>WJ4IK8?v!p_4#`#CSFZTK4{bUrC*n@TTBym<=Gb$7^!yl|*Cu#lq4 zy3M+Vu`fTmx9F#3HHXK@b%NxkWI^wfrrAe9)Tjy%q$Ig0kLO9>`80k6+wGo17wzl% z)q`2IK6-|{thzxy<5aV__q^v76|D@$kuaqUeHGkDOY0lr+{fI~9`2tut?X`kZ;HZ>+qAwSH{Ao%Nzcma zmXuUk?`<3pIUC2^6IrA>vu2Oq^N5I+BmLCZSjVOuyl>Zq9@3pRdDEWMqsNF%?OFlK z#PyBi-SiVp@sUy3x+N#7^P5X&>P+usPqpt{?IbrjuePNeu@}kn&Rfju)EY|;C(-v< zqG=B09^nld?z#Aue&*KYOSQ`2K)Xt<(oj@Y(ht#La~B`>=SI}(JX?37Z*NPZ=jw>W z9Yx-YE^;l@X2SyVI*{c@;>C$)%6$q?2Z%RN(ge*B8rd6fxC+{1$PpgOzHUC+_nzkl znT2cLXBEE7($0LL=i;=AN}S1f?&cJP$~Q=ODXzD8W%SZbN8NtsO9my?&*^aT)ja3y zrwRL2)c?{d(ZoDGw}_^q>1L18$Q!B%WH*UoB0VoQ)hi}Ctt+2ilJ08QX~az&%2deRr0!zEt3cluhT-J1NKIk& zS;es{Crf`(jz0A_wK=Nt`g5>YZuIu9!ftr8BxT6pQcL2%k~yF`;fDOuHz(E~Z~1Mx zxgtkwTcxXVgNyIm;U6+M7j$r&4$i+DMBnl4Msly^Z2P`3oM1A4^M+T-3+~{HbYRZX ztXR=U|93-$j#Y%};aS!nwU$j@w?I(-Rw~jnG zs(7q*{-O9w6y>Dp^{9KTv$Q0_Zd}{l#_|8HuQ|VYTX3O z)Ed}fYjZAqpF(ZA*b~mZ8N<#nxO@%>z#fyh zFDlf1`(%RXV3;zQrR^_d980~udTh_)KD(udfAm`GBNiF^xO?3^HW%1Nq|A-N^!8e& zIx5pyXa149Vd>M`+Us?PYc=Ub4$(ah6_MV>$?YEb_U@(duq-+6gQrYwT1mxjnUQ<4 zReW#p!@*|Ly>)r<#)BSS34Tsp8|U$RM{TKcb<`l^w+9z>x;Xv0PB&~Fb4Z(M+!Uj& z#TC>QcLk}=563NQNDO7Dy(Ki*aE_<;`A~e_yT!ei@(4XP^WP7*cyvG9ec&DR7YDPp Lur)8TX;N diff --git a/common/data/src/main/res/drawable/lanes_ssr.png b/common/data/src/main/res/drawable/lanes_ssr.png deleted file mode 100644 index f9533511231f1bf03263e18aef94b2c0ab00bbd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1277 zcmVEX>4Tx04R~2kg-a`P!xv0RM8@JQXE7iLpSMYCI_oR5ENppV0B896pKj=NlNhz zd=q_`4uar2xGFgN-{|0A7B3wBkHb0tfA58sorGz*xDRPo6|UbOUJkG9u6=Lm;gsY^k?Jtd(uAy#ju znTi`xDJPc$(LkizG~{j8d7e^6@|eiWB;1k8)8t|P_j~Q*tlqRX=6O&Ab!$P@8js=q z5mtw=_6#f64O#8qZ)=!w>Y0DO@e5R7P?}G|Pa*&S00Lr5M??TE?^1t900009a7bBm z000XU000XU0RWnu7ytkO2XskIMF;5&9tja92CT3p0000PbVXQnLvL+uWo~o;Lvm$d zbY)~9cWHEJAV*0}P*;Ht7XSbQJ4r-ARA}DqnM-U;Q5eU6XZrS-qNR;!(-Jg|5>oHR z0?|^B)+72%(ay?(5D^kYB32|8U6Af<*sx%sMI=--Dy$@pG_;;A6`?E|kA4;==$!v%?sx8Y?)RPFJZYW^9p4&x6h(g|%GfrJR%*Q6geBb19eEo&%cC8p@=|W0&|m z?MFw$>`eC2CGAo#X?DG+mdT;(B3bQOnib@St_vvj6j28+Y)VTw&nrm{LnO;sq!nzI zTu=JY9M)(B8ztYP-aAJ2(}PnhThx$-NV2F7b4ef|sjjCvft?Y{NI=qDkE>)4J)B~S zgF`EawSgu{1W1l>n?jAtiTY?Fa$(4z&gHo2T;+@-9_Xf84eN8!W^!y@7t0b?b6w9& z+wx*r?joQ<9#B4l!)G?BkJ^eR^H}NVUL#qqrCPu`$D37>?NZbg+;?~}K?mwom$vB3 z#NeL9UMVz5qARKTX&m7YluSU9TnL-RrHG+DtXap@mGFI0En`P~Xf9>0yv{28Bi^6p zLfjONkr~!!F0jC2U*^PbBQdo32KdTL#%mK;FNsXW7xIX;e#IK%Iq6!2r})SrG2{_T z9bmd{qpC6_+>l}NpYs6(|& z0y$*xB*qboDbegZY*hoGM84n$K2V{)SRI0hR6qTWXP9q1u>7({l6-bG(6UJ<=Di0m{*n~Myh*vTL=i2h!YU!;4m{%EX>4Tx04R~2kg-a`P!xv0RIO5UQWV4?gKI}KIan2fP$9+&MyE7sv6#e=q!i!4 zH_?abAP7E$qk^;ljSdcG@xbAH9M1Xwb1$^)BudN014y%~aQ$9z8C==RZ&)nRW{XZ3 zm3hze`ZUJptELq%U8B`J_h+=@Q5mVum06S*6P>5No`*$Pw-%JG@fhA8 zVJ(35XXsovc&+??Tf>Y~&;0X^U#>(@N9d&>4*&oF0%A)?L;wJ)jUzGu000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2kHR@1{pZUIwtY}000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}00057Nkl4!>b3w@ zD~Xe&$JojHJ7V=YN#4+46*pwnH&$yHWSnRL&7Av{<*-`KPwERQ(rmh8%W^lG<%5T! zi6foTkS{DS!)Fgon7171go+QWTrtdnr!LGpmi39dTjY#>{uI&n@?G1Vu^{`5pheVe zZ0Sp9EXWcmt8kU4ujLa@ow2|?i$>PT$2|WHq^NSnijrXOpVwV^O*d&v(!#X6TO`8( zrvPL`LAHtT&5}fkIAcK$8R8PS$mPF@v295bKCmEbO!D{t4fXAb+`_N>!Jga?);!x#a9H=D^H{N^cyMtIZD?tY0q_CI00000NkvXX Hu0mjf`X-9B literal 0 HcmV?d00001 diff --git a/common/data/src/main/res/drawable/left_not_valid.png b/common/data/src/main/res/drawable/left_x.png similarity index 100% rename from common/data/src/main/res/drawable/left_not_valid.png rename to common/data/src/main/res/drawable/left_x.png diff --git a/common/data/src/main/res/drawable/left_x_straight_o.png b/common/data/src/main/res/drawable/left_x_straight_o.png new file mode 100644 index 0000000000000000000000000000000000000000..ac944d63754fb77ff59f70ef9c53b36c6ed37799 GIT binary patch literal 5265 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 literal 0 HcmV?d00001 diff --git a/common/data/src/main/res/drawable/right_valid.png b/common/data/src/main/res/drawable/right_o.png similarity index 100% rename from common/data/src/main/res/drawable/right_valid.png rename to common/data/src/main/res/drawable/right_o.png diff --git a/common/data/src/main/res/drawable/straight_not_valid_right_valid.png b/common/data/src/main/res/drawable/right_o_straight_x.png similarity index 100% rename from common/data/src/main/res/drawable/straight_not_valid_right_valid.png rename to common/data/src/main/res/drawable/right_o_straight_x.png diff --git a/common/data/src/main/res/drawable/right_not_valid.png b/common/data/src/main/res/drawable/right_x.png similarity index 100% rename from common/data/src/main/res/drawable/right_not_valid.png rename to common/data/src/main/res/drawable/right_x.png diff --git a/common/data/src/main/res/drawable/right_x_straight_x.png b/common/data/src/main/res/drawable/right_x_straight_x.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0d00d0cd4269ddef178752887f07407ae43931 GIT binary patch literal 5240 zcmeHKX;c$g7LF?@jiTZLjT(c~u9Z~wMFK*?5+y>jj6_7Os#KtqEGB_OL1-22Mw@X& zdRoxd#v_U#iU=Z&;tnXdG!8DH?Sgg$bx@R1j%d%T1QAa6IdeSI&M$IKrRu$R@AvNg z-goQOOAVgq?>N+TD1}0Clm$pbz#4x1#fNj-Q&4JY@+_o-?N;#bvnCL(ptq<#qMC zOWkC}fdcci6qx`0uq!c@Jl2*p51%7~rdc~Z?fTC-^mt~}8n2TB4F8-UH{V|D!T;i>xR+my?hsguqZy&hbV>RCHx&0R^v^oRsaaUq;G z;7sCYY)kF&D@9vi$TFOIG4FJH`P!OO-`!3+gRbVr6Lv_ZN!*%J`8u(__Q9TaBoY9lP*Y>o8^?xuMa$zmYb1Ylby?`<2oiq zmh7DJeKx1Ejy24*yN;8z^|!Z+-U#yf1s4?)oV{;ng&y&9Hz%jm_uKDvrY&ym^}5zl zZmpob*6YseLD&3(BbPd^YNk+zdlEn?5%NG0rd87sr545MX0;ATh(hu3GV2g*8E&Ma zcr>9A(^|_<(5Qq`OqhaK(^TM!|%P^sm=H)rm!z=;-YTSrW&FWZ< zL1Y%wthgfZOm;J9RI7<`nV1$K52i}AdYsCkbLcSSYbN4ZG|!<_54}<)3X%GCL4cN+ z7GpH(L=1+>WTKncbge#`!4wLG44B1Wu^?ap8CGbFh#Art+(`%nodO~L;v>Gaj ziJ;mzqnJhm4=`WK9cYBZ&L=$SA)eDf_ z%hE`wK9JQbHgd$8PR~GqdpB+`>-V`^je(V1E|O}oI5Iq$R7@l17b&$Ep%mF3aa5@k zqAZAuV=%=(d^HH3O_JERU3`RtQ;Up9QrxO5&hq6#Mh6o^~0Ovy- zK2rz@`IrjgC{YX-usATv;`V?D(i1?HNNmrjNGK(MLU9(tf`xpD$z=fmoDV}N7r`Ko zfQ9jKHq7RzY*0!}In1UH( zvxmJ_NvKx*H*2zZs2;W@4=b>uqg{!O2wsgh4P9A_-%Qm_iZ!o-oFzPZ1VkDxMM% zLVOHHA&!d2g@gi(3Gr1-J_qKZs6dGK4*Gvh5om%hVsg7Q@qb7WWujaj#={{Yi_3#J zLM0bM5m1UM98swR7^o50CiQNO{0S-ckbPH*9t`r$|6aEqjNd8SX3%4+0IP5716vT- z(HPxZT9+(9yr1&dRZ*XE3M#d4l8@rIkFGwtK8k^lGVW7XA6*~Cz(*PPsq0UpYv_kV zF|GmMvLZ^Xfml@7i~54sK}EzdMz)^{wIXqraS1yx}=!R2TWFX$xN!m$tR|+&I?kIQ+s; z=@jXYA@+-_ic9UwUS?Swxl2330)3DN)%CwL{K`F;aOh3*%o)ln@t$4}&|>kS4w*JG zJh$FeF|DR(%(}wnE#qF*rW|`XIyz&|QnoBRWA~*y@XOG|gvawu4mT?di-HN!V#(I2 zZs&cFfW#}M7m|)>{P*#m{&>E6bkI#dHIwsy()X3cwu%Kl3cl&=DnQ-^)=G4*dciLN* zFeWW4-`kdd`KQjHvS;NqI=yb(_2LDJ#_;-wTRWp7%2za9+tJ=y7&%>$zj?BxwenGz zmv~{UXnVLU-LL5+e{Z&_v}01urGWH?+El}#Mw9eXmFLnNhxzGG+jky&;cK4P_^@BW z@HdzxVb+MKP16hJ*0ddIDa;NjtC*>sIA%fG$wJGq^6|W}yvcE6ia#aeD^r_xL^g~c_2k&IvekFC^P^hs jZ*#AD+x}a!GP(cl;jLcpM(%0^0;R}&=SdIvELrm(Hx8d8 literal 0 HcmV?d00001 diff --git a/common/data/src/main/res/drawable/slight_right_valid.png b/common/data/src/main/res/drawable/slight_right_o.png similarity index 100% rename from common/data/src/main/res/drawable/slight_right_valid.png rename to common/data/src/main/res/drawable/slight_right_o.png diff --git a/common/data/src/main/res/drawable/slight_right_not_valid.png b/common/data/src/main/res/drawable/slight_right_x.png similarity index 100% rename from common/data/src/main/res/drawable/slight_right_not_valid.png rename to common/data/src/main/res/drawable/slight_right_x.png diff --git a/common/data/src/main/res/drawable/straight_valid.png b/common/data/src/main/res/drawable/straight_o.png similarity index 100% rename from common/data/src/main/res/drawable/straight_valid.png rename to common/data/src/main/res/drawable/straight_o.png diff --git a/common/data/src/main/res/drawable/straight_not_valid.png b/common/data/src/main/res/drawable/straight_x.png similarity index 100% rename from common/data/src/main/res/drawable/straight_not_valid.png rename to common/data/src/main/res/drawable/straight_x.png