From 3d39c2e1302ab84a083518c800f2a988c945a6e0 Mon Sep 17 00:00:00 2001 From: Sameer Dhakal Date: Mon, 29 Oct 2018 12:50:00 -0400 Subject: [PATCH 1/3] [Refactor] - Tour : Updates the id of tour intro object to "INTRO" --- .../kotlin/edu/artic/map/rendering/TourIntroMapItemRenderer.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/map/src/main/kotlin/edu/artic/map/rendering/TourIntroMapItemRenderer.kt b/map/src/main/kotlin/edu/artic/map/rendering/TourIntroMapItemRenderer.kt index 27619b52f..1277a14d2 100644 --- a/map/src/main/kotlin/edu/artic/map/rendering/TourIntroMapItemRenderer.kt +++ b/map/src/main/kotlin/edu/artic/map/rendering/TourIntroMapItemRenderer.kt @@ -5,6 +5,7 @@ import com.fuzz.rx.asFlowable import com.google.android.gms.maps.model.BitmapDescriptor import com.google.android.gms.maps.model.BitmapDescriptorFactory import com.google.android.gms.maps.model.LatLng +import edu.artic.db.INTRO_TOUR_STOP_OBJECT_ID import edu.artic.db.debug import edu.artic.db.models.ArticTour import edu.artic.image.asRequestObservable @@ -46,7 +47,7 @@ class TourIntroMapItemRenderer : MapItemRenderer(useBitmapQueue = tru override fun getLocationFromItem(item: ArticTour): LatLng = item.toLatLng() - override fun getIdFromItem(item: ArticTour): String = item.nid + override fun getIdFromItem(item: ArticTour): String = INTRO_TOUR_STOP_OBJECT_ID override fun getMarkerAlpha(floor: Int, mapDisplayMode: MapDisplayMode, item: ArticTour): Float { // on tour, set the alpha depending on current floor. From dc8e5235169c3bd52eb2bcc56a4f9bbb6c3f5bf3 Mon Sep 17 00:00:00 2001 From: Sameer Dhakal Date: Mon, 29 Oct 2018 13:00:46 -0400 Subject: [PATCH 2/3] [Refactor] - Map : Returns marker instead of MarkerHolder --- .../main/kotlin/edu/artic/map/MapFragment.kt | 2 +- .../edu/artic/map/MapMarkerConstructor.kt | 2 +- .../main/kotlin/edu/artic/map/MapViewModel.kt | 24 +++++++++++++++---- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/map/src/main/kotlin/edu/artic/map/MapFragment.kt b/map/src/main/kotlin/edu/artic/map/MapFragment.kt index 376999b02..517bd3b5e 100644 --- a/map/src/main/kotlin/edu/artic/map/MapFragment.kt +++ b/map/src/main/kotlin/edu/artic/map/MapFragment.kt @@ -426,7 +426,7 @@ class MapFragment : BaseViewModelFragment() { */ viewModel .selectedTourStopMarkerId - .flatMap { viewModel.retrieveObjectById(it) } + .flatMap { viewModel.retrieveMarkerByObjectId(it) } .filterValue() .withLatestFrom(viewModel.currentMap.filterValue()) .observeOn(AndroidSchedulers.mainThread()) diff --git a/map/src/main/kotlin/edu/artic/map/MapMarkerConstructor.kt b/map/src/main/kotlin/edu/artic/map/MapMarkerConstructor.kt index d14108e0c..cdb963b62 100644 --- a/map/src/main/kotlin/edu/artic/map/MapMarkerConstructor.kt +++ b/map/src/main/kotlin/edu/artic/map/MapMarkerConstructor.kt @@ -36,7 +36,7 @@ class MapMarkerConstructor private val amenitiesMapItemRenderer = AmenitiesMapItemRenderer(articMapAnnotationDao) private val departmentsMapItemRenderer = DepartmentsMapItemRenderer(articMapAnnotationDao) private val galleriesMapItemRenderer = GalleriesMapItemRenderer(galleryDao) - private val tourIntroMapItemRenderer = TourIntroMapItemRenderer() + val tourIntroMapItemRenderer = TourIntroMapItemRenderer() private val lionMapItemRenderer = LionMapItemRenderer() val objectsMapItemRenderer = ObjectsMapItemRenderer(objectsDao) diff --git a/map/src/main/kotlin/edu/artic/map/MapViewModel.kt b/map/src/main/kotlin/edu/artic/map/MapViewModel.kt index e2fdc6451..050fd78e8 100644 --- a/map/src/main/kotlin/edu/artic/map/MapViewModel.kt +++ b/map/src/main/kotlin/edu/artic/map/MapViewModel.kt @@ -5,12 +5,14 @@ import com.fuzz.rx.* import com.fuzz.rx.Optional import com.google.android.gms.maps.GoogleMap import com.google.android.gms.maps.model.LatLng +import com.google.android.gms.maps.model.Marker import com.google.android.gms.maps.model.VisibleRegion import com.jakewharton.rxrelay2.PublishRelay import com.jakewharton.rxrelay2.Relay import edu.artic.analytics.AnalyticsAction import edu.artic.analytics.AnalyticsTracker import edu.artic.analytics.EventCategoryName +import edu.artic.db.INTRO_TOUR_STOP_OBJECT_ID import edu.artic.db.daos.ArticMapAnnotationDao import edu.artic.db.daos.ArticMapFloorDao import edu.artic.db.daos.ArticObjectDao @@ -22,8 +24,7 @@ import edu.artic.location.LocationService import edu.artic.location.isLocationInMuseum import edu.artic.map.helpers.toLatLng -import edu.artic.map.rendering.MapItemModel -import edu.artic.map.rendering.MarkerHolder +import edu.artic.map.rendering.MapItemRenderer import edu.artic.map.tutorial.TutorialPreferencesManager import edu.artic.tours.manager.TourProgressManager import edu.artic.viewmodel.NavViewViewModel @@ -575,12 +576,25 @@ class MapViewModel @Inject constructor(val mapMarkerConstructor: MapMarkerConstr } /** - * Retrieve an object from the [MapMarkerConstructor] + * Retrieve a Marker from the [MapMarkerConstructor] */ - fun retrieveObjectById(nid: String): Observable>> { - return mapMarkerConstructor.objectsMapItemRenderer.getMarkerHolderById(nid) + fun retrieveMarkerByObjectId(nid: String): Observable> { + + val markerRenderer: MapItemRenderer<*> = if (nid == INTRO_TOUR_STOP_OBJECT_ID) { + mapMarkerConstructor.tourIntroMapItemRenderer + } else { + mapMarkerConstructor.objectsMapItemRenderer + } + + return markerRenderer + .getMarkerHolderById(nid) + .filterFlatMap({ it.value != null }, { it.value }) + .map { data -> + Optional(data.marker) + } } + override fun onCleared() { super.onCleared() mapMarkerConstructor.cleanup() From dfbbb552ca9e9578281568c06d6a1331ca7e0a40 Mon Sep 17 00:00:00 2001 From: Sameer Dhakal Date: Mon, 29 Oct 2018 13:01:37 -0400 Subject: [PATCH 3/3] [Refactor] - Map : Brings selected tour stop to front when overlapped --- .../main/kotlin/edu/artic/map/MapFragment.kt | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/map/src/main/kotlin/edu/artic/map/MapFragment.kt b/map/src/main/kotlin/edu/artic/map/MapFragment.kt index 517bd3b5e..fb5c7a2d2 100644 --- a/map/src/main/kotlin/edu/artic/map/MapFragment.kt +++ b/map/src/main/kotlin/edu/artic/map/MapFragment.kt @@ -196,6 +196,24 @@ class MapFragment : BaseViewModelFragment() { * locks us into just that area */ setLatLngBoundsForCameraTarget(mapDisplayBounds) + + /** + * Marker.showInfoWindow() method is used (see [MapViewModel.retrieveMarkerByObjectId] + * to bring the selected marker to front (markers sometime overlap). + * We are using this method just to bring the targeted marker to front without + * displaying info window. + * + * Purpose of setting this infoWindowAdapter is for displaying an empty info window. + */ + setInfoWindowAdapter(object : GoogleMap.InfoWindowAdapter { + override fun getInfoContents(p0: Marker?): View { + return View(requireContext()) + } + + override fun getInfoWindow(p0: Marker?): View { + return View(requireContext()) + } + }) } } @@ -430,8 +448,12 @@ class MapFragment : BaseViewModelFragment() { .filterValue() .withLatestFrom(viewModel.currentMap.filterValue()) .observeOn(AndroidSchedulers.mainThread()) - .subscribeBy { (markerHolder, map) -> - val (_, _, marker) = markerHolder + .subscribeBy { (marker, map) -> + + /** + * showInfoWindow() is only used for bringing targeted marker to front. + */ + marker.showInfoWindow() val currentZoomLevel = map.cameraPosition.zoom map.animateCamera(CameraUpdateFactory.newLatLngZoom(marker.position, Math.max(ZOOM_INDIVIDUAL, currentZoomLevel)))