From 6a5dc93fd8d5ce8b5d93369c241fc0dc1f6bd32a Mon Sep 17 00:00:00 2001 From: johan12345 Date: Tue, 27 Oct 2020 22:52:03 +0100 Subject: [PATCH] show distance of charging stations to current location --- .../vonforst/evmap/fragment/MapFragment.kt | 1 + .../vonforst/evmap/viewmodel/MapViewModel.kt | 23 +++++++++++++++++++ app/src/main/res/layout/detail_view.xml | 22 +++++++++++++++++- app/src/main/res/layout/fragment_map.xml | 5 ++-- 4 files changed, 48 insertions(+), 3 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 92cbb1fd..0d7e09ec 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -723,6 +723,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac val location = LocationServices.FusedLocationApi.getLastLocation(locationClient) if (location != null) { val latLng = LatLng(location.latitude, location.longitude) + vm.location.value = latLng val camUpdate = map.cameraUpdateFactory.newLatLngZoom(latLng, 13f) if (animate) { map.animateCamera(camUpdate) 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 1a58cc76..910c544d 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import net.vonforst.evmap.api.availability.ChargeLocationStatus import net.vonforst.evmap.api.availability.getAvailability +import net.vonforst.evmap.api.distanceBetween import net.vonforst.evmap.api.goingelectric.* import net.vonforst.evmap.storage.* import net.vonforst.evmap.ui.cluster @@ -128,6 +129,28 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode } } } + val chargerDistance: MediatorLiveData by lazy { + MediatorLiveData().apply { + val callback = { _: Any? -> + val loc = location.value + val charger = chargerSparse.value + value = if (loc != null && charger != null && myLocationEnabled.value == true) { + distanceBetween( + loc.latitude, + loc.longitude, + charger.coordinates.lat, + charger.coordinates.lng + ) / 1000 + } else null + } + addSource(chargerSparse, callback) + addSource(location, callback) + addSource(myLocationEnabled, callback) + } + } + val location: MutableLiveData by lazy { + MutableLiveData() + } val availability: MediatorLiveData> by lazy { MediatorLiveData>().apply { addSource(chargerSparse) { charger -> diff --git a/app/src/main/res/layout/detail_view.xml b/app/src/main/res/layout/detail_view.xml index 0d4075dc..05cdea41 100644 --- a/app/src/main/res/layout/detail_view.xml +++ b/app/src/main/res/layout/detail_view.xml @@ -25,6 +25,10 @@ name="charger" type="Resource<ChargeLocation>" /> + + @@ -80,15 +84,31 @@ app:layout_constraintTop_toBottomOf="@+id/textView" tools:text="Beispielstraße 10, 12345 Berlin" /> + + diff --git a/app/src/main/res/layout/fragment_map.xml b/app/src/main/res/layout/fragment_map.xml index 8069c2d7..374ad902 100644 --- a/app/src/main/res/layout/fragment_map.xml +++ b/app/src/main/res/layout/fragment_map.xml @@ -132,7 +132,7 @@ app:behavior_peekHeight="@dimen/peek_height" app:bottomsheetbehavior_defaultState="stateHidden" app:layout_behavior="@string/BottomSheetBehaviorGoogleMapsLike" - tools:bottomsheetbehavior_defaultState="stateExpanded"> + tools:bottomsheetbehavior_defaultState="stateCollapsed"> + app:filteredChargeCards="@{vm.filteredChargeCards}" + app:distance="@{vm.chargerDistance}" />