This commit is contained in:
Dimitris
2026-01-20 13:21:58 +01:00
parent e22865bd73
commit 7db7cba4fb
21 changed files with 3595 additions and 1218 deletions

View File

@@ -115,7 +115,6 @@ class NavigationSession : Session(), NavigationScreen.Listener {
}
}
val carSpeedListener = OnCarDataAvailableListener<Speed> { data ->
if (data.displaySpeedMetersPerSecond.status == CarValue.STATUS_SUCCESS) {
val speed = data.displaySpeedMetersPerSecond.value
@@ -184,7 +183,7 @@ class NavigationSession : Session(), NavigationScreen.Listener {
val useCarLocation = getBooleanKeyValue(carContext, CAR_LOCATION)
if (useCarLocation) {
val carSensors = carContext.getCarService(CarHardwareManager::class.java).carSensors
carSensors.addCompassListener(CarSensors.UPDATE_RATE_FASTEST,
carSensors.addCompassListener(CarSensors.UPDATE_RATE_NORMAL,
carContext.mainExecutor,
carCompassListener)
carSensors.addCarHardwareLocationListener(

View File

@@ -30,7 +30,7 @@ import com.kouros.navigation.car.map.getPaddingValues
import com.kouros.navigation.car.map.rememberBaseStyle
import com.kouros.navigation.car.navigation.RouteCarModel
import com.kouros.navigation.data.Constants.ROUTING_ENGINE
import com.kouros.navigation.data.Constants.homeLocation
import com.kouros.navigation.data.Constants.homeVogelhart
import com.kouros.navigation.data.ObjectBox
import com.kouros.navigation.data.RouteEngine
import com.kouros.navigation.model.RouteModel
@@ -55,11 +55,11 @@ class SurfaceRenderer(
var lastLocation = location(0.0, 0.0)
var carOrientation = 0F
var carOrientation = 999F
private val cameraPosition = MutableLiveData(
CameraPosition(
zoom = 15.0,
target = Position(latitude = homeLocation.latitude, longitude = homeLocation.longitude)
target = Position(latitude = homeVogelhart.latitude, longitude = homeVogelhart.longitude)
)
)
private var visibleArea = MutableLiveData(
@@ -245,11 +245,14 @@ class SurfaceRenderer(
fun updateLocation(location: Location) {
synchronized(this) {
if (viewStyle == ViewStyle.VIEW || viewStyle == ViewStyle.PAN_VIEW) {
val bearing = bearing(
val bearing = if (carOrientation == 999F)
bearing(
lastLocation,
location,
cameraPosition.value!!.bearing
)
) else {
carOrientation.toDouble()
}
val zoom = if (viewStyle == ViewStyle.VIEW) {
calculateZoom(location.speed.toDouble())
} else {
@@ -281,16 +284,16 @@ class SurfaceRenderer(
}
fun setRouteData() {
routeData.value = routeModel.route.routeGeoJson
routeData.value = routeModel.curRoute.routeGeoJson
viewStyle = ViewStyle.VIEW
}
fun setPreviewRouteData(routeModel: RouteModel) {
viewStyle = ViewStyle.PREVIEW
with(routeModel) {
routeData.value = route.routeGeoJson
centerLocation = route.centerLocation
previewDistance = route.summary!!.distance
routeData.value = curRoute.routeGeoJson
centerLocation = curRoute.centerLocation
previewDistance = curRoute.summary.distance
}
updateCameraPosition(
0.0,

View File

@@ -158,21 +158,31 @@ fun RouteLayer(routeData: String?) {
@Composable
fun AmenityLayer(routeData: String?) {
if (routeData != null && routeData.isNotEmpty()) {
val color = if (routeData.contains(Constants.PHARMACY)) {
const(Color.Red)
} else if (routeData.contains(Constants.CHARGING_STATION)) {
const(Color.Blue)
} else {
const(Color.Black)
var color = const(Color.Red)
var img = image(painterResource(R.drawable.local_pharmacy_48px), drawAsSdf = true)
if (routeData.contains(Constants.CHARGING_STATION)) {
color = const(Color.Green)
img = image(painterResource(R.drawable.ev_station_48px), drawAsSdf = true)
} else if (routeData.contains(Constants.FUEL_STATION)){
color = const(Color.Black)
img = image(painterResource(R.drawable.local_gas_station_48px), drawAsSdf = true)
}
val routes = rememberGeoJsonSource(GeoJsonData.JsonString(routeData))
SymbolLayer(
id = "amenity-layer",
source = routes,
iconImage = image(painterResource(R.drawable.ev_station_48px), drawAsSdf = true),
iconImage = img,
iconColor = color,
iconOpacity = const(2.0f),
iconSize = const(3.0f),
iconSize =
interpolate(
type = exponential(1.2f),
input = zoom(),
5 to const(0.7f),
6 to const(1.0f),
7 to const(2.0f),
20 to const(4f),
),
)
}
}

View File

@@ -450,7 +450,7 @@ class NavigationScreen(
invalidate()
val mainThreadHandler = Handler(carContext.mainLooper)
mainThreadHandler.post {
object : CountDownTimer(3000, 1000) {
object : CountDownTimer(2000, 1000) {
override fun onTick(millisUntilFinished: Long) {}
override fun onFinish() {
navigationType = NavigationType.NAVIGATION

View File

@@ -6,11 +6,10 @@ import androidx.annotation.DrawableRes
import androidx.car.app.CarContext
import androidx.car.app.CarToast
import androidx.car.app.Screen
import androidx.car.app.constraints.ConstraintManager
import androidx.car.app.model.Action
import androidx.car.app.model.Action.FLAG_DEFAULT
import androidx.car.app.model.Action.FLAG_PRIMARY
import androidx.car.app.model.ActionStrip
import androidx.car.app.model.CarColor
import androidx.car.app.model.CarIcon
import androidx.car.app.model.CarText
import androidx.car.app.model.DurationSpan
@@ -18,19 +17,17 @@ import androidx.car.app.model.Header
import androidx.car.app.model.ItemList
import androidx.car.app.model.ListTemplate
import androidx.car.app.model.MessageTemplate
import androidx.car.app.model.OnClickListener
import androidx.car.app.model.Row
import androidx.car.app.model.Template
import androidx.car.app.navigation.model.MapController
import androidx.car.app.navigation.model.MapWithContentTemplate
import androidx.car.app.navigation.model.NavigationTemplate
import androidx.car.app.navigation.model.RoutingInfo
import androidx.core.graphics.drawable.IconCompat
import androidx.lifecycle.Observer
import com.kouros.data.R
import com.kouros.navigation.car.SurfaceRenderer
import com.kouros.navigation.car.navigation.NavigationMessage
import com.kouros.navigation.car.navigation.RouteCarModel
import com.kouros.navigation.data.NavigationRepository
import com.kouros.navigation.data.Place
import com.kouros.navigation.model.ViewModel
import com.kouros.navigation.utils.location
@@ -79,9 +76,14 @@ class RoutePreviewScreen(
.setFlags(FLAG_DEFAULT)
.setIcon(navigateActionIcon)
.setOnClickListener { this.onNavigate() }
.build()
val itemListBuilder = ItemList.Builder()
var i = 0
routeModel.route.routes.forEach { it ->
itemListBuilder.addItem(createRow(i++, navigateAction))
}
val header = Header.Builder()
.setStartHeaderAction(Action.BACK)
.setTitle(carContext.getString(R.string.route_preview))
@@ -93,30 +95,40 @@ class RoutePreviewScreen(
)
.build()
val message = if (routeModel.isNavigating() && routeModel.route.waypoints!!.isNotEmpty()) {
createRouteText()
} else {
CarText.Builder("Wait")
.build()
}
val messageTemplate = MessageTemplate.Builder(
message
)
.setHeader(header)
.addAction(navigateAction)
.setLoading(message.toString() == "Wait")
.build()
val timer = object : CountDownTimer(5000, 1000) {
override fun onTick(millisUntilFinished: Long) {}
override fun onFinish() {
//onNavigate()
val message =
if (routeModel.isNavigating() && routeModel.curRoute.waypoints!!.isNotEmpty()) {
createRouteText(0)
} else {
CarText.Builder("Wait")
.build()
}
if (routeModel.route.routes.size == 1) {
val timer = object : CountDownTimer(5000, 1000) {
override fun onTick(millisUntilFinished: Long) {}
override fun onFinish() {
onNavigate()
}
}
timer.start()
}
timer.start()
val content = if (routeModel.route.routes.size > 1) {
ListTemplate.Builder()
.setHeader(header)
.setSingleList(itemListBuilder.build())
.build()
} else {
MessageTemplate.Builder(
message
)
.setHeader(header)
.addAction(navigateAction)
.setLoading(message.toString() == "Wait")
.build()
}
return MapWithContentTemplate.Builder()
.setContentTemplate(messageTemplate)
.setContentTemplate(content)
.setMapController(
MapController.Builder().setMapActionStrip(
getMapActionStrip()
@@ -176,10 +188,14 @@ class RoutePreviewScreen(
)
.build()
private fun createRouteText(): CarText {
val time = routeModel.route.summary!!.duration
private fun createRouteText(index: Int): CarText {
val time = routeModel.route.routes[index].summary.duration
println("Duration $time")
val length =
BigDecimal(routeModel.route.summary!!.distance).setScale(1, RoundingMode.HALF_EVEN)
BigDecimal(routeModel.route.routes[index].summary.distance).setScale(
1,
RoundingMode.HALF_EVEN
)
val firstRoute = SpannableString(" \u00b7 $length km")
firstRoute.setSpan(
DurationSpan.create(time.toLong()), 0, 1, 0
@@ -188,14 +204,27 @@ class RoutePreviewScreen(
.build()
}
private fun createRow(index: Int, action: Action): Row {
val route = createRouteText(index)
val titleText = "$index"
return Row.Builder()
.setTitle(route)
.setOnClickListener(OnClickListener { onRouteSelected(index) })
.addText(titleText)
.addAction(action)
.build()
}
private fun onNavigate() {
setResult(destination)
finish()
}
private fun onRouteSelected(index: Int) {
setResult(destination)
finish()
routeModel.currentRouteIndex = index
surfaceRenderer.setPreviewRouteData(routeModel)
//setResult(destination)
//finish()
}
fun getMapActionStrip(): ActionStrip {