diff --git a/Riot/Modules/Room/RoomCoordinator.swift b/Riot/Modules/Room/RoomCoordinator.swift index 53f1a2202..9e446f4e0 100644 --- a/Riot/Modules/Room/RoomCoordinator.swift +++ b/Riot/Modules/Room/RoomCoordinator.swift @@ -386,6 +386,14 @@ extension RoomCoordinator: RoomViewControllerDelegate { startLocationCoordinatorWithEvent(event, bubbleData: bubbleData) } + func roomViewController(_ roomViewController: RoomViewController, locationShareActivityViewControllerFor event: MXEvent) -> UIActivityViewController? { + guard let location = event.location else { + return nil + } + + return LocationSharingCoordinator.shareActivityControllerForLocation(CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude)) + } + func roomViewController(_ roomViewController: RoomViewController, canEndPollWithEventIdentifier eventIdentifier: String) -> Bool { guard #available(iOS 14.0, *) else { return false diff --git a/Riot/Modules/Room/RoomViewController.h b/Riot/Modules/Room/RoomViewController.h index c47948655..d55354979 100644 --- a/Riot/Modules/Room/RoomViewController.h +++ b/Riot/Modules/Room/RoomViewController.h @@ -219,6 +219,9 @@ handleUniversalLinkWithParameters:(UniversalLinkParameters*)parameters; didRequestLocationPresentationForEvent:(MXEvent *)event bubbleData:(id)bubbleData; +- (nullable UIActivityViewController *)roomViewController:(RoomViewController *)roomViewController + locationShareActivityViewControllerForEvent:(MXEvent *)event; + - (BOOL)roomViewController:(RoomViewController *)roomViewController canEndPollWithEventIdentifier:(NSString *)eventIdentifier; diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index 481d345bb..ac7bb4a4c 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -3441,9 +3441,15 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05; [self cancelEventSelection]; - NSArray *activityItems = @[selectedComponent.textMessage]; + UIActivityViewController *activityViewController = nil; + if (selectedEvent.location) { + activityViewController = [self.delegate roomViewController:self locationShareActivityViewControllerForEvent:selectedEvent]; + } - UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; + if (activityViewController == nil) { + NSArray *activityItems = @[selectedComponent.textMessage]; + activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; + } if (activityViewController) { diff --git a/RiotSwiftUI/Modules/Room/LocationSharing/Coordinator/LocationSharingCoordinator.swift b/RiotSwiftUI/Modules/Room/LocationSharing/Coordinator/LocationSharingCoordinator.swift index bb8de9124..1ddface6f 100644 --- a/RiotSwiftUI/Modules/Room/LocationSharing/Coordinator/LocationSharingCoordinator.swift +++ b/RiotSwiftUI/Modules/Room/LocationSharing/Coordinator/LocationSharingCoordinator.swift @@ -72,7 +72,7 @@ final class LocationSharingCoordinator: Coordinator, Presentable { self.completion?() case .share(let latitude, let longitude): if let location = self.parameters.location { - self.showActivityControllerForLocation(location) + self.locationSharingHostingController.present(Self.shareActivityControllerForLocation(location), animated: true) return } @@ -94,19 +94,15 @@ final class LocationSharingCoordinator: Coordinator, Presentable { } } + static func shareActivityControllerForLocation(_ location: CLLocationCoordinate2D) -> UIActivityViewController { + return UIActivityViewController(activityItems: [ShareToMapsAppActivity.urlForMapsAppType(.apple, location: location)], + applicationActivities: [ShareToMapsAppActivity(type: .apple, location: location), + ShareToMapsAppActivity(type: .google, location: location)]) + } + // MARK: - Presentable func toPresentable() -> UIViewController { return locationSharingHostingController } - - // MARK: - Private - - private func showActivityControllerForLocation(_ location: CLLocationCoordinate2D) { - let vc = UIActivityViewController(activityItems: [ShareToMapsAppActivity.urlForMapsAppType(.apple, location: location)], - applicationActivities: [ShareToMapsAppActivity(type: .apple, location: location), - ShareToMapsAppActivity(type: .google, location: location)]) - - locationSharingHostingController.present(vc, animated: true) - } } diff --git a/RiotSwiftUI/Modules/Room/LocationSharing/Coordinator/ShareToMapsAppActivity.swift b/RiotSwiftUI/Modules/Room/LocationSharing/Coordinator/ShareToMapsAppActivity.swift index 6f7bd3780..12b24bcb6 100644 --- a/RiotSwiftUI/Modules/Room/LocationSharing/Coordinator/ShareToMapsAppActivity.swift +++ b/RiotSwiftUI/Modules/Room/LocationSharing/Coordinator/ShareToMapsAppActivity.swift @@ -20,25 +20,25 @@ extension UIActivity.ActivityType { static let shareToMapsApp = UIActivity.ActivityType("Element.ShareToMapsApp") } -class ShareToMapsAppActivity: UIActivity { - enum MapsAppType { +public class ShareToMapsAppActivity: UIActivity { + public enum MapsAppType { case apple case google } - let type: MapsAppType - let location: CLLocationCoordinate2D + private let type: MapsAppType + private let location: CLLocationCoordinate2D private override init() { fatalError() } - init(type: MapsAppType, location: CLLocationCoordinate2D) { + public init(type: MapsAppType, location: CLLocationCoordinate2D) { self.type = type self.location = location } - static func urlForMapsAppType(_ type: MapsAppType, location: CLLocationCoordinate2D) -> URL { + public static func urlForMapsAppType(_ type: MapsAppType, location: CLLocationCoordinate2D) -> URL { switch type { case .apple: return URL(string: "https://maps.apple.com?ll=\(location.latitude),\(location.longitude)&q=Pin")! @@ -47,7 +47,7 @@ class ShareToMapsAppActivity: UIActivity { } } - override var activityTitle: String? { + public override var activityTitle: String? { switch type { case .apple: return VectorL10n.locationSharingOpenAppleMaps @@ -60,15 +60,15 @@ class ShareToMapsAppActivity: UIActivity { return .action } - override var activityType: UIActivity.ActivityType { + public override var activityType: UIActivity.ActivityType { return .shareToMapsApp } - override func canPerform(withActivityItems activityItems: [Any]) -> Bool { + public override func canPerform(withActivityItems activityItems: [Any]) -> Bool { return true } - override func prepare(withActivityItems activityItems: [Any]) { + public override func prepare(withActivityItems activityItems: [Any]) { let url = Self.urlForMapsAppType(type, location: location) UIApplication.shared.open(url, options: [:]) { [weak self] result in