From e8db5acfbf4702999d7ed93b4285216bce1797cb Mon Sep 17 00:00:00 2001 From: johan12345 Date: Sun, 12 Sep 2021 11:46:15 +0200 Subject: [PATCH] Check if Android Auto Version >= 6.7 before using Car API Level 3 --- app/src/google/AndroidManifest.xml | 4 ++++ .../net/vonforst/evmap/auto/CarAppService.kt | 9 ++++---- .../vonforst/evmap/auto/ChargepriceScreen.kt | 3 +-- .../java/net/vonforst/evmap/auto/Utils.kt | 22 +++++++++++++++++++ .../net/vonforst/evmap/auto/WelcomeScreen.kt | 3 +-- 5 files changed, 32 insertions(+), 9 deletions(-) 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))