Restaurants

This commit is contained in:
Dimitris
2026-05-05 14:27:00 +02:00
parent 202c2dfcea
commit 25ba7d7bf6
19 changed files with 134 additions and 83 deletions
@@ -755,7 +755,11 @@ class NavigationSession : CarSession(), NavigationListener, NavigationObserverCa
val duration = Duration.between(current, lastTrafficDate)
if (showTraffic && duration.abs().seconds > TRAFFIC_UPDATE) {
lastTrafficDate = current
navigationViewModel.loadTraffic(carContext, location, surfaceRenderer.carOrientation)
navigationViewModel.loadTraffic(
carContext,
location,
surfaceRenderer.carOrientation
)
}
}
@@ -28,12 +28,20 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.kouros.data.R
import com.kouros.navigation.data.ClosedColor
import com.kouros.navigation.data.Constants
import com.kouros.navigation.data.Constants.homeVogelhart
import com.kouros.navigation.data.HeavyColor
import com.kouros.navigation.data.LaneColor
import com.kouros.navigation.data.NavigationColorDark
import com.kouros.navigation.data.NavigationColorLight
import com.kouros.navigation.data.PharmacyColor
import com.kouros.navigation.data.QueuingColor
import com.kouros.navigation.data.RoadworksColor
import com.kouros.navigation.data.RouteColor
import com.kouros.navigation.data.SlowColor
import com.kouros.navigation.data.SpeedColor
import com.kouros.navigation.data.StationaryColor
import com.kouros.navigation.data.ViewStyle
import com.kouros.navigation.utils.GeoUtils.createEndCollection
import com.kouros.navigation.utils.GeoUtils.createPointCollection
@@ -180,6 +188,12 @@ 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,
@@ -289,13 +303,13 @@ fun trafficImage(key: String): Expression<ImageValue> {
fun trafficColor(key: String): Expression<ColorValue> {
when (key) {
"queuing" -> return const(Color(0xFFC46E53))
"slow" -> return const(Color(0xFFC43E3E))
"stationary" -> return const(Color(0xFF910A0A))
"heavy" -> return const(Color(0xFF6B0404))
"roadworks" -> return const(Color(0xFFDAA707))
"closed" -> return const(Color(0xFF210C0F))
"lane" -> return const(Color(0xFFEFBAC1))
"queuing" -> return const(QueuingColor)
"slow" -> return const(SlowColor)
"stationary" -> return const(StationaryColor)
"heavy" -> return const(HeavyColor)
"roadworks" -> return const(RoadworksColor)
"closed" -> return const(ClosedColor)
"lane" -> return const(LaneColor)
}
return const(Color.Blue)
}
@@ -306,11 +320,14 @@ fun AmenityLayer(routeData: String?) {
var color = const(Color.Red)
var img = image(painterResource(R.drawable.local_pharmacy_24px), drawAsSdf = true)
if (routeData.contains(Constants.CHARGING_STATION)) {
color = const(Color(0xFF054603))
color = const(PharmacyColor)
img = image(painterResource(R.drawable.ev_station_24px), drawAsSdf = true)
} else if (routeData.contains(Constants.FUEL_STATION)) {
color = const(Color.Blue)
img = image(painterResource(R.drawable.local_gas_station_24), drawAsSdf = true)
} else if (routeData.contains(Constants.RESTAURANT)) {
color = const(Color.Magenta)
img = image(painterResource(R.drawable.restaurant_24px), drawAsSdf = true)
}
val routes = rememberGeoJsonSource(GeoJsonData.JsonString(routeData))
SymbolLayer(
@@ -4,6 +4,8 @@ import androidx.car.app.CarContext
import androidx.car.app.Screen
import androidx.car.app.model.Action
import androidx.car.app.model.CarIcon
import androidx.car.app.model.GridItem
import androidx.car.app.model.GridTemplate
import androidx.car.app.model.Header
import androidx.car.app.model.ItemList
import androidx.car.app.model.ListTemplate
@@ -16,6 +18,7 @@ import com.kouros.navigation.data.Category
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.RESTAURANT
import com.kouros.navigation.data.ViewStyle
import com.kouros.navigation.model.NavigationViewModel
@@ -30,22 +33,18 @@ class CategoriesScreen(
var categories: List<Category> = listOf(
Category(id = FUEL_STATION, name = carContext.getString(R.string.fuel_station)),
Category(id = PHARMACY, name = carContext.getString(R.string.pharmacy)),
Category(id = CHARGING_STATION, name = carContext.getString(R.string.charging_station))
Category(id = CHARGING_STATION, name = carContext.getString(R.string.charging_station)),
Category(id = RESTAURANT, name = carContext.getString(R.string.restaurant))
)
init {
}
override fun onGetTemplate(): Template {
val itemListBuilder = ItemList.Builder()
.setNoItemsMessage("No categories to show")
categories.forEach {
itemListBuilder.addItem(
Row.Builder()
.setTitle(it.name)
GridItem.Builder()
.setImage(carIcon(carContext, it.id, -1))
.setTitle(it.name)
.setOnClickListener {
category = it.id
screenManager
@@ -55,7 +54,7 @@ class CategoriesScreen(
surfaceRenderer,
category,
navigationViewModel,
)
)
) { obj: Any? ->
if (obj != null) {
setResult(obj)
@@ -63,20 +62,19 @@ class CategoriesScreen(
}
}
}
.setBrowsable(true)
.build()
)
}
surfaceRenderer.viewStyle = ViewStyle.AMENITY_VIEW
val header = Header.Builder()
.setStartHeaderAction(Action.BACK)
.setTitle(carContext.getString(R.string.category_title))
.build()
return ListTemplate.Builder()
.setHeader(header)
return GridTemplate.Builder()
.setHeader(
Header.Builder()
.setStartHeaderAction(Action.BACK)
.setTitle(carContext.getString(R.string.category_title))
.build()
)
.setSingleList(itemListBuilder.build())
.build()
}
@@ -88,7 +86,7 @@ fun carIcon(context: CarContext, category: String, index: Int): CarIcon {
CHARGING_STATION -> R.drawable.ev_station_24px
FUEL_STATION -> R.drawable.local_gas_station_24
PHARMACY -> R.drawable.local_pharmacy_24px
else -> R.drawable.ic_place_white_24dp
else -> R.drawable.restaurant_24px
}
return CarIcon.Builder(IconCompat.createWithResource(context, resId)).build()
} else {
@@ -31,6 +31,7 @@ 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.RESTAURANT
import com.kouros.navigation.data.Constants.TAG
import com.kouros.navigation.data.Place
import com.kouros.navigation.data.overpass.Elements
@@ -52,7 +53,6 @@ class CategoryScreen(
) : Screen(carContext), CategoryObserverCallback {
val repository = getSettingsRepository(carContext)
val settingsViewModel = getSettingsViewModel(carContext)
@@ -77,7 +77,6 @@ class CategoryScreen(
})
navigationViewModel.elements.observe(this, categoryObserver)
//navigationViewModel.getAmenities(carContext, category, surfaceRenderer.lastLocation)
}
override fun onGetTemplate(): Template {
@@ -94,12 +93,10 @@ class CategoryScreen(
)
)
elements.forEach {
if (it.tags.operator != null) {
if (index++ < listLimit) {
listBuilder.addItem(
createItem(it, category, index)
)
}
if (index++ < listLimit) {
listBuilder.addItem(
createItem(it, category, index)
)
}
}
}
@@ -133,7 +130,7 @@ class CategoryScreen(
CHARGING_STATION -> R.string.charging_station
FUEL_STATION -> R.string.fuel_station
PHARMACY -> R.string.pharmacy
else -> R.string.no_places
else -> R.string.restaurant
}
return carContext.getString(resId)
}
@@ -154,10 +151,10 @@ 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}"))
when (category) {
CHARGING_STATION -> row.addText("${it.tags.socketType2} X Typ 2 ${it.tags.socketType2Output}")
FUEL_STATION -> row.addText(carText("${it.e5} / ${it.e10}${it.tags.openingHours}"))
RESTAURANT, PHARMACY ->row.addText(carText(it.tags.openingHours))
}
if (it.distance < 1000) {
row.addText("${(it.distance).toInt()} m")
@@ -3,7 +3,6 @@ package com.kouros.navigation.car.screen
import android.text.SpannableString
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.util.Log
import androidx.activity.OnBackPressedCallback
import androidx.car.app.CarContext
import androidx.car.app.CarToast
@@ -13,7 +12,6 @@ import androidx.car.app.model.Action
import androidx.car.app.model.Action.FLAG_DEFAULT
import androidx.car.app.model.Action.FLAG_IS_PERSISTENT
import androidx.car.app.model.CarColor
import androidx.car.app.model.CarIcon
import androidx.car.app.model.CarText
import androidx.car.app.model.DurationSpan
import androidx.car.app.model.ForegroundCarColorSpan
@@ -26,7 +24,6 @@ import androidx.car.app.model.Template
import androidx.car.app.navigation.model.MapController
import androidx.car.app.navigation.model.MapWithContentTemplate
import androidx.car.app.versioning.CarAppApiLevels
import androidx.core.graphics.drawable.IconCompat
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.Observer
@@ -35,7 +32,6 @@ import androidx.lifecycle.lifecycleScope
import com.kouros.data.R
import com.kouros.navigation.car.SurfaceRenderer
import com.kouros.navigation.car.navigation.RouteCarModel
import com.kouros.navigation.data.Constants.TAG
import com.kouros.navigation.data.Place
import com.kouros.navigation.data.ViewStyle
import com.kouros.navigation.data.route.Routes
@@ -377,7 +373,6 @@ class RoutePreviewScreen(
surfaceRenderer.carOrientation
)
}
}
enum class RoutePreviewType {
@@ -50,7 +50,7 @@ fun createNumberIcon(category: String, number: String): IconCompat {
CHARGING_STATION -> Color.GREEN
FUEL_STATION -> Color.BLUE
PHARMACY -> Color.RED
else -> Color.WHITE
else -> Color.MAGENTA
}
paint.color = color
canvas.drawCircle(size / 2f, size / 2f, size / 2f, paint)