Email and Share icons
Although at the time of writing, Email will crash on 15
This commit is contained in:
39
App/Backend/History/ShareableURL.swift
Normal file
39
App/Backend/History/ShareableURL.swift
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user