diff --git a/app/src/google/AndroidManifest.xml b/app/src/google/AndroidManifest.xml
index bfed96af..3e6a6b3c 100644
--- a/app/src/google/AndroidManifest.xml
+++ b/app/src/google/AndroidManifest.xml
@@ -10,6 +10,10 @@
+
+
+
+
= CarAppApiLevels.LEVEL_3) {
+ if (supportsCarApiLevel3(carContext)) {
val exec = ContextCompat.getMainExecutor(carContext)
hardwareMan.carSensors.addCarHardwareLocationListener(
CarSensors.UPDATE_RATE_NORMAL,
@@ -119,13 +118,13 @@ class EVMapSession(val cas: CarAppService) : Session(), LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private fun unbindLocationService() {
- if (carContext.carAppApiLevel >= CarAppApiLevels.LEVEL_3) {
+ if (supportsCarApiLevel3(carContext)) {
+ hardwareMan.carSensors.removeCarHardwareLocationListener(::onCarHardwareLocationReceived)
+ } else {
locationService?.let { service ->
service.removeLocationUpdates()
cas.unbindService(serviceConnection)
}
- } else {
- hardwareMan.carSensors.removeCarHardwareLocationListener(::onCarHardwareLocationReceived)
}
}
diff --git a/app/src/google/java/net/vonforst/evmap/auto/ChargepriceScreen.kt b/app/src/google/java/net/vonforst/evmap/auto/ChargepriceScreen.kt
index fd0384d9..266d20d5 100644
--- a/app/src/google/java/net/vonforst/evmap/auto/ChargepriceScreen.kt
+++ b/app/src/google/java/net/vonforst/evmap/auto/ChargepriceScreen.kt
@@ -11,7 +11,6 @@ import androidx.car.app.Screen
import androidx.car.app.hardware.CarHardwareManager
import androidx.car.app.hardware.info.Model
import androidx.car.app.model.*
-import androidx.car.app.versioning.CarAppApiLevels
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.IconCompat
import androidx.lifecycle.lifecycleScope
@@ -148,7 +147,7 @@ class ChargepriceScreen(ctx: CarContext, val charger: ChargeLocation) : Screen(c
}
private fun loadData() {
- if (carContext.carAppApiLevel >= CarAppApiLevels.LEVEL_3) {
+ if (supportsCarApiLevel3(carContext)) {
val exec = ContextCompat.getMainExecutor(carContext)
val hardwareMan =
carContext.getCarService(CarContext.HARDWARE_SERVICE) as CarHardwareManager
diff --git a/app/src/google/java/net/vonforst/evmap/auto/Utils.kt b/app/src/google/java/net/vonforst/evmap/auto/Utils.kt
index 69b16723..ae4ca6db 100644
--- a/app/src/google/java/net/vonforst/evmap/auto/Utils.kt
+++ b/app/src/google/java/net/vonforst/evmap/auto/Utils.kt
@@ -1,11 +1,13 @@
package net.vonforst.evmap.auto
+import android.content.Context
import android.graphics.Bitmap
import androidx.car.app.CarContext
import androidx.car.app.constraints.ConstraintManager
import androidx.car.app.hardware.common.CarUnit
import androidx.car.app.model.CarColor
import androidx.car.app.model.CarIcon
+import androidx.car.app.versioning.CarAppApiLevels
import androidx.core.graphics.drawable.IconCompat
import net.vonforst.evmap.api.availability.ChargepointStatus
import java.util.*
@@ -68,4 +70,24 @@ fun formatCarUnitSpeed(value: Float?, unit: Int?): String {
CarUnit.MILES_PER_HOUR -> "%.0f mph".format(value * 3.6 / kmPerMile)
else -> ""
}
+}
+
+fun getAndroidAutoVersion(ctx: Context): List {
+ val info = ctx.packageManager.getPackageInfo("com.google.android.projection.gearhead", 0)
+ return info.versionName.split(".")
+}
+
+fun supportsCarApiLevel3(ctx: CarContext): Boolean {
+ if (ctx.carAppApiLevel < CarAppApiLevels.LEVEL_3) return false
+ ctx.hostInfo?.let { hostInfo ->
+ if (hostInfo.packageName == "com.google.android.projection.gearhead") {
+ val version = getAndroidAutoVersion(ctx)
+ // Android Auto 6.7 is required. 6.6 reports supporting API Level 3,
+ // but crashes when using it. See: https://issuetracker.google.com/issues/199509584
+ if (version[0] < "6" || version[0] == "6" && version[1] < "7") {
+ return false
+ }
+ }
+ }
+ return true
}
\ 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 65dd54d8..aa8b3632 100644
--- a/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt
+++ b/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt
@@ -7,7 +7,6 @@ import android.os.Looper
import androidx.car.app.CarContext
import androidx.car.app.Screen
import androidx.car.app.model.*
-import androidx.car.app.versioning.CarAppApiLevels
import androidx.core.graphics.drawable.IconCompat
import net.vonforst.evmap.R
@@ -82,7 +81,7 @@ class WelcomeScreen(ctx: CarContext, val session: EVMapSession) : Screen(ctx), L
screenManager.push(MapScreen(carContext, session, favorites = true))
}
.build())
- if (carContext.carAppApiLevel >= CarAppApiLevels.LEVEL_3) {
+ if (supportsCarApiLevel3(carContext)) {
addItem(
Row.Builder()
.setTitle(carContext.getString(R.string.auto_vehicle_data))