diff --git a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h index 20f83a0a6..0986a688c 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h +++ b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h @@ -54,9 +54,15 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, nullable) ConversationViewItem *viewItem; +// Cells are prefetched but expensive cells (e.g. media) should only load +// when visible and unload when no longer visible. Non-visible cells can +// cache their contents on their ConversationViewItem, but that cache may +// be evacuated before the cell becomes visible again. @property (nonatomic) BOOL isCellVisible; -- (void)loadForDisplay:(int)contentWidth; +@property (nonatomic) int contentWidth; + +- (void)loadForDisplay; - (CGSize)cellSizeForViewWidth:(int)viewWidth contentWidth:(int)contentWidth; diff --git a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.m b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.m index a168467bc..ea9852c0a 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.m @@ -16,9 +16,10 @@ NS_ASSUME_NONNULL_BEGIN self.viewItem = nil; self.delegate = nil; self.isCellVisible = NO; + self.contentWidth = 0; } -- (void)loadForDisplay:(int)contentWidth +- (void)loadForDisplay { OWSFail(@"%@ This method should be overridden.", self.logTag); } diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSContactOffersCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSContactOffersCell.m index 5dcd6171e..dfc21c6f1 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSContactOffersCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSContactOffersCell.m @@ -87,7 +87,7 @@ NS_ASSUME_NONNULL_BEGIN return NSStringFromClass([self class]); } -- (void)loadForDisplay:(int)contentWidth +- (void)loadForDisplay { OWSAssert(self.viewItem); OWSAssert([self.viewItem.interaction isKindOfClass:[OWSContactOffersInteraction class]]); diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index 739b55c30..a2fcaa804 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -207,7 +207,7 @@ NS_ASSUME_NONNULL_BEGIN return (TSMessage *)self.viewItem.interaction; } -- (void)loadForDisplay:(int)contentWidth +- (void)loadForDisplay { OWSAssert(self.viewItem); OWSAssert(self.viewItem.interaction); @@ -220,7 +220,7 @@ NS_ASSUME_NONNULL_BEGIN = isIncoming ? [self.bubbleFactory incoming] : [self.bubbleFactory outgoing]; self.bubbleImageView.image = bubbleImageData.messageBubbleImage; - [self updateDateHeader:contentWidth]; + [self updateDateHeader]; [self updateFooter]; switch (self.cellType) { @@ -263,8 +263,10 @@ NS_ASSUME_NONNULL_BEGIN // }); } -- (void)updateDateHeader:(int)contentWidth +- (void)updateDateHeader { + OWSAssert(self.contentWidth > 0); + static NSDateFormatter *dateHeaderDateFormatter = nil; static NSDateFormatter *dateHeaderTimeFormatter = nil; static dispatch_once_t onceToken; @@ -312,7 +314,7 @@ NS_ASSUME_NONNULL_BEGIN self.dateHeaderConstraints = @[ // Date headers should be visually centered within the conversation view, // so they need to extend outside the cell's boundaries. - [self.dateHeaderLabel autoSetDimension:ALDimensionWidth toSize:contentWidth], + [self.dateHeaderLabel autoSetDimension:ALDimensionWidth toSize:self.contentWidth], (self.isIncoming ? [self.dateHeaderLabel autoPinEdgeToSuperviewEdge:ALEdgeLeading] : [self.dateHeaderLabel autoPinEdgeToSuperviewEdge:ALEdgeTrailing]), [self.dateHeaderLabel autoPinEdgeToSuperviewEdge:ALEdgeTop], diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.m index f0a1cdc68..9b811758f 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.m @@ -85,7 +85,7 @@ NS_ASSUME_NONNULL_BEGIN return NSStringFromClass([self class]); } -- (void)loadForDisplay:(int)contentWidth +- (void)loadForDisplay { OWSAssert(self.viewItem); diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSUnreadIndicatorCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSUnreadIndicatorCell.m index b078d2966..e97d32e08 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSUnreadIndicatorCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSUnreadIndicatorCell.m @@ -84,7 +84,7 @@ NS_ASSUME_NONNULL_BEGIN return NSStringFromClass([self class]); } -- (void)loadForDisplay:(int)contentWidth +- (void)loadForDisplay { OWSAssert(self.viewItem); OWSAssert([self.viewItem.interaction isKindOfClass:[TSUnreadIndicatorInteraction class]]); diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 591a21694..502dbbaec 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -4025,8 +4025,9 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { } cell.viewItem = viewItem; cell.delegate = self; + cell.contentWidth = self.layout.contentWidth; - [cell loadForDisplay:self.layout.contentWidth]; + [cell loadForDisplay]; return cell; }