Chargeprice vehicle selection: Add battery size and charging power to distinguish vehicle models

fixes #268
This commit is contained in:
johan12345
2023-02-18 21:05:45 +01:00
parent 350f18df8e
commit ee354d2cd1
4 changed files with 41 additions and 12 deletions

View File

@@ -114,7 +114,16 @@ data class ChargepriceCar(
val brand: String,
@Json(name = "dc_charge_ports")
val dcChargePorts: List<String>
val dcChargePorts: List<String>,
@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 {

View File

@@ -17,7 +17,7 @@ class MultiSelectDialog : MaterialDialogFragment() {
companion object {
fun getInstance(
title: String,
data: Map<String, String>,
data: Map<String, CharSequence>,
selected: Set<String>,
commonChoices: Set<String>?,
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<String, String>
val data = args.getSerializable("data") as HashMap<String, CharSequence>
val selected = args.getSerializable("selected") as HashSet<String>
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<MultiSelectItem> {
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<MultiSelectItem>({ 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
data class MultiSelectItem(val key: String, val name: CharSequence, var selected: Boolean) :
Equatable

View File

@@ -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()
}

View File

@@ -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