Skip to content

Commit

Permalink
【iOS】update to version 2.6.0.
Browse files Browse the repository at this point in the history
  • Loading branch information
Tangjianing authored and AbySwifter committed Sep 14, 2024
1 parent 4f4d0f2 commit ab77491
Show file tree
Hide file tree
Showing 131 changed files with 4,090 additions and 831 deletions.
61 changes: 19 additions & 42 deletions iOS/Example/App/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@ import ImSDK_Plus
import TUIRoomKit
import UIKit
import TUIRoomKit
import TIMPush

#if DEBUG
let businessID: Int32 = 0
#else
let businessID: Int32 = 0
#endif

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
Expand Down Expand Up @@ -49,50 +56,20 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
}

func showMainViewController() {
guard ProfileManager.shared.curUserID() != nil else {
debugPrint("not login")
return
}
let prepareViewController = ConferenceOptionsViewController()
let nav = RoomNavigationController(rootViewController: prepareViewController)
nav.modalPresentationStyle = .fullScreen
getCurrentWindowViewController()?.present(nav, animated: true)
}

func showLoginViewController() {
let loginVC = TRTCLoginViewController()
let nav = RoomNavigationController(rootViewController: loginVC)
if let keyWindow = SceneDelegate.getCurrentWindow() {
keyWindow.rootViewController = nav
keyWindow.makeKeyAndVisible()
} else {
debugPrint("window error")
}
}

