Add observer to refresh RoomTitleView on presence updates

This commit is contained in:
aringenbach
2022-04-04 16:50:14 +02:00
parent 967b4429f5
commit 4c38d89f55
+53 -20
View File
@@ -20,6 +20,15 @@
#import "ThemeService.h"
#import "GeneratedInterface-Swift.h"
@interface RoomTitleView()
{
/**
The observer of the presence for direct user.
*/
id mxDirectUserPresenceObserver;
}
@end
@implementation RoomTitleView
+ (UINib *)nib
@@ -109,6 +118,22 @@
}
else if (self.mxRoom)
{
if (!mxDirectUserPresenceObserver && self.mxRoom.isDirect)
{
// Observe contact presence change
mxDirectUserPresenceObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXKContactManagerMatrixUserPresenceChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
NSString* directUserId = self.mxRoom.directUserId;
if (directUserId && [directUserId isEqualToString:notif.object])
{
[self refreshContactPresence];
}
}];
[self refreshContactPresence];
}
self.displayNameTextField.text = self.mxRoom.summary.displayname;
if (!self.displayNameTextField.text.length)
{
@@ -119,26 +144,29 @@
{
self.displayNameTextField.textColor = ThemeService.shared.theme.textPrimaryColor;
}
MXUser *contact = [self.mxRoom.mxSession userWithUserId:self.mxRoom.directUserId];
BOOL presenceHidden = contact.presence == MXPresenceUnknown;
self.presenceIndicatorView.hidden = presenceHidden;
self.presenceIndicatorView.borderColor = ThemeService.shared.theme.headerBackgroundColor;
self.presenceIndicatorView.presence = contact.presence;
if (presenceHidden)
{
[self.badgeImageViewLeadingToPictureViewConstraint setPriority:UILayoutPriorityDefaultLow];
[self.badgeImageViewCenterYToDisplayNameConstraint setPriority:UILayoutPriorityDefaultLow];
[self.badgeImageViewToPictureViewBottomConstraint setPriority:UILayoutPriorityRequired];
[self.badgeImageViewToPictureViewTrailingConstraint setPriority:UILayoutPriorityRequired];
}
else
{
[self.badgeImageViewToPictureViewBottomConstraint setPriority:UILayoutPriorityDefaultLow];
[self.badgeImageViewToPictureViewTrailingConstraint setPriority:UILayoutPriorityDefaultLow];
[self.badgeImageViewLeadingToPictureViewConstraint setPriority:UILayoutPriorityRequired];
[self.badgeImageViewCenterYToDisplayNameConstraint setPriority:UILayoutPriorityRequired];
}
}
}
- (void)refreshContactPresence
{
MXUser *contact = [self.mxRoom.mxSession userWithUserId:self.mxRoom.directUserId];
BOOL presenceHidden = contact.presence == MXPresenceUnknown;
self.presenceIndicatorView.hidden = presenceHidden;
self.presenceIndicatorView.borderColor = ThemeService.shared.theme.headerBackgroundColor;
self.presenceIndicatorView.presence = contact.presence;
if (presenceHidden)
{
[self.badgeImageViewLeadingToPictureViewConstraint setPriority:UILayoutPriorityDefaultLow];
[self.badgeImageViewCenterYToDisplayNameConstraint setPriority:UILayoutPriorityDefaultLow];
[self.badgeImageViewToPictureViewBottomConstraint setPriority:UILayoutPriorityRequired];
[self.badgeImageViewToPictureViewTrailingConstraint setPriority:UILayoutPriorityRequired];
}
else
{
[self.badgeImageViewToPictureViewBottomConstraint setPriority:UILayoutPriorityDefaultLow];
[self.badgeImageViewToPictureViewTrailingConstraint setPriority:UILayoutPriorityDefaultLow];
[self.badgeImageViewLeadingToPictureViewConstraint setPriority:UILayoutPriorityRequired];
[self.badgeImageViewCenterYToDisplayNameConstraint setPriority:UILayoutPriorityRequired];
}
}
@@ -146,6 +174,11 @@
{
self.tapGestureDelegate = nil;
if (mxDirectUserPresenceObserver) {
[[NSNotificationCenter defaultCenter] removeObserver:mxDirectUserPresenceObserver];
mxDirectUserPresenceObserver = nil;
}
[super destroy];
}