mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-22 17:42:45 +02:00
Setup a dedicated listener owned by PresenceIndicatorView
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user