From 03a97cdd70666b19aabe5d71db6629af439a8ec6 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 21 Apr 2017 09:56:31 -0400 Subject: [PATCH 1/2] Only the last cell associated with a media adapter should clear its views. // FREEBIE --- .../TSMessageAdapaters/OWSMessageMediaAdapter.h | 6 +++++- .../Models/TSMessageAdapaters/TSAnimatedAdapter.m | 10 ++++++++++ .../TSGenericAttachmentAdapter.m | 10 ++++++++++ .../src/Models/TSMessageAdapaters/TSPhotoAdapter.m | 10 ++++++++++ .../TSMessageAdapaters/TSVideoAttachmentAdapter.m | 10 ++++++++++ .../views/OWSIncomingMessageCollectionViewCell.m | 14 +++++++++++++- .../views/OWSOutgoingMessageCollectionViewCell.m | 14 +++++++++++++- 7 files changed, 71 insertions(+), 3 deletions(-) diff --git a/Signal/src/Models/TSMessageAdapaters/OWSMessageMediaAdapter.h b/Signal/src/Models/TSMessageAdapaters/OWSMessageMediaAdapter.h index b30cb7518..72b06d71b 100644 --- a/Signal/src/Models/TSMessageAdapaters/OWSMessageMediaAdapter.h +++ b/Signal/src/Models/TSMessageAdapaters/OWSMessageMediaAdapter.h @@ -8,7 +8,11 @@ NS_ASSUME_NONNULL_BEGIN - (void)setCellVisible:(BOOL)isVisible; -- (void)clearCachedMediaViews; +// Cells will request that this adapter clear its cached media views, +// but the adapter should only honor requests from the last cell to +// use its views. +- (void)setLastCell:(nullable id)cell; +- (void)clearCachedMediaViewsIfLastCell:(id)cell; @end diff --git a/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m index 8850ed7b0..4d1a3dcb9 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m @@ -21,6 +21,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) TSAttachmentStream *attachment; @property (nonatomic, nullable) AttachmentUploadView *attachmentUploadView; @property (nonatomic) BOOL incoming; +@property (nonatomic, nullable, weak) id lastCell; @end @@ -79,6 +80,15 @@ NS_ASSUME_NONNULL_BEGIN } } +- (void)clearCachedMediaViewsIfLastCell:(id)cell +{ + OWSAssert(cell); + + if (cell == self.lastCell) { + [self clearCachedMediaViews]; + } +} + #pragma mark - JSQMessageMediaData protocol - (UIView *)mediaView { diff --git a/Signal/src/Models/TSMessageAdapaters/TSGenericAttachmentAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSGenericAttachmentAdapter.m index d25fe937d..fccaa9d48 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSGenericAttachmentAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSGenericAttachmentAdapter.m @@ -21,6 +21,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) TSAttachmentStream *attachment; @property (nonatomic, nullable) AttachmentUploadView *attachmentUploadView; @property (nonatomic) BOOL incoming; +@property (nonatomic, nullable, weak) id lastCell; @end @@ -210,6 +211,15 @@ NS_ASSUME_NONNULL_BEGIN // Ignore. } +- (void)clearCachedMediaViewsIfLastCell:(id)cell +{ + OWSAssert(cell); + + if (cell == self.lastCell) { + [self clearCachedMediaViews]; + } +} + @end NS_ASSUME_NONNULL_END diff --git a/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m index a043aad85..5adcb67d7 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m @@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, nullable) UIImageView *cachedImageView; @property (nonatomic, nullable) AttachmentUploadView *attachmentUploadView; @property (nonatomic) BOOL incoming; +@property (nonatomic, nullable, weak) id lastCell; @end @@ -145,6 +146,15 @@ NS_ASSUME_NONNULL_BEGIN // Ignore. } +- (void)clearCachedMediaViewsIfLastCell:(id)cell +{ + OWSAssert(cell); + + if (cell == self.lastCell) { + [self clearCachedMediaViews]; + } +} + @end NS_ASSUME_NONNULL_END diff --git a/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m index 264c55c7a..83ee2add5 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m @@ -30,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, nullable) AttachmentUploadView *attachmentUploadView; @property (nonatomic) BOOL isAudioPlaying; @property (nonatomic) BOOL isPaused; +@property (nonatomic, nullable, weak) id lastCell; @end @@ -294,6 +295,15 @@ NS_ASSUME_NONNULL_BEGIN // Ignore. } +- (void)clearCachedMediaViewsIfLastCell:(id)cell +{ + OWSAssert(cell); + + if (cell == self.lastCell) { + [self clearCachedMediaViews]; + } +} + @end NS_ASSUME_NONNULL_END diff --git a/Signal/src/views/OWSIncomingMessageCollectionViewCell.m b/Signal/src/views/OWSIncomingMessageCollectionViewCell.m index 0ddc7e66d..49ada508b 100644 --- a/Signal/src/views/OWSIncomingMessageCollectionViewCell.m +++ b/Signal/src/views/OWSIncomingMessageCollectionViewCell.m @@ -30,10 +30,22 @@ NS_ASSUME_NONNULL_BEGIN self.expirationTimerViewWidthConstraint.constant = 0.0f; [self.mediaAdapter setCellVisible:NO]; - [self.mediaAdapter clearCachedMediaViews]; + + // Clear this adapter's views IFF this was the last cell to use this adapter. + [self.mediaAdapter clearCachedMediaViewsIfLastCell:self]; + [_mediaAdapter setLastCell:nil]; + self.mediaAdapter = nil; } +- (void)setMediaAdapter:(nullable id)mediaAdapter +{ + _mediaAdapter = mediaAdapter; + + // Mark this as the last cell to use this adapter. + [_mediaAdapter setLastCell:self]; +} + // pragma mark - OWSMessageCollectionViewCell - (void)setCellVisible:(BOOL)isVisible diff --git a/Signal/src/views/OWSOutgoingMessageCollectionViewCell.m b/Signal/src/views/OWSOutgoingMessageCollectionViewCell.m index 934bcabf2..8362a9fc5 100644 --- a/Signal/src/views/OWSOutgoingMessageCollectionViewCell.m +++ b/Signal/src/views/OWSOutgoingMessageCollectionViewCell.m @@ -31,10 +31,22 @@ NS_ASSUME_NONNULL_BEGIN self.expirationTimerViewWidthConstraint.constant = 0.0f; [self.mediaAdapter setCellVisible:NO]; - [self.mediaAdapter clearCachedMediaViews]; + + // Clear this adapter's views IFF this was the last cell to use this adapter. + [self.mediaAdapter clearCachedMediaViewsIfLastCell:self]; + [_mediaAdapter setLastCell:nil]; + self.mediaAdapter = nil; } +- (void)setMediaAdapter:(nullable id)mediaAdapter +{ + _mediaAdapter = mediaAdapter; + + // Mark this as the last cell to use this adapter. + [_mediaAdapter setLastCell:self]; +} + // pragma mark - OWSMessageCollectionViewCell - (void)setCellVisible:(BOOL)isVisible From 210802994e1261eae5556d1c94d6efa5539747ab Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 21 Apr 2017 14:19:30 -0400 Subject: [PATCH 2/2] Respond to CR. // FREEBIE --- .../Models/TSMessageAdapaters/OWSMessageMediaAdapter.h | 4 ++-- Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m | 8 +++++--- .../TSMessageAdapaters/TSGenericAttachmentAdapter.m | 8 +++++--- Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m | 8 +++++--- .../Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m | 8 +++++--- Signal/src/views/OWSIncomingMessageCollectionViewCell.m | 6 +++--- Signal/src/views/OWSOutgoingMessageCollectionViewCell.m | 6 +++--- 7 files changed, 28 insertions(+), 20 deletions(-) diff --git a/Signal/src/Models/TSMessageAdapaters/OWSMessageMediaAdapter.h b/Signal/src/Models/TSMessageAdapaters/OWSMessageMediaAdapter.h index 72b06d71b..8c32a32b1 100644 --- a/Signal/src/Models/TSMessageAdapaters/OWSMessageMediaAdapter.h +++ b/Signal/src/Models/TSMessageAdapaters/OWSMessageMediaAdapter.h @@ -11,8 +11,8 @@ NS_ASSUME_NONNULL_BEGIN // Cells will request that this adapter clear its cached media views, // but the adapter should only honor requests from the last cell to // use its views. -- (void)setLastCell:(nullable id)cell; -- (void)clearCachedMediaViewsIfLastCell:(id)cell; +- (void)setLastPresentingCell:(nullable id)cell; +- (void)clearCachedMediaViewsIfLastPresentingCell:(id)cell; @end diff --git a/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m index 4d1a3dcb9..d1617ce51 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSAnimatedAdapter.m @@ -21,7 +21,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) TSAttachmentStream *attachment; @property (nonatomic, nullable) AttachmentUploadView *attachmentUploadView; @property (nonatomic) BOOL incoming; -@property (nonatomic, nullable, weak) id lastCell; + +// See comments on OWSMessageMediaAdapter. +@property (nonatomic, nullable, weak) id lastPresentingCell; @end @@ -80,11 +82,11 @@ NS_ASSUME_NONNULL_BEGIN } } -- (void)clearCachedMediaViewsIfLastCell:(id)cell +- (void)clearCachedMediaViewsIfLastPresentingCell:(id)cell { OWSAssert(cell); - if (cell == self.lastCell) { + if (cell == self.lastPresentingCell) { [self clearCachedMediaViews]; } } diff --git a/Signal/src/Models/TSMessageAdapaters/TSGenericAttachmentAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSGenericAttachmentAdapter.m index fccaa9d48..3186a1d02 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSGenericAttachmentAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSGenericAttachmentAdapter.m @@ -21,7 +21,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) TSAttachmentStream *attachment; @property (nonatomic, nullable) AttachmentUploadView *attachmentUploadView; @property (nonatomic) BOOL incoming; -@property (nonatomic, nullable, weak) id lastCell; + +// See comments on OWSMessageMediaAdapter. +@property (nonatomic, nullable, weak) id lastPresentingCell; @end @@ -211,11 +213,11 @@ NS_ASSUME_NONNULL_BEGIN // Ignore. } -- (void)clearCachedMediaViewsIfLastCell:(id)cell +- (void)clearCachedMediaViewsIfLastPresentingCell:(id)cell { OWSAssert(cell); - if (cell == self.lastCell) { + if (cell == self.lastPresentingCell) { [self clearCachedMediaViews]; } } diff --git a/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m index 5adcb67d7..48d73ec7d 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSPhotoAdapter.m @@ -16,7 +16,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, nullable) UIImageView *cachedImageView; @property (nonatomic, nullable) AttachmentUploadView *attachmentUploadView; @property (nonatomic) BOOL incoming; -@property (nonatomic, nullable, weak) id lastCell; + +// See comments on OWSMessageMediaAdapter. +@property (nonatomic, nullable, weak) id lastPresentingCell; @end @@ -146,11 +148,11 @@ NS_ASSUME_NONNULL_BEGIN // Ignore. } -- (void)clearCachedMediaViewsIfLastCell:(id)cell +- (void)clearCachedMediaViewsIfLastPresentingCell:(id)cell { OWSAssert(cell); - if (cell == self.lastCell) { + if (cell == self.lastPresentingCell) { [self clearCachedMediaViews]; } } diff --git a/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m b/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m index 83ee2add5..2a97c4e5d 100644 --- a/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m +++ b/Signal/src/Models/TSMessageAdapaters/TSVideoAttachmentAdapter.m @@ -30,7 +30,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, nullable) AttachmentUploadView *attachmentUploadView; @property (nonatomic) BOOL isAudioPlaying; @property (nonatomic) BOOL isPaused; -@property (nonatomic, nullable, weak) id lastCell; + +// See comments on OWSMessageMediaAdapter. +@property (nonatomic, nullable, weak) id lastPresentingCell; @end @@ -295,11 +297,11 @@ NS_ASSUME_NONNULL_BEGIN // Ignore. } -- (void)clearCachedMediaViewsIfLastCell:(id)cell +- (void)clearCachedMediaViewsIfLastPresentingCell:(id)cell { OWSAssert(cell); - if (cell == self.lastCell) { + if (cell == self.lastPresentingCell) { [self clearCachedMediaViews]; } } diff --git a/Signal/src/views/OWSIncomingMessageCollectionViewCell.m b/Signal/src/views/OWSIncomingMessageCollectionViewCell.m index 49ada508b..6d3378980 100644 --- a/Signal/src/views/OWSIncomingMessageCollectionViewCell.m +++ b/Signal/src/views/OWSIncomingMessageCollectionViewCell.m @@ -32,8 +32,8 @@ NS_ASSUME_NONNULL_BEGIN [self.mediaAdapter setCellVisible:NO]; // Clear this adapter's views IFF this was the last cell to use this adapter. - [self.mediaAdapter clearCachedMediaViewsIfLastCell:self]; - [_mediaAdapter setLastCell:nil]; + [self.mediaAdapter clearCachedMediaViewsIfLastPresentingCell:self]; + [_mediaAdapter setLastPresentingCell:nil]; self.mediaAdapter = nil; } @@ -43,7 +43,7 @@ NS_ASSUME_NONNULL_BEGIN _mediaAdapter = mediaAdapter; // Mark this as the last cell to use this adapter. - [_mediaAdapter setLastCell:self]; + [_mediaAdapter setLastPresentingCell:self]; } // pragma mark - OWSMessageCollectionViewCell diff --git a/Signal/src/views/OWSOutgoingMessageCollectionViewCell.m b/Signal/src/views/OWSOutgoingMessageCollectionViewCell.m index 8362a9fc5..186fbabc3 100644 --- a/Signal/src/views/OWSOutgoingMessageCollectionViewCell.m +++ b/Signal/src/views/OWSOutgoingMessageCollectionViewCell.m @@ -33,8 +33,8 @@ NS_ASSUME_NONNULL_BEGIN [self.mediaAdapter setCellVisible:NO]; // Clear this adapter's views IFF this was the last cell to use this adapter. - [self.mediaAdapter clearCachedMediaViewsIfLastCell:self]; - [_mediaAdapter setLastCell:nil]; + [self.mediaAdapter clearCachedMediaViewsIfLastPresentingCell:self]; + [_mediaAdapter setLastPresentingCell:nil]; self.mediaAdapter = nil; } @@ -44,7 +44,7 @@ NS_ASSUME_NONNULL_BEGIN _mediaAdapter = mediaAdapter; // Mark this as the last cell to use this adapter. - [_mediaAdapter setLastCell:self]; + [_mediaAdapter setLastPresentingCell:self]; } // pragma mark - OWSMessageCollectionViewCell