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 Combine
import MessageUI
import UIKit import UIKit
import UniformTypeIdentifiers import UniformTypeIdentifiers
@@ -95,26 +96,8 @@ class BrowserViewController: UIViewController
}), for: .touchUpInside) }), for: .touchUpInside)
// Share button // Share button
toolbarController.shareButton.addAction(UIAction(handler: { [unowned self, toolbarController] _ in toolbarController.shareButton.addAction(UIAction(handler: { [unowned self] _ in
if let url = self.webView.url { showShareSheetForCurrentURL(fromViewController: nil)
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)
}
}), for: .touchUpInside) }), for: .touchUpInside)
// Script button // Script button
@@ -289,6 +272,11 @@ class BrowserViewController: UIViewController
documentControls.dismiss(animated: true, completion: nil) documentControls.dismiss(animated: true, completion: nil)
}, for: .touchUpInside) }, for: .touchUpInside)
// Email
documentControls.emailView.addAction(UIAction { [unowned self] _ in
composeEmailForCurrentURL(fromViewController: documentControls)
}, for: .touchUpInside)
// Settings // Settings
documentControls.settingsView.addAction(UIAction { [unowned self] _ in documentControls.settingsView.addAction(UIAction { [unowned self] _ in
documentControls.dismiss(animated: false, completion: nil) documentControls.dismiss(animated: false, completion: nil)
@@ -321,6 +309,40 @@ class BrowserViewController: UIViewController
self.view = browserView 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() { internal func showSettingsWindow() {
#if targetEnvironment(macCatalyst) #if targetEnvironment(macCatalyst)
let userActivity = NSUserActivity(activityType: SessionActivityType.SettingsWindow.rawValue) let userActivity = NSUserActivity(activityType: SessionActivityType.SettingsWindow.rawValue)
@@ -570,3 +592,10 @@ extension BrowserViewController: URLBarDelegate
changingFocusToAutocompleteController = false 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 readabilityView = DocumentControlItemView()
let darkModeView = DocumentControlItemView() let darkModeView = DocumentControlItemView()
let archiveView = DocumentControlItemView() let archiveView = DocumentControlItemView()
let emailView = DocumentControlItemView()
var observations: [NSKeyValueObservation] = [] var observations: [NSKeyValueObservation] = []
@@ -37,6 +38,9 @@ class DocumentControlViewController: UIViewController
archiveView.label.text = "Archive.today" archiveView.label.text = "Archive.today"
archiveView.imageView.image = UIImage(systemName: "shippingbox") archiveView.imageView.image = UIImage(systemName: "shippingbox")
emailView.label.text = "Email"
emailView.imageView.image = UIImage(systemName: "envelope")
if darkModeEnabled { if darkModeEnabled {
darkModeView.label.text = "Disable Dark Mode" darkModeView.label.text = "Disable Dark Mode"
} else { } else {
@@ -47,6 +51,8 @@ class DocumentControlViewController: UIViewController
documentControlsView.stackView.addArrangedSubview(navigationControlView) documentControlsView.stackView.addArrangedSubview(navigationControlView)
documentControlsView.stackView.addArrangedSubview(fontSizeAdjustView) documentControlsView.stackView.addArrangedSubview(fontSizeAdjustView)
documentControlsView.stackView.addArrangedSubview(emailView)
documentControlsView.stackView.addArrangedSubview(findOnPageControlView) documentControlsView.stackView.addArrangedSubview(findOnPageControlView)
documentControlsView.stackView.addArrangedSubview(darkModeView) documentControlsView.stackView.addArrangedSubview(darkModeView)
documentControlsView.stackView.addArrangedSubview(readabilityView) documentControlsView.stackView.addArrangedSubview(readabilityView)

View File

@@ -52,6 +52,7 @@
CD853BD424E77BF900D2BDCC /* HistoryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD853BD324E77BF900D2BDCC /* HistoryItem.swift */; }; CD853BD424E77BF900D2BDCC /* HistoryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD853BD324E77BF900D2BDCC /* HistoryItem.swift */; };
CD97CF9225D5BE6F00288FEE /* NavigationControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD97CF9125D5BE6F00288FEE /* NavigationControlsView.swift */; }; CD97CF9225D5BE6F00288FEE /* NavigationControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD97CF9125D5BE6F00288FEE /* NavigationControlsView.swift */; };
CDAD9CE8263A2DF200FF7199 /* DocumentControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDAD9CE7263A2DF200FF7199 /* DocumentControlsView.swift */; }; CDAD9CE8263A2DF200FF7199 /* DocumentControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDAD9CE7263A2DF200FF7199 /* DocumentControlsView.swift */; };
CDAD9CEA263A318F00FF7199 /* ShareableURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDAD9CE9263A318F00FF7199 /* ShareableURL.swift */; };
CDC4A1CF25E9D8F7007D33C6 /* Tagger.js in Resources */ = {isa = PBXBuildFile; fileRef = CDC4A1CE25E9D8F7007D33C6 /* Tagger.js */; }; CDC4A1CF25E9D8F7007D33C6 /* Tagger.js in Resources */ = {isa = PBXBuildFile; fileRef = CDC4A1CE25E9D8F7007D33C6 /* Tagger.js */; };
CDC5DA3A25DB774D00BA8D99 /* Readability.js in Resources */ = {isa = PBXBuildFile; fileRef = CDC5DA3925DB774D00BA8D99 /* Readability.js */; }; CDC5DA3A25DB774D00BA8D99 /* Readability.js in Resources */ = {isa = PBXBuildFile; fileRef = CDC5DA3925DB774D00BA8D99 /* Readability.js */; };
CDC5DA3E25DB7C2C00BA8D99 /* ReaderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC5DA3D25DB7C2C00BA8D99 /* ReaderViewController.swift */; }; CDC5DA3E25DB7C2C00BA8D99 /* ReaderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC5DA3D25DB7C2C00BA8D99 /* ReaderViewController.swift */; };
@@ -145,6 +146,7 @@
CD853BD324E77BF900D2BDCC /* HistoryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryItem.swift; sourceTree = "<group>"; }; CD853BD324E77BF900D2BDCC /* HistoryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryItem.swift; sourceTree = "<group>"; };
CD97CF9125D5BE6F00288FEE /* NavigationControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControlsView.swift; sourceTree = "<group>"; }; CD97CF9125D5BE6F00288FEE /* NavigationControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControlsView.swift; sourceTree = "<group>"; };
CDAD9CE7263A2DF200FF7199 /* DocumentControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentControlsView.swift; sourceTree = "<group>"; }; CDAD9CE7263A2DF200FF7199 /* DocumentControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentControlsView.swift; sourceTree = "<group>"; };
CDAD9CE9263A318F00FF7199 /* ShareableURL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareableURL.swift; sourceTree = "<group>"; };
CDC4A1CE25E9D8F7007D33C6 /* Tagger.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = Tagger.js; sourceTree = "<group>"; }; CDC4A1CE25E9D8F7007D33C6 /* Tagger.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = Tagger.js; sourceTree = "<group>"; };
CDC5DA3925DB774D00BA8D99 /* Readability.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = Readability.js; sourceTree = "<group>"; }; CDC5DA3925DB774D00BA8D99 /* Readability.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = Readability.js; sourceTree = "<group>"; };
CDC5DA3D25DB7C2C00BA8D99 /* ReaderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderViewController.swift; sourceTree = "<group>"; }; CDC5DA3D25DB7C2C00BA8D99 /* ReaderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderViewController.swift; sourceTree = "<group>"; };
@@ -376,6 +378,7 @@
CD853BCF24E778B800D2BDCC /* History.xcdatamodeld */, CD853BCF24E778B800D2BDCC /* History.xcdatamodeld */,
CD853BCD24E7763900D2BDCC /* BrowserHistory.swift */, CD853BCD24E7763900D2BDCC /* BrowserHistory.swift */,
CD853BD324E77BF900D2BDCC /* HistoryItem.swift */, CD853BD324E77BF900D2BDCC /* HistoryItem.swift */,
CDAD9CE9263A318F00FF7199 /* ShareableURL.swift */,
); );
path = History; path = History;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -528,6 +531,7 @@
1A03811024E71CF000826501 /* ReliefButton.swift in Sources */, 1A03811024E71CF000826501 /* ReliefButton.swift in Sources */,
1A03811224E71EAA00826501 /* GradientView.swift in Sources */, 1A03811224E71EAA00826501 /* GradientView.swift in Sources */,
1ADFF4C024CA6964006DC7AE /* URLBar.swift in Sources */, 1ADFF4C024CA6964006DC7AE /* URLBar.swift in Sources */,
CDAD9CEA263A318F00FF7199 /* ShareableURL.swift in Sources */,
CDCE2666251AA840007FE92A /* StackView.swift in Sources */, CDCE2666251AA840007FE92A /* StackView.swift in Sources */,
CD853BD124E778B800D2BDCC /* History.xcdatamodeld in Sources */, CD853BD124E778B800D2BDCC /* History.xcdatamodeld in Sources */,
CDD0522125F8023700DD1771 /* Settings.swift in Sources */, CDD0522125F8023700DD1771 /* Settings.swift in Sources */,