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

@@ -0,0 +1,39 @@
//
// ShareableURL.swift
// App
//
// Created by James Magahern on 4/28/21.
//
import Foundation
class ShareableURL : NSObject, UIActivityItemSource
{
let url: URL
let title: String
let favicon: UIImage?
init(url: URL, title: String, favicon: UIImage?) {
self.url = url
self.title = title
self.favicon = favicon
super.init()
}
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return self.url
}
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
return self.url
}
func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
return self.title
}
func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivity.ActivityType?, suggestedSize size: CGSize) -> UIImage? {
return self.favicon
}
}

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)
}
}

View File

@@ -17,6 +17,7 @@ class DocumentControlViewController: UIViewController
let readabilityView = DocumentControlItemView()
let darkModeView = DocumentControlItemView()
let archiveView = DocumentControlItemView()
let emailView = DocumentControlItemView()
var observations: [NSKeyValueObservation] = []
@@ -37,6 +38,9 @@ class DocumentControlViewController: UIViewController
archiveView.label.text = "Archive.today"
archiveView.imageView.image = UIImage(systemName: "shippingbox")
emailView.label.text = "Email"
emailView.imageView.image = UIImage(systemName: "envelope")
if darkModeEnabled {
darkModeView.label.text = "Disable Dark Mode"
} else {
@@ -47,6 +51,8 @@ class DocumentControlViewController: UIViewController
documentControlsView.stackView.addArrangedSubview(navigationControlView)
documentControlsView.stackView.addArrangedSubview(fontSizeAdjustView)
documentControlsView.stackView.addArrangedSubview(emailView)
documentControlsView.stackView.addArrangedSubview(findOnPageControlView)
documentControlsView.stackView.addArrangedSubview(darkModeView)
documentControlsView.stackView.addArrangedSubview(readabilityView)