Presence: fix live updates on Home & DM list

This commit is contained in:
aringenbach 2022-05-11 15:05:56 +02:00
parent 835cddab01
commit 6cc5433ac4
5 changed files with 76 additions and 9 deletions

View file

@ -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

View file

@ -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;

View file

@ -93,6 +93,11 @@
return roomSummary.avatar;
}
- (NSString *)directUserId
{
return self.roomSummary.directUserId;
}
- (MXPresence)presence
{
if (self.roomSummary.isDirect)

View file

@ -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;

1
changelog.d/6144.bugfix Normal file
View file

@ -0,0 +1 @@
Presence: fix live updates on Home & DM list