Email and Share icons

Although at the time of writing, Email will crash on 15
This commit is contained in:
James Magahern
2021-05-06 16:19:39 -07:00
parent 557efa40e9
commit dd11f1c61a
4 changed files with 98 additions and 20 deletions

View File

@@ -6,6 +6,7 @@
//
import Combine
import MessageUI
import UIKit
import UniformTypeIdentifiers
@@ -95,26 +96,8 @@ class BrowserViewController: UIViewController
}), for: .touchUpInside)
// Share button
toolbarController.shareButton.addAction(UIAction(handler: { [unowned self, toolbarController] _ in
if let url = self.webView.url {
let itemProvider = NSItemProvider(item: url as NSURL, typeIdentifier: UTType.url.identifier)
let config = UIActivityItemsConfiguration(itemProviders: [ itemProvider ])
config.metadataProvider = { metadataKey in
switch metadataKey {
case .title: return self.webView.title
case .messageBody: return self.webView.title
default: return nil
}
}
config.previewProvider = { index, intent, suggestedSize in
NSItemProvider(item: self.tab.favicon, typeIdentifier: UTType.image.identifier)
}
let activityController = UIActivityViewController(activityItemsConfiguration: config)
activityController.popoverPresentationController?.sourceView = toolbarController.shareButton
self.present(activityController, animated: true, completion: nil)
}
toolbarController.shareButton.addAction(UIAction(handler: { [unowned self] _ in
showShareSheetForCurrentURL(fromViewController: nil)
}), for: .touchUpInside)
// Script button
@@ -289,6 +272,11 @@ class BrowserViewController: UIViewController
documentControls.dismiss(animated: true, completion: nil)
}, for: .touchUpInside)
// Email
documentControls.emailView.addAction(UIAction { [unowned self] _ in
composeEmailForCurrentURL(fromViewController: documentControls)
}, for: .touchUpInside)
// Settings
documentControls.settingsView.addAction(UIAction { [unowned self] _ in
documentControls.dismiss(animated: false, completion: nil)
@@ -321,6 +309,40 @@ class BrowserViewController: UIViewController
self.view = browserView
}
internal func showShareSheetForCurrentURL(fromViewController: UIViewController?) {
guard let url = self.webView.url else { return }
let shareableURL = ShareableURL(
url: url,
title: webView.title ?? url.absoluteString,
favicon: tab.favicon
)
let activityController = UIActivityViewController(activityItems: [ shareableURL ], applicationActivities: nil)
activityController.popoverPresentationController?.sourceView = toolbarController.shareButton
if let fromViewController = fromViewController {
fromViewController.dismiss(animated: false, completion: nil)
}
self.present(activityController, animated: true, completion: nil)
}
internal func composeEmailForCurrentURL(fromViewController: UIViewController?) {
guard let url = self.webView.url else { return }
let composeController = MFMailComposeViewController()
composeController.setSubject(webView.title ?? url.absoluteString)
composeController.setMessageBody(url.absoluteString, isHTML: false)
composeController.mailComposeDelegate = self
if let fromViewController = fromViewController {
fromViewController.dismiss(animated: false, completion: nil)
}
present(composeController, animated: true, completion: nil)
}
internal func showSettingsWindow() {
#if targetEnvironment(macCatalyst)
let userActivity = NSUserActivity(activityType: SessionActivityType.SettingsWindow.rawValue)
@@ -570,3 +592,10 @@ extension BrowserViewController: URLBarDelegate
changingFocusToAutocompleteController = false
}
}
extension BrowserViewController: MFMailComposeViewControllerDelegate
{
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true, completion: nil)
}
}