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 6a74840f..8bc92e45 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 @@ -6,6 +6,7 @@ import com.squareup.moshi.Moshi import okhttp3.Cache import okhttp3.OkHttpClient import retrofit2.Call +import retrofit2.Response import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory import retrofit2.http.GET @@ -13,7 +14,7 @@ import retrofit2.http.Query interface GoingElectricApi { @GET("chargepoints/") - fun getChargepoints( + suspend fun getChargepoints( @Query("sw_lat") swlat: Double, @Query("sw_lng") sw_lng: Double, @Query("ne_lat") ne_lat: Double, @Query("ne_lng") ne_lng: Double, @Query("clustering") clustering: Boolean, @@ -22,7 +23,7 @@ interface GoingElectricApi { @Query("freecharging") freecharging: Boolean, @Query("freeparking") freeparking: Boolean, @Query("min_power") minPower: Int - ): Call + ): Response @GET("chargepoints/") fun getChargepointDetail(@Query("ge_id") id: Long): Call 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 a6edaad0..eb1b9117 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt @@ -18,7 +18,13 @@ fun getFilters(application: Application): List> { return listOf( BooleanFilter(application.getString(R.string.filter_free), "freecharging"), BooleanFilter(application.getString(R.string.filter_free_parking), "freeparking"), - SliderFilter(application.getString(R.string.filter_min_power), "min_power", 350) + SliderFilter(application.getString(R.string.filter_min_power), "min_power", 350, "kW"), + SliderFilter( + application.getString(R.string.filter_min_connectors), + "min_connectors", + 10, + "" + ) ) } @@ -81,7 +87,8 @@ data class MultipleChoiceFilter( data class SliderFilter( override val name: String, override val key: String, - val max: Int + val max: Int, + val unit: String ) : Filter() { override val valueClass: KClass = SliderFilterValue::class override fun defaultValue() = SliderFilterValue(key, 0) 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 d705cd61..0cfbc2c6 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -130,46 +130,49 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode chargepoints.value = Resource.loading(chargepoints.value?.data) val bounds = mapPosition.bounds val zoom = mapPosition.zoom - getChargepointsWithFilters(bounds, zoom, filters).enqueue(object : - Callback { - override fun onFailure(call: Call, t: Throwable) { - chargepoints.value = Resource.error(t.message, chargepoints.value?.data) - t.printStackTrace() - } - - override fun onResponse( - call: Call, - response: Response - ) { - if (!response.isSuccessful || response.body()!!.status != "ok") { - chargepoints.value = - Resource.error(response.message(), chargepoints.value?.data) - } else { - chargepoints.value = Resource.success(response.body()!!.chargelocations) - } - } - }) + viewModelScope.launch { + chargepoints.value = getChargepointsWithFilters(bounds, zoom, filters) + } } - private fun getChargepointsWithFilters( + private suspend fun getChargepointsWithFilters( bounds: LatLngBounds, zoom: Float, filters: List> - ): Call { + ): Resource> { val freecharging = (filters.find { it.value.key == "freecharging" }!!.value as BooleanFilterValue).value val freeparking = (filters.find { it.value.key == "freeparking" }!!.value as BooleanFilterValue).value val minPower = (filters.find { it.value.key == "min_power" }!!.value as SliderFilterValue).value + val minConnectors = + (filters.find { it.value.key == "min_connectors" }!!.value as SliderFilterValue).value - return api.getChargepoints( + val response = api.getChargepoints( bounds.southwest.latitude, bounds.southwest.longitude, bounds.northeast.latitude, bounds.northeast.longitude, clustering = zoom < 13, zoom = zoom, clusterDistance = 70, freecharging = freecharging, minPower = minPower, freeparking = freeparking ) + + if (!response.isSuccessful || response.body()!!.status != "ok") { + return Resource.error(response.message(), chargepoints.value?.data) + } else { + val data = response.body()!!.chargelocations.filter { it -> + // apply filters which GoingElectric does not support natively + if (it is ChargeLocation) { + it.chargepoints + .filter { it.power >= minPower } + .sumBy { it.count } >= minConnectors + } else { + true + } + } + + return Resource.success(data) + } } private suspend fun loadAvailability(charger: ChargeLocation) { diff --git a/app/src/main/res/layout/item_filter_slider.xml b/app/src/main/res/layout/item_filter_slider.xml index 2b0673e2..6cefe47e 100644 --- a/app/src/main/res/layout/item_filter_slider.xml +++ b/app/src/main/res/layout/item_filter_slider.xml @@ -57,7 +57,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" - android:text="@{progress + " kW"}" + android:text="@{String.valueOf(progress) + ' ' + ((SliderFilter) item.filter).unit}" app:layout_constraintBottom_toBottomOf="@+id/seekBar" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/seekBar" diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2a21c828..5d2d5a06 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -47,4 +47,5 @@ Nur kostenlose Ladesäulen Minimale Leistung Nur Ladesäulen mit kostenlosem Parkplatz + Mindestzahl Anschlüsse \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aaf35796..fb4557e6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,4 +46,5 @@ Only free chargers Minimum power Only chargers with free parking + Minimum number of connectors