From f2f3b9eaedbed0b50e721481e148664f6b95556e Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 16 Jul 2018 15:07:25 -0600 Subject: [PATCH 1/3] reload cell after removing unread indicator // FREEBIE --- .../ConversationView/ConversationViewController.m | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 2ec8df7298..fc3a0954f3 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -2605,6 +2605,16 @@ typedef enum : NSUInteger { { OWSAssertIsOnMainThread(); + NSIndexPath *_Nullable indexPathOfUnreadIndicator = [self indexPathOfUnreadMessagesIndicator]; + if (indexPathOfUnreadIndicator) { + ConversationViewItem *oldIndicatorItem = [self viewItemForIndex:indexPathOfUnreadIndicator.row]; + OWSAssert(oldIndicatorItem); + + oldIndicatorItem.unreadIndicator = nil; + + [self.collectionView reloadItemsAtIndexPaths:@[ indexPathOfUnreadIndicator ]]; + } + if (self.hasClearedUnreadMessagesIndicator) { // ensureDynamicInteractionsForThread is somewhat expensive // so we don't want to call it unnecessarily. From 2c3f7db4e455f5633539bdb210be816436998155 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 16 Jul 2018 15:09:50 -0600 Subject: [PATCH 2/3] Only add one 'incoming message' unread indicator per foreground. // FREEBIE --- .../ConversationView/ConversationViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index fc3a0954f3..6f70d7cdb6 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -4922,7 +4922,7 @@ typedef enum : NSUInteger { // unread indicator exists yet on dynamicInteractions. BOOL isItemUnread = ([viewItem.interaction conformsToProtocol:@protocol(OWSReadTracking)] && !((id)viewItem.interaction).wasRead); - if (isItemUnread && !unreadIndicator && !hasPlacedUnreadIndicator) { + if (isItemUnread && !unreadIndicator && !hasPlacedUnreadIndicator && !self.hasClearedUnreadMessagesIndicator) { unreadIndicator = [[OWSUnreadIndicator alloc] initUnreadIndicatorWithTimestamp:viewItem.interaction.timestamp From 567f625902a9163c213911a476685de18e837486 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 16 Jul 2018 15:47:00 -0600 Subject: [PATCH 3/3] touch instead of reload to make sure any adjacent bubbles are updated appropriately. --- .../ConversationView/ConversationViewController.m | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 6f70d7cdb6..e8f04599d4 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -2610,9 +2610,12 @@ typedef enum : NSUInteger { ConversationViewItem *oldIndicatorItem = [self viewItemForIndex:indexPathOfUnreadIndicator.row]; OWSAssert(oldIndicatorItem); - oldIndicatorItem.unreadIndicator = nil; - - [self.collectionView reloadItemsAtIndexPaths:@[ indexPathOfUnreadIndicator ]]; + // TODO ideally this would be happening within the *same* transaction that caused the unreadMessageIndicator + // to be cleared. + [self.editingDatabaseConnection + asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { + [oldIndicatorItem.interaction touchWithTransaction:transaction]; + }]; } if (self.hasClearedUnreadMessagesIndicator) {