diff --git a/app/src/google/java/net/vonforst/evmap/auto/PermissionScreen.kt b/app/src/google/java/net/vonforst/evmap/auto/PermissionScreen.kt index 72b8add9..8ed475fb 100644 --- a/app/src/google/java/net/vonforst/evmap/auto/PermissionScreen.kt +++ b/app/src/google/java/net/vonforst/evmap/auto/PermissionScreen.kt @@ -11,7 +11,6 @@ import net.vonforst.evmap.R */ class PermissionScreen( ctx: CarContext, - val session: EVMapSession, @StringRes val message: Int, val permissions: List ) : Screen(ctx) { diff --git a/app/src/google/java/net/vonforst/evmap/auto/VehicleDataScreen.kt b/app/src/google/java/net/vonforst/evmap/auto/VehicleDataScreen.kt index df30ccbd..401d2185 100644 --- a/app/src/google/java/net/vonforst/evmap/auto/VehicleDataScreen.kt +++ b/app/src/google/java/net/vonforst/evmap/auto/VehicleDataScreen.kt @@ -1,43 +1,102 @@ package net.vonforst.evmap.auto +import android.content.pm.PackageManager +import android.os.Handler +import android.os.Looper import androidx.car.app.CarContext import androidx.car.app.Screen import androidx.car.app.hardware.CarHardwareManager -import androidx.car.app.hardware.common.OnCarDataAvailableListener import androidx.car.app.hardware.info.EnergyLevel -import androidx.car.app.model.GridItem -import androidx.car.app.model.GridTemplate -import androidx.car.app.model.ItemList -import androidx.car.app.model.Template +import androidx.car.app.hardware.info.Model +import androidx.car.app.model.* import androidx.core.content.ContextCompat +import net.vonforst.evmap.R -class VehicleDataScreen(ctx: CarContext) : Screen(ctx), OnCarDataAvailableListener { - val hardwareMan = ctx.getCarService(CarContext.HARDWARE_SERVICE) as CarHardwareManager - var energyLevel: EnergyLevel? = null +class VehicleDataScreen(ctx: CarContext) : Screen(ctx) { + private val hardwareMan = ctx.getCarService(CarContext.HARDWARE_SERVICE) as CarHardwareManager + private var model: Model? = null + private var energyLevel: EnergyLevel? = null - init { - hardwareMan.carInfo.addEnergyLevelListener(ContextCompat.getMainExecutor(ctx), this) - } + private val permissions = listOf( + "com.google.android.gms.permission.CAR_FUEL" + ) 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() + if (permissionsGranted()) { + setupListeners() + } else { + Handler(Looper.getMainLooper()).post { + screenManager.pushForResult( + PermissionScreen( + carContext, + R.string.auto_location_permission_needed, + permissions ) + ) { + setupListeners() } - }.build() - ).build() + } + } + + val energyLevel = energyLevel + val model = model + + return GridTemplate.Builder().apply { + setTitle( + if (model != null && model.manufacturer.value != null && model.name.value != null) { + "${model.manufacturer.value} ${model.name.value}" + } else { + carContext.getString(R.string.auto_vehicle_data) + } + ) + setHeaderAction(Action.BACK) + if (!permissionsGranted()) { + setLoading(true) + } else { + setSingleList( + ItemList.Builder().apply { + addItem( + GridItem.Builder().apply { + setTitle("Battery") + energyLevel?.batteryPercent?.value?.let { percent -> + setText("%.1f".format(percent)) + setImage(CarIcon.APP_ICON) + } ?: setLoading(true) + }.build() + ) + addItem( + GridItem.Builder().apply { + setTitle("Fuel") + energyLevel?.fuelPercent?.value?.let { percent -> + setText("%.1f".format(percent)) + setImage(CarIcon.APP_ICON) + } ?: setLoading(true) + }.build() + ) + }.build() + ) + } + }.build() } - override fun onCarDataAvailable(data: EnergyLevel) { - this.energyLevel = energyLevel - invalidate() + private fun setupListeners() { + val exec = ContextCompat.getMainExecutor(carContext) + hardwareMan.carInfo.addEnergyLevelListener(exec) { + this.energyLevel = it + invalidate() + } + + hardwareMan.carInfo.fetchModel(exec) { + this.model = it + invalidate() + } } + + private fun permissionsGranted(): Boolean = + permissions.all { + ContextCompat.checkSelfPermission( + carContext, + it + ) == PackageManager.PERMISSION_GRANTED + } } \ 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 0969def4..0afb7072 100644 --- a/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt +++ b/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt @@ -22,7 +22,6 @@ class WelcomeScreen(ctx: CarContext, val session: EVMapSession) : Screen(ctx), L screenManager.pushForResult( PermissionScreen( carContext, - session, R.string.auto_location_permission_needed, listOf(Manifest.permission.ACCESS_FINE_LOCATION) ) diff --git a/app/src/google/res/values-de/values.xml b/app/src/google/res/values-de/values.xml index 87a1fb3c..3f5225cd 100644 --- a/app/src/google/res/values-de/values.xml +++ b/app/src/google/res/values-de/values.xml @@ -15,6 +15,7 @@ In App öffnen Auf dem Telefon geöffnet Um EVMap auf Android Auto zu nutzen, braucht die App Zugriff auf deinen Standort. + Für diese Funktion benötigt EVMap Zugriff auf Daten deines Fahrzeugs. Auf Telefon zulassen In der Nähe Favoriten diff --git a/app/src/google/res/values/values.xml b/app/src/google/res/values/values.xml index 5f243afe..101b3dff 100644 --- a/app/src/google/res/values/values.xml +++ b/app/src/google/res/values/values.xml @@ -25,6 +25,7 @@ Open in app Opened on phone To run EVMap on Android Auto, you need to grant access to your location. + For this feature, EVMap needs access to your vehicle data. Grant on phone Nearby chargers Favorites