extension AppDelegate: TIMPushDelegate {
func offlinePushCertificateID() -> Int32 {
return businessID
}

private func getCurrentWindowViewController() -> UIViewController? {
var keyWindow: UIWindow?
for window in UIApplication.shared.windows {
if window.isMember(of: UIWindow.self), window.isKeyWindow {
keyWindow = window
break
}
}
guard let rootController = keyWindow?.rootViewController else {
return nil
func onRemoteNotificationReceived(_ notice: String?) -> Bool {
guard let notice = notice else { return false }
guard let dict = notice.convertToDic() else { return false }
guard let roomId = dict["RoomId"] as? String else { return false }
if V2TIMManager.sharedInstance().getLoginStatus() == .STATUS_LOGINED {
AppUtils.shared.showConferenceMainViewController(roomId: roomId)
}
func findCurrentController(from vc: UIViewController?) -> UIViewController? {
if let nav = vc as? UINavigationController {
return findCurrentController(from: nav.topViewController)
} else if let tabBar = vc as? UITabBarController {
return findCurrentController(from: tabBar.selectedViewController)
} else if let presented = vc?.presentedViewController {
return findCurrentController(from: presented)
}
return vc
}
let viewController = findCurrentController(from: rootController)
return viewController
return true
}
}
9 changes: 9 additions & 0 deletions iOS/Example/App/Main/Common/String+Extension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,13 @@ extension String {
}
return output
}

func convertToDic() -> [String : Any]?{
guard let data = self.data(using: String.Encoding.utf8) else { return nil }
if let dict = try? JSONSerialization.jsonObject(with: data,
options: .mutableContainers) as? [String : Any] {
return dict
}
return nil
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ class ContactCell: UITableViewCell {
}
}

func setupViewState(with info: User, isSelected: Bool) {
func setupViewState(with info: User, isSelected: Bool, isDisaled: Bool) {
let placeholder = UIImage(named: "room_default_avatar_rect")
if let url = URL(string: info.avatarUrl) {
avatarImageView.sd_setImage(with: url, placeholderImage: placeholder)
Expand All @@ -368,7 +368,13 @@ class ContactCell: UITableViewCell {
} else {
nameLabel.text = info.userId
}
checkBox.isSelected = isSelected
checkBox.isSelected = isSelected || isDisaled

if isDisaled {
contentView.alpha = 0.5
} else {
contentView.alpha = 1
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,22 @@ import RTCRoomEngine
import Factory
import TUIRoomKit

class SelectMemberViewController: UIViewController, SelectMemberControllerProtocol {
weak var delegate: MemberSelectionDelegate?
class SelectMemberViewController: UIViewController, ContactViewProtocol {
weak var delegate: ContactViewSelectDelegate?
private var viewModel = SelectMembersViewModel()
private var cancellableSet = Set<AnyCancellable>()

init(selectedUsers: [User]) {
init(participants: ConferenceParticipants) {
super.init(nibName: nil, bundle: nil)
viewModel.selectMembers(selectedUsers)
viewModel.selectMembers(participants.selectedList)
viewModel.setDisabledMembers(participants.unSelectableList)
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

func setDelegate(_ selector: MemberSelectionDelegate) {
func setDelegate(_ selector: ContactViewSelectDelegate) {
self.delegate = selector
}

Expand All @@ -37,11 +38,21 @@ class SelectMemberViewController: UIViewController, SelectMemberControllerProtoc
view = rootView
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewDidLoad() {
super.viewDidLoad()
bindInteraction()
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

func bindInteraction() {
guard let selectMembersView = view as? SelectMemberView else {
return
Expand Down Expand Up @@ -105,6 +116,9 @@ extension SelectMemberViewController: UITableViewDelegate {

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let member = viewModel.filteredMembers[indexPath.row]
if viewModel.disabledMembers.contains(where: { $0.userId == member.userId}) {
return
}
if viewModel.selectedMembers.contains(where: { $0.userId == member.userId }) {
viewModel.deSelectMember(member)
} else {
Expand All @@ -126,7 +140,8 @@ extension SelectMemberViewController: UITableViewDataSource {
}
let member = viewModel.filteredMembers[indexPath.row]
let isSelected = viewModel.selectedMembers.contains(where: { $0.userId == member.userId})
cell.setupViewState(with: member, isSelected: isSelected)
let isDisabled = viewModel.disabledMembers.contains(where: { $0.userId == member.userId})
cell.setupViewState(with: member, isSelected: isSelected, isDisaled: isDisabled)
return cell
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,32 +10,106 @@ import Combine
import UIKit
import RTCRoomEngine
import TUIRoomKit
import ImSDK_Plus
import TUICore

class SelectMembersViewModel {
private(set) var members: [User] = []
@Published private(set) var filteredMembers: [User] = []
@Published private(set) var selectedMembers: [User] = []

init() {
loadMembers()
enum DataProviderType {
case IMData
case localData
}

struct APIError: Error {
let code: Int32
let message: String?
}

struct PagedUsers {
let users: [User]
let hasNextPage: Bool
let nextPage: Int?
}

protocol UserDateProvider {
func getUsers(page: Int?, pageSize: Int?, completion: @escaping (Result<PagedUsers, Error>) -> Void)
}

class ImDataProvider: UserDateProvider {
// use relationship chain data from IM, if you want to use IM, you should import data first.
func getUsers(page: Int?, pageSize: Int?, completion: @escaping (Result<PagedUsers, Error>) -> Void) {
V2TIMManager.sharedInstance()?.getFriendList { list in
let users = list?.map({ info in
return User(userId: info.userID, userName: info.userFullInfo.nickName, avatarUrl: info.userFullInfo.faceURL ?? "")
})
let result = PagedUsers(users: users ?? [], hasNextPage: false, nextPage: 0)
completion(.success(result))
} fail: { error, message in
completion(.failure(APIError(code: error, message: message)))
}
}
}

class LocalDataProvider: UserDateProvider {
// use local mock data,you can replace with ypur own data.
private var allUsers: [User] = []

func loadMembers() {
//load mock data, you should replace with your real data
init() {
guard let url = Bundle.main.url(forResource: "members", withExtension: "json") else {
return
}
do {
let data = try Data(contentsOf: url)
let decoder = JSONDecoder()
let users = try decoder.decode([User].self, from: data)
members = users
filteredMembers = members
allUsers = try decoder.decode([User].self, from: data)
} catch {
print("Error decoding JSON: \(error)")
}
}

func getUsers(page: Int? = nil, pageSize: Int? = nil, completion: @escaping (Result<PagedUsers, Error>) -> Void) {
completion(.success(PagedUsers(users: allUsers, hasNextPage: false, nextPage: 0)))
}
}

class DataProviderFactory {
static func getDataProvider(_ type: DataProviderType) -> UserDateProvider {
switch type {
case .IMData:
return ImDataProvider()
case .localData:
return LocalDataProvider()
}
}
}

class SelectMembersViewModel {
private(set) var members: [User] = []
@Published private(set) var filteredMembers: [User] = []
@Published private(set) var selectedMembers: [User] = []
private(set) var disabledMembers: [User] = []

init() {
loadMembers()
}

func loadMembers() {
let dataProvider = DataProviderFactory.getDataProvider(.localData)
dataProvider.getUsers(page: nil, pageSize: nil) { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let pagedUsers):
let selfUserId = TUILogin.getUserID()
var users = pagedUsers.users
if let index = users.firstIndex(where: { $0.userId == selfUserId }) {
users.remove(at: index)
}
self.members = users
self.filteredMembers = users
default:
break
}
}
}

func filterMember(with searchText: String) {
if searchText.isEmpty {
filteredMembers = members
Expand All @@ -61,6 +135,9 @@ class SelectMembersViewModel {
}
}

func setDisabledMembers(_ members: [User]) {
disabledMembers = members
}

func deSelectMember(_ member: User) {
if let index = selectedMembers.firstIndex(where: { $0.userId == member.userId }) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ struct ConferenceOptionInfo {
class ConferenceOptionsDataHelper {
func generateOptionsData() -> [ConferenceOptionInfo] {
var options: [ConferenceOptionInfo] = []
let enterRoom = ConferenceOptionInfo(normalText: .joinRoomText, normalIcon: "enter_conference", backgroundColor: "0x146EFA")
options.append(enterRoom)

let createRoom = ConferenceOptionInfo(normalText: .createRoomText, normalIcon: "create_conference", backgroundColor: "0x146EFA")
options.append(createRoom)

let enterRoom = ConferenceOptionInfo(normalText: .joinRoomText, normalIcon: "enter_conference", backgroundColor: "0x146EFA")
options.append(enterRoom)

let scheduleRoom = ConferenceOptionInfo(normalText: .scheduleRoomText, normalIcon: "schedule_conference", backgroundColor: "0x146EFA")
options.append(scheduleRoom)
return options
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@ class ConferenceOptionsViewController: UIViewController {
self.view = view
}

override func viewDidLoad() {
super.viewDidLoad()
ConferenceSession.sharedInstance.setContactsViewProvider { participants in
return SelectMemberViewController(participants: participants)
}
ConferenceSession.sharedInstance.enableWaterMark()
}

deinit {
debugPrint("deinit \(self)")
}
Expand Down Expand Up @@ -79,7 +87,8 @@ extension ConferenceOptionsViewController {

func scheduleRoom() {
let scheduleViewController = ScheduleConferenceViewController { selectedList in
return SelectMemberViewController(selectedUsers: selectedList)
let participants = ConferenceParticipants(selectedList: selectedList)
return SelectMemberViewController(participants: participants)
}
navigationController?.pushViewController(scheduleViewController, animated: true)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ class CreateRoomViewController: UIViewController {
navigationController?.setNavigationBarHidden(false, animated: false)
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
UIApplication.shared.isIdleTimerDisabled = false
renewRootViewState()
setupRoomId()
}

Expand Down Expand Up @@ -133,11 +132,8 @@ extension CreateRoomViewController {
}

func enterButtonClick(sender: UIButton) {
rootView?.updateEnterButtonState(isEnabled: false)
rootView?.updateLoadingState(isStarted: true)
guard let roomId = self.roomId else {
self.view.makeToast(.generatingRoomIdText)
self.renewRootViewState()
return
}
quickStartConference(roomId: roomId)
Expand All @@ -154,11 +150,6 @@ extension CreateRoomViewController {
navigationController?.pushViewController(vc, animated: true)
}

private func renewRootViewState() {
rootView?.updateEnterButtonState(isEnabled: true)
rootView?.updateLoadingState(isStarted: false)
}

func switchRoomTypeClick() {
rootView?.showSpeechModeControlView()
}
Expand Down Expand Up @@ -223,7 +214,6 @@ extension CreateRoomViewController: ConferenceObserver {
SceneDelegate.getCurrentWindow()?.makeToast(errorText, duration: 1, position:TUICSToastPositionCenter)
navigationController?.popViewController(animated: true)
}
renewRootViewState()
}

func onConferenceFinished(conferenceId: String) {
Expand Down
Loading

0 comments on commit ab77491

Please sign in to comment.