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" #import "MXRoomSummary+Riot.h"
@interface RecentTableViewCell()
{
/**
The observer of the presence for direct user.
*/
id mxDirectUserPresenceObserver;
}
@end
@implementation RecentTableViewCell @implementation RecentTableViewCell
#pragma mark - Class methods #pragma mark - Class methods
@ -48,6 +57,7 @@
self.lastEventDescription.textColor = ThemeService.shared.theme.textSecondaryColor; self.lastEventDescription.textColor = ThemeService.shared.theme.textSecondaryColor;
self.lastEventDate.textColor = ThemeService.shared.theme.textSecondaryColor; self.lastEventDate.textColor = ThemeService.shared.theme.textSecondaryColor;
self.missedNotifAndUnreadBadgeLabel.textColor = ThemeService.shared.theme.baseTextPrimaryColor; self.missedNotifAndUnreadBadgeLabel.textColor = ThemeService.shared.theme.baseTextPrimaryColor;
self.presenceIndicatorView.borderColor = ThemeService.shared.theme.backgroundColor;
self.roomAvatar.defaultBackgroundColor = [UIColor clearColor]; self.roomAvatar.defaultBackgroundColor = [UIColor clearColor];
} }
@ -129,10 +139,24 @@
displayName:roomCellData.roomDisplayname displayName:roomCellData.roomDisplayname
mediaManager:roomCellData.mxSession.mediaManager]; mediaManager:roomCellData.mxSession.mediaManager];
// Presence indicator if (!mxDirectUserPresenceObserver && roomCellData.directUserId)
self.presenceIndicatorView.borderColor = ThemeService.shared.theme.backgroundColor; {
self.presenceIndicatorView.presence = roomCellData.presence; // Observe contact presence change
self.presenceIndicatorView.hidden = roomCellData.presence == MXPresenceUnknown; 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 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 + (CGFloat)heightForCellData:(MXKCellData *)cellData withMaximumWidth:(CGFloat)maxWidth
{ {
// The height is fixed // The height is fixed

View file

@ -26,6 +26,15 @@
#import "MXTools.h" #import "MXTools.h"
@interface RoomCollectionViewCell()
{
/**
The observer of the presence for direct user.
*/
id mxDirectUserPresenceObserver;
}
@end
@implementation RoomCollectionViewCell @implementation RoomCollectionViewCell
#pragma mark - Class methods #pragma mark - Class methods
@ -147,10 +156,31 @@
displayName:roomCellData.roomDisplayname displayName:roomCellData.roomDisplayname
mediaManager:roomCellData.mxSession.mediaManager]; mediaManager:roomCellData.mxSession.mediaManager];
// Presence indicator if (!mxDirectUserPresenceObserver && roomCellData.directUserId)
self.presenceIndicatorView.presence = roomCellData.presence; {
self.presenceIndicatorView.hidden = roomCellData.presence == MXPresenceUnknown; // 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 - (MXKCellData*)renderedCellData

View file

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

View file

@ -44,6 +44,7 @@
@property (nonatomic, readonly) NSString *roomIdentifier; @property (nonatomic, readonly) NSString *roomIdentifier;
@property (nonatomic, readonly) NSString *roomDisplayname; @property (nonatomic, readonly) NSString *roomDisplayname;
@property (nonatomic, readonly) NSString *avatarUrl; @property (nonatomic, readonly) NSString *avatarUrl;
@property (nonatomic, readonly) NSString *directUserId;
@property (nonatomic, readonly) MXPresence presence; @property (nonatomic, readonly) MXPresence presence;
@property (nonatomic, readonly) NSString *lastEventTextMessage; @property (nonatomic, readonly) NSString *lastEventTextMessage;
@property (nonatomic, readonly) NSString *lastEventDate; @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