diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1555a91..6c4f37e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -17,8 +17,8 @@ android { applicationId = "com.kouros.navigation" minSdk = 33 targetSdk = 37 - versionCode = 103 - versionName = "0.3.0.103" + versionCode = 104 + versionName = "0.3.0.104" base.archivesName = "navi-$versionName" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } 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 8728623..e33979b 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 @@ -16,6 +16,7 @@ import androidx.car.app.navigation.model.Trip import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelStore import androidx.lifecycle.ViewModelStoreOwner @@ -60,6 +61,7 @@ import com.kouros.navigation.utils.getSettingsViewModel import com.kouros.navigation.utils.location import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.launch +import org.maplibre.geojson.FeatureCollection import java.time.Duration import java.time.LocalDateTime import java.time.ZoneOffset @@ -116,6 +118,8 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa var lastAlert : Long = 0 var navigationManagerStarted = false + var updateLocationIndex = 0 + /** * Lifecycle observer for managing session lifecycle events. * Cleans up resources when the session is destroyed. @@ -438,6 +442,7 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa checkTraffic(LocalDateTime.now(ZoneOffset.UTC), location) surfaceRenderer.updateLocation(location, streetName) } + updateLocationIndex++ } /** @@ -471,7 +476,7 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa checkArrival() } val endTime = System.currentTimeMillis() - startTime - //Log.d(TAG, "handleNavigationLocation: $endTime") + Log.d(TAG, "handleNavigationLocation: $endTime") } /** @@ -507,14 +512,14 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa return } - val stepData = routeModel.currentStep() // 121 ms + val stepData = routeModel.currentStep() - navigationScreen.updateTrip( // 277 ms + navigationScreen.updateTrip( isNavigating = routeModel.isNavigating(), isRerouting = false, hasArrived = routeModel.isArrival(), - destinationTravelEstimate = routeModel.getTravelEstimateTrip(carContext), // 60 ms - stepTravelEstimate = routeModel.getTravelEstimateStep(carContext), // 60 ms + destinationTravelEstimate = routeModel.getTravelEstimateTrip(carContext), + stepTravelEstimate = routeModel.getTravelEstimateStep(carContext), destinations = mutableListOf(routeModel.getDestination()), steps = routeModel.getSteps(carContext), stepRemainingDistance = routeModel.getDistance(), @@ -529,7 +534,7 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa * Updates the trip information and notifies the listener with a new Trip object. * This includes destination name, address, travel estimate, and loading status. */ - updateTrip(routeModel.getTrip(carContext)) // 230 ms + updateTrip(routeModel.getTrip(carContext)) } /** @@ -703,6 +708,10 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa navigationScreen.invalidate() } + override fun onTrafficMessageReceived(trafficMessage: String) { + + } + /** * Loads a route to the specified place and sets it as the destination. */ @@ -748,6 +757,12 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa lastTrafficDate = current navigationViewModel.loadTraffic(carContext, location, surfaceRenderer.carOrientation) } + if (updateLocationIndex % 4 == 0) { +// navigationViewModel.updateTrafficMessages( +// surfaceRenderer.lastLocation, +// surfaceRenderer.trafficData.value!! +// ) + } } /** diff --git a/common/car/src/main/java/com/kouros/navigation/car/map/MapView.kt b/common/car/src/main/java/com/kouros/navigation/car/map/MapView.kt index a788316..dd296b0 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/map/MapView.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/map/MapView.kt @@ -1,6 +1,7 @@ package com.kouros.navigation.car.map import android.location.Location +import android.util.Log import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues @@ -28,12 +29,15 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.kouros.data.R import com.kouros.navigation.data.Constants +import com.kouros.navigation.data.Constants.TAG import com.kouros.navigation.data.NavigationColorDark import com.kouros.navigation.data.NavigationColorLight import com.kouros.navigation.data.RouteColor import com.kouros.navigation.data.SpeedColor import com.kouros.navigation.data.ViewStyle import com.kouros.navigation.utils.GeoUtils.createEndCollection +import com.kouros.navigation.utils.GeoUtils.createLineStringCollection +import com.kouros.navigation.utils.GeoUtils.createPointCollection import com.kouros.navigation.utils.isMetricSystem import com.kouros.navigation.utils.location import org.maplibre.compose.camera.CameraPosition @@ -47,6 +51,8 @@ import org.maplibre.compose.expressions.dsl.interpolate import org.maplibre.compose.expressions.dsl.zoom import org.maplibre.compose.expressions.value.ColorValue import org.maplibre.compose.expressions.value.DpValue +import org.maplibre.compose.expressions.value.ExpressionValue +import org.maplibre.compose.expressions.value.ImageValue import org.maplibre.compose.layers.Anchor import org.maplibre.compose.layers.FillLayer import org.maplibre.compose.layers.LineLayer @@ -61,6 +67,8 @@ import org.maplibre.compose.sources.Source import org.maplibre.compose.sources.getBaseSource import org.maplibre.compose.sources.rememberGeoJsonSource import org.maplibre.compose.style.BaseStyle +import org.maplibre.geojson.FeatureCollection +import org.maplibre.geojson.LineString import org.maplibre.spatialk.geojson.Position import kotlin.time.Duration.Companion.seconds @@ -131,6 +139,7 @@ fun MapLibre( fun StartEndLayer(routeData: String?) { if (!routeData.isNullOrEmpty()) { val end = createEndCollection(routeData) + Log.d("Map End", " $end") val routes = rememberGeoJsonSource(GeoJsonData.JsonString(end)) val img = image(painterResource(R.drawable.sports_score_48px), drawAsSdf = true) SymbolLayer( @@ -186,9 +195,49 @@ fun TrafficLayer(trafficData: Map) { color = trafficColor(it.key), width = routeLineWidth(base = 2.dp, isCasing = false), ) + val featureCollection = FeatureCollection.fromJson(it.value) + if (featureCollection.features()!!.isNotEmpty()) { + val points = mutableListOf>() + featureCollection.features()!!.forEach { geo -> + val coordinates = (geo.geometry() as LineString).coordinates() + if (coordinates.size > 5) { + val first = coordinates.first() + val second = coordinates[1] + points.add(listOf(first.coordinates()[0], second.coordinates()[1])) + } + } + val collection = createPointCollection( + points, it.key + ) + TrafficPoint(it.key, "${it.key}-point-layer", collection) + } } } +@Composable +fun TrafficPoint(id: String, layer: String, routeData: String?) { + if (!routeData.isNullOrEmpty()) { + val routes = rememberGeoJsonSource(GeoJsonData.JsonString(routeData)) + val img = trafficImage(id) + SymbolLayer( + id = layer, + source = routes, + iconColor = const(Color.Red), + iconImage = img, + iconSize = + interpolate( + type = exponential(2f), + input = zoom(), + 5 to const(0.4f), + 6 to const(1.6f), + 7 to const(2.0f), + 20 to const(5.0f), + ), + ) + } + +} + /** * Reusable helper for consistent line widths across all route layers. */ @@ -198,12 +247,12 @@ private fun routeLineWidth(base: Dp, isCasing: Boolean = false): Expression { + when (key) { + "heavy", "queuing", "slow", "stationary" -> return image(painterResource(R.drawable.traffic_jam_24px), drawAsSdf = true) + "roadworks" -> return image(painterResource(R.drawable.construction_24px), drawAsSdf = true) + "closed", "lane" -> return image(painterResource(R.drawable.remove_road_24px), drawAsSdf = true) + } + return image(painterResource(R.drawable.traffic_jam_24px), drawAsSdf = true) +} + fun trafficColor(key: String): Expression { when (key) { "queuing" -> return const(Color(0xFFC46E53)) @@ -239,6 +298,8 @@ fun trafficColor(key: String): Expression { "stationary" -> return const(Color(0xFF910A0A)) "heavy" -> return const(Color(0xFF6B0404)) "roadworks" -> return const(Color(0xFFDAA707)) + "closed" -> return const(Color(0xFFDA0727)) + "lane" -> return const(Color(0xFFEFBAC1)) } return const(Color.Blue) } diff --git a/common/car/src/main/java/com/kouros/navigation/car/screen/observers/NavigationObserverCallback.kt b/common/car/src/main/java/com/kouros/navigation/car/screen/observers/NavigationObserverCallback.kt index 0a6a1e4..f0e4f99 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/screen/observers/NavigationObserverCallback.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/screen/observers/NavigationObserverCallback.kt @@ -29,4 +29,6 @@ interface NavigationObserverCallback { /** Called to request UI invalidation/refresh */ fun invalidateScreen() + fun onTrafficMessageReceived(trafficMessage: String) + } diff --git a/common/car/src/main/java/com/kouros/navigation/car/screen/observers/NavigationObserverManager.kt b/common/car/src/main/java/com/kouros/navigation/car/screen/observers/NavigationObserverManager.kt index d618d79..8fb77f4 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/screen/observers/NavigationObserverManager.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/screen/observers/NavigationObserverManager.kt @@ -14,6 +14,8 @@ class NavigationObserverManager( val routeObserver = RouteObserver(callback) val trafficObserver = TrafficObserver(callback) + + val trafficMessageObserver = TrafficMessageObserver(callback) val placeSearchObserver = PlaceSearchObserver(callback) val speedCameraObserver = SpeedCameraObserver(callback) val maxSpeedObserver = MaxSpeedObserver(callback) @@ -21,6 +23,7 @@ class NavigationObserverManager( fun attachAllObservers(session: NavigationSession) { viewModel.route.observe(session, routeObserver) viewModel.traffic.observe(session, trafficObserver) + viewModel.trafficMessage.observe(session, trafficMessageObserver) viewModel.placeLocation.observe(session, placeSearchObserver) viewModel.speedCameras.observe(session, speedCameraObserver) viewModel.maxSpeed.observe(session, maxSpeedObserver) diff --git a/common/car/src/main/java/com/kouros/navigation/car/screen/observers/TrafficMessageObserver.kt b/common/car/src/main/java/com/kouros/navigation/car/screen/observers/TrafficMessageObserver.kt new file mode 100644 index 0000000..8516c4c --- /dev/null +++ b/common/car/src/main/java/com/kouros/navigation/car/screen/observers/TrafficMessageObserver.kt @@ -0,0 +1,16 @@ +package com.kouros.navigation.car.screen.observers + +import androidx.lifecycle.Observer + +/** + * Observer for traffic data updates. + */ +class TrafficMessageObserver( + private val callback: NavigationObserverCallback +) : Observer { + + override fun onChanged(value: String) { + callback.onTrafficMessageReceived(value) + callback.invalidateScreen() + } +} diff --git a/common/data/src/main/java/com/kouros/navigation/data/ApplicationConfig.kt b/common/data/src/main/java/com/kouros/navigation/data/ApplicationConfig.kt new file mode 100644 index 0000000..7867731 --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/ApplicationConfig.kt @@ -0,0 +1,44 @@ +package com.kouros.navigation.data + +import android.util.Log +import java.io.File + +data class ApplicationConfig( + val user: String, + val password: String +) { + + companion object { + fun load(): ApplicationConfig { + + fun Map.envOrLookup(key: String): String { + return System.getenv(key) ?: this[key]!! + } + + val envVars: Map = envFile().let { envFile -> + if (envFile.exists()) { + envFile.readLines() + .map { it.split("=") } + .filter { it.size == 2 } + .associate { it.first().trim() to it.last().trim() } + } else emptyMap() + } + + return ApplicationConfig( + user = envVars.envOrLookup("USER"), + password = envVars.envOrLookup("PASSWORD"), + ) + } + } +} + +fun envFile(): File { + + //val path = context.filesDir.absolutePath + //val config = ApplicationConfig.load(context) + + return listOf(".env").map { + Log.d("Overpass", it) + File(it) + }.first { it.exists() } +} \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/Color.kt b/common/data/src/main/java/com/kouros/navigation/data/Color.kt index 0b7839a..1aa2898 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/Color.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/Color.kt @@ -3,8 +3,7 @@ package com.kouros.navigation.data import androidx.compose.ui.graphics.Color val NavigationColorLight = Color(0xFF17A119) - -val NavigationColorDark = Color(0xFF07568C) +val NavigationColorDark = Color(0xFF413EAD) val RouteColor = Color(0xFF5201B4) 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 1c28f88..576fccf 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 @@ -146,6 +146,8 @@ object Constants { const val TRAFFIC_UPDATE = 300 + const val TRAFFIC_MESSAGE_UPDATE = 10 + const val SPEED_UPDATE_DISTANCE = 600F const val INSTRUCTION_DISTANCE = 50 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 0599411..4223a5e 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 @@ -4,9 +4,12 @@ import android.location.Location import android.util.Log import com.google.gson.GsonBuilder import com.kouros.data.BuildConfig +import com.kouros.navigation.data.ApplicationConfig import com.kouros.navigation.utils.GeoUtils.getBoundingBox import java.io.OutputStreamWriter +import java.net.Authenticator import java.net.HttpURLConnection +import java.net.PasswordAuthentication import java.net.URL class Overpass { @@ -94,7 +97,17 @@ class Overpass { } private fun overpassApi(connection: HttpURLConnection, searchQuery: String): List { + return try { + Authenticator.setDefault(object : Authenticator() { + override fun getPasswordAuthentication(): PasswordAuthentication { + return PasswordAuthentication( + "kouros", + "eo7sbjyWpmjSVFyELgbfrryqJ6ddNeq9".toCharArray() + ) + } + }) + connection.outputStream.use { os -> OutputStreamWriter(os).use { writer -> writer.write(searchQuery) diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt index 3658045..dfc2266 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt @@ -23,9 +23,10 @@ private const val tomtomFields = val useLocal = BuildConfig.DEBUG -val useLocalTraffic = BuildConfig.DEBUG +val useLocalTraffic = BuildConfig.DEBUG class TomTomRepository : NavigationRepository() { + override fun getRoute( context: Context, currentLocation: Location, @@ -102,7 +103,7 @@ class TomTomRepository : NavigationRepository() { if (!showTraffic) { return "" } - val bbox = calculateSquareRadius(location.latitude, location.longitude, 15.0) + val bbox = calculateSquareRadius(location.latitude, location.longitude, 10.0) return if (useLocalTraffic) { fetchUrl( "http://192.168.1.37/tomtom_traffic.json", diff --git a/common/data/src/main/java/com/kouros/navigation/model/NavigationViewModel.kt b/common/data/src/main/java/com/kouros/navigation/model/NavigationViewModel.kt index 9e4088f..d68a5e5 100644 --- a/common/data/src/main/java/com/kouros/navigation/model/NavigationViewModel.kt +++ b/common/data/src/main/java/com/kouros/navigation/model/NavigationViewModel.kt @@ -3,7 +3,6 @@ package com.kouros.navigation.model import android.content.Context import android.location.Location import android.util.Log - import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.runtime.toMutableStateList import androidx.lifecycle.MutableLiveData @@ -11,9 +10,11 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.gson.Gson import com.google.gson.GsonBuilder +import com.kouros.navigation.data.ApplicationConfig import com.kouros.navigation.data.Constants import com.kouros.navigation.data.Constants.SPEED_BEARING_DEVIATION import com.kouros.navigation.data.Constants.SPEED_UPDATE_DISTANCE +import com.kouros.navigation.data.Constants.TAG import com.kouros.navigation.data.NavigationRepository import com.kouros.navigation.data.Place import com.kouros.navigation.data.Places @@ -36,6 +37,7 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.maplibre.geojson.FeatureCollection +import org.maplibre.geojson.LineString import java.time.LocalDateTime import java.time.ZoneOffset import kotlin.collections.first @@ -59,6 +61,11 @@ class NavigationViewModel(private val repository: NavigationRepository) : ViewMo MutableLiveData() } + /** LiveData containing categorized traffic messages map */ + val trafficMessage: MutableLiveData by lazy { + MutableLiveData() + } + /** LiveData containing a preview route JSON string for route preview screens */ val previewRoute: MutableLiveData by lazy { MutableLiveData() @@ -223,33 +230,6 @@ class NavigationViewModel(private val repository: NavigationRepository) : ViewMo } } - /** - * Categorizes traffic incidents by type (queuing, stationary, slow, heavy, roadworks). - * @param data Raw traffic GeoJSON string - * @return Map of incident type to GeoJSON FeatureCollection - */ - private fun rebuildTraffic(data: String): Map { - val featureCollection = FeatureCollection.fromJson(data) - val incidents = mutableMapOf() - val queuing = featureCollection.features()!! - .filter { it.properties()!!.get("events").toString().contains("Queuing traffic") } - incidents["queuing"] = FeatureCollection.fromFeatures(queuing).toJson() - val stationary = featureCollection.features()!! - .filter { it.properties()!!.get("events").toString().contains("Stationary traffic") } - incidents["stationary"] = FeatureCollection.fromFeatures(stationary).toJson() - val slow = featureCollection.features()!! - .filter { it.properties()!!.get("events").toString().contains("Slow traffic") } - incidents["slow"] = FeatureCollection.fromFeatures(slow).toJson() - val heavy = featureCollection.features()!! - .filter { it.properties()!!.get("events").toString().contains("Heavy traffic") } - incidents["heavy"] = FeatureCollection.fromFeatures(heavy).toJson() - val roadworks = featureCollection.features()!! - .filter { it.properties()!!.get("events").toString().contains("Roadworks") } - incidents["roadworks"] = FeatureCollection.fromFeatures(roadworks).toJson() - - return incidents - } - /** * Calculates a preview route for route preview screen. * Posts the route JSON to previewRoute LiveData. @@ -278,6 +258,40 @@ class NavigationViewModel(private val repository: NavigationRepository) : ViewMo return previewRoute.value } + /** + * Categorizes traffic incidents by type (queuing, stationary, slow, heavy, roadworks). + * @param data Raw traffic GeoJSON string + * @return Map of incident type to GeoJSON FeatureCollection + */ + private fun rebuildTraffic(data: String): Map { + val featureCollection = FeatureCollection.fromJson(data) + val incidents = mutableMapOf() + val queuing = featureCollection.features()!! + .filter { it.properties()!!.get("events").toString().contains("Queuing traffic") } + incidents["queuing"] = FeatureCollection.fromFeatures(queuing).toJson() + val stationary = featureCollection.features()!! + .filter { it.properties()!!.get("events").toString().contains("Stationary traffic") } + incidents["stationary"] = FeatureCollection.fromFeatures(stationary).toJson() + val slow = featureCollection.features()!! + .filter { it.properties()!!.get("events").toString().contains("Slow traffic") } + incidents["slow"] = FeatureCollection.fromFeatures(slow).toJson() + val heavy = featureCollection.features()!! + .filter { it.properties()!!.get("events").toString().contains("Heavy traffic") } + incidents["heavy"] = FeatureCollection.fromFeatures(heavy).toJson() + val roadworks = featureCollection.features()!! + .filter { it.properties()!!.get("events").toString().contains("Roadworks") } + incidents["roadworks"] = FeatureCollection.fromFeatures(roadworks).toJson() + val laneClosed = featureCollection.features()!! + .filter { it.properties()!!.get("events").toString().contains("Lane closed") } + incidents["lane"] = FeatureCollection.fromFeatures(laneClosed).toJson() + val closed = featureCollection.features()!! + .filter { it.properties()!!.get("events").toString().contains("Closed") } + incidents["closed"] = FeatureCollection.fromFeatures(closed).toJson() + + + return incidents + } + /** * Loads device contacts with addresses and converts to Place objects. @@ -434,17 +448,17 @@ class NavigationViewModel(private val repository: NavigationRepository) : ViewMo var element: Elements? val search = mutableListOf() - speedElements.filter { it.type == "way"}.forEach { + speedElements.filter { it.type == "way" }.forEach { var distance: Float var maxDistance = 1000F var geometryFirstLocation = location(0.0, 0.0) var geometryLastLocation = location(0.0, 0.0) for ((geoIndex, geo) in it.geometry.withIndex()) { if (geoIndex == 0) { - geometryFirstLocation= location(geo.lon, geo.lat) + geometryFirstLocation = location(geo.lon, geo.lat) } - if (geoIndex == it.geometry.size-1) { - geometryLastLocation = location(geo.lon, geo.lat) + if (geoIndex == it.geometry.size - 1) { + geometryLastLocation = location(geo.lon, geo.lat) } val geometryLocation = location(geo.lon, geo.lat) distance = geometryLocation.distanceTo(location) @@ -463,7 +477,8 @@ class NavigationViewModel(private val repository: NavigationRepository) : ViewMo ) } } - val result = search.sortedWith(compareBy { it.distance }.thenByDescending { it.bearing }) + val result = + search.sortedWith(compareBy { it.distance }.thenByDescending { it.bearing }) if (result.isNotEmpty()) { element = result.first().element speed = if (element.tags.maxspeed == "none" && element.tags.highway == "motorway") { @@ -479,7 +494,11 @@ class NavigationViewModel(private val repository: NavigationRepository) : ViewMo return speed } - private fun isBearingValid(element: Elements, streetBearing : Float, routeBearing: Float) : Boolean { + private fun isBearingValid( + element: Elements, + streetBearing: Float, + routeBearing: Float + ): Boolean { return if (element.tags.oneway.isNotEmpty()) { (streetBearing - routeBearing.absoluteValue) < SPEED_BEARING_DEVIATION } else { diff --git a/common/data/src/main/java/com/kouros/navigation/model/RouteCalculator.kt b/common/data/src/main/java/com/kouros/navigation/model/RouteCalculator.kt index dd9a946..b527dd3 100644 --- a/common/data/src/main/java/com/kouros/navigation/model/RouteCalculator.kt +++ b/common/data/src/main/java/com/kouros/navigation/model/RouteCalculator.kt @@ -1,7 +1,9 @@ package com.kouros.navigation.model import android.location.Location +import android.util.Log import androidx.car.app.navigation.model.Step +import com.kouros.navigation.data.ApplicationConfig import com.kouros.navigation.data.Constants.MAXIMUM_LOCATION_DISTANCE import com.kouros.navigation.data.Constants.NEAREST_LOCATION_DISTANCE import com.kouros.navigation.data.Constants.SPEED_UPDATE_DISTANCE @@ -117,6 +119,7 @@ class RouteCalculator(var routeModel: RouteModel) { if ((distance > SPEED_UPDATE_DISTANCE * 2) || lastSpeedIndex < routeModel.route.currentStepIndex) { lastSpeedIndex = routeModel.route.currentStepIndex lastSpeedLocation = location + viewModel.updateSpeedLimit( location, routeModel.route.currentStep().street, diff --git a/common/data/src/main/res/drawable/car_crash_24px.xml b/common/data/src/main/res/drawable/car_crash_24px.xml new file mode 100644 index 0000000..80a554d --- /dev/null +++ b/common/data/src/main/res/drawable/car_crash_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/common/data/src/main/res/drawable/construction_24px.xml b/common/data/src/main/res/drawable/construction_24px.xml new file mode 100644 index 0000000..b7afb15 --- /dev/null +++ b/common/data/src/main/res/drawable/construction_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/common/data/src/main/res/drawable/remove_road_24px.xml b/common/data/src/main/res/drawable/remove_road_24px.xml new file mode 100644 index 0000000..746f168 --- /dev/null +++ b/common/data/src/main/res/drawable/remove_road_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/common/data/src/main/res/drawable/traffic_jam_24px.xml b/common/data/src/main/res/drawable/traffic_jam_24px.xml new file mode 100644 index 0000000..04dfc3c --- /dev/null +++ b/common/data/src/main/res/drawable/traffic_jam_24px.xml @@ -0,0 +1,10 @@ + + +