From 65189cd798d2d0e2258ebd8b9d814289aea1efd1 Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Thu, 22 Jul 2021 14:32:00 +0200 Subject: [PATCH] Android Auto: create a VehicleDataScreen showing state of charge --- app/src/google/AndroidManifest.xml | 3 +- .../vonforst/evmap/auto/VehicleDataScreen.kt | 43 +++++++++++++++++++ .../net/vonforst/evmap/auto/WelcomeScreen.kt | 16 +++++++ app/src/google/res/drawable/ic_car.xml | 10 +++++ app/src/google/res/values-de/values.xml | 1 + app/src/google/res/values/values.xml | 1 + 6 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 app/src/google/java/net/vonforst/evmap/auto/VehicleDataScreen.kt create mode 100644 app/src/google/res/drawable/ic_car.xml diff --git a/app/src/google/AndroidManifest.xml b/app/src/google/AndroidManifest.xml index 9899dae2..cda57b0e 100644 --- a/app/src/google/AndroidManifest.xml +++ b/app/src/google/AndroidManifest.xml @@ -5,8 +5,9 @@ + - + { + val hardwareMan = ctx.getCarService(CarContext.HARDWARE_SERVICE) as CarHardwareManager + var energyLevel: EnergyLevel? = null + + init { + hardwareMan.carInfo.addEnergyLevelListener(ContextCompat.getMainExecutor(ctx), this) + } + + override fun onGetTemplate(): Template { + val energy = energyLevel ?: return GridTemplate.Builder().setLoading(true).build() + + return GridTemplate.Builder().setSingleList( + ItemList.Builder().apply { + energy.batteryPercent.value?.let { percent -> + addItem( + GridItem.Builder() + .setTitle("Battery") + .setText("%.1f".format(percent)) + .build() + ) + } + }.build() + ).build() + } + + override fun onCarDataAvailable(data: EnergyLevel) { + this.energyLevel = energyLevel + invalidate() + } +} \ No newline at end of file diff --git a/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt b/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt index 28d0996d..15b12bd1 100644 --- a/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt +++ b/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt @@ -6,6 +6,7 @@ import androidx.car.app.Screen import androidx.car.app.model.* import androidx.core.graphics.drawable.IconCompat import net.vonforst.evmap.R +import net.vonforst.evmap.auto.screens.VehicleDataScreen /** * Welcome screen with selection between favorites and nearby chargers @@ -55,6 +56,21 @@ class WelcomeScreen(ctx: CarContext, val session: EVMapSession) : Screen(ctx), L screenManager.push(MapScreen(carContext, session, favorites = true)) } .build()) + addItem( + Row.Builder() + .setTitle(carContext.getString(R.string.auto_vehicle_data)) + .setImage( + CarIcon.Builder( + IconCompat.createWithResource(carContext, R.drawable.ic_car) + ).setTint(CarColor.DEFAULT).build() + ) + .setBrowsable(true) + .setOnClickListener { + session.mapScreen = null + screenManager.push(VehicleDataScreen(carContext)) + } + .build() + ) }.build()) setCurrentLocationEnabled(true) setHeaderAction(Action.APP_ICON) diff --git a/app/src/google/res/drawable/ic_car.xml b/app/src/google/res/drawable/ic_car.xml new file mode 100644 index 00000000..dc2afc1f --- /dev/null +++ b/app/src/google/res/drawable/ic_car.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/google/res/values-de/values.xml b/app/src/google/res/values-de/values.xml index bcc63a28..87a1fb3c 100644 --- a/app/src/google/res/values-de/values.xml +++ b/app/src/google/res/values-de/values.xml @@ -20,6 +20,7 @@ Favoriten ⚠️ Störungsmeldung (%s) Weitere Aktualisierung nicht möglich. Bitte zurück gehen und neu starten. + Fahrzeugdaten Android Auto-Unterstützung Auf unterstützen Autos kannst du EVMap auch mit Android Auto nutzen. Öffne dazu einfach die EVMap-App aus dem Menü von Android Auto. klingt cool diff --git a/app/src/google/res/values/values.xml b/app/src/google/res/values/values.xml index 13380609..5f243afe 100644 --- a/app/src/google/res/values/values.xml +++ b/app/src/google/res/values/values.xml @@ -30,6 +30,7 @@ Favorites ⚠️ Fault report (%s) Further updates not possible. Please go back and restart. + Vehicle data Android Auto support You can also use EVMap from within Android Auto on supported cars. Simply select the EVMap app in the Android Auto menu. sounds cool