Setup a dedicated listener owned by PresenceIndicatorView

This commit is contained in:
aringenbach
2022-05-12 10:55:00 +02:00
parent 99076d0606
commit 231fc52e45
9 changed files with 182 additions and 178 deletions
@@ -21,6 +21,7 @@
// We add here a protocol to handle tap gesture in title view.
@class RoomTitleView;
@class PresenceIndicatorView;
@protocol PresenceIndicatorViewDelegate;
@protocol RoomTitleViewTapGestureDelegate <NSObject>
/**
@@ -33,7 +34,7 @@
@end
@interface RoomTitleView : MXKRoomTitleView <UIGestureRecognizerDelegate>
@interface RoomTitleView : MXKRoomTitleView <UIGestureRecognizerDelegate, PresenceIndicatorViewDelegate>
@property (weak, nonatomic) IBOutlet UIView *titleMask;
@property (weak, nonatomic) IBOutlet UIImageView *badgeImageView;
+29 -52
View File
@@ -20,15 +20,6 @@
#import "ThemeService.h"
#import "GeneratedInterface-Swift.h"
@interface RoomTitleView()
{
/**
The observer of the presence for direct user.
*/
id mxDirectUserPresenceObserver;
}
@end
@implementation RoomTitleView
+ (UINib *)nib
@@ -118,22 +109,16 @@
}
else if (self.mxRoom)
{
if (!mxDirectUserPresenceObserver && self.mxRoom.isDirect)
if (self.mxRoom.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.mxRoom.directUserId;
if (directUserId && [directUserId isEqualToString:notif.object])
{
[self refreshContactPresence];
}
}];
[self refreshContactPresence];
MXUser *contact = [self.mxRoom.mxSession userWithUserId:self.mxRoom.directUserId];
self.presenceIndicatorView.borderColor = ThemeService.shared.theme.headerBackgroundColor;
self.presenceIndicatorView.delegate = self;
[self.presenceIndicatorView configureWithUserId:self.mxRoom.directUserId presence:contact.presence];
}
else
{
[self.presenceIndicatorView stopListeningPresenceUpdates];
}
self.displayNameTextField.text = self.mxRoom.summary.displayname;
@@ -149,38 +134,10 @@
}
}
- (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];
}
}
- (void)destroy
{
self.tapGestureDelegate = nil;
if (mxDirectUserPresenceObserver) {
[[NSNotificationCenter defaultCenter] removeObserver:mxDirectUserPresenceObserver];
mxDirectUserPresenceObserver = nil;
}
[super destroy];
}
@@ -246,4 +203,24 @@
return self.typingLabel.text;
}
#pragma mark - PresenceIndicatorViewDelegate
- (void)presenceIndicatorViewDidUpdateVisibility:(PresenceIndicatorView *)presenceIndicatorView isHidden:(BOOL)isHidden
{
if (isHidden)
{
[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];
}
}
@end