-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathReaderStreamViewController+Sharing.swift
More file actions
126 lines (99 loc) · 4.12 KB
/
Copy pathReaderStreamViewController+Sharing.swift
File metadata and controls
126 lines (99 loc) · 4.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import UIKit
import MobileCoreServices
import UniformTypeIdentifiers
import ShareExtensionCore
import WordPressData
// MARK: - Functionality related to sharing a blog via the reader.
extension ReaderStreamViewController {
// MARK: Internal behavior
/// Exposes the Share button if the currently selected Reader topic represents a site.
///
func configureShareButtonIfNeeded() {
guard let _ = readerTopic as? ReaderSiteTopic else {
removeShareButton()
return
}
let button = UIBarButtonItem(title: nil, image: UIImage(named: "wpl-share"), target: self, action: #selector(shareButtonTapped))
button.tag = NavigationItemTag.share.rawValue
button.accessibilityLabel = SharedStrings.Button.share
addRightBarButtonItem(button)
}
func addRightBarButtonItem(_ item: UIBarButtonItem, after afterTag: NavigationItemTag? = nil) {
var items = self.navigationItem.rightBarButtonItems ?? []
guard !items.contains(where: { $0.tag == item.tag }) else { return }
if let afterTag, let index = items.firstIndex(where: { $0.tag == afterTag.rawValue }) {
items.insert(item, at: index)
} else {
items.append(item)
}
self.navigationItem.rightBarButtonItems = items
}
// MARK: Private behavior
private func removeShareButton() {
navigationItem.rightBarButtonItem = nil
}
@objc private func shareButtonTapped(_ sender: UIBarButtonItem) {
guard let sitePendingPost = readerTopic as? ReaderSiteTopic else {
return
}
WPAppAnalytics.track(.readerSiteShared, blogID: sitePendingPost.siteID)
let activities = WPActivityDefaults.defaultActivities() as! [UIActivity]
let activityViewController = UIActivityViewController(activityItems: [sitePendingPost], applicationActivities: activities)
activityViewController.completionWithItemsHandler = { (activityType, completed, returnedItems, error) in
if completed {
WPActivityDefaults.trackActivityType((activityType).map { $0.rawValue })
}
}
if UIDevice.isPad() {
activityViewController.modalPresentationStyle = .popover
}
if let presentationController = activityViewController.popoverPresentationController {
presentationController.permittedArrowDirections = .any
presentationController.sourceItem = sender
}
present(activityViewController, animated: true)
}
}
// MARK: - ReaderSiteTopic support for sharing
private extension ReaderSiteTopic {
var shareablePostData: Data {
let shareSitePost = SharePost(title: title, summary: siteDescription, url: siteURL)
return shareSitePost.data
}
var shareableURL: URL? {
return URL(string: siteURL)
}
}
extension ReaderSiteTopic: UIActivityItemSource {
public func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return shareableURL as Any
}
public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
guard let activityType else {
return nil
}
let value: Any?
switch activityType {
case SharePost.activityType:
return shareablePostData
default:
value = shareableURL
}
return value
}
public func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
let value: String
if activityType == nil {
value = ""
} else {
value = title
}
return value
}
public func activityViewController(_ activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: UIActivity.ActivityType?) -> String {
if activityType == SharePost.activityType {
return ShareBlog.typeIdentifier
}
return UTType.url.identifier
}
}