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
@@ -45,6 +45,7 @@ final class RoomInfoListViewModel: NSObject, RoomInfoListViewModelType {
encryptionImage: encryptionImage,
isEncrypted: room.summary.isEncrypted,
isDirect: room.isDirect,
directUserId: room.directUserId,
directUserPresence: directUserPresence)
return RoomInfoListViewData(numberOfMembers: Int(room.summary.membersCount.joined),
@@ -58,12 +59,10 @@ final class RoomInfoListViewModel: NSObject, RoomInfoListViewModelType {
self.room = room
super.init()
startObservingSummaryChanges()
startObservingPresenceChanges()
}
deinit {
stopObservingSummaryChanges()
stopObservingPresenceChanges()
}
// MARK: - Public
@@ -91,27 +90,11 @@ final class RoomInfoListViewModel: NSObject, RoomInfoListViewModelType {
NotificationCenter.default.removeObserver(self, name: .mxRoomSummaryDidChange, object: nil)
}
private func startObservingPresenceChanges() {
NotificationCenter.default.addObserver(self, selector: #selector(presenceUpdated(_:)), name: .mxkContactManagerMatrixUserPresenceChange, object: nil)
}
private func stopObservingPresenceChanges() {
NotificationCenter.default.removeObserver(self, name: .mxkContactManagerMatrixUserPresenceChange, object: nil)
}
@objc private func roomSummaryUpdated(_ notification: Notification) {
// force update view
self.update(viewState: .loaded(viewData: viewData))
}
@objc private func presenceUpdated(_ notification: NSNotification) {
guard let updatedUserId = notification.object as? String, updatedUserId == room.directUserId else {
return
}
self.update(viewState: .loaded(viewData: viewData))
}
private func loadData() {
self.update(viewState: .loaded(viewData: viewData))
}
@@ -30,7 +30,11 @@ class RoomInfoBasicView: UIView {
@IBOutlet private weak var avatarContainerView: UIView!
@IBOutlet private weak var avatarImageView: MXKImageView!
@IBOutlet private weak var badgeImageView: UIImageView!
@IBOutlet private weak var presenceIndicatorView: PresenceIndicatorView!
@IBOutlet private weak var presenceIndicatorView: PresenceIndicatorView! {
didSet {
presenceIndicatorView.delegate = self
}
}
@IBOutlet private weak var roomNameStackView: UIStackView!
@IBOutlet private weak var roomNameLabel: UILabel!
@IBOutlet private weak var roomAddressLabel: UILabel!
@@ -98,12 +102,16 @@ class RoomInfoBasicView: UIView {
VectorL10n.roomParticipantsSecurityInformationRoomEncryptedForDm :
VectorL10n.roomParticipantsSecurityInformationRoomEncrypted
securityContainerView.isHidden = !viewData.isEncrypted
presenceIndicatorView.setPresence(viewData.directUserPresence)
updateBadgeImageViewPosition(with: viewData.encryptionImage, presence: viewData.directUserPresence)
if let directUserId = viewData.directUserId {
presenceIndicatorView.configure(userId: directUserId, presence: viewData.directUserPresence)
} else {
presenceIndicatorView.stopListeningPresenceUpdates()
}
updateBadgeImageViewPosition(isPresenceDisplayed: viewData.directUserPresence != .unknown)
}
private func updateBadgeImageViewPosition(with encryptionImage: UIImage?, presence: MXPresence) {
guard encryptionImage != nil else {
private func updateBadgeImageViewPosition(isPresenceDisplayed: Bool) {
guard badgeImageView.image != nil else {
badgeImageView.isHidden = true
return
}
@@ -111,7 +119,6 @@ class RoomInfoBasicView: UIView {
badgeImageView.isHidden = false
// Update badge position if it doesn't match expectation.
// If presence is displayed, badge should be in the name stack.
let isPresenceDisplayed = presence != .unknown
let isBadgeInRoomNameStackView = roomNameStackView.arrangedSubviews.contains(badgeImageView)
switch (isPresenceDisplayed, isBadgeInRoomNameStackView) {
case (true, false):
@@ -167,3 +174,9 @@ extension RoomInfoBasicView: Themable {
}
}
extension RoomInfoBasicView: PresenceIndicatorViewDelegate {
func presenceIndicatorViewDidUpdateVisibility(_ presenceIndicatorView: PresenceIndicatorView, isHidden: Bool) {
updateBadgeImageViewPosition(isPresenceDisplayed: !isHidden)
}
}
@@ -27,5 +27,6 @@ struct RoomInfoBasicViewData {
let encryptionImage: UIImage?
let isEncrypted: Bool
let isDirect: Bool
let directUserId: String?
let directUserPresence: MXPresence
}