From 6cc5433ac47cd29aa185f15f985bb37e46c1348c Mon Sep 17 00:00:00 2001 From: aringenbach Date: Wed, 11 May 2022 15:05:56 +0200 Subject: [PATCH] Presence: fix live updates on Home & DM list --- .../Recents/Views/RecentTableViewCell.m | 40 ++++++++++++++++--- .../Home/Views/RoomCollectionViewCell.m | 38 ++++++++++++++++-- .../Models/RoomList/MXKRecentCellData.m | 5 +++ .../RoomList/MXKRecentCellDataStoring.h | 1 + changelog.d/6144.bugfix | 1 + 5 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 changelog.d/6144.bugfix diff --git a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m index 4ab4b68bc..e60a2f3b4 100644 --- a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m +++ b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m @@ -27,6 +27,15 @@ #import "MXRoomSummary+Riot.h" +@interface RecentTableViewCell() +{ + /** + The observer of the presence for direct user. + */ + id mxDirectUserPresenceObserver; +} +@end + @implementation RecentTableViewCell #pragma mark - Class methods @@ -48,6 +57,7 @@ self.lastEventDescription.textColor = ThemeService.shared.theme.textSecondaryColor; self.lastEventDate.textColor = ThemeService.shared.theme.textSecondaryColor; self.missedNotifAndUnreadBadgeLabel.textColor = ThemeService.shared.theme.baseTextPrimaryColor; + self.presenceIndicatorView.borderColor = ThemeService.shared.theme.backgroundColor; self.roomAvatar.defaultBackgroundColor = [UIColor clearColor]; } @@ -128,11 +138,25 @@ roomId:roomCellData.roomIdentifier displayName:roomCellData.roomDisplayname mediaManager:roomCellData.mxSession.mediaManager]; - - // Presence indicator - self.presenceIndicatorView.borderColor = ThemeService.shared.theme.backgroundColor; - self.presenceIndicatorView.presence = roomCellData.presence; - self.presenceIndicatorView.hidden = roomCellData.presence == MXPresenceUnknown; + + if (!mxDirectUserPresenceObserver && roomCellData.directUserId) + { + // Observe contact presence change + MXWeakify(self); + mxDirectUserPresenceObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXKContactManagerMatrixUserPresenceChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) { + MXStrongifyAndReturnIfNil(self); + + NSString* directUserId = self->roomCellData.directUserId; + + if (directUserId && [directUserId isEqualToString:notif.object]) + { + MXPresence presence = [MXTools presence:[notif.userInfo objectForKey:kMXKContactManagerMatrixPresenceKey]]; + [self refreshContactPresence:presence]; + } + }]; + + [self refreshContactPresence:roomCellData.presence]; + } } else { @@ -140,6 +164,12 @@ } } +- (void)refreshContactPresence:(MXPresence)presence +{ + self.presenceIndicatorView.presence = presence; + self.presenceIndicatorView.hidden = presence == MXPresenceUnknown; +} + + (CGFloat)heightForCellData:(MXKCellData *)cellData withMaximumWidth:(CGFloat)maxWidth { // The height is fixed diff --git a/Riot/Modules/Home/Views/RoomCollectionViewCell.m b/Riot/Modules/Home/Views/RoomCollectionViewCell.m index 550aa8ce1..439a82628 100644 --- a/Riot/Modules/Home/Views/RoomCollectionViewCell.m +++ b/Riot/Modules/Home/Views/RoomCollectionViewCell.m @@ -26,6 +26,15 @@ #import "MXTools.h" +@interface RoomCollectionViewCell() +{ + /** + The observer of the presence for direct user. + */ + id mxDirectUserPresenceObserver; +} +@end + @implementation RoomCollectionViewCell #pragma mark - Class methods @@ -146,13 +155,34 @@ roomId:roomCellData.roomIdentifier displayName:roomCellData.roomDisplayname mediaManager:roomCellData.mxSession.mediaManager]; - - // Presence indicator - self.presenceIndicatorView.presence = roomCellData.presence; - self.presenceIndicatorView.hidden = roomCellData.presence == MXPresenceUnknown; + + if (!mxDirectUserPresenceObserver && roomCellData.directUserId) + { + // Observe contact presence change + MXWeakify(self); + mxDirectUserPresenceObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXKContactManagerMatrixUserPresenceChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) { + MXStrongifyAndReturnIfNil(self); + + NSString* directUserId = self->roomCellData.directUserId; + + if (directUserId && [directUserId isEqualToString:notif.object]) + { + MXPresence presence = [MXTools presence:[notif.userInfo objectForKey:kMXKContactManagerMatrixPresenceKey]]; + [self refreshContactPresence:presence]; + } + }]; + + [self refreshContactPresence:roomCellData.presence]; + } } } +- (void)refreshContactPresence:(MXPresence)presence +{ + self.presenceIndicatorView.presence = presence; + self.presenceIndicatorView.hidden = presence == MXPresenceUnknown; +} + - (MXKCellData*)renderedCellData { return roomCellData; diff --git a/Riot/Modules/MatrixKit/Models/RoomList/MXKRecentCellData.m b/Riot/Modules/MatrixKit/Models/RoomList/MXKRecentCellData.m index 96842e5b2..958e316fa 100644 --- a/Riot/Modules/MatrixKit/Models/RoomList/MXKRecentCellData.m +++ b/Riot/Modules/MatrixKit/Models/RoomList/MXKRecentCellData.m @@ -93,6 +93,11 @@ return roomSummary.avatar; } +- (NSString *)directUserId +{ + return self.roomSummary.directUserId; +} + - (MXPresence)presence { if (self.roomSummary.isDirect) diff --git a/Riot/Modules/MatrixKit/Models/RoomList/MXKRecentCellDataStoring.h b/Riot/Modules/MatrixKit/Models/RoomList/MXKRecentCellDataStoring.h index 1bc6a3d42..7185ae4eb 100644 --- a/Riot/Modules/MatrixKit/Models/RoomList/MXKRecentCellDataStoring.h +++ b/Riot/Modules/MatrixKit/Models/RoomList/MXKRecentCellDataStoring.h @@ -44,6 +44,7 @@ @property (nonatomic, readonly) NSString *roomIdentifier; @property (nonatomic, readonly) NSString *roomDisplayname; @property (nonatomic, readonly) NSString *avatarUrl; +@property (nonatomic, readonly) NSString *directUserId; @property (nonatomic, readonly) MXPresence presence; @property (nonatomic, readonly) NSString *lastEventTextMessage; @property (nonatomic, readonly) NSString *lastEventDate; diff --git a/changelog.d/6144.bugfix b/changelog.d/6144.bugfix new file mode 100644 index 000000000..1bcc33992 --- /dev/null +++ b/changelog.d/6144.bugfix @@ -0,0 +1 @@ +Presence: fix live updates on Home & DM list