From d8f011b64b8106c8f3df0dc4f1c8bf811b7e31e2 Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Sun, 14 Jun 2020 19:19:27 +0200 Subject: [PATCH] Add error message when internet is not available --- .../vonforst/evmap/fragment/MapFragment.kt | 29 +++++++++-- .../vonforst/evmap/viewmodel/MapViewModel.kt | 51 ++++++++++++------- app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 4 files changed, 64 insertions(+), 20 deletions(-) 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 855244af..ee4fa32b 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -89,6 +89,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac private var markers: MutableBiMap = HashBiMap() private var clusterMarkers: List = emptyList() private var searchResultMarker: Marker? = null + private var connectionErrorSnackbar: Snackbar? = null private lateinit var clusterIconGenerator: ClusterIconGenerator private lateinit var chargerIconGenerator: ChargerIconGenerator @@ -312,9 +313,31 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac unhighlightAllMarkers() } }) - vm.chargepoints.observe(viewLifecycleOwner, Observer { - val chargepoints = it.data - if (chargepoints != null) updateMap(chargepoints) + vm.chargepoints.observe(viewLifecycleOwner, Observer { res -> + when (res.status) { + Status.ERROR -> { + val view = view ?: return@Observer + + connectionErrorSnackbar?.dismiss() + connectionErrorSnackbar = Snackbar + .make(view, R.string.connection_error, Snackbar.LENGTH_INDEFINITE) + .setAction(R.string.retry) { + connectionErrorSnackbar?.dismiss() + vm.reloadChargepoints() + } + connectionErrorSnackbar!!.show() + } + Status.SUCCESS -> { + connectionErrorSnackbar?.dismiss() + } + Status.LOADING -> { + } + } + + val chargepoints = res.data + if (chargepoints != null) { + updateMap(chargepoints) + } }) vm.favorites.observe(viewLifecycleOwner, Observer { updateFavoriteToggle() 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 34e2bb64..2bcc0208 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -16,6 +16,7 @@ import net.vonforst.evmap.ui.cluster import retrofit2.Call import retrofit2.Callback import retrofit2.Response +import java.io.IOException data class MapPosition(val bounds: LatLngBounds, val zoom: Float) @@ -76,9 +77,7 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode value = Resource.loading(emptyList()) listOf(mapPosition, filtersWithValue).forEach { addSource(it) { - val pos = mapPosition.value ?: return@addSource - val filters = filtersWithValue.value ?: return@addSource - loadChargepoints(pos, filters) + reloadChargepoints() } } } @@ -174,6 +173,12 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode } } + fun reloadChargepoints() { + val pos = mapPosition.value ?: return + val filters = filtersWithValue.value ?: return + loadChargepoints(pos, filters) + } + private fun loadChargepoints( mapPosition: MapPosition, filters: List> @@ -229,20 +234,32 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode val data = mutableListOf() do { // load all pages of the response - val response = api.getChargepoints( - bounds.southwest.latitude, bounds.southwest.longitude, - bounds.northeast.latitude, bounds.northeast.longitude, - clustering = useGeClustering, zoom = zoom, - clusterDistance = clusterDistance, freecharging = freecharging, minPower = minPower, - freeparking = freeparking, plugs = connectors, chargecards = chargeCards, - networks = networks, startkey = startkey - ) - if (!response.isSuccessful || response.body()!!.status != "ok") { - return Resource.error(response.message(), chargepoints.value?.data) - } else { - val body = response.body()!! - data.addAll(body.chargelocations) - startkey = body.startkey + try { + val response = api.getChargepoints( + bounds.southwest.latitude, + bounds.southwest.longitude, + bounds.northeast.latitude, + bounds.northeast.longitude, + clustering = useGeClustering, + zoom = zoom, + clusterDistance = clusterDistance, + freecharging = freecharging, + minPower = minPower, + freeparking = freeparking, + plugs = connectors, + chargecards = chargeCards, + networks = networks, + startkey = startkey + ) + if (!response.isSuccessful || response.body()!!.status != "ok") { + return Resource.error(response.message(), chargepoints.value?.data) + } else { + val body = response.body()!! + data.addAll(body.chargelocations) + startkey = body.startkey + } + } catch (e: IOException) { + return Resource.error(e.message, chargepoints.value?.data) } } while (startkey != null && startkey < 10000) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e4fd7270..cfa1cae7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -92,4 +92,6 @@ OK Sprache App-Sprache ändern + Ladesäulen konnten nicht geladen werden + Wiederholen \ 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 234268f0..534d73f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -91,4 +91,6 @@ OK Language Change the app language + Could not load charging stations + Retry