From 9891cf8e88d5deab74965ca7e07a4fd57480f0e5 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Wed, 5 Oct 2022 22:21:30 +0200 Subject: [PATCH] Fronyx predictions: Only load data for supported chargers (CCS and CHAdeMO located in Germany) --- .../vonforst/evmap/api/fronyx/FronyxApi.kt | 27 +++++++++++++++++++ .../vonforst/evmap/viewmodel/MapViewModel.kt | 18 ++++++++++--- app/src/main/res/layout/detail_view.xml | 6 ++++- app/src/main/res/layout/fragment_map.xml | 1 + 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/vonforst/evmap/api/fronyx/FronyxApi.kt b/app/src/main/java/net/vonforst/evmap/api/fronyx/FronyxApi.kt index 16b368a8..bc901e30 100644 --- a/app/src/main/java/net/vonforst/evmap/api/fronyx/FronyxApi.kt +++ b/app/src/main/java/net/vonforst/evmap/api/fronyx/FronyxApi.kt @@ -4,6 +4,8 @@ import android.content.Context import com.facebook.stetho.okhttp3.StethoInterceptor import com.squareup.moshi.Moshi import net.vonforst.evmap.BuildConfig +import net.vonforst.evmap.model.ChargeLocation +import net.vonforst.evmap.model.Chargepoint import okhttp3.Cache import okhttp3.OkHttpClient import retrofit2.Retrofit @@ -56,5 +58,30 @@ interface FronyxApi { .build() return retrofit.create(FronyxApi::class.java) } + + /** + * Checks if a chargepoint is supported by Fronyx. + * + * This function just applies some heuristics on the charger's data without making API + * calls. If it returns true, that is not a guarantee that Fronyx will have information + * on this chargepoint. But if it is false, it is pretty unlikely that Fronyx will have + * useful data, so we do not try to load the data in this case. + */ + fun isChargepointSupported(charger: ChargeLocation, chargepoint: Chargepoint): Boolean { + if (charger.address?.country !in listOf("Deutschland", "Germany")) { + // fronyx only predicts for chargers in Germany for now + return false + } + if (chargepoint.type !in listOf( + Chargepoint.CCS_UNKNOWN, + Chargepoint.CCS_TYPE_2, + Chargepoint.CHADEMO + ) + ) { + // fronyx only predicts DC chargers for now + return false + } + return true + } } } \ No newline at end of file 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 9207348d..e7f2ae79 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -215,11 +215,14 @@ class MapViewModel(application: Application, private val state: SavedStateHandle val prediction: LiveData>> by lazy { availability.switchMap { av -> - av?.data?.evseIds?.let { evseIds -> + av.data?.evseIds?.let { evseIds -> liveData { emit(Resource.loading(null)) - val allEvseIds = evseIds.flatMap { it.value } + val charger = charger.value?.data ?: return@liveData + val allEvseIds = + evseIds.filterKeys { FronyxApi.isChargepointSupported(charger, it) } + .flatMap { it.value } try { val result = allEvseIds.map { @@ -268,12 +271,21 @@ class MapViewModel(application: Application, private val state: SavedStateHandle it.value.count { it.second == FronyxStatus.UNAVAILABLE } - } + }.ifEmpty { null } } } } } + val predictionMaxValue: LiveData by lazy { + charger.map { + it.data?.let { charger -> + charger.chargepoints.filter { FronyxApi.isChargepointSupported(charger, it) } + .sumOf { it.count } + } ?: 0 + } + } + val myLocationEnabled: MutableLiveData by lazy { MutableLiveData() } diff --git a/app/src/main/res/layout/detail_view.xml b/app/src/main/res/layout/detail_view.xml index fc3e1a12..2597aec8 100644 --- a/app/src/main/res/layout/detail_view.xml +++ b/app/src/main/res/layout/detail_view.xml @@ -47,6 +47,10 @@ name="predictionGraph" type="Map<ZonedDateTime, Integer>" /> + + @@ -388,7 +392,7 @@ app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintStart_toStartOf="@+id/guideline" app:layout_constraintTop_toBottomOf="@+id/textView8" - app:maxValue="@{charger.data.totalChargepoints}" + app:maxValue="@{predictionMaxValue}" tools:itemCount="3" tools:layoutManager="LinearLayoutManager" tools:listitem="@layout/item_connector" diff --git a/app/src/main/res/layout/fragment_map.xml b/app/src/main/res/layout/fragment_map.xml index 3102b877..dd7ddfbc 100644 --- a/app/src/main/res/layout/fragment_map.xml +++ b/app/src/main/res/layout/fragment_map.xml @@ -196,6 +196,7 @@ app:availability="@{vm.availability}" app:filteredAvailability="@{vm.filteredAvailability}" app:predictionGraph="@{vm.predictionGraph}" + app:predictionMaxValue="@{vm.predictionMaxValue}" app:chargeCards="@{vm.chargeCardMap}" app:filteredChargeCards="@{vm.filteredChargeCards}" app:distance="@{vm.chargerDistance}"