From 62197f99cb5dd22c17879412c9daaae18f08ea27 Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Mon, 28 Dec 2020 20:16:26 +0100 Subject: [PATCH] GoingElectricApi: use coroutines for loading charger details --- .../api/goingelectric/GoingElectricApi.kt | 3 +- .../vonforst/evmap/viewmodel/MapViewModel.kt | 58 +++++++------------ .../NewMotionAvailabilityDetectorTest.kt | 3 +- .../api/goingelectric/GoingElectricApiTest.kt | 2 +- 4 files changed, 24 insertions(+), 42 deletions(-) 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 9caab887..f6333be6 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,7 +6,6 @@ import com.squareup.moshi.Moshi import net.vonforst.evmap.BuildConfig import okhttp3.Cache import okhttp3.OkHttpClient -import retrofit2.Call import retrofit2.Response import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory @@ -56,7 +55,7 @@ interface GoingElectricApi { ): Response @GET("chargepoints/") - fun getChargepointDetail(@Query("ge_id") id: Long): Call + suspend fun getChargepointDetail(@Query("ge_id") id: Long): Response @GET("chargepoints/pluglist/") suspend fun getPlugs(): Response 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 d33277ce..b22bf9f6 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -9,13 +9,13 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import net.vonforst.evmap.api.availability.ChargeLocationStatus import net.vonforst.evmap.api.availability.getAvailability -import net.vonforst.evmap.api.goingelectric.* +import net.vonforst.evmap.api.goingelectric.ChargeCard +import net.vonforst.evmap.api.goingelectric.ChargeLocation +import net.vonforst.evmap.api.goingelectric.ChargepointListItem +import net.vonforst.evmap.api.goingelectric.GoingElectricApi import net.vonforst.evmap.storage.* import net.vonforst.evmap.ui.cluster import net.vonforst.evmap.utils.distanceBetween -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response import java.io.IOException data class MapPosition(val bounds: LatLngBounds, val zoom: Float) @@ -425,57 +425,41 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode private fun loadChargerDetails(charger: ChargeLocation) { chargerDetails.value = Resource.loading(null) - api.getChargepointDetail(charger.id).enqueue(object : - Callback { - override fun onFailure(call: Call, t: Throwable) { - chargerDetails.value = Resource.error(t.message, null) - t.printStackTrace() - } - - override fun onResponse( - call: Call, - response: Response - ) { + viewModelScope.launch { + try { + val response = api.getChargepointDetail(charger.id) if (!response.isSuccessful || response.body()!!.status != "ok") { chargerDetails.value = Resource.error(response.message(), null) } else { chargerDetails.value = Resource.success(response.body()!!.chargelocations[0] as ChargeLocation) } + } catch (e: IOException) { + chargerDetails.value = Resource.error(e.message, null) + e.printStackTrace() } - }) + } } fun loadChargerById(chargerId: Long) { chargerDetails.value = Resource.loading(null) chargerSparse.value = null - api.getChargepointDetail(chargerId).enqueue(object : - Callback { - override fun onFailure(call: Call, t: Throwable) { + viewModelScope.launch { + val response = api.getChargepointDetail(chargerId) + if (!response.isSuccessful || response.body()!!.status != "ok") { chargerSparse.value = null - chargerDetails.value = Resource.error(t.message, null) - t.printStackTrace() - } - - override fun onResponse( - call: Call, - response: Response - ) { - if (!response.isSuccessful || response.body()!!.status != "ok") { - chargerDetails.value = Resource.error(response.message(), null) - chargerSparse.value = null - } else { - val chargers = response.body()!!.chargelocations + chargerDetails.value = Resource.error(response.message(), null) + } else { + val chargers = response.body()!!.chargelocations if (chargers.isNotEmpty()) { val charger = chargers[0] as ChargeLocation - chargerDetails.value = Resource.success(charger) - chargerSparse.value = charger - } else { + chargerDetails.value = + Resource.success(charger) + chargerSparse.value = charger} else { chargerDetails.value = Resource.error("not found", null) chargerSparse.value = null } - } } - }) + } } } \ No newline at end of file diff --git a/app/src/test/java/net/vonforst/evmap/api/availability/NewMotionAvailabilityDetectorTest.kt b/app/src/test/java/net/vonforst/evmap/api/availability/NewMotionAvailabilityDetectorTest.kt index 6d6532a9..df844c05 100644 --- a/app/src/test/java/net/vonforst/evmap/api/availability/NewMotionAvailabilityDetectorTest.kt +++ b/app/src/test/java/net/vonforst/evmap/api/availability/NewMotionAvailabilityDetectorTest.kt @@ -66,8 +66,7 @@ class NewMotionAvailabilityDetectorTest { @Test fun apiTest() { for (chargepoint in listOf(2105L, 18284L)) { - val charger = api.getChargepointDetail(chargepoint) - .execute().body()!! + val charger = runBlocking { api.getChargepointDetail(chargepoint).body()!! } .chargelocations[0] as ChargeLocation println(charger) diff --git a/app/src/test/java/net/vonforst/evmap/api/goingelectric/GoingElectricApiTest.kt b/app/src/test/java/net/vonforst/evmap/api/goingelectric/GoingElectricApiTest.kt index b691377c..173887b3 100644 --- a/app/src/test/java/net/vonforst/evmap/api/goingelectric/GoingElectricApiTest.kt +++ b/app/src/test/java/net/vonforst/evmap/api/goingelectric/GoingElectricApiTest.kt @@ -53,7 +53,7 @@ class GoingElectricApiTest { @Test fun testLoadChargepointDetail() { - val response = api.getChargepointDetail(2105).execute() + val response = runBlocking { api.getChargepointDetail(2105) } assertTrue(response.isSuccessful) val body = response.body()!! assertEquals("ok", body.status)