From ee354d2cd1a1d2f91b24bffb5bb46f0400bd8dfd Mon Sep 17 00:00:00 2001 From: johan12345 Date: Sat, 18 Feb 2023 21:05:45 +0100 Subject: [PATCH] Chargeprice vehicle selection: Add battery size and charging power to distinguish vehicle models fixes #268 --- .../evmap/api/chargeprice/ChargepriceModel.kt | 11 ++++++- .../evmap/fragment/MultiSelectDialog.kt | 11 +++---- .../preference/ChargepriceSettingsFragment.kt | 29 +++++++++++++++---- .../evmap/ui/MultiSelectDialogPreference.kt | 2 +- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/net/vonforst/evmap/api/chargeprice/ChargepriceModel.kt b/app/src/main/java/net/vonforst/evmap/api/chargeprice/ChargepriceModel.kt index 81143769..af99be7d 100644 --- a/app/src/main/java/net/vonforst/evmap/api/chargeprice/ChargepriceModel.kt +++ b/app/src/main/java/net/vonforst/evmap/api/chargeprice/ChargepriceModel.kt @@ -114,7 +114,16 @@ data class ChargepriceCar( val brand: String, @Json(name = "dc_charge_ports") - val dcChargePorts: List + val dcChargePorts: List, + + @Json(name = "usable_battery_size") + val usableBatterySize: Float, + + @Json(name = "ac_max_power") + val acMaxPower: Float, + + @Json(name = "dc_max_power") + val dcMaxPower: Float? ) : Equatable, Parcelable { companion object { diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MultiSelectDialog.kt b/app/src/main/java/net/vonforst/evmap/fragment/MultiSelectDialog.kt index 663b2ac0..cd149237 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MultiSelectDialog.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MultiSelectDialog.kt @@ -17,7 +17,7 @@ class MultiSelectDialog : MaterialDialogFragment() { companion object { fun getInstance( title: String, - data: Map, + data: Map, selected: Set, commonChoices: Set?, showAllButton: Boolean = true @@ -55,7 +55,7 @@ class MultiSelectDialog : MaterialDialogFragment() { override fun initView(view: View, savedInstanceState: Bundle?) { val args = requireArguments() - val data = args.getSerializable("data") as HashMap + val data = args.getSerializable("data") as HashMap val selected = args.getSerializable("selected") as HashSet val title = args.getString("title") val commonChoices = if (args.containsKey("commonChoices")) { @@ -71,7 +71,7 @@ class MultiSelectDialog : MaterialDialogFragment() { binding.btnAll.visibility = if (showAllButton) View.VISIBLE else View.INVISIBLE items = data.entries.toList() - .sortedBy { it.value.lowercase(Locale.getDefault()) } + .sortedBy { it.value.toString().lowercase(Locale.getDefault()) } .sortedBy { when { selected.contains(it.key) && commonChoices?.contains(it.key) == true -> 0 @@ -117,7 +117,7 @@ private fun search( ): List { return items.filter { item -> // search for string within name - text.lowercase(Locale.getDefault()) in item.name.lowercase(Locale.getDefault()) + text.lowercase(Locale.getDefault()) in item.name.toString().lowercase(Locale.getDefault()) } } @@ -125,4 +125,5 @@ class Adapter() : DataBindingAdapter({ it.key }) { override fun getItemViewType(position: Int) = R.layout.dialog_multi_select_item } -data class MultiSelectItem(val key: String, val name: String, var selected: Boolean) : Equatable \ No newline at end of file +data class MultiSelectItem(val key: String, val name: CharSequence, var selected: Boolean) : + Equatable \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/fragment/preference/ChargepriceSettingsFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/preference/ChargepriceSettingsFragment.kt index bf2f1c9a..387e50fc 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/preference/ChargepriceSettingsFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/preference/ChargepriceSettingsFragment.kt @@ -2,13 +2,19 @@ package net.vonforst.evmap.fragment.preference import android.content.SharedPreferences import android.os.Bundle +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.ImageSpan +import android.text.style.RelativeSizeSpan import android.view.View +import androidx.appcompat.content.res.AppCompatResources import androidx.fragment.app.viewModels -import androidx.preference.MultiSelectListPreference import net.vonforst.evmap.R +import net.vonforst.evmap.ui.MultiSelectDialogPreference import net.vonforst.evmap.viewmodel.SettingsViewModel import net.vonforst.evmap.viewmodel.viewModelFactory + class ChargepriceSettingsFragment : BaseSettingsFragment() { override val isTopLevel = false @@ -22,8 +28,8 @@ class ChargepriceSettingsFragment : BaseSettingsFragment() { } }) - private lateinit var myVehiclePreference: MultiSelectListPreference - private lateinit var myTariffsPreference: MultiSelectListPreference + private lateinit var myVehiclePreference: MultiSelectDialogPreference + private lateinit var myTariffsPreference: MultiSelectDialogPreference override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -34,8 +40,21 @@ class ChargepriceSettingsFragment : BaseSettingsFragment() { res.data?.let { cars -> val sortedCars = cars.sortedBy { it.brand } myVehiclePreference.entryValues = sortedCars.map { it.id }.toTypedArray() - myVehiclePreference.entries = - sortedCars.map { "${it.brand} ${it.name}" }.toTypedArray() + myVehiclePreference.entries = sortedCars.map { + SpannableStringBuilder().apply { + appendLine("${it.brand} ${it.name}") + append(SpannableStringBuilder().apply { + append("%.0f kWh".format(it.usableBatterySize)) + append(" | ") + append("AC %.0f kW".format(it.acMaxPower)) + it.dcMaxPower?.let { + append(" | ") + append("DC %.0f kW".format(it)) + } + }, RelativeSizeSpan(0.86f), Spanned.SPAN_INCLUSIVE_EXCLUSIVE) + + } + }.toTypedArray() myVehiclePreference.isEnabled = true updateMyVehiclesSummary() } diff --git a/app/src/main/java/net/vonforst/evmap/ui/MultiSelectDialogPreference.kt b/app/src/main/java/net/vonforst/evmap/ui/MultiSelectDialogPreference.kt index 84c147b5..e75971be 100644 --- a/app/src/main/java/net/vonforst/evmap/ui/MultiSelectDialogPreference.kt +++ b/app/src/main/java/net/vonforst/evmap/ui/MultiSelectDialogPreference.kt @@ -38,7 +38,7 @@ class MultiSelectDialogPreference(ctx: Context, attrs: AttributeSet) : val dialog = MultiSelectDialog.getInstance( title.toString(), - entryValues.map { it.toString() }.zip(entries.map { it.toString() }).toMap(), + entryValues.map { it.toString() }.zip(entries).toMap(), if (all) entryValues.map { it.toString() }.toSet() else values, emptySet(), showAllButton