EnterRoomViewController.swift 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. //
  2. // TUIRoomViewController.swift
  3. // TUIRoom
  4. //
  5. // Created by WesleyLei on 2021/12/16.
  6. // Copyright © 2021 Tencent. All rights reserved.
  7. //
  8. import SnapKit
  9. import UIKit
  10. import TUIRoomKit
  11. import TUICore
  12. import RTCRoomEngine
  13. class EnterRoomViewController: UIViewController {
  14. weak var rootView: EnterRoomView?
  15. private var fieldText: String = ""
  16. private(set) var inputViewItems: [ListCellItemData] = []
  17. private(set) var switchViewItems: [ListCellItemData] = []
  18. private let currentUserName: String = TUILogin.getNickName() ?? ""
  19. private let currentUserId: String = TUILogin.getUserID() ?? ""
  20. private var roomId: String = ""
  21. private var enableLocalAudio: Bool = true
  22. private var enableLocalVideo: Bool = true
  23. private var isSoundOnSpeaker: Bool = true
  24. let backButton: UIButton = {
  25. let button = UIButton(type: .custom)
  26. let normalIcon = UIImage(named: "room_back_white")
  27. button.setImage(normalIcon, for: .normal)
  28. button.setTitleColor(UIColor(0xD1D9EC), for: .normal)
  29. return button
  30. }()
  31. override var shouldAutorotate: Bool {
  32. return false
  33. }
  34. override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
  35. return .portrait
  36. }
  37. init() {
  38. super.init(nibName: nil, bundle: nil)
  39. createItems()
  40. backButton.addTarget(self, action: #selector(backButtonClick(sender:)), for: .touchUpInside)
  41. }
  42. required init?(coder: NSCoder) {
  43. fatalError("init(coder:) has not been implemented")
  44. }
  45. override func loadView() {
  46. let rootView = EnterRoomView()
  47. rootView.rootViewController = self
  48. view = rootView
  49. self.rootView = rootView
  50. }
  51. override func viewDidLoad() {
  52. super.viewDidLoad()
  53. ConferenceSession.sharedInstance.addObserver(observer: self)
  54. }
  55. override func viewWillAppear(_ animated: Bool) {
  56. super.viewWillAppear(animated)
  57. navigationController?.setNavigationBarHidden(false, animated: false)
  58. navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
  59. UIApplication.shared.isIdleTimerDisabled = false
  60. }
  61. @objc func backButtonClick(sender: UIButton) {
  62. navigationController?.popViewController(animated: true)
  63. }
  64. deinit {
  65. ConferenceSession.sharedInstance.removeObserver(observer: self)
  66. debugPrint("deinit \(self)")
  67. }
  68. }
  69. extension EnterRoomViewController {
  70. private func createItems() {
  71. let enterRoomIdItem = ListCellItemData()
  72. enterRoomIdItem.titleText = .roomNumText
  73. enterRoomIdItem.fieldEnable = true
  74. enterRoomIdItem.hasFieldView = true
  75. enterRoomIdItem.fieldPlaceholderText = .placeholderTipsText
  76. enterRoomIdItem.action = { [weak self] sender in
  77. guard let self = self, let view = sender as? UITextField else { return }
  78. self.fieldText = view.text ?? ""
  79. }
  80. inputViewItems.append(enterRoomIdItem)
  81. let userNameItem = ListCellItemData()
  82. userNameItem.titleText = .userNameText
  83. userNameItem.messageText = currentUserName
  84. userNameItem.hasDownLineView = false
  85. inputViewItems.append(userNameItem)
  86. let openMicItem = ListCellItemData()
  87. openMicItem.titleText = .openMicText
  88. openMicItem.hasSwitch = true
  89. openMicItem.isSwitchOn = enableLocalAudio
  90. openMicItem.action = {[weak self] sender in
  91. guard let self = self, let view = sender as? UISwitch else { return }
  92. self.enableLocalAudio = view.isOn
  93. }
  94. switchViewItems.append(openMicItem)
  95. let openSpeakerItem = ListCellItemData()
  96. openSpeakerItem.titleText = .openSpeakerText
  97. openSpeakerItem.hasSwitch = true
  98. openSpeakerItem.isSwitchOn = true
  99. openSpeakerItem.action = {[weak self] sender in
  100. guard let self = self, let view = sender as? UISwitch else { return }
  101. self.isSoundOnSpeaker = view.isOn
  102. }
  103. switchViewItems.append(openSpeakerItem)
  104. let openCameraItem = ListCellItemData()
  105. openCameraItem.titleText = .openCameraText
  106. openCameraItem.hasSwitch = true
  107. openCameraItem.isSwitchOn = enableLocalVideo
  108. openCameraItem.hasDownLineView = false
  109. openCameraItem.action = {[weak self] sender in
  110. guard let self = self, let view = sender as? UISwitch else { return }
  111. self.enableLocalVideo = view.isOn
  112. }
  113. switchViewItems.append(openCameraItem)
  114. }
  115. func enterButtonClick(sender: UIButton) {
  116. if fieldText.count <= 0 {
  117. view.makeToast(.enterRoomIdErrorToast)
  118. return
  119. }
  120. let roomIDStr = fieldText
  121. .replacingOccurrences(of: " ",
  122. with: "",
  123. options: .literal,
  124. range: nil)
  125. if roomIDStr.count <= 0 {
  126. view.makeToast(.enterRoomIdErrorToast)
  127. return
  128. }
  129. roomId = roomIDStr
  130. joinConference(roomId: roomId)
  131. }
  132. private func joinConference(roomId: String) {
  133. let vc = ConferenceMainViewController()
  134. let params = JoinConferenceParams(roomId: roomId)
  135. params.isOpenMicrophone = enableLocalAudio
  136. params.isOpenCamera = enableLocalVideo
  137. params.isOpenSpeaker = isSoundOnSpeaker
  138. vc.setJoinConferenceParams(params: params)
  139. navigationController?.pushViewController(vc, animated: true)
  140. }
  141. }
  142. extension EnterRoomViewController: ConferenceObserver {
  143. func onConferenceJoined(roomInfo: TUIRoomInfo, error: TUIError, message: String) {
  144. guard error != .success else { return }
  145. navigationController?.popViewController(animated: true)
  146. guard !message.isEmpty else { return }
  147. SceneDelegate.getCurrentWindow()?.makeToast(message, duration: 1, position:TUICSToastPositionCenter)
  148. }
  149. func onConferenceFinished(roomInfo: TUIRoomInfo, reason: ConferenceFinishedReason) {
  150. debugPrint("onConferenceFinished")
  151. }
  152. func onConferenceExited(roomInfo: TUIRoomInfo, reason: ConferenceExitedReason) {
  153. debugPrint("onConferenceExited")
  154. }
  155. }
  156. private extension String {
  157. static var enterRoomIdErrorToast: String {
  158. RoomDemoLocalize("Enter a valid room ID.")
  159. }
  160. static var placeholderTipsText: String {
  161. RoomDemoLocalize("Enter a room ID")
  162. }
  163. static var userNameText: String {
  164. RoomDemoLocalize("Your Name")
  165. }
  166. static var roomNumText: String {
  167. RoomDemoLocalize("Room ID")
  168. }
  169. static var openCameraText: String {
  170. RoomDemoLocalize("Video")
  171. }
  172. static var openMicText: String {
  173. RoomDemoLocalize("Mic")
  174. }
  175. static var openSpeakerText: String {
  176. RoomDemoLocalize("Speaker")
  177. }
  178. }