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 fd3d16e..0d1a8e8 100644 --- a/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt +++ b/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt @@ -41,12 +41,9 @@ import com.google.android.gms.location.LocationServices import com.kouros.navigation.MainApplication.Companion.navigationViewModel import com.kouros.navigation.data.Constants.DESTINATION_ARRIVAL_DISTANCE import com.kouros.navigation.data.Constants.homeLocation -import com.kouros.navigation.data.NavigationRepository import com.kouros.navigation.data.StepData -import com.kouros.navigation.data.valhalla.ValhallaRepository import com.kouros.navigation.model.MockLocation import com.kouros.navigation.model.RouteModel -import com.kouros.navigation.model.ViewModel import com.kouros.navigation.ui.theme.NavigationTheme import com.kouros.navigation.utils.bearing import com.kouros.navigation.utils.calculateZoom @@ -114,13 +111,16 @@ class MainActivity : ComponentActivity() { } locationManager = getSystemService(LOCATION_SERVICE) as LocationManager fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) - if (useMock) { - mock = MockLocation(locationManager) - mock.setMockLocation( - homeLocation.latitude, - homeLocation.longitude - ) - } + fusedLocationClient.lastLocation + .addOnSuccessListener { location : android.location.Location? -> + if (useMock) { + mock = MockLocation(locationManager) + mock.setMockLocation( + location?.latitude ?: homeLocation.latitude, + location?.longitude ?: homeLocation.longitude + ) + } + } enableEdgeToEdge() setContent { CheckPermissionScreen() @@ -165,11 +165,6 @@ class MainActivity : ComponentActivity() { } val step: StepData? by stepData.observeAsState() val nextStep: StepData? by nextStepData.observeAsState() - - fun openSheet() { - scope.launch { scaffoldState.bottomSheetState.expand() } - } - fun closeSheet() { scope.launch { scaffoldState.bottomSheetState.partialExpand() @@ -242,7 +237,7 @@ class MainActivity : ComponentActivity() { if (routeState.maneuverType == 39 && leftStepDistance() < DESTINATION_ARRIVAL_DISTANCE ) { - stopNavigation() + // stopNavigation() routeState = routeState.copy(arrived = true) routeData.value = "" } @@ -305,7 +300,7 @@ class MainActivity : ComponentActivity() { for ((index, step) in routeModel.legs.steps.withIndex()) { for ((windex, waypoint) in step.maneuver.waypoints.withIndex()) { mock.setMockLocation(waypoint[1], waypoint[0]) - delay(1000L) // + delay(600L) // } } } 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 9fb8605..11eb571 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 @@ -137,7 +137,7 @@ class RouteCarModel() : RouteModel() { val dismissAction: Action = createToastAction( carContext, - R.string.speed_camera, R.string.exit_action_title, + R.string.exit_action_title, R.string.exit_action_title, FLAG_DEFAULT ) diff --git a/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt b/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt index 5044536..ca390dc 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt @@ -34,7 +34,9 @@ import com.kouros.navigation.data.Place import com.kouros.navigation.data.nominatim.SearchResult import com.kouros.navigation.data.overpass.Elements import com.kouros.navigation.model.ViewModel +import com.kouros.navigation.utils.bearing import com.kouros.navigation.utils.location +import kotlin.math.absoluteValue class NavigationScreen( carContext: CarContext, @@ -488,10 +490,15 @@ class NavigationScreen( it.distance = distance.toDouble() updatedCameras.add(it) } - val sortedList = updatedCameras.sortedWith(compareBy { it.distance }) + val sortedList = updatedCameras.sortedWith(compareBy { it.distance }) val camera = sortedList.first() - if (camera.distance < 80) { - routeModel.showSpeedCamera(carContext, camera.distance, camera.tags.maxspeed) + val bearingSpeedCamera = location.bearingTo(location(camera.lon!!, camera.lat!!)) + val bearingRoute = surfaceRenderer.lastLocation.bearingTo(location) + + if (camera.distance < 80 + && (bearingSpeedCamera.absoluteValue - bearingRoute.absoluteValue).absoluteValue < 15.0 + ) { + routeModel.showSpeedCamera(carContext, camera.distance, camera.tags.maxspeed) } } } 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 f6f7e6a..cd1421f 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 @@ -179,3 +179,6 @@ object Constants { } +enum class RouteEngine { + VALHALLA, OSRM, GRAPHHOPPER +} \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/Route.kt b/common/data/src/main/java/com/kouros/navigation/data/Route.kt index 6621fce..842516f 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/Route.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/Route.kt @@ -2,6 +2,8 @@ package com.kouros.navigation.data import android.location.Location import com.google.gson.GsonBuilder +import com.kouros.navigation.data.osrm.OsrmResponse +import com.kouros.navigation.data.osrm.OsrmRoute import com.kouros.navigation.data.route.Leg import com.kouros.navigation.data.route.Step import com.kouros.navigation.data.route.Summary @@ -28,7 +30,7 @@ data class Route( data class Builder ( - var routeEngine : Int = 0, + var routeEngine : Int = RouteEngine.VALHALLA.ordinal, var summary: Summary? = null, var legs: List? = null, var routeGeoJson: String = "", @@ -46,10 +48,14 @@ data class Route( fun route(route: String) = apply { if (route.isNotEmpty() && route != "[]") { val gson = GsonBuilder().serializeNulls().create() - val jsonObject: Map = Json.parseToJsonElement(route).jsonObject - val routeJson = - gson.fromJson(jsonObject["trip"].toString(), ValhallaResponse::class.java) - ValhallaRoute().mapJsonToValhalla(routeJson, this) + if (routeEngine == RouteEngine.VALHALLA.ordinal) { + val jsonObject: Map = Json.parseToJsonElement(route).jsonObject + val routeJson = gson.fromJson(jsonObject["trip"].toString(), ValhallaResponse::class.java) + ValhallaRoute().mapJsonToValhalla(routeJson, this) + } else { + val osrmJson = gson.fromJson(route, OsrmResponse::class.java) + OsrmRoute().mapToOsrm(osrmJson, this) + } } } diff --git a/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmJson.kt b/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmResponse.kt similarity index 92% rename from common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmJson.kt rename to common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmResponse.kt index d330866..7f8e7d8 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmJson.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmResponse.kt @@ -3,7 +3,7 @@ package com.kouros.navigation.data.osrm import com.google.gson.annotations.SerializedName -data class OsrmJson ( +data class OsrmResponse ( @SerializedName("code" ) var code : String? = null, @SerializedName("routes" ) var routes : ArrayList = arrayListOf(), 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 new file mode 100644 index 0000000..450ad5c --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRoute.kt @@ -0,0 +1,11 @@ +package com.kouros.navigation.data.osrm + +import com.kouros.navigation.data.Route +import com.kouros.navigation.data.valhalla.ValhallaResponse + +class OsrmRoute { + + fun mapToOsrm(routeJson: OsrmResponse, builder: Route.Builder) { + + } +} \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/overpass/Overpass.kt b/common/data/src/main/java/com/kouros/navigation/data/overpass/Overpass.kt index aeb8d10..1be014a 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/overpass/Overpass.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/overpass/Overpass.kt @@ -28,6 +28,7 @@ class Overpass { |); |out body; """.trimMargin() + println("way[highway](around:$radius,$linestring)") return overpassApi(httpURLConnection, searchQuery) } @@ -60,7 +61,6 @@ class Overpass { } fun overpassApi(httpURLConnection: HttpURLConnection, searchQuery: String) : List { - // Send the JSON we created val outputStreamWriter = OutputStreamWriter(httpURLConnection.outputStream) outputStreamWriter.write(searchQuery) outputStreamWriter.flush() diff --git a/common/data/src/main/java/com/kouros/navigation/data/valhalla/Trip.kt b/common/data/src/main/java/com/kouros/navigation/data/valhalla/Trip.kt deleted file mode 100644 index 22b5412..0000000 --- a/common/data/src/main/java/com/kouros/navigation/data/valhalla/Trip.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.kouros.navigation.data.valhalla - -import com.google.gson.annotations.SerializedName -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.json.JsonIgnoreUnknownKeys - - -@OptIn(ExperimentalSerializationApi::class) -@JsonIgnoreUnknownKeys -data class Trip ( - - @SerializedName("locations" ) var locations : ArrayList = arrayListOf(), - @SerializedName("legs" ) var legs : ArrayList = arrayListOf(), - @SerializedName("summary" ) var summaryValhalla : SummaryValhalla = SummaryValhalla(), - @SerializedName("status_message" ) var statusMessage : String = "", - @SerializedName("status" ) var status : Int = 0, - @SerializedName("units" ) var units : String = "", - @SerializedName("language" ) var language : String = "", - - ) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaJson.kt b/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaJson.kt deleted file mode 100644 index 8b1b7ee..0000000 --- a/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaJson.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.kouros.navigation.data.valhalla - -import com.google.gson.annotations.SerializedName -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonIgnoreUnknownKeys - - -@OptIn(ExperimentalSerializationApi::class) -@JsonIgnoreUnknownKeys -data class ValhallaJson ( - - @SerializedName("trip" ) var trip : Trip = Trip(), - @SerializedName("id" ) var id : String = "" - -) 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 4d602f0..0354413 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 @@ -26,7 +26,7 @@ open class RouteModel() { val arrived: Boolean = false, val maneuverType: Int = 0, val travelMessage: String = "", - // max speed for street (maneuver) + val lastSpeedLocation: Location = location(0.0, 0.0), val lastSpeedIndex: Int = 0, val maxSpeed: Int = 0, ) @@ -89,9 +89,11 @@ open class RouteModel() { } fun updateSpeedLimit(location: Location, viewModel: ViewModel) { - // speed limit for each maneuver index - if (routeState.lastSpeedIndex < route.currentStep) { + // speed limit + val distance = routeState.lastSpeedLocation.distanceTo(location) + if (distance > 500 || routeState.lastSpeedIndex < route.currentStep) { routeState = routeState.copy(lastSpeedIndex = route.currentStep) + routeState = routeState.copy(lastSpeedLocation = location) val elements = viewModel.getMaxSpeed(location) elements.forEach { if (it.tags.name != null && it.tags.maxspeed != null) {