From 4345ee655059f58b196184453affbe097637c0c2 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Wed, 7 Jan 2026 21:51:55 +0100 Subject: [PATCH 1/2] Upgrade Car App Library to 1.8.0-beta01 --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f2b57d6f..735fdb08 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -330,7 +330,7 @@ dependencies { implementation("com.github.ev-map:locale-config-x:58b036abf4") // Android Auto - val carAppVersion = "1.7.0" + val carAppVersion = "1.8.0-beta01" implementation("androidx.car.app:app:$carAppVersion") normalImplementation("androidx.car.app:app-projected:$carAppVersion") automotiveImplementation("androidx.car.app:app-automotive:$carAppVersion") From ac37cdde32372990d3862c0842b894534078f8a4 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Wed, 7 Jan 2026 21:55:10 +0100 Subject: [PATCH 2/2] new map screen: keep scroll position on refresh --- .../evmap/auto/ChargerListFormatter.kt | 52 ++++++++++++++++++- .../vonforst/evmap/auto/LegacyMapScreen.kt | 3 +- .../java/net/vonforst/evmap/auto/MapScreen.kt | 8 +-- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/net/vonforst/evmap/auto/ChargerListFormatter.kt b/app/src/main/java/net/vonforst/evmap/auto/ChargerListFormatter.kt index f1a64273..45e36e8b 100644 --- a/app/src/main/java/net/vonforst/evmap/auto/ChargerListFormatter.kt +++ b/app/src/main/java/net/vonforst/evmap/auto/ChargerListFormatter.kt @@ -21,6 +21,7 @@ import androidx.car.app.model.Pane import androidx.car.app.model.Place import androidx.car.app.model.PlaceMarker import androidx.car.app.model.Row +import androidx.car.app.model.RowSection import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.IconCompat import net.vonforst.evmap.R @@ -54,7 +55,7 @@ class ChargerListFormatter( private val iconGen = ChargerIconGenerator(carContext, null, height = 96) var favorites: Set = emptySet() - fun buildChargerList( + fun buildChargerListLegacy( chargers: List?, availabilities: Map> ): ItemList? { @@ -103,6 +104,55 @@ class ChargerListFormatter( } } + fun buildChargerList( + chargers: List?, + availabilities: Map> + ): RowSection? { + return if (chargers != null) { + val chargerList = chargers.take(screen.maxRows) + val builder = RowSection.Builder() + // only show the city if not all chargers are in the same city + val showCity = chargerList.map { it.address?.city }.distinct().size > 1 + chargerList.forEach { charger -> + builder.addItem( + formatCharger( + charger, + availabilities, + showCity, + charger.id in favorites + ) + ) + } + builder.setNoItemsMessage( + carContext.getString( + if (screen.filterStatus == FILTERS_FAVORITES) { + R.string.auto_no_favorites_found + } else { + R.string.auto_no_chargers_found + } + ) + ) + builder.setOnItemVisibilityChangedListener(screen) + builder.build() + } else { + if (screen.loadingError) { + val builder = RowSection.Builder() + builder.setNoItemsMessage( + carContext.getString(R.string.connection_error) + ) + builder.build() + } else if (screen.locationError) { + val builder = RowSection.Builder() + builder.setNoItemsMessage( + carContext.getString(R.string.location_error) + ) + builder.build() + } else { + null + } + } + } + private fun formatCharger( charger: ChargeLocation, availabilities: Map>, diff --git a/app/src/main/java/net/vonforst/evmap/auto/LegacyMapScreen.kt b/app/src/main/java/net/vonforst/evmap/auto/LegacyMapScreen.kt index 946569ec..9ff6b96b 100644 --- a/app/src/main/java/net/vonforst/evmap/auto/LegacyMapScreen.kt +++ b/app/src/main/java/net/vonforst/evmap/auto/LegacyMapScreen.kt @@ -58,7 +58,6 @@ import java.io.IOException import java.time.Duration import java.time.Instant import java.time.ZonedDateTime -import kotlin.collections.set import kotlin.math.abs import kotlin.math.min @@ -164,7 +163,7 @@ class LegacyMapScreen(ctx: CarContext, val session: EVMapSession) : setAnchor(Place.Builder(CarLocation.create(it.latitude, it.longitude)).build()) } } - formatter.buildChargerList(chargers, availabilities)?.let { + formatter.buildChargerListLegacy(chargers, availabilities)?.let { setItemList(it) } ?: setLoading(true) setCurrentLocationEnabled(true) diff --git a/app/src/main/java/net/vonforst/evmap/auto/MapScreen.kt b/app/src/main/java/net/vonforst/evmap/auto/MapScreen.kt index c6854601..0411b6bb 100644 --- a/app/src/main/java/net/vonforst/evmap/auto/MapScreen.kt +++ b/app/src/main/java/net/vonforst/evmap/auto/MapScreen.kt @@ -21,9 +21,9 @@ import androidx.car.app.model.ActionStrip import androidx.car.app.model.CarColor import androidx.car.app.model.CarIcon import androidx.car.app.model.Header -import androidx.car.app.model.ListTemplate import androidx.car.app.model.MessageTemplate import androidx.car.app.model.PaneTemplate +import androidx.car.app.model.SectionedItemTemplate import androidx.car.app.model.Template import androidx.car.app.navigation.model.MapController import androidx.car.app.navigation.model.MapWithContentTemplate @@ -213,7 +213,7 @@ class MapScreen(ctx: CarContext, val session: EVMapSession) : }.build()) }.build() } else { - ListTemplate.Builder().apply { + SectionedItemTemplate.Builder().apply { setHeader(Header.Builder().apply { setTitle(title) setStartHeaderAction(Action.APP_ICON) @@ -223,8 +223,10 @@ class MapScreen(ctx: CarContext, val session: EVMapSession) : chargers?.filterIsInstance(), availabilities )?.let { - setSingleList(it) + addSection(it) } ?: setLoading(true) + + setScrollStatePersistenceStrategy(SectionedItemTemplate.SCROLL_STATE_PRESERVE_INDEX) }.build() } return MapWithContentTemplate.Builder().apply {