From c4d44f9ddfff9c3ba10719fc6eb36d846c109656 Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Sun, 5 Jul 2020 12:38:58 +0200 Subject: [PATCH] switch connectors filter to MultiSelectDialog because Chip interface is buggy --- .../vonforst/evmap/adapter/FiltersAdapter.kt | 3 +- .../evmap/fragment/MultiSelectDialog.kt | 45 +++++++++++-------- .../evmap/viewmodel/FilterViewModel.kt | 3 +- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/net/vonforst/evmap/adapter/FiltersAdapter.kt b/app/src/main/java/net/vonforst/evmap/adapter/FiltersAdapter.kt index a56d8a7a..1cff62f2 100644 --- a/app/src/main/java/net/vonforst/evmap/adapter/FiltersAdapter.kt +++ b/app/src/main/java/net/vonforst/evmap/adapter/FiltersAdapter.kt @@ -179,7 +179,8 @@ class FiltersAdapter : DataBindingAdapter>() { MultiSelectDialog.getInstance( filter.name, filter.choices, - value.values + value.values, + commonChoices = filter.commonChoices ) dialog.okListener = { selected -> value.values = selected.toMutableSet() 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 1e373297..ba8028fe 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MultiSelectDialog.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MultiSelectDialog.kt @@ -20,13 +20,15 @@ class MultiSelectDialog : AppCompatDialogFragment() { fun getInstance( title: String, data: Map, - selected: Set + selected: Set, + commonChoices: Set? ): MultiSelectDialog { val dialog = MultiSelectDialog() dialog.arguments = Bundle().apply { putString("title", title) putSerializable("data", HashMap(data)) putSerializable("selected", HashSet(selected)) + if (commonChoices != null) putSerializable("commonChoices", HashSet(commonChoices)) } return dialog } @@ -55,18 +57,23 @@ class MultiSelectDialog : AppCompatDialogFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - val data = requireArguments().getSerializable("data") as HashMap - val selected = requireArguments().getSerializable("selected") as HashSet - val title = requireArguments().getString("title") + val args = requireArguments() + 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")) { + args.getSerializable("commonChoices") as HashSet + } else null dialogTitle.text = title val adapter = Adapter() list.adapter = adapter list.layoutManager = LinearLayoutManager(view.context) - items = data.entries.toList().sortedBy { it.value }.map { - MultiSelectItem(it.key, it.value, it.key in selected) - } + items = data.entries.toList() + .sortedBy { it.value } + .sortedByDescending { commonChoices?.contains(it.key) == true } + .map { MultiSelectItem(it.key, it.value, it.key in selected) } adapter.submitList(items) etSearch.doAfterTextChanged { text -> @@ -95,20 +102,20 @@ class MultiSelectDialog : AppCompatDialogFragment() { adapter.submitList(search(items, etSearch.text.toString())) } } +} - private fun search( - items: List, - text: String - ): List { - return items.filter { item -> - // search for string within name - text.toLowerCase(Locale.getDefault()) in item.name.toLowerCase(Locale.getDefault()) - } - } - - class Adapter() : DataBindingAdapter({ it.key }) { - override fun getItemViewType(position: Int) = R.layout.dialog_multi_select_item +private fun search( + items: List, + text: String +): List { + return items.filter { item -> + // search for string within name + text.toLowerCase(Locale.getDefault()) in item.name.toLowerCase(Locale.getDefault()) } } +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 diff --git a/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt b/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt index 2f54bc15..28fc8bd5 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt @@ -76,7 +76,8 @@ private fun MediatorLiveData>>.buildFilters( MultipleChoiceFilter( application.getString(R.string.filter_connectors), "connectors", plugMap, - commonChoices = setOf(Chargepoint.TYPE_2, Chargepoint.CCS, Chargepoint.CHADEMO) + commonChoices = setOf(Chargepoint.TYPE_2, Chargepoint.CCS, Chargepoint.CHADEMO), + manyChoices = true ), SliderFilter( application.getString(R.string.filter_min_connectors),