From a0045fc6bb4860c4e0d4e1357d870d0ea8df2137 Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Thu, 24 Dec 2020 15:37:13 +0100 Subject: [PATCH] add filter by categories (fixes #64) --- .../api/goingelectric/GoingElectricApi.kt | 3 +- .../evmap/viewmodel/FilterViewModel.kt | 33 +++++++++++++++++++ .../vonforst/evmap/viewmodel/MapViewModel.kt | 8 +++++ app/src/main/res/values-de/strings.xml | 27 +++++++++++++++ app/src/main/res/values/strings.xml | 27 +++++++++++++++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricApi.kt b/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricApi.kt index b1053442..e075067a 100644 --- a/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricApi.kt +++ b/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricApi.kt @@ -27,6 +27,7 @@ interface GoingElectricApi { @Query("plugs") plugs: String? = null, @Query("chargecards") chargecards: String? = null, @Query("networks") networks: String? = null, + @Query("categories") categories: String? = null, @Query("startkey") startkey: Int? = null, @Query("open_twentyfourseven") open247: Boolean = false, @Query("barrierfree") barrierfree: Boolean = false, @@ -46,7 +47,7 @@ interface GoingElectricApi { suspend fun getChargeCards(): Response companion object { - private val cacheSize = 10L * 1024 * 1024; // 10MB + private val cacheSize = 10L * 1024 * 1024 // 10MB fun create( apikey: String, 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 a1285fff..6bdef5dc 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt @@ -63,6 +63,34 @@ private fun MediatorLiveData>>.buildFilters( }?.toMap() ?: return val networkMap = networks.value?.map { it.name to it.name }?.toMap() ?: return val chargecardMap = chargeCards.value?.map { it.id.toString() to it.name }?.toMap() ?: return + val categoryMap = mapOf( + "Autohaus" to application.getString(R.string.category_car_dealership), + "Autobahnraststätte" to application.getString(R.string.category_service_on_motorway), + "Autohof" to application.getString(R.string.category_service_off_motorway), + "Bahnhof" to application.getString(R.string.category_railway_station), + "Behörde" to application.getString(R.string.category_public_authorities), + "Campingplatz" to application.getString(R.string.category_camping), + "Einkaufszentrum" to application.getString(R.string.category_shopping_mall), + "Ferienwohnung" to application.getString(R.string.category_holiday_home), + "Flughafen" to application.getString(R.string.category_airport), + "Freizeitpark" to application.getString(R.string.category_amusement_park), + "Hotel" to application.getString(R.string.category_hotel), + "Kino" to application.getString(R.string.category_cinema), + "Kirche" to application.getString(R.string.category_church), + "Krankenhaus" to application.getString(R.string.category_hospital), + "Museum" to application.getString(R.string.category_museum), + "Parkhaus" to application.getString(R.string.category_parking_multi), + "Parkplatz" to application.getString(R.string.category_parking), + "Privater Ladepunkt" to application.getString(R.string.category_private_charger), + "Rastplatz" to application.getString(R.string.category_rest_area), + "Restaurant" to application.getString(R.string.category_restaurant), + "Schwimmbad" to application.getString(R.string.category_swimming_pool), + "Supermarkt" to application.getString(R.string.category_supermarket), + "Tankstelle" to application.getString(R.string.category_petrol_station), + "Tiefgarage" to application.getString(R.string.category_parking_underground), + "Tierpark" to application.getString(R.string.category_zoo), + "Wohnmobilstellplatz" to application.getString(R.string.category_caravan_site) + ) value = listOf( BooleanFilter(application.getString(R.string.filter_free), "freecharging"), BooleanFilter(application.getString(R.string.filter_free_parking), "freeparking"), @@ -90,6 +118,11 @@ private fun MediatorLiveData>>.buildFilters( application.getString(R.string.filter_networks), "networks", networkMap, manyChoices = true ), + MultipleChoiceFilter( + application.getString(R.string.categories), "categories", + categoryMap, + manyChoices = true + ), BooleanFilter(application.getString(R.string.filter_barrierfree), "barrierfree"), MultipleChoiceFilter( application.getString(R.string.filter_chargecards), "chargecards", 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 910c544d..9e65b6bf 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -280,6 +280,13 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode } val networks = formatMultipleChoice(networksVal) + val categoriesVal = getMultipleChoiceValue(filters, "categories") + if (categoriesVal.values.isEmpty() && !categoriesVal.all) { + // no categories chosen + return Triple(Resource.success(emptyList()), filteredConnectors, filteredChargeCards) + } + val categories = formatMultipleChoice(categoriesVal) + // do not use clustering if filters need to be applied locally. val useClustering = zoom < 13 val geClusteringAvailable = minConnectors <= 1 @@ -308,6 +315,7 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode plugs = connectors, chargecards = chargeCards, networks = networks, + categories = categories, startkey = startkey ) if (!response.isSuccessful || response.body()!!.status != "ok") { diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index fd3cf7db..45846434 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -109,6 +109,33 @@ Kontakt Ladesäule melden bei GoingElectric.de bearbeiten + Kategorien + Autohaus + Autobahnraststätte + Autohof + Bahnhof + Behörde + Campingplatz + Einkaufszentrum + Ferienwohnung + Flughafen + Freizeitpark + Hotel + Kino + Kirche + Krankenhaus + Museum + Parkhaus + Parkplatz + Privater Ladepunkt + Rastplatz + Restaurant + Schwimmbad + Supermarkt + Tankstelle + Tiefgarage + Tierpark + Wohnmobilstellplatz %d kompatibler Ladetarif %d kompatible Ladetarife diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5115257f..48282588 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -108,6 +108,33 @@ Contact Report new charger edit on GoingElectric.de + Categories + Car Dealership + Service area (on motorway) + Service area (off motorway) + Railway station + Public authorities + Camping site + Shopping mall + Holiday home + Airport + Amusement park + Hotel + Cinema + Church + Hospital + Museum + Multi-storey car park + Car park + Private charger + Rest area + Restaurant + Swimming pool + Supermarket + Petrol station + Underground car park + Zoo + Caravan site %d compatible payment method %d compatible payment methods