From b2e53829e55a14b8d63ce5f2e4ead57cab26315a Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Fri, 3 Mar 2023 23:48:08 +0300 Subject: [PATCH] open events in map apps --- .../Location/EventsController.swift | 115 +++++++++++------- AutoCat/Controllers/ReportController.swift | 28 ++++- AutoCat/Info.plist | 4 + 3 files changed, 103 insertions(+), 44 deletions(-) diff --git a/AutoCat/Controllers/Location/EventsController.swift b/AutoCat/Controllers/Location/EventsController.swift index c2ca239..132b5bf 100644 --- a/AutoCat/Controllers/Location/EventsController.swift +++ b/AutoCat/Controllers/Location/EventsController.swift @@ -145,42 +145,77 @@ class EventsController: UIViewController, UITableViewDataSource, UITableViewDele // MARK: - UITableViewDelegate func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { + guard let vehicle = self.vehicle else { + HUD.flash(.labeledError(title: nil, subtitle: "Unknown vehicle")) + return nil + } + + let event = vehicle.events[indexPath.row] + return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in - let copy = UIAction(title: NSLocalizedString("Copy", comment: ""), image: UIImage(systemName: "doc.on.doc")) { action in - self.copyEvent(index: indexPath.row) - } - let share = UIAction(title: NSLocalizedString("Share", comment: ""), image: UIImage(systemName: "square.and.arrow.up")) { action in - self.shareEvent(index: indexPath.row) - } + let copy = UIAction(title: NSLocalizedString("Copy", comment: ""), + image: UIImage(systemName: "doc.on.doc"), + handler: { _ in self.copyEvent(event: event) }) - let edit = UIAction(title: NSLocalizedString("Edit", comment: ""), image: UIImage(systemName: "pencil")) { action in - self.editEvent(index: indexPath.row) - } + let share = UIAction(title: NSLocalizedString("Share", comment: ""), + image: UIImage(systemName: "square.and.arrow.up"), + handler: { _ in self.shareEvent(event: event) }) - let delete = UIAction(title: NSLocalizedString("Delete", comment: ""), image: UIImage(systemName: "trash"), attributes: .destructive) { action in - self.deleteEvent(index: indexPath.row) + let edit = UIAction(title: NSLocalizedString("Edit", comment: ""), + image: UIImage(systemName: "pencil"), + handler: { _ in self.editEvent(event: event) }) + + let delete = UIAction(title: NSLocalizedString("Delete", comment: ""), + image: UIImage(systemName: "trash"), + attributes: .destructive, + handler: { _ in self.deleteEvent(event: event) }) + + let openApple = UIAction(title: NSLocalizedString("Apple Maps", comment: ""), + image: UIImage(systemName: "map"), + handler: { _ in self.openInAppleMaps(event: event) }) + + let openYandex = UIAction(title: NSLocalizedString("Yandex Maps", comment: ""), + image: UIImage(systemName: "map"), + handler: { _ in self.openInYandexMaps(event: event) }) + + let openMenu: UIMenuElement + if let yandexUrl = URL(string: "yandexmaps://"), + UIApplication.shared.canOpenURL(yandexUrl) + { + openMenu = UIMenu(title: NSLocalizedString("Open in ...", comment: ""), + children: [openApple, openYandex]) + } else { + openApple.title = NSLocalizedString("Open in Apple Maps", comment: "") + openMenu = openApple } - return UIMenu(title: NSLocalizedString("Actions", comment: ""), children: [copy, share, edit, delete]) + return UIMenu(title: NSLocalizedString("Actions", comment: ""), children: [copy, share, edit, openMenu, delete]) } } func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { + guard let vehicle = self.vehicle else { + HUD.flash(.labeledError(title: nil, subtitle: "Unknown vehicle")) + return nil + } + + let event = vehicle.events[indexPath.row] + let copy = UIContextualAction(style: .normal, title: NSLocalizedString("Copy", comment: "")) { action, view, completion in - self.copyEvent(index: indexPath.row) + self.copyEvent(event: event) completion(true) } copy.image = UIImage(systemName: "doc.on.doc") copy.backgroundColor = .systemBlue let delete = UIContextualAction(style: .destructive, title: NSLocalizedString("Delete", comment: "")) { action, view, completion in - self.deleteEvent(index: indexPath.row, completion: completion) + self.deleteEvent(event: event, completion: completion) } delete.image = UIImage(systemName: "trash") let edit = UIContextualAction(style: .normal, title: NSLocalizedString("Edit", comment: "")) { action, view, completion in - self.editEvent(index: indexPath.row) + self.editEvent(event: event) completion(true) } edit.image = UIImage(systemName: "pencil") @@ -206,13 +241,7 @@ class EventsController: UIViewController, UITableViewDataSource, UITableViewDele // MARK: - Event actions - func deleteEvent(index: Int, completion: ((Bool) -> Void)? = nil) { - guard let vehicle = self.vehicle else { - HUD.flash(.labeledError(title: nil, subtitle: "Unknown vehicle")) - return - } - - let event = vehicle.events[index] + func deleteEvent(event: VehicleEvent, completion: ((Bool) -> Void)? = nil) { HUD.show(.progress) Api.remove(event: event.id).observe(on: MainScheduler.instance).subscribe(onSuccess: { vehicle in let result = self.update(vehicle: vehicle) @@ -224,13 +253,7 @@ class EventsController: UIViewController, UITableViewDataSource, UITableViewDele }).disposed(by: self.bag) } - func editEvent(index: Int) { - guard let vehicle = self.vehicle else { - HUD.flash(.labeledError(title: nil, subtitle: "Unknown vehicle")) - return - } - - let event = vehicle.events[index] + func editEvent(event: VehicleEvent) { let sb = UIStoryboard(name: "Main", bundle: nil) let controller = sb.instantiateViewController(identifier: "LocationEditController") as LocationEditController controller.title = NSLocalizedString("Edit event", comment: "") @@ -252,14 +275,8 @@ class EventsController: UIViewController, UITableViewDataSource, UITableViewDele self.navigationController?.pushViewController(controller, animated: true) } - func copyEvent(index: Int) { - guard let vehicle = self.vehicle else { - HUD.flash(.labeledError(title: nil, subtitle: "Unknown vehicle")) - return - } - + func copyEvent(event: VehicleEvent) { var items: [String: Any] = [:] - let event = vehicle.events[index] if let url = event.getMapLink() { items[kUTTypeURL as String] = url @@ -278,17 +295,29 @@ class EventsController: UIViewController, UITableViewDataSource, UITableViewDele self.setupBarButtonItems() } - func shareEvent(index: Int) { - guard let vehicle = self.vehicle else { - HUD.flash(.labeledError(title: nil, subtitle: "Unknown vehicle")) + func shareEvent(event: VehicleEvent) { + guard let url = event.getMapLink() else { return } - let event = vehicle.events[index] - if let url = event.getMapLink() { - let controller = UIActivityViewController(activityItems: [url], applicationActivities: nil) - self.present(controller, animated: true) + let controller = UIActivityViewController(activityItems: [url], applicationActivities: nil) + self.present(controller, animated: true) + } + + func openInAppleMaps(event: VehicleEvent) { + let coordinates = CLLocationCoordinate2D(latitude: event.latitude, + longitude: event.longitude) + let placemark = MKPlacemark(coordinate: coordinates) + let mapItem = MKMapItem(placemark: placemark) + mapItem.openInMaps() + } + + func openInYandexMaps(event: VehicleEvent) { + guard let url = URL(string: "yandexmaps://maps.yandex.ru/?pt=\(event.longitude),\(event.latitude)&z=12") else { + return } + + UIApplication.shared.open(url) } @objc func addEvent(_ sender: UIBarButtonItem) { diff --git a/AutoCat/Controllers/ReportController.swift b/AutoCat/Controllers/ReportController.swift index 1358f07..d0a2c79 100644 --- a/AutoCat/Controllers/ReportController.swift +++ b/AutoCat/Controllers/ReportController.swift @@ -4,6 +4,7 @@ import LinkPresentation import RealmSwift import Eureka import AutoCatCore +import SwiftEntryKit class ReportController: FormViewController, MediaBrowserViewControllerDataSource, MediaBrowserViewControllerDelegate, UIActivityItemSource { @@ -156,7 +157,15 @@ class ReportController: FormViewController, MediaBrowserViewControllerDataSource for row in form.allRows { if let labelRow = row as? LabelRow { let doubleTap = UITapGestureRecognizer { _ in - UIPasteboard.general.string = labelRow.value + guard let text = labelRow.value else { + return + } + + UIPasteboard.general.string = text + let generator = UIImpactFeedbackGenerator(style: .rigid) + generator.impactOccurred() + let toastMessage = NSLocalizedString("Copied: ", comment: "") + text + self.showToast(text: toastMessage) } doubleTap.numberOfTapsRequired = 2 @@ -165,6 +174,23 @@ class ReportController: FormViewController, MediaBrowserViewControllerDataSource } } + func showToast(text: String) { + let style = EKProperty.LabelStyle( + font: .systemFont(ofSize: 14), + color: .white, //.black, + alignment: .center + ) + let labelContent = EKProperty.LabelContent( + text: text, + style: style + ) + let contentView = EKNoteMessageView(with: labelContent) + + var attributes: EKAttributes = .bottomFloat //.toast + attributes.entryBackground = .visualEffect(style: EKAttributes.BackgroundStyle.BlurStyle(light: .dark, dark: .light)) //.color(color: .init(red: 0, green: 196, blue: 0)) + SwiftEntryKit.display(entry: contentView, using: attributes) + } + func update(row tag: String, with value: String) { if let row = self.form.rowBy(tag: tag) as? LabelRow { row.value = value diff --git a/AutoCat/Info.plist b/AutoCat/Info.plist index eee995d..b4959a8 100644 --- a/AutoCat/Info.plist +++ b/AutoCat/Info.plist @@ -2,6 +2,10 @@ + LSApplicationQueriesSchemes + + yandexmaps + ITSAppUsesNonExemptEncryption CFBundleDevelopmentRegion