瀏覽代碼

Merge pull request #953 from deltachat/preview-fix

Preview fix
cyBerta 4 年之前
父節點
當前提交
3af61cf02c

+ 6 - 10
deltachat-ios/Chat/ChatViewControllerNew.swift

@@ -805,8 +805,8 @@ class ChatViewControllerNew: UITableViewController {
         mediaPicker?.showPhotoVideoLibrary()
     }
 
-    private func showMediaGallery(currentIndex: Int, mediaUrls urls: [URL]) {
-        let betterPreviewController = PreviewController(currentIndex: currentIndex, urls: urls)
+    private func showMediaGallery(currentIndex: Int, msgIds: [Int]) {
+        let betterPreviewController = PreviewController(type: .multi(msgIds, currentIndex))
         let nav = UINavigationController(rootViewController: betterPreviewController)
         nav.modalPresentationStyle = .fullScreen
         navigationController?.present(nav, animated: true)
@@ -1012,14 +1012,10 @@ class ChatViewControllerNew: UITableViewController {
     }
 
     func showMediaGalleryFor(message: DcMsg) {
-        if let url = message.fileURL {
-            // find all other messages with same message type
-            let previousUrls: [URL] = message.previousMediaURLs()
-            let nextUrls: [URL] = message.nextMediaURLs()
-            // these are the files user will be able to swipe trough
-            let mediaUrls: [URL] = previousUrls + [url] + nextUrls
-            showMediaGallery(currentIndex: previousUrls.count, mediaUrls: mediaUrls)
-        }
+
+        let msgIds = dcContext.getChatMedia(chatId: chatId, messageType: Int32(message.type), messageType2: 0, messageType3: 0)
+        let index = msgIds.firstIndex(of: message.id) ?? 0
+        showMediaGallery(currentIndex: index, msgIds: msgIds)
     }
 
     private func didTapAsm(msg: DcMsg, orgText: String) {

+ 6 - 10
deltachat-ios/Controller/ChatViewController.swift

@@ -749,8 +749,8 @@ class ChatViewController: MessagesViewController {
         mediaPicker?.showPhotoVideoLibrary()
     }
 
-    private func showMediaGallery(currentIndex: Int, mediaUrls urls: [URL]) {
-        let betterPreviewController = PreviewController(currentIndex: currentIndex, urls: urls)
+    private func showMediaGallery(currentIndex: Int, msgIds: [Int]) {
+        let betterPreviewController = PreviewController(type: .multi(msgIds, currentIndex))
         let nav = UINavigationController(rootViewController: betterPreviewController)
         nav.modalPresentationStyle = .fullScreen
         navigationController?.present(nav, animated: true)
@@ -1310,14 +1310,10 @@ extension ChatViewController: MessageCellDelegate {
             let message = messageList[indexPath.section]
             if message.isSetupMessage {
                 didTapAsm(msg: message, orgText: "")
-            } else if let url = message.fileURL {
-                // find all other messages with same message type
-                let previousUrls: [URL] = message.previousMediaURLs()
-                let nextUrls: [URL] = message.nextMediaURLs()
-
-                // these are the files user will be able to swipe trough
-                let mediaUrls: [URL] = previousUrls + [url] + nextUrls
-                showMediaGallery(currentIndex: previousUrls.count, mediaUrls: mediaUrls)
+            } else {
+                let msgIds = dcContext.getChatMedia(chatId: chatId, messageType: Int32(message.type), messageType2: 0, messageType3: 0)
+                let index = msgIds.firstIndex(of: message.id) ?? 0
+                showMediaGallery(currentIndex: index, msgIds: msgIds)
             }
         }
     }

+ 1 - 1
deltachat-ios/Controller/ContactDetailViewController.swift

@@ -395,7 +395,7 @@ class ContactDetailViewController: UITableViewController {
     private func showContactAvatarIfNeeded() {
         let contact = viewModel.contact
         if let url =  contact.profileImageURL {
-            let previewController = PreviewController(currentIndex: 0, urls: [url])
+            let previewController = PreviewController(type: .single(url))
             previewController.customTitle = contact.displayName
             present(previewController, animated: true, completion: nil)
         }

+ 1 - 5
deltachat-ios/Controller/DocumentGalleryController.swift

@@ -87,11 +87,7 @@ extension DocumentGalleryController {
         guard let index = fileMessageIds.index(of: msgId) else {
             return
         }
-
-        let mediaUrls = fileMessageIds.compactMap {
-            return DcMsg(id: $0).fileURL
-        }
-        let previewController = PreviewController(currentIndex: index, urls: mediaUrls)
+        let previewController = PreviewController(type: .multi(fileMessageIds, index))
         present(previewController, animated: true, completion: nil)
     }
 }

+ 1 - 5
deltachat-ios/Controller/GalleryViewController.swift

@@ -210,11 +210,7 @@ extension GalleryViewController {
         guard let index = mediaMessageIds.index(of: msgId) else {
             return
         }
-
-        let mediaUrls = mediaMessageIds.compactMap {
-            return DcMsg(id: $0).fileURL
-        }
-        let previewController = PreviewController(currentIndex: index, urls: mediaUrls)
+        let previewController = PreviewController(type: .multi(mediaMessageIds, index))
         present(previewController, animated: true, completion: nil)
     }
 }

+ 1 - 1
deltachat-ios/Controller/GroupChatDetailViewController.swift

@@ -326,7 +326,7 @@ class GroupChatDetailViewController: UIViewController {
 
     private func showGroupAvatarIfNeeded() {
         if let url = chat.profileImageURL {
-            let previewController = PreviewController(currentIndex: 0, urls: [url])
+            let previewController = PreviewController(type: .single(url))
             previewController.customTitle = self.title
             present(previewController, animated: true, completion: nil)
         }

+ 28 - 7
deltachat-ios/Controller/PreviewController.swift

@@ -1,9 +1,14 @@
 import QuickLook
 import UIKit
+import DcCore
 
 class PreviewController: QLPreviewController {
+    enum PreviewType {
+        case single(URL)
+        case multi([Int], Int) // msgIds, index
+    }
 
-    var urls: [URL]
+    let previewType: PreviewType
 
     var customTitle: String?
 
@@ -12,11 +17,16 @@ class PreviewController: QLPreviewController {
         return button
     }()
 
-    init(currentIndex: Int, urls: [URL]) {
-        self.urls = urls
+    init(type: PreviewType) {
+        self.previewType = type
         super.init(nibName: nil, bundle: nil)
         dataSource = self
-        currentPreviewItemIndex = currentIndex
+        switch type {
+        case .multi(_,let currentIndex):
+            currentPreviewItemIndex = currentIndex
+        case .single:
+            currentPreviewItemIndex = 0
+        }
     }
 
     required init?(coder: NSCoder) {
@@ -41,11 +51,22 @@ class PreviewController: QLPreviewController {
 extension PreviewController: QLPreviewControllerDataSource {
 
     func numberOfPreviewItems(in _: QLPreviewController) -> Int {
-        return urls.count
+        switch previewType {
+        case .single:
+            return 1
+        case .multi(let msgIds, _):
+            return msgIds.count
+        }
     }
 
     func previewController(_: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
-        return PreviewItem(url: urls[index], title: self.customTitle)
+        switch previewType {
+        case .single(let url):
+            return PreviewItem(url: url, title: self.customTitle)
+        case .multi(let msgIds, _):
+            let msg = DcMsg(id: msgIds[index])
+            return PreviewItem(url: msg.fileURL, title: self.customTitle)
+        }
     }
 }
 
@@ -54,7 +75,7 @@ class PreviewItem: NSObject, QLPreviewItem {
     var previewItemURL: URL?
     var previewItemTitle: String?
 
-    init(url: URL, title: String?) {
+    init(url: URL?, title: String?) {
         self.previewItemURL = url
         self.previewItemTitle = title ?? ""
     }