瀏覽代碼

integrated async loading to videoTextCells

nayooti 5 年之前
父節點
當前提交
18df777b15

+ 6 - 5
deltachat-ios/DC/DcMsg+Extension.swift

@@ -48,18 +48,19 @@ extension DcMsg: MessageType {
     }
 
     internal func createVideoMessage(text: String) -> MessageKind {
+        var thumbnail: UIImage?
+        if let fileURL = fileURL {
+            thumbnail = ThumbnailCache.shared.restoreImage(key: fileURL.absoluteString)
+        }
         if text.isEmpty {
-            var thumbnail: UIImage?
-            if let fileURL = fileURL {
-                thumbnail = ThumbnailCache.shared.restoreImage(key: fileURL.absoluteString)
-            }
+
             return MessageKind.video(Media(url: fileURL, image: thumbnail))
         }
         let attributedString = NSAttributedString(string: text, attributes: [
             NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .body),
             NSAttributedString.Key.foregroundColor: DcColors.defaultTextColor]
         )
-        return MessageKind.videoText(Media(url: fileURL, text: [attributedString]))
+        return MessageKind.videoText(Media(url: fileURL, image: thumbnail, text: [attributedString]))
     }
 
     internal func createImageMessage(text: String) -> MessageKind {

+ 10 - 1
deltachat-ios/MessageKit/Layout/TextMediaMessageSizeCalculator.swift

@@ -81,13 +81,22 @@ open class TextMediaMessageSizeCalculator: MessageSizeCalculator {
 
             var messageContainerSize = CGSize(width: imageWidth, height: imageHeight)
             switch message.kind {
-            case .photoText(let mediaItem), .videoText(let mediaItem), .animatedImageText(let mediaItem):
+            case .photoText(let mediaItem), .animatedImageText(let mediaItem):
                 if let text = mediaItem.text?[MediaItemConstants.messageText] {
                     let textHeight = text.height(withConstrainedWidth: maxTextWidth)
                     messageContainerSize.height += textHeight
                     messageContainerSize.height +=  self.messageLabelInsets(for: message).vertical
                 }
                 return messageContainerSize
+            case .videoText(let mediaItem):
+                var videoContainerSize = CGSize(width: self.minTextWidth, height: self.minTextWidth)
+                if let text = mediaItem.text?[MediaItemConstants.messageText] {
+                    let textHeight = text.height(withConstrainedWidth: maxTextWidth)
+                    // static size for thumbnails
+                    videoContainerSize.height += textHeight
+                    videoContainerSize.height += self.messageLabelInsets(for: message).vertical
+                }
+                return videoContainerSize
             default:
                 return messageContainerSize
             }

+ 27 - 2
deltachat-ios/MessageKit/Views/Cells/TextMediaMessageCell.swift

@@ -106,14 +106,36 @@ open class TextMediaMessageCell: MessageContentCell {
         }
 
         switch message.kind {
-        case .photoText(let mediaItem), .videoText(let mediaItem), .fileText(let mediaItem):
+        case .photoText(let mediaItem), .fileText(let mediaItem):
             configureImageView(for: mediaItem)
             configureMessageLabel(for: mediaItem,
                                   with: displayDelegate,
                                   message: message,
                                   at: indexPath,
                                   in: messagesCollectionView)
-
+        case .videoText(let mediaItem):
+            configureMessageLabel(
+                for: mediaItem,
+                with: displayDelegate,
+                message: message,
+                at: indexPath,
+                in: messagesCollectionView
+            )
+            if let url = mediaItem.url {
+                if let image = mediaItem.image {
+                    imageView.image = image
+                } else {
+                    // no image in cache
+                    imageView.loadVideoThumbnail(from: url, placeholderImage: mediaItem.placeholderImage, completionHandler: { [weak self] thumbnail in
+                            if let image = thumbnail {
+                                self?.cache(thumbnail: image, key: url.absoluteString)
+                            }
+                        }
+                    )
+                }
+            } else {
+                imageView.image = mediaItem.placeholderImage
+            }
         default:
             fatalError("Unexpected message kind in TextMediaMessageCell")
         }
@@ -124,6 +146,9 @@ open class TextMediaMessageCell: MessageContentCell {
         displayDelegate.configureMediaMessageImageView(imageView, for: message, at: indexPath, in: messagesCollectionView)
     }
 
+    private func cache(thumbnail image: UIImage, key: String) {
+        ThumbnailCache.shared.storeImage(image: image, key: key)
+    }
 
     private func configurePlayButtonView(for messageKind: MessageKind) {
         switch messageKind {