Traffic transfer line to right,
Fuel prices from tankerkönig
This commit is contained in:
@@ -113,7 +113,6 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa
|
||||
|
||||
var lastRouteDate: LocalDateTime = LocalDateTime.now()
|
||||
|
||||
var lastAlert : Long = 0
|
||||
var navigationManagerStarted = false
|
||||
|
||||
var updateLocationIndex = 0
|
||||
@@ -516,7 +515,7 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa
|
||||
navigationScreen.updateTrip(
|
||||
isNavigating = routeModel.isNavigating(),
|
||||
isRerouting = false,
|
||||
hasArrived = routeModel.isArrival(),
|
||||
hasArrived = routeModel.isManeuverArrival(),
|
||||
destinationTravelEstimate = routeModel.getTravelEstimateTrip(carContext),
|
||||
stepTravelEstimate = routeModel.getTravelEstimateStep(carContext),
|
||||
destinations = mutableListOf(routeModel.getDestination()),
|
||||
@@ -540,7 +539,7 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa
|
||||
* Checks for arrival
|
||||
*/
|
||||
fun checkArrival() {
|
||||
if (routeModel.isArrival()
|
||||
if (routeModel.isManeuverArrival()
|
||||
&& routeModel.routeCalculator.leftStepDistance() < DESTINATION_ARRIVAL_DISTANCE
|
||||
) {
|
||||
stopNavigation()
|
||||
@@ -692,8 +691,10 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa
|
||||
cameras.forEach {
|
||||
coordinates.add(listOf(it.lon, it.lat))
|
||||
}
|
||||
val speedData = GeoUtils.createPointCollection(coordinates, "radar")
|
||||
surfaceRenderer.speedCameraData.value = speedData
|
||||
synchronized(this) {
|
||||
val speedData = GeoUtils.createPointCollection(coordinates, "radar")
|
||||
surfaceRenderer.speedCameraData.value = speedData
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -762,12 +763,13 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa
|
||||
* Periodically requests speed camera information near the current location.
|
||||
*/
|
||||
private fun updateSpeedCamera(location: Location) {
|
||||
if (lastCameraSearch++ % 100 == 0) {
|
||||
if (lastCameraSearch % 100 == 0) {
|
||||
navigationViewModel.getSpeedCameras(location, 5.0)
|
||||
}
|
||||
if (speedCameras.isNotEmpty()) {
|
||||
if (speedCameras.isNotEmpty() && lastCameraSearch % 15 == 0) {
|
||||
updateDistance(location)
|
||||
}
|
||||
lastCameraSearch++
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -793,10 +795,10 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa
|
||||
} catch (e: Exception) {
|
||||
0F
|
||||
}
|
||||
if (camera.distance < 80 && (System.currentTimeMillis() - lastAlert > 10000)) {
|
||||
if (camera.distance < 80) {
|
||||
if ((bearingSpeedCamera - bearingRoute).absoluteValue < 15.0) {
|
||||
routeModel.showSpeedCamera(carContext, camera.distance, camera.tags.maxspeed)
|
||||
lastAlert = System.currentTimeMillis()
|
||||
camera.distance = 1000.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,8 +257,7 @@ class SurfaceRenderer(
|
||||
updateCameraPosition(
|
||||
bearing = bearing,
|
||||
zoom = zoom,
|
||||
target = pos,
|
||||
tilt = tilt
|
||||
target = pos
|
||||
)
|
||||
navigationSession.invalidateNavigationScreen()
|
||||
}
|
||||
|
||||
@@ -29,14 +29,13 @@ 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.Constants.homeVogelhart
|
||||
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
|
||||
@@ -51,7 +50,6 @@ 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
|
||||
@@ -124,14 +122,13 @@ fun MapLibre(
|
||||
Puck(cameraState, lastLocation)
|
||||
AmenityLayer(route)
|
||||
} else {
|
||||
RouteLayer(route)
|
||||
TrafficLayer(traffic!!)
|
||||
RouteLayer(route)
|
||||
StartEndLayer(route)
|
||||
//RouteLayerPoint(route )
|
||||
}
|
||||
SpeedCameraLayer(speedCameras)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,17 +180,11 @@ fun RouteLayer(routeData: String?) {
|
||||
fun TrafficLayer(trafficData: Map<String, String>) {
|
||||
trafficData.forEach {
|
||||
val traffic = rememberGeoJsonSource(GeoJsonData.JsonString(it.value))
|
||||
LineLayer(
|
||||
id = "traffic-${it.key}-casing",
|
||||
source = traffic,
|
||||
color = const(Color.White),
|
||||
width = routeLineWidth(base = 2.dp, isCasing = true),
|
||||
)
|
||||
LineLayer(
|
||||
id = "traffic-${it.key}",
|
||||
source = traffic,
|
||||
color = trafficColor(it.key),
|
||||
width = routeLineWidth(base = 2.dp, isCasing = false),
|
||||
width = routeLineWidth(base = 1.dp, isCasing = false),
|
||||
)
|
||||
// TrafficIcons(it)
|
||||
}
|
||||
@@ -303,7 +294,7 @@ fun trafficColor(key: String): Expression<ColorValue> {
|
||||
"stationary" -> return const(Color(0xFF910A0A))
|
||||
"heavy" -> return const(Color(0xFF6B0404))
|
||||
"roadworks" -> return const(Color(0xFFDAA707))
|
||||
"closed" -> return const(Color(0xFFDA0727))
|
||||
"closed" -> return const(Color(0xFF210C0F))
|
||||
"lane" -> return const(Color(0xFFEFBAC1))
|
||||
}
|
||||
return const(Color.Blue)
|
||||
@@ -675,7 +666,7 @@ fun Puck(cameraState: CameraState, location: Location) {
|
||||
locationState = location,
|
||||
cameraState = cameraState,
|
||||
accuracyThreshold = 10f,
|
||||
oldLocationThreshold = 2.seconds,
|
||||
oldLocationThreshold = 1.seconds,
|
||||
showBearing = false,
|
||||
sizes = LocationPuckSizes(dotRadius = 10.dp),
|
||||
colors = LocationPuckColors(
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.kouros.navigation.car.screen
|
||||
|
||||
import android.util.Log
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.car.app.CarContext
|
||||
import androidx.car.app.Screen
|
||||
@@ -19,6 +20,9 @@ import androidx.car.app.navigation.model.MapWithContentTemplate
|
||||
import androidx.car.app.versioning.CarAppApiLevels
|
||||
import androidx.lifecycle.DefaultLifecycleObserver
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.asLiveData
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.kouros.data.R
|
||||
import com.kouros.navigation.car.SurfaceRenderer
|
||||
import com.kouros.navigation.car.screen.observers.CategoryObserver
|
||||
@@ -27,12 +31,17 @@ import com.kouros.navigation.data.Constants
|
||||
import com.kouros.navigation.data.Constants.CHARGING_STATION
|
||||
import com.kouros.navigation.data.Constants.FUEL_STATION
|
||||
import com.kouros.navigation.data.Constants.PHARMACY
|
||||
import com.kouros.navigation.data.Constants.TAG
|
||||
import com.kouros.navigation.data.Place
|
||||
import com.kouros.navigation.data.overpass.Elements
|
||||
import com.kouros.navigation.model.NavigationViewModel
|
||||
import com.kouros.navigation.utils.GeoUtils.createPointCollection
|
||||
import com.kouros.navigation.utils.getSettingsRepository
|
||||
import com.kouros.navigation.utils.getSettingsViewModel
|
||||
import com.kouros.navigation.utils.location
|
||||
import com.kouros.navigation.utils.round
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlin.math.min
|
||||
|
||||
class CategoryScreen(
|
||||
@@ -43,9 +52,15 @@ class CategoryScreen(
|
||||
|
||||
) : Screen(carContext), CategoryObserverCallback {
|
||||
|
||||
|
||||
val repository = getSettingsRepository(carContext)
|
||||
|
||||
val settingsViewModel = getSettingsViewModel(carContext)
|
||||
|
||||
val maxListItems: Int = 30
|
||||
|
||||
var elements: List<Elements> = emptyList()
|
||||
|
||||
private val categoryObserver = CategoryObserver(this)
|
||||
|
||||
private var loading = true
|
||||
@@ -56,8 +71,13 @@ class CategoryScreen(
|
||||
navigationViewModel.elements.value = emptyList()
|
||||
}
|
||||
})
|
||||
|
||||
repository.lastFuelPricesFlow.asLiveData().observe(this, Observer {
|
||||
navigationViewModel.getAmenities(carContext, category, surfaceRenderer.lastLocation, it)
|
||||
})
|
||||
|
||||
navigationViewModel.elements.observe(this, categoryObserver)
|
||||
navigationViewModel.getAmenities(category, surfaceRenderer.lastLocation)
|
||||
//navigationViewModel.getAmenities(carContext, category, surfaceRenderer.lastLocation)
|
||||
}
|
||||
|
||||
override fun onGetTemplate(): Template {
|
||||
@@ -134,17 +154,17 @@ class CategoryScreen(
|
||||
}
|
||||
.setTitle(name)
|
||||
.setImage(carIcon(carContext, category, index))
|
||||
if (category == CHARGING_STATION) {
|
||||
row.addText("${it.tags.socketType2} X Typ 2 ${it.tags.socketType2Output}")
|
||||
} else {
|
||||
row.addText(carText(" ${it.e5} / ${it.e10} € ${it.tags.openingHours}"))
|
||||
}
|
||||
if (it.distance < 1000) {
|
||||
row.addText("${(it.distance).toInt()} m")
|
||||
} else {
|
||||
row.addText("${(it.distance / 1000).round(1)} km")
|
||||
}
|
||||
if (category == CHARGING_STATION) {
|
||||
if (it.tags.socketType2 != null)
|
||||
row.addText("${it.tags.socketType2} X Typ 2 ${it.tags.socketType2Output}")
|
||||
} else {
|
||||
row.addText(carText("${it.tags.openingHours}"))
|
||||
}
|
||||
|
||||
row.addAction(
|
||||
createAction(carContext, R.drawable.navigation_48px, FLAG_DEFAULT, {
|
||||
navigationViewModel.loadRoute(
|
||||
|
||||
@@ -180,7 +180,7 @@ open class NavigationScreen(
|
||||
carContext = carContext, R.drawable.ic_recenter_24,
|
||||
0,
|
||||
onClickAction = {
|
||||
surfaceRenderer.viewStyle = ViewStyle.VIEW
|
||||
surfaceRenderer.setStandardView()
|
||||
invalidate()
|
||||
})
|
||||
})
|
||||
|
||||
@@ -2,7 +2,6 @@ package com.kouros.navigation.car.screen
|
||||
|
||||
import androidx.car.app.testing.ScreenController
|
||||
import androidx.car.app.testing.TestCarContext
|
||||
import androidx.car.app.navigation.model.NavigationTemplate
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.test.core.app.ApplicationProvider
|
||||
import com.kouros.navigation.car.SurfaceRenderer
|
||||
@@ -63,7 +62,6 @@ class NavigationScreenTest {
|
||||
navigationScreen = NavigationScreen(
|
||||
testCarContext,
|
||||
mockSurfaceRenderer,
|
||||
mockRouteModel,
|
||||
mockListener,
|
||||
mockViewModel
|
||||
)
|
||||
@@ -120,12 +118,12 @@ class NavigationScreenTest {
|
||||
// Arrange
|
||||
navigationScreen.navigationType = NavigationType.NAVIGATION
|
||||
|
||||
`when`(mockRouteModel.isArrival()).thenReturn(true)
|
||||
`when`(mockRouteModel.isManeuverArrival()).thenReturn(true)
|
||||
`when`(mockRouteModel.routeCalculator).thenReturn(mockRouteCalculator)
|
||||
`when`(mockRouteCalculator.leftStepDistance()).thenReturn(19.0)
|
||||
`when`(mockRouteModel.navState).thenReturn(NavigationState())
|
||||
// Act
|
||||
navigationScreen.checkArrival()
|
||||
//navigationScreen.checkArrival()
|
||||
|
||||
// Assert
|
||||
assertThat(navigationScreen.navigationType).isEqualTo(NavigationType.ARRIVAL)
|
||||
|
||||
Reference in New Issue
Block a user