| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- //
- // EngineEventCenter.swift
- // TUIRoomKit
- //
- // Created by aby on 2023/1/8.
- // Copyright © 2023 Tencent. All rights reserved.
- //
- import Foundation
- import TUICore
- protocol RoomKitUIEventResponder: NSObject {
- func onNotifyUIEvent(key: EngineEventCenter.RoomUIEvent, Object: Any?, info: [AnyHashable: Any]?)
- }
- protocol RoomEngineEventResponder: NSObject {
- func onEngineEvent(name: EngineEventCenter.RoomEngineEvent, param: [String: Any]?)
- }
- class TUINotificationAdapter:NSObject ,TUINotificationProtocol {
-
- weak var responder: RoomKitUIEventResponder?
-
- init(responder: RoomKitUIEventResponder? = nil) {
- self.responder = responder
- }
-
- func onNotifyEvent(_ key: String, subKey: String, object anObject: Any?, param: [AnyHashable : Any]?) {
- guard let eventKey = EngineEventCenter.RoomUIEvent(rawValue: subKey) else { return }
- responder?.onNotifyUIEvent(key: eventKey, Object: anObject, info: param)
- }
-
- deinit {
- debugPrint("deinit \(self)")
- }
- }
- class EngineEventCenter: NSObject {
-
- // Weak Ref
- typealias WeakArray<T> = [() -> T?]
- static let shared = EngineEventCenter()
- private var engineObserverMap: [RoomEngineEvent: WeakArray<RoomEngineEventResponder>] = [:]
- private var uiEventObserverMap: [RoomUIEvent: [TUINotificationAdapter]] = [:]
-
- private override init() {
- super.init()
- }
-
- enum RoomEngineEvent: String {
- case onKickedOffLine
- case onRoomDismissed
- case onKickedOutOfRoom
- case onUserVideoStateChanged
- case onUserAudioStateChanged
- case onUserVoiceVolumeChanged
- case onUserScreenCaptureStopped
- case onRequestReceived
- case onSendMessageForUserDisableChanged
- case onRemoteUserEnterRoom
- case onRemoteUserLeaveRoom
- case onSeatListChanged
- case onAllUserCameraDisableChanged
- case onAllUserMicrophoneDisableChanged
- case onKickedOffSeat
- case onStatistics
- case onDeletedTakeSeatRequest
- case onExitedRoom
- case onDestroyedRoom
- case onStartedRoom
- case onJoinedRoom
- case onConferenceInfoChanged
- case onInitialSelfUserInfo
- case onInitialRoomInfo
- case onGetUserListFinished
- case onUserSigExpired
- case onUserInfoChanged
- }
-
- enum RoomUIEvent: String {
- case TUIRoomKitService
- case TUIRoomKitService_RenewUserList
- case TUIRoomKitService_SomeoneSharing
- case TUIRoomKitService_RenewSeatList
- case TUIRoomKitService_UserOnSeatChanged
- case TUIRoomKitService_ShowRoomMainView
- case TUIRoomKitService_ShowRoomVideoFloatView
- case TUIRoomKitService_CurrentUserHasAudioStream
- case TUIRoomKitService_CurrentUserHasVideoStream
- case TUIRoomKitService_CurrentUserRoleChanged
- case TUIRoomKitService_CurrentUserMuteMessage
- case TUIRoomKitService_RoomOwnerChanged
- case TUIRoomKitService_ChangeToolBarHiddenState
- case TUIRoomKitService_SetToolBarDelayHidden
- case TUIRoomKitService_HiddenChatWindow
- case TUIRoomKitService_ShowExitRoomView
- case TUIRoomKitService_RenewVideoSeatView
- case TUIRoomKitService_DismissConferenceViewController
- case TUIRoomKitService_ShowFloatChatView
- }
-
- func subscribeUIEvent(key: RoomUIEvent, responder: RoomKitUIEventResponder) {
- let observer = TUINotificationAdapter(responder: responder)
- if var observerArray = uiEventObserverMap[key] {
- observerArray.append(observer)
- uiEventObserverMap[key] = observerArray
- } else {
- uiEventObserverMap[key] = [observer]
- }
- DispatchQueue.main.async {
- TUICore.registerEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: observer)
- }
- }
-
- func unsubscribeUIEvent(key: RoomUIEvent, responder: RoomKitUIEventResponder) {
- guard var observerArray = uiEventObserverMap[key] else { return }
- observerArray = observerArray.filter({ observer in
- guard let responderValue = observer.responder else {
- DispatchQueue.main.async {
- TUICore.unRegisterEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: observer)
- }
- return false
- }
- if responderValue.isEqual(responder) {
- DispatchQueue.main.async {
- TUICore.unRegisterEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: observer)
- }
- return false
- } else {
- return true
- }
- })
- if observerArray.count == 0 {
- uiEventObserverMap.removeValue(forKey: key)
- } else {
- uiEventObserverMap[key] = observerArray
- }
- }
-
- func notifyUIEvent(key: RoomUIEvent, param: [AnyHashable : Any]) {
- DispatchQueue.main.async {
- TUICore.notifyEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: nil, param: param)
- }
- }
-
- func subscribeEngine(event: RoomEngineEvent, observer: RoomEngineEventResponder) {
- let weakObserver = { [weak observer] in return observer }
- if var observerArray = engineObserverMap[event] {
- let listenerObject = observerArray.first { weakObject in
- guard let object = weakObject() else { return false }
- return object.isEqual(observer)
- }
- guard listenerObject == nil else { return }
- observerArray.append(weakObserver)
- engineObserverMap[event] = observerArray
- } else {
- engineObserverMap[event] = [weakObserver]
- }
- }
- func unsubscribeEngine(event: RoomEngineEvent, observer: RoomEngineEventResponder) {
- guard var observerArray = engineObserverMap[event] else { return }
- observerArray.removeAll { weakObject in
- guard let object = weakObject() else { return true }
- return object.isEqual(observer)
- }
- if observerArray.count == 0 {
- engineObserverMap.removeValue(forKey: event)
- } else {
- engineObserverMap[event] = observerArray
- }
- }
-
- func notifyEngineEvent(event: RoomEngineEvent, param: [String : Any]) {
- guard let observers = engineObserverMap[event] else { return }
- observers.forEach { responder in
- responder()?.onEngineEvent(name: event, param: param)
- }
- }
-
- deinit {
- debugPrint("deinit \(self)")
- }
- }
|