From a7a4906e8f846134f8c169f3442147a5b29f4200 Mon Sep 17 00:00:00 2001 From: MaximeE Date: Wed, 25 May 2022 11:12:31 +0200 Subject: [PATCH 1/3] 6202: Changelog --- changelog.d/6202.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/6202.bugfix diff --git a/changelog.d/6202.bugfix b/changelog.d/6202.bugfix new file mode 100644 index 000000000..f88ba6a7a --- /dev/null +++ b/changelog.d/6202.bugfix @@ -0,0 +1 @@ +Location sharing: Improve automatic detection of pin drop state From 315b2b5a37ef42ded3d91254c1f661feb118fa50 Mon Sep 17 00:00:00 2001 From: MaximeE Date: Wed, 1 Jun 2022 14:17:27 +0200 Subject: [PATCH 2/3] 6202: Add pan gesture recognizer to handle detection of user moving across map --- .../View/LocationSharingMapView.swift | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingMapView.swift b/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingMapView.swift index 97836ef64..cc6c80245 100644 --- a/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingMapView.swift +++ b/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingMapView.swift @@ -65,6 +65,9 @@ struct LocationSharingMapView: UIViewRepresentable { let mapView = self.makeMapView() mapView.delegate = context.coordinator + let panGesture = UIPanGestureRecognizer(target: context.coordinator, action: #selector(context.coordinator.didPan)) + panGesture.delegate = context.coordinator + mapView.addGestureRecognizer(panGesture) return mapView } @@ -106,11 +109,12 @@ struct LocationSharingMapView: UIViewRepresentable { @available(iOS 14, *) extension LocationSharingMapView { - class Coordinator: NSObject, MGLMapViewDelegate { + class Coordinator: NSObject, MGLMapViewDelegate, UIGestureRecognizerDelegate { // MARK: - Properties var locationSharingMapView: LocationSharingMapView + var mapCenterCoordinate: CLLocationCoordinate2D? // MARK: - Setup @@ -158,13 +162,7 @@ extension LocationSharingMapView { } func mapView(_ mapView: MGLMapView, regionDidChangeAnimated animated: Bool) { - let mapCenterCoordinate = mapView.centerCoordinate - // Prevent this function to set pinLocation when the map is openning - guard let userLocation = locationSharingMapView.userLocation, - !userLocation.isEqual(to: mapCenterCoordinate, precision: 0.0000000001) else { - return - } - locationSharingMapView.mapCenterCoordinate = mapCenterCoordinate + self.mapCenterCoordinate = mapView.centerCoordinate } // MARK: Callout @@ -182,11 +180,24 @@ extension LocationSharingMapView { } func mapView(_ mapView: MGLMapView, tapOnCalloutFor annotation: MGLAnnotation) { - locationSharingMapView.onCalloutTap?(annotation) // Hide the callout mapView.deselectAnnotation(annotation, animated: true) } + + // MARK: UIGestureRecognizer + + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return gestureRecognizer is UIPanGestureRecognizer + } + + @objc + func didPan() { + guard let mapCenterCoordinate = mapCenterCoordinate else { + return + } + locationSharingMapView.mapCenterCoordinate = mapCenterCoordinate + } } } From ae30f34656fd8106ece7aff2ee647aca6f023ba4 Mon Sep 17 00:00:00 2001 From: MaximeE Date: Thu, 2 Jun 2022 11:34:01 +0200 Subject: [PATCH 3/3] 6202: Improve how pan gesture is handled --- .../LocationSharing/LocationSharingModels.swift | 5 ++--- .../LocationSharingViewModel.swift | 6 +++++- .../View/LocationSharingMapView.swift | 15 +++++++-------- .../View/LocationSharingView.swift | 5 ++++- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingModels.swift b/RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingModels.swift index b4ade5e31..ec9eb58bd 100644 --- a/RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingModels.swift +++ b/RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingModels.swift @@ -39,6 +39,7 @@ enum LocationSharingViewAction { case goToUserLocation case startLiveSharing case shareLiveLocation(timeout: LiveLocationSharingTimeout) + case userDidPan } enum LocationSharingViewModelResult { @@ -70,9 +71,7 @@ struct LocationSharingViewState: BindableState { var highlightedAnnotation: LocationAnnotation? /// Indicates whether the user has moved around the map to drop a pin somewhere other than their current location - var isPinDropSharing: Bool { - return bindings.pinLocation != nil - } + var isPinDropSharing: Bool = false var showLoadingIndicator: Bool = false diff --git a/RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingViewModel.swift b/RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingViewModel.swift index 78a38040b..e2b64ff85 100644 --- a/RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingViewModel.swift +++ b/RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingViewModel.swift @@ -78,12 +78,16 @@ class LocationSharingViewModel: LocationSharingViewModelType, LocationSharingVie completion?(.share(latitude: pinLocation.latitude, longitude: pinLocation.longitude, coordinateType: .pin)) case .goToUserLocation: - state.bindings.pinLocation = nil + state.showsUserLocation = true + state.isPinDropSharing = false case .startLiveSharing: self.startLiveLocationSharing() case .shareLiveLocation(let timeout): state.bindings.showingTimerSelector = false completion?(.shareLiveLocation(timeout: timeout.rawValue)) + case .userDidPan: + state.showsUserLocation = false + state.isPinDropSharing = true } } diff --git a/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingMapView.swift b/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingMapView.swift index cc6c80245..8ad3ccceb 100644 --- a/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingMapView.swift +++ b/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingMapView.swift @@ -58,6 +58,9 @@ struct LocationSharingMapView: UIViewRepresentable { /// Publish view errors if any let errorSubject: PassthroughSubject + + /// Called when the user pan on the map + var userDidPan: (() -> Void)? // MARK: - UIViewRepresentable @@ -80,7 +83,7 @@ struct LocationSharingMapView: UIViewRepresentable { mapView.setCenter(highlightedAnnotation.coordinate, zoomLevel: Constants.mapZoomLevel, animated: false) } - if self.showsUserLocation && mapCenterCoordinate == nil { + if self.showsUserLocation { mapView.showsUserLocation = true mapView.userTrackingMode = .follow } else { @@ -114,7 +117,6 @@ extension LocationSharingMapView { // MARK: - Properties var locationSharingMapView: LocationSharingMapView - var mapCenterCoordinate: CLLocationCoordinate2D? // MARK: - Setup @@ -130,7 +132,7 @@ extension LocationSharingMapView { return LocationAnnotationView(userLocationAnnotation: userLocationAnnotation) } else if let pinLocationAnnotation = annotation as? PinLocationAnnotation { return LocationAnnotationView(pinLocationAnnotation: pinLocationAnnotation) - } else if annotation is MGLUserLocation && locationSharingMapView.mapCenterCoordinate == nil, let currentUserAvatarData = locationSharingMapView.userAvatarData { + } else if annotation is MGLUserLocation, let currentUserAvatarData = locationSharingMapView.userAvatarData { // Replace default current location annotation view with a UserLocationAnnotatonView when the map is center on user location return LocationAnnotationView(avatarData: currentUserAvatarData) } @@ -162,7 +164,7 @@ extension LocationSharingMapView { } func mapView(_ mapView: MGLMapView, regionDidChangeAnimated animated: Bool) { - self.mapCenterCoordinate = mapView.centerCoordinate + locationSharingMapView.mapCenterCoordinate = mapView.centerCoordinate } // MARK: Callout @@ -193,10 +195,7 @@ extension LocationSharingMapView { @objc func didPan() { - guard let mapCenterCoordinate = mapCenterCoordinate else { - return - } - locationSharingMapView.mapCenterCoordinate = mapCenterCoordinate + locationSharingMapView.userDidPan?() } } } diff --git a/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingView.swift b/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingView.swift index 52ec07f22..c986f5a6a 100644 --- a/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingView.swift +++ b/RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingView.swift @@ -76,7 +76,10 @@ struct LocationSharingView: View { showsUserLocation: context.viewState.showsUserLocation, userLocation: $context.userLocation, mapCenterCoordinate: $context.pinLocation, - errorSubject: context.viewState.errorSubject) + errorSubject: context.viewState.errorSubject, + userDidPan: { + context.send(viewAction: .userDidPan) + }) if context.viewState.isPinDropSharing { LocationSharingMarkerView(backgroundColor: theme.colors.accent) { Image(uiImage: Asset.Images.locationPinIcon.image)