Browse Source

trigger message reload on content did load

nayooti 5 years ago
parent
commit
13d42d05f6

+ 7 - 0
deltachat-ios/Controller/ChatViewController.swift

@@ -561,6 +561,7 @@ class ChatViewController: MessagesViewController {
         case .photo, .video:
             let cell = messagesCollectionView.dequeueReusableCell(MediaMessageCell.self, for: indexPath)
             cell.configure(with: message, at: indexPath, and: messagesCollectionView)
+            cell.asyncDelegate = self
             return cell
         case .photoText, .videoText:
             let cell = messagesCollectionView.dequeueReusableCell(TextMediaMessageCell.self, for: indexPath)
@@ -1504,3 +1505,9 @@ extension MessageCollectionViewCell {
         }
     }
 }
+
+extension ChatViewController: AsyncContentLoadDelegate {
+    func contentDidLoad() {
+        messagesCollectionView.reloadData()
+    }
+}

+ 8 - 2
deltachat-ios/MessageKit/Layout/MediaMessageSizeCalculator.swift

@@ -53,8 +53,14 @@ open class MediaMessageSizeCalculator: MessageSizeCalculator {
         switch message.kind {
         case .photo(let item):
             return sizeForMediaItem(maxWidth, item)
-        case .video:
-            return CGSize(width: maxWidth, height: maxWidth)
+        case .video(let item):
+            // return CGSize(width: maxWidth, height: defaultHeight)
+            if item.image == nil {
+                // no cached thumbnail -> is generated asynchronously
+                return CGSize(width: maxWidth, height: defaultHeight)
+            } else {
+                return sizeForMediaItem(maxWidth, item)
+            }
         default:
             fatalError("messageContainerSize received unhandled MessageDataType: \(message.kind)")
         }

+ 8 - 0
deltachat-ios/MessageKit/Views/Cells/MediaMessageCell.swift

@@ -22,11 +22,17 @@
  SOFTWARE.
  */
 
+protocol AsyncContentLoadDelegate: class {
+    func contentDidLoad()
+}
+
 import UIKit
 
 /// A subclass of `MessageContentCell` used to display video and audio messages.
 open class MediaMessageCell: MessageContentCell {
 
+    weak var asyncDelegate: AsyncContentLoadDelegate?
+
     /// The play button view to display on video messages.
     open lazy var playButtonView: PlayButtonView = {
         let playButtonView = PlayButtonView()
@@ -60,6 +66,7 @@ open class MediaMessageCell: MessageContentCell {
     open override func prepareForReuse() {
         super.prepareForReuse()
         self.imageView.image = nil
+        self.asyncDelegate = nil
     }
 
     open override func configure(with message: MessageType, at indexPath: IndexPath, and messagesCollectionView: MessagesCollectionView) {
@@ -82,6 +89,7 @@ open class MediaMessageCell: MessageContentCell {
                     imageView.loadVideoThumbnail(from: url, placeholderImage: mediaItem.placeholderImage, completionHandler: { [weak self] thumbnail in
                         if let image = thumbnail {
                             self?.cache(thumbnail: image, key: url.absoluteString)
+                            self?.asyncDelegate?.contentDidLoad()
                         }
                     })
                 }