From 74b74dcd071206780f6eec023755d5e352a4d321 Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Sun, 24 May 2020 08:16:04 +0200 Subject: [PATCH] add marker for selected search result (fixes #18) --- .../vonforst/evmap/fragment/MapFragment.kt | 30 +++++++++++++++---- .../vonforst/evmap/viewmodel/MapViewModel.kt | 5 ++++ 2 files changed, 30 insertions(+), 5 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 10682889..76871872 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -82,6 +82,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac private lateinit var detailAppBarBehavior: MergedAppBarLayoutBehavior private var markers: MutableBiMap = HashBiMap() private var clusterMarkers: List = emptyList() + private var searchResultMarker: Marker? = null private lateinit var clusterIconGenerator: ClusterIconGenerator private lateinit var chargerIconGenerator: ChargerIconGenerator @@ -94,6 +95,8 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac bottomSheetBehavior.state = STATE_COLLAPSED } else if (state == STATE_COLLAPSED) { vm.chargerSparse.value = null + } else if (state == STATE_HIDDEN) { + vm.searchResult.value = null } } } @@ -190,7 +193,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac bottomSheetBehavior.state = BottomSheetBehaviorGoogleMapsLike.STATE_ANCHOR_POINT } binding.search.setOnClickListener { - val fields = listOf(Place.Field.LAT_LNG) + val fields = listOf(Place.Field.LAT_LNG, Place.Field.VIEWPORT) val intent: Intent = Autocomplete.IntentBuilder( AutocompleteActivityMode.OVERLAY, fields ) @@ -242,7 +245,8 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac override fun onStateChanged(bottomSheet: View, newState: Int) { vm.bottomSheetState.value = newState - backPressedCallback.isEnabled = newState != STATE_HIDDEN + backPressedCallback.isEnabled = + newState != STATE_HIDDEN || vm.searchResult.value != null } }) vm.chargerSparse.observe(viewLifecycleOwner, Observer { @@ -266,6 +270,24 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac vm.favorites.observe(viewLifecycleOwner, Observer { updateFavoriteToggle() }) + vm.searchResult.observe(viewLifecycleOwner, Observer { place -> + val map = this.map ?: return@Observer + searchResultMarker?.remove() + searchResultMarker = null + + if (place != null) { + if (place.viewport != null) { + map.animateCamera(CameraUpdateFactory.newLatLngBounds(place.viewport, 0)) + } else { + map.animateCamera(CameraUpdateFactory.newLatLngZoom(place.latLng, 12f)) + } + + searchResultMarker = map.addMarker(MarkerOptions().position(place.latLng!!)) + } + + backPressedCallback.isEnabled = vm.bottomSheetState.value != STATE_HIDDEN || + place != null + }) } private fun unhighlightAllMarkers() { @@ -581,9 +603,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac when (requestCode) { REQUEST_AUTOCOMPLETE -> { if (resultCode == Activity.RESULT_OK) { - val place = Autocomplete.getPlaceFromIntent(data!!) - val zoom = 12f - map?.animateCamera(CameraUpdateFactory.newLatLngZoom(place.latLng, zoom)) + vm.searchResult.value = Autocomplete.getPlaceFromIntent(data!!) } } else -> super.onActivityResult(requestCode, resultCode, data) 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 f73037be..bb330876 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -3,6 +3,7 @@ package net.vonforst.evmap.viewmodel import android.app.Application import androidx.lifecycle.* import com.google.android.gms.maps.model.LatLngBounds +import com.google.android.libraries.places.api.model.Place import kotlinx.coroutines.Job import kotlinx.coroutines.launch import net.vonforst.evmap.api.availability.ChargeLocationStatus @@ -127,6 +128,10 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode db.chargeLocationsDao().getAllChargeLocations() } + val searchResult: MutableLiveData by lazy { + MutableLiveData() + } + fun insertFavorite(charger: ChargeLocation) { viewModelScope.launch { db.chargeLocationsDao().insert(charger)