135 lines
4.7 KiB
Swift
135 lines
4.7 KiB
Swift
//
|
|
// ShareViewController.swift
|
|
// TeamMailShareExtension
|
|
//
|
|
// Created by dab.dev on 06/04/2022.
|
|
//
|
|
|
|
import UIKit
|
|
import Social
|
|
import MobileCoreServices
|
|
|
|
class ShareViewController: SLComposeServiceViewController {
|
|
|
|
let hostAppBundleIdentifier = "com.linagora.teammail"
|
|
let sharedKey = "ShareKey"
|
|
var sharedText: [String] = []
|
|
let textContentType = kUTTypeText as String
|
|
let urlContentType = kUTTypeURL as String
|
|
|
|
override func isContentValid() -> Bool {
|
|
return true
|
|
}
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad();
|
|
}
|
|
|
|
override func viewDidAppear(_ animated: Bool) {
|
|
super.viewDidAppear(animated)
|
|
|
|
// This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.
|
|
if let content = extensionContext!.inputItems[0] as? NSExtensionItem {
|
|
if let contents = content.attachments {
|
|
for (index, attachment) in (contents).enumerated() {
|
|
if attachment.hasItemConformingToTypeIdentifier(textContentType) {
|
|
handleText(content: content, attachment: attachment, index: index)
|
|
} else if attachment.hasItemConformingToTypeIdentifier(urlContentType) {
|
|
handleUrl(content: content, attachment: attachment, index: index)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
override func didSelectPost() {
|
|
print("didSelectPost");
|
|
}
|
|
|
|
override func configurationItems() -> [Any]! {
|
|
// To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
|
|
return []
|
|
}
|
|
|
|
private func handleText (content: NSExtensionItem, attachment: NSItemProvider, index: Int) {
|
|
attachment.loadItem(forTypeIdentifier: textContentType, options: nil) { [weak self] data, error in
|
|
|
|
if error == nil, let item = data as? String, let this = self {
|
|
|
|
this.sharedText.append(item)
|
|
|
|
// If this is the last item, save imagesData in userDefaults and redirect to host app
|
|
if index == (content.attachments?.count)! - 1 {
|
|
let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)")
|
|
userDefaults?.set(this.sharedText, forKey: this.sharedKey)
|
|
userDefaults?.synchronize()
|
|
this.redirectToHostApp(type: .text)
|
|
}
|
|
|
|
} else {
|
|
self?.dismissWithError()
|
|
}
|
|
}
|
|
}
|
|
|
|
private func handleUrl (content: NSExtensionItem, attachment: NSItemProvider, index: Int) {
|
|
attachment.loadItem(forTypeIdentifier: urlContentType, options: nil) { [weak self] data, error in
|
|
|
|
if error == nil, let item = data as? URL, let this = self {
|
|
|
|
this.sharedText.append(item.absoluteString)
|
|
|
|
// If this is the last item, save imagesData in userDefaults and redirect to host app
|
|
if index == (content.attachments?.count)! - 1 {
|
|
let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)")
|
|
userDefaults?.set(this.sharedText, forKey: this.sharedKey)
|
|
userDefaults?.synchronize()
|
|
this.redirectToHostApp(type: .text)
|
|
}
|
|
|
|
} else {
|
|
self?.dismissWithError()
|
|
}
|
|
}
|
|
}
|
|
|
|
private func dismissWithError() {
|
|
print("[ERROR] Error loading data!")
|
|
let alert = UIAlertController(title: "Error", message: "Error loading data", preferredStyle: .alert)
|
|
|
|
let action = UIAlertAction(title: "Error", style: .cancel) { _ in
|
|
self.dismiss(animated: true, completion: nil)
|
|
}
|
|
|
|
alert.addAction(action)
|
|
present(alert, animated: true, completion: nil)
|
|
extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
|
|
}
|
|
|
|
private func redirectToHostApp(type: RedirectType) {
|
|
let url = URL(string: "ShareMedia://dataUrl=\(sharedKey)#\(type)")
|
|
var responder = self as UIResponder?
|
|
let selectorOpenURL = sel_registerName("openURL:")
|
|
|
|
while (responder != nil) {
|
|
if (responder?.responds(to: selectorOpenURL))! {
|
|
let _ = responder?.perform(selectorOpenURL, with: url)
|
|
}
|
|
responder = responder!.next
|
|
}
|
|
extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
|
|
}
|
|
|
|
enum RedirectType {
|
|
case media
|
|
case text
|
|
case file
|
|
}
|
|
}
|
|
|
|
extension Array {
|
|
subscript (safe index: UInt) -> Element? {
|
|
return Int(index) < count ? self[Int(index)] : nil
|
|
}
|
|
}
|