|
@@ -1,5 +1,6 @@
|
|
|
import UIKit
|
|
|
import DcCore
|
|
|
+import LinkPresentation
|
|
|
|
|
|
class DocumentGalleryController: UIViewController {
|
|
|
|
|
@@ -41,9 +42,16 @@ class DocumentGalleryController: UIViewController {
|
|
|
self?.redirectToMessage(of: indexPath)
|
|
|
}
|
|
|
)
|
|
|
+ let shareItem = ContextMenuProvider.ContextMenuItem(
|
|
|
+ title: String.localized("menu_share"),
|
|
|
+ imageName: "square.and.arrow.up",
|
|
|
+ action: #selector(DocumentGalleryFileCell.share(_:)), onPerform: { [weak self] indexPath in
|
|
|
+ self?.shareAttachment(of: indexPath)
|
|
|
+ }
|
|
|
+ )
|
|
|
|
|
|
let menu = ContextMenuProvider()
|
|
|
- menu.setMenu([showInChatItem, deleteItem])
|
|
|
+ menu.setMenu([showInChatItem, shareItem, deleteItem])
|
|
|
return menu
|
|
|
}()
|
|
|
|
|
@@ -110,6 +118,11 @@ class DocumentGalleryController: UIViewController {
|
|
|
self.dcContext.deleteMessage(msgId: msgId)
|
|
|
self.tableView.deleteRows(at: [indexPath], with: .automatic)
|
|
|
}
|
|
|
+
|
|
|
+ func showWebxdcViewFor(message: DcMsg) {
|
|
|
+ let webxdcViewController = WebxdcViewController(dcContext: dcContext, messageId: message.id)
|
|
|
+ navigationController?.pushViewController(webxdcViewController, animated: true)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// MARK: - UITableViewDelegate, UITableViewDataSource
|
|
@@ -130,7 +143,12 @@ extension DocumentGalleryController: UITableViewDelegate, UITableViewDataSource
|
|
|
|
|
|
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
|
|
let msgId = fileMessageIds[indexPath.row]
|
|
|
- showPreview(msgId: msgId)
|
|
|
+ let message = dcContext.getMessage(id: msgId)
|
|
|
+ if message.type == DC_MSG_WEBXDC {
|
|
|
+ showWebxdcViewFor(message: message)
|
|
|
+ } else {
|
|
|
+ showPreview(msgId: msgId)
|
|
|
+ }
|
|
|
tableView.deselectRow(at: indexPath, animated: false)
|
|
|
}
|
|
|
|
|
@@ -180,4 +198,66 @@ extension DocumentGalleryController {
|
|
|
appDelegate.appCoordinator.showChat(chatId: chatId, msgId: msgId, animated: false, clearViewControllerStack: true)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ func shareAttachment(of indexPath: IndexPath) {
|
|
|
+ let msgId = fileMessageIds[indexPath.row]
|
|
|
+ let message = dcContext.getMessage(id: msgId)
|
|
|
+ let activityVC: UIActivityViewController
|
|
|
+ guard let fileURL = message.fileURL else { return }
|
|
|
+ let objectsToShare: [Any]
|
|
|
+ if message.type == DC_MSG_WEBXDC {
|
|
|
+ let dict = message.getWebxdcInfoDict()
|
|
|
+ var previewImage: UIImage?
|
|
|
+ if let iconfilePath = dict["icon"] as? String {
|
|
|
+ let blob = message.getWebxdcBlob(filename: iconfilePath)
|
|
|
+ if !blob.isEmpty {
|
|
|
+ previewImage = UIImage(data: blob)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ let previewText = dict["name"] as? String ?? fileURL.lastPathComponent
|
|
|
+ objectsToShare = [WebxdcItemSource(title: previewText,
|
|
|
+ previewImage: previewImage,
|
|
|
+ url: fileURL)]
|
|
|
+ } else {
|
|
|
+ objectsToShare = [fileURL]
|
|
|
+ }
|
|
|
+
|
|
|
+ activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
|
|
|
+ activityVC.excludedActivityTypes = [.copyToPasteboard]
|
|
|
+ activityVC.popoverPresentationController?.sourceView = self.view
|
|
|
+ self.present(activityVC, animated: true, completion: nil)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class WebxdcItemSource: NSObject, UIActivityItemSource {
|
|
|
+ var title: String
|
|
|
+ var url: URL
|
|
|
+ var previewImage: UIImage?
|
|
|
+
|
|
|
+ init(title: String, previewImage: UIImage?, url: URL) {
|
|
|
+ self.title = title
|
|
|
+ self.url = url
|
|
|
+ self.previewImage = previewImage
|
|
|
+ super.init()
|
|
|
+ }
|
|
|
+
|
|
|
+ func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
|
|
|
+ return title
|
|
|
+ }
|
|
|
+
|
|
|
+ func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
|
|
|
+ return url
|
|
|
+ }
|
|
|
+
|
|
|
+ @available(iOS 13.0, *)
|
|
|
+ func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
|
|
|
+ let metadata = LPLinkMetadata()
|
|
|
+ metadata.title = title
|
|
|
+ if let previewImage = previewImage {
|
|
|
+ metadata.iconProvider = NSItemProvider(object: previewImage)
|
|
|
+ }
|
|
|
+ metadata.originalURL = url
|
|
|
+ return metadata
|
|
|
+ }
|
|
|
}
|