From 03410a4c4944d9eb99e0f5fb583e6915edc88e90 Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Sun, 17 May 2020 13:21:19 +0200 Subject: [PATCH] show charger status "unknown" as question mark (fixes #7) --- .../evmap/adapter/DataBindingAdapters.kt | 10 ++++--- .../net/vonforst/evmap/ui/BindingAdapters.kt | 30 +++++++++++++++---- .../evmap/viewmodel/FavoritesViewModel.kt | 6 ++-- app/src/main/res/layout/item_connector.xml | 13 ++++---- app/src/main/res/layout/item_favorite.xml | 3 +- app/src/main/res/values/colors.xml | 1 + 6 files changed, 43 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/net/vonforst/evmap/adapter/DataBindingAdapters.kt b/app/src/main/java/net/vonforst/evmap/adapter/DataBindingAdapters.kt index 820cd707..37e0e0cd 100644 --- a/app/src/main/java/net/vonforst/evmap/adapter/DataBindingAdapters.kt +++ b/app/src/main/java/net/vonforst/evmap/adapter/DataBindingAdapters.kt @@ -65,14 +65,16 @@ fun chargepointWithAvailability( availability: Map>? ): List? { return chargepoints?.map { - ConnectorAdapter.ChargepointWithAvailability( - it, availability?.get(it)?.count { it == ChargepointStatus.AVAILABLE } - ) + val status = availability?.get(it) + ConnectorAdapter.ChargepointWithAvailability(it, status) } } class ConnectorAdapter : DataBindingAdapter() { - data class ChargepointWithAvailability(val chargepoint: Chargepoint, val available: Int?) : + data class ChargepointWithAvailability( + val chargepoint: Chargepoint, + val status: List? + ) : Equatable override fun getItemViewType(position: Int): Int = R.layout.item_connector diff --git a/app/src/main/java/net/vonforst/evmap/ui/BindingAdapters.kt b/app/src/main/java/net/vonforst/evmap/ui/BindingAdapters.kt index 5e269c2a..7c71e5cf 100644 --- a/app/src/main/java/net/vonforst/evmap/ui/BindingAdapters.kt +++ b/app/src/main/java/net/vonforst/evmap/ui/BindingAdapters.kt @@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.floatingactionbutton.FloatingActionButton import net.vonforst.evmap.R +import net.vonforst.evmap.api.availability.ChargepointStatus import net.vonforst.evmap.api.goingelectric.Chargepoint @@ -82,25 +83,30 @@ fun setContentDescriptionResource(imageView: ImageView, resource: Int) { } @BindingAdapter("tintAvailability") -fun setImageTintAvailability(view: ImageView, available: Int?) { +fun setImageTintAvailability(view: ImageView, available: List?) { view.imageTintList = ColorStateList.valueOf(availabilityColor(available, view.context)) } @BindingAdapter("textColorAvailability") -fun setTextColorAvailability(view: TextView, available: Int?) { +fun setTextColorAvailability(view: TextView, available: List?) { view.setTextColor(availabilityColor(available, view.context)) } @BindingAdapter("backgroundTintAvailability") -fun setBackgroundTintAvailability(view: View, available: Int?) { +fun setBackgroundTintAvailability(view: View, available: List?) { view.backgroundTintList = ColorStateList.valueOf(availabilityColor(available, view.context)) } private fun availabilityColor( - available: Int?, + status: List?, context: Context -): Int = if (available != null) { - if (available > 0) { +): Int = if (status != null) { + val unknown = status.any { it == ChargepointStatus.UNKNOWN } + val available = status.count { it == ChargepointStatus.AVAILABLE } + + if (unknown) { + ContextCompat.getColor(context, R.color.unknown) + } else if (available > 0) { ContextCompat.getColor(context, R.color.available) } else { ContextCompat.getColor(context, R.color.unavailable) @@ -108,4 +114,16 @@ private fun availabilityColor( } else { val ta = context.theme.obtainStyledAttributes(intArrayOf(R.attr.colorControlNormal)) ta.getColor(0, 0) +} + +fun availabilityText(status: List?): String? { + if (status == null) return null + + val total = status.size + val unknown = status.count { it == ChargepointStatus.UNKNOWN } + val available = status.count { it == ChargepointStatus.AVAILABLE } + + return if (unknown > 0) { + if (unknown == total) "?" else "$available?" + } else available.toString() } \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/viewmodel/FavoritesViewModel.kt b/app/src/main/java/net/vonforst/evmap/viewmodel/FavoritesViewModel.kt index 62d6e41e..5542011c 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/FavoritesViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/FavoritesViewModel.kt @@ -81,18 +81,18 @@ class FavoritesViewModel(application: Application, geApiKey: String) : data class FavoritesListItem( val charger: ChargeLocation, - val available: Resource, + val available: Resource>, val total: Int, val distance: Double? ) : Equatable - private fun totalAvailable(id: Long): Resource { + private fun totalAvailable(id: Long): Resource> { val availability = availability.value?.get(id) ?: return Resource.error(null, null) if (availability.status != Status.SUCCESS) { return Resource(availability.status, null, availability.message) } else { val values = availability.data?.status?.values ?: return Resource.error(null, null) - return Resource.success(values.sumBy { it.filter { it == ChargepointStatus.AVAILABLE }.size }) + return Resource.success(values.flatten()) } } diff --git a/app/src/main/res/layout/item_connector.xml b/app/src/main/res/layout/item_connector.xml index 83fc99a7..b617119c 100644 --- a/app/src/main/res/layout/item_connector.xml +++ b/app/src/main/res/layout/item_connector.xml @@ -6,6 +6,7 @@ + @@ -43,7 +44,7 @@ android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" app:layout_constraintStart_toStartOf="@+id/imageView" app:layout_constraintTop_toTopOf="@+id/imageView" - app:goneUnless="@{item.available == null}" + app:goneUnless="@{item.status == null}" tools:visibility="gone" tools:text="×99" /> @@ -53,15 +54,15 @@ android:layout_height="wrap_content" android:layout_marginStart="30dp" android:layout_marginTop="30dp" - android:text="@{String.format("%d/%d", item.available, item.chargepoint.count)}" + android:text="@{String.format("%s/%d", BindingAdaptersKt.availabilityText(item.status), item.chargepoint.count)}" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" android:background="@drawable/rounded_rect" android:padding="2dp" android:textColor="@android:color/white" app:layout_constraintStart_toStartOf="@+id/imageView" app:layout_constraintTop_toTopOf="@+id/imageView" - app:goneUnless="@{item.available != null}" - app:backgroundTintAvailability="@{item.available}" + app:goneUnless="@{item.status != null}" + app:backgroundTintAvailability="@{item.status}" tools:backgroundTint="@color/available" tools:text="80/99" /> @@ -77,7 +78,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView" - app:textColorAvailability="@{item.available}" + app:textColorAvailability="@{item.status}" tools:textColor="@color/available" tools:text="350 kW" /> diff --git a/app/src/main/res/layout/item_favorite.xml b/app/src/main/res/layout/item_favorite.xml index e596ed24..a4b40f92 100644 --- a/app/src/main/res/layout/item_favorite.xml +++ b/app/src/main/res/layout/item_favorite.xml @@ -7,6 +7,7 @@ + #9e9e9e #4caf50 #f44336 + #9e9e9e #C3000000