From 594e6964f468ed0b1322f2a73e5829319aed3759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joris=20Pelgr=C3=B6m?= Date: Wed, 25 Jan 2023 04:37:00 +0100 Subject: [PATCH] Improve state for Android Auto: translate, timestamps (#3262) - Use string resources for common states to allow for translation - Format timestamps to a relative time (if recent) to make it easier to read --- .../vehicle/EntityGridVehicleScreen.kt | 2 +- .../android/common/data/integration/Entity.kt | 47 +++++++++++++++++-- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/app/src/full/java/io/homeassistant/companion/android/vehicle/EntityGridVehicleScreen.kt b/app/src/full/java/io/homeassistant/companion/android/vehicle/EntityGridVehicleScreen.kt index 00c38139c..f7cdfabe2 100644 --- a/app/src/full/java/io/homeassistant/companion/android/vehicle/EntityGridVehicleScreen.kt +++ b/app/src/full/java/io/homeassistant/companion/android/vehicle/EntityGridVehicleScreen.kt @@ -63,7 +63,7 @@ class EntityGridVehicleScreen( GridItem.Builder() .setLoading(false) .setTitle(entity.friendlyName) - .setText(entity.friendlyState) + .setText(entity.friendlyState(carContext)) .setImage( CarIcon.Builder( IconicsDrawable(carContext, icon).apply { diff --git a/common/src/main/java/io/homeassistant/companion/android/common/data/integration/Entity.kt b/common/src/main/java/io/homeassistant/companion/android/common/data/integration/Entity.kt index 7bbfb4875..f3c58efc0 100644 --- a/common/src/main/java/io/homeassistant/companion/android/common/data/integration/Entity.kt +++ b/common/src/main/java/io/homeassistant/companion/android/common/data/integration/Entity.kt @@ -2,14 +2,20 @@ package io.homeassistant.companion.android.common.data.integration import android.content.Context import android.graphics.Color +import android.os.Build +import android.text.format.DateUtils import android.util.Log import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.IIcon import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial import io.homeassistant.companion.android.common.data.websocket.impl.entities.CompressedStateDiff +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter +import java.time.format.DateTimeParseException import java.util.Calendar import java.util.Locale import kotlin.math.round +import io.homeassistant.companion.android.common.R as commonR data class Entity( val entityId: String, @@ -436,9 +442,42 @@ suspend fun Entity.onPressed( val Entity.friendlyName: String get() = (attributes as? Map<*, *>)?.get("friendly_name")?.toString() ?: entityId -val Entity.friendlyState: String - get() = state.split("_").joinToString(" ") { word -> - word.replaceFirstChar { - if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() +fun Entity.friendlyState(context: Context): String { + var friendlyState = when (state) { + "closed" -> context.getString(commonR.string.state_closed) + "closing" -> context.getString(commonR.string.state_closing) + "jammed" -> context.getString(commonR.string.state_jammed) + "locked" -> context.getString(commonR.string.state_locked) + "locking" -> context.getString(commonR.string.state_locking) + "off" -> context.getString(commonR.string.state_off) + "on" -> context.getString(commonR.string.state_on) + "open" -> context.getString(commonR.string.state_open) + "opening" -> context.getString(commonR.string.state_opening) + "unavailable" -> context.getString(commonR.string.state_unavailable) + "unlocked" -> context.getString(commonR.string.state_unlocked) + "unlocking" -> context.getString(commonR.string.state_unlocking) + "unknown" -> context.getString(commonR.string.state_unknown) + else -> state + } + if (friendlyState == state && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + try { + val stateInMillis = ZonedDateTime.parse(state, DateTimeFormatter.ISO_OFFSET_DATE_TIME) + .toInstant() + .toEpochMilli() + friendlyState = DateUtils.getRelativeTimeSpanString( + stateInMillis, + System.currentTimeMillis(), + 0, + DateUtils.FORMAT_ABBREV_ALL + ).toString() + } catch (e: DateTimeParseException) { /* Not a timestamp */ } + } + if (friendlyState == state) { + friendlyState = state.split("_").joinToString(" ") { word -> + word.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() + } } } + return friendlyState +}