diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt index 85676741..61202786 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -10,6 +10,7 @@ import android.content.res.Configuration import android.os.Bundle import android.view.* import android.view.inputmethod.InputMethodManager +import android.widget.TextView import androidx.activity.OnBackPressedCallback import androidx.core.app.SharedElementCallback import androidx.core.content.ContextCompat @@ -505,7 +506,21 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.map, menu) - super.onCreateOptionsMenu(menu, inflater) + + val filterItem = menu.findItem(R.id.menu_filter) + val filterView = filterItem.actionView + + val filterBadge = filterView?.findViewById(R.id.filter_badge) + if (filterBadge != null) { + // set up badge showing number of active filters + vm.filtersCount.observe(viewLifecycleOwner, Observer { + filterBadge.visibility = if (it > 0) View.VISIBLE else View.GONE + filterBadge.text = it.toString() + }) + } + filterView?.setOnClickListener { + onOptionsItemSelected(filterItem) + } } override fun onOptionsItemSelected(item: MenuItem): Boolean { 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 65b4b3a7..a62e714f 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt @@ -169,7 +169,18 @@ data class MultipleChoiceFilterValue( @PrimaryKey override val key: String, var values: MutableSet, var all: Boolean -) : FilterValue() +) : FilterValue() { + override fun equals(other: Any?): Boolean { + if (other == null || other !is MultipleChoiceFilterValue) return false + if (key != other.key) return false + + return if (all) { + other.all + } else { + !other.all && values == other.values + } + } +} @Entity data class SliderFilterValue( diff --git a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt index 7620ec49..0859e1b5 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -45,6 +45,17 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode private val filtersWithValue: LiveData>> by lazy { filtersWithValue(filters, filterValues) } + + val filtersCount: LiveData by lazy { + MediatorLiveData().apply { + value = 0 + addSource(filtersWithValue) { filtersWithValue -> + value = filtersWithValue.count { + it.filter.defaultValue() != it.value + } + } + } + } val chargepoints: MediatorLiveData>> by lazy { MediatorLiveData>>() .apply { diff --git a/app/src/main/res/layout/action_filter.xml b/app/src/main/res/layout/action_filter.xml new file mode 100644 index 00000000..fb35440b --- /dev/null +++ b/app/src/main/res/layout/action_filter.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/map.xml b/app/src/main/res/menu/map.xml index c76a22c8..3de50203 100644 --- a/app/src/main/res/menu/map.xml +++ b/app/src/main/res/menu/map.xml @@ -6,5 +6,6 @@ android:id="@+id/menu_filter" android:title="@string/menu_filter" android:icon="@drawable/ic_filter" - app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" + app:actionLayout="@layout/action_filter" /> \ No newline at end of file