Commit 24085dc4 authored by pete谢兆麟's avatar pete谢兆麟

Merge branch 'yinhe-live-1212' of...

Merge branch 'yinhe-live-1212' of http://gitlab.galaxy-immi.com/mobile-group/galaxy-iOS into yinhe-live-1212
parents 89c4bb06 0a544f2e
......@@ -7208,7 +7208,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxyTestEnv.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 15;
CURRENT_PROJECT_VERSION = 16;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -7350,7 +7350,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxy.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 15;
CURRENT_PROJECT_VERSION = 16;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -7555,7 +7555,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxyDebug.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 15;
CURRENT_PROJECT_VERSION = 16;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -7602,7 +7602,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxy.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 15;
CURRENT_PROJECT_VERSION = 16;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......
......@@ -114,26 +114,29 @@ class YHAIMainChatViewController: YHBaseViewController {
func reloadAndScrollToBottom(_ forceScrollToBottom: Bool = false, _ isNeedAccurate: Bool = false) {
self.tableView.reloadData()
if !forceScrollToBottom && !canTriggerProgrammaticScroll() {
return
}
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
if isNeedAccurate {
// self.tableView.setContentOffset(.zero, animated: true)
// self.tableView.setContentOffset(CGPointMake(0, 90000), animated: true)
}
// 使用 performBatchUpdates 来确保所有布局更新完成后再滚动
self.tableView.performBatchUpdates(nil) { _ in
// 在布局更新完成后执行滚动
// 使用 UIView.animate 实现更丝滑的滚动效果
UIView.animate(withDuration: 0.5,
delay: 0,
usingSpringWithDamping: 1.0, // 弹簧阻尼,控制回弹效果
initialSpringVelocity: 0.3, // 初始速度
options: [.curveEaseOut, .allowUserInteraction],
animations: {
if self.messages.count > 0 {
let lastIndexPath = IndexPath(row: self.messages.count-1, section: 0)
self.tableView.scrollToRow(at: lastIndexPath, at: .bottom, animated: true)
self.tableView.scrollToRow(at: lastIndexPath, at: .bottom, animated: false)
}
}
}, completion: nil)
}
}
......@@ -148,21 +151,16 @@ class YHAIMainChatViewController: YHBaseViewController {
self.reloadAndScrollToBottom(forceScrollToBottom)
self.bottomInputView.status = .loading
self.chatConfig.disableHandleMessage = false
self.manager.disableHandleMessage = false
self.manager.requestAI(botId: self.robotId, conversationId: self.conversationId, question:text) {
[weak self] res, done in
guard let self = self else { return }
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
[weak self] in
guard let self = self else { return }
self.chatConfig.handleReceiveMessage(res, done, &messages)
if done {
print("RESPONSE-DONE")
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
}
self.reloadAndScrollToBottom(forceScrollToBottom)
self.chatConfig.handleReceiveMessage(res, done, &messages)
if done {
print("RESPONSE-DONE")
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
}
self.reloadAndScrollToBottom(forceScrollToBottom)
}
}
}
......@@ -202,19 +200,15 @@ class YHAIMainChatViewController: YHBaseViewController {
}
func stopAutoResponse(completion:((Bool)->())? = nil) {
self.manager.cancelCurrentRequest()
self.reloadAndScrollToBottom()
self.chatConfig.disableHandleMessage = true
self.manager.disableHandleMessage = true
self.chatConfig.removeThinkingMessageFromChatList(&self.messages)
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
completion?(true)
self.manager.stopChat(chatId: self.manager.chatId, conversationId: self.conversationId) { success, error in
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
if success {
self.reloadAndScrollToBottom()
self.manager.request?.cancel()
self.chatConfig.disableHandleMessage = true
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
self.chatConfig.removeThinkingMessageFromChatList(&self.messages)
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
self.tableView.reloadData()
completion?(success)
}
}
}
}
......@@ -272,9 +266,7 @@ extension YHAIMainChatViewController: UITableViewDelegate, UITableViewDataSource
guard let self = self else { return }
if self.isNeedStopResonse() {
self.stopAutoResponse { success in
if success {
self.sendMessage(text)
}
self.sendMessage(text)
}
} else {
self.sendMessage(text)
......@@ -354,6 +346,47 @@ extension YHAIMainChatViewController: UITableViewDelegate, UITableViewDataSource
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if 0 <= indexPath.row, indexPath.row < messages.count {
let message = messages[indexPath.row]
let msgType = message.getType()
if !message.isTextMessage() {
return UITableView.automaticDimension
}
let text = message.body.contentText // 要显示的文本内容
let font = UIFont.PFSC_R(ofSize: 14) // 字体大小
let maxWidth = KScreenWidth-20*2-16*2 // 最大宽度限制
let attributes = [NSAttributedString.Key.font : font] as [NSAttributedString.Key : Any]
let size = (text as NSString).boundingRect(with: CGSize(width: maxWidth, height: .greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: attributes, context: nil).size
var textHeight = ceil(size.height)
if textHeight < 20.0 {
textHeight = 20.0
}
if message.isSelf || msgType == .recommendText {
return textHeight + 16.0*2 + 16.0
}
let complete = message.isDone
let isNeedShowCopyView = complete
let isNeedShowLoadingView = !complete
var resultHeight = textHeight+16.0*2.0
if isNeedShowLoadingView {
resultHeight += (18+6)
}
if isNeedShowCopyView {
resultHeight += (16+37)
} else {
resultHeight += 16
}
return resultHeight
}
return UITableView.automaticDimension
}
......
......@@ -27,6 +27,9 @@ class YHAIRequestManager: NSObject {
var uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
var chatId = ""
var disableHandleMessage: Bool = false
func getCommonHeaders() -> HTTPHeaders {
var requestHeader = HTTPHeaders()
......@@ -58,10 +61,19 @@ class YHAIRequestManager: NSObject {
}
return requestHeader
}
func cancelCurrentRequest() {
self.request?.responseStreamString {
stream in
}
self.request?.cancel()
self.request = nil
}
func requestAI(botId: String, conversationId: String, question: String = "", callback: ((_ msg: YHAIChatMessage?, _ done: Bool) -> Void)?) {
self.disableHandleMessage = false
let url = YHBaseUrlManager.shared.curURL() + YHAllApiName.AIChat.agentChat
self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
......@@ -86,6 +98,10 @@ class YHAIRequestManager: NSObject {
[weak self] stream in
guard let self = self else { return }
if self.disableHandleMessage {
return
}
switch stream.event {
case let .stream(result):
......@@ -100,15 +116,15 @@ class YHAIRequestManager: NSObject {
case let .failure(error):
print("\(error)")
// 一段话结束需要重新生成uuid 来
self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
callback?(nil, true)
// self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
// callback?(nil, true)
}
case let .complete(completion):
print("COMPLETE")
// 一段话结束需要重新生成uuid 来
self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
callback?(nil, true)
// self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
// callback?(nil, true)
if let af_error = completion.error {
......@@ -166,7 +182,7 @@ class YHAIRequestManager: NSObject {
}
// 处理data字符串
func handle(dataString: String, completion:((_ : YHAIChatMessage, _ done: Bool) ->())?) {
func handle(dataString: String, completion:((_ : YHAIChatMessage?, _ done: Bool) ->())?) {
let arr = dataString.components(separatedBy: "\n\n")
if arr.count <= 0 {
......@@ -229,36 +245,40 @@ class YHAIRequestManager: NSObject {
self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
}
// if receiveMessage.isUserfulMessage() {
// completion?(receiveMessage, sessionDone)
// }
if receiveMessage.isUserfulMessage() {
if receiveMessage.isNeedSpiceMessage() {
let text = receiveMessage.body.contentText
if text.count > 1 {
let textArray = Array(text)
for (index, character) in textArray.enumerated() {
let msg = receiveMessage.copy() as! YHAIChatMessage
msg.body.contentText = String(character)
msg.body.status = ""
if index == textArray.count-1 {
msg.body.status = receiveMessage.body.status
}
msg.updateBodyToData()
printLog("AAAAA- \(msg)")
sessionDone = receiveMessage.body.isDone()
completion?(msg, sessionDone)
}
} else {
completion?(receiveMessage, sessionDone)
}
if receiveMessage.body.isDone() {
completion?(nil, sessionDone)
} else {
completion?(receiveMessage, sessionDone)
}
}
// if receiveMessage.isUserfulMessage() {
// if receiveMessage.isNeedSpiceMessage() {
// let text = receiveMessage.body.contentText
// if text.count > 1 {
// let textArray = Array(text)
// for (index, character) in textArray.enumerated() {
// let msg = receiveMessage.copy() as! YHAIChatMessage
// msg.body.contentText = String(character)
// msg.body.status = ""
// if index == textArray.count-1 {
// msg.body.status = receiveMessage.body.status
// }
// msg.updateBodyToData()
// printLog("AAAAA- \(msg)")
// sessionDone = receiveMessage.body.isDone()
// completion?(msg, sessionDone)
// }
//
// } else {
// completion?(receiveMessage, sessionDone)
// }
//
// } else {
// completion?(receiveMessage, sessionDone)
// }
// }
}
} // arr 结束
}
......
......@@ -31,7 +31,6 @@ class YHAIRobotChatViewController: YHBaseViewController {
}()
lazy var tableView: UITableView = {
let tableView = UITableView(frame: CGRectMake(0, 0, k_Height_NavigationtBarAndStatuBar, KScreenHeight-k_Height_NavigationtBarAndStatuBar-64-k_Height_safeAreaInsetsBottom()), style:.grouped)
if #available(iOS 11.0, *) {
......@@ -47,7 +46,7 @@ class YHAIRobotChatViewController: YHBaseViewController {
chatConfig.registerMessageGroupCells(tableView)
return tableView
}()
lazy var bgImgView: UIImageView = {
let v = UIImageView(image: UIImage(named: "ai_chat_bg"))
return v
......@@ -94,9 +93,7 @@ class YHAIRobotChatViewController: YHBaseViewController {
guard let self = self else { return }
if self.isNeedStopResonse() {
self.stopAutoResponse { success in
if success {
self.sendMessage(text, true)
}
self.sendMessage(text, true)
}
} else {
self.sendMessage(text, true)
......@@ -115,9 +112,7 @@ class YHAIRobotChatViewController: YHBaseViewController {
if self.isNeedStopResonse() {
self.stopAutoResponse { success in
if success {
self.sendMessage(text, true)
}
self.sendMessage(text, true)
}
} else {
self.sendMessage(text, true)
......@@ -189,25 +184,29 @@ class YHAIRobotChatViewController: YHBaseViewController {
func reloadAndScrollToBottom(_ forceScrollToBottom: Bool = false, _ isNeedAccurate: Bool = false) {
self.tableView.reloadData()
if !forceScrollToBottom && !canTriggerProgrammaticScroll() {
return
}
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
if isNeedAccurate {
// self.tableView.setContentOffset(.zero, animated: true)
// self.tableView.setContentOffset(CGPointMake(0, 90000), animated: true)
}
// 使用 performBatchUpdates 来确保所有布局更新完成后再滚动
self.tableView.performBatchUpdates(nil) { _ in
// 在布局更新完成后执行滚动
// 使用 UIView.animate 实现更丝滑的滚动效果
UIView.animate(withDuration: 0.5,
delay: 0,
usingSpringWithDamping: 1.0, // 弹簧阻尼,控制回弹效果
initialSpringVelocity: 0.3, // 初始速度
options: [.curveEaseOut, .allowUserInteraction],
animations: {
if self.messages.count > 0 {
let lastIndexPath = IndexPath(row: self.messages.count-1, section: 0)
self.tableView.scrollToRow(at: lastIndexPath, at: .bottom, animated: true)
self.tableView.scrollToRow(at: lastIndexPath, at: .bottom, animated: false)
}
}
}, completion: nil)
}
}
......@@ -219,22 +218,18 @@ class YHAIRobotChatViewController: YHBaseViewController {
messages.append(thinkingMessage)
self.bottomInputView.status = .loading
self.chatConfig.disableHandleMessage = false
self.manager.disableHandleMessage = false
self.reloadAndScrollToBottom(forceScrollToBottom)
self.manager.requestAI(botId: self.robotId, conversationId: self.conversationId, question:text) {
[weak self] res, done in
guard let self = self else { return }
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
[weak self] in
guard let self = self else { return }
self.chatConfig.handleReceiveMessage(res, done, &messages)
if done {
print("RESPONSE-DONE")
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
}
self.reloadAndScrollToBottom(forceScrollToBottom)
self.chatConfig.handleReceiveMessage(res, done, &messages)
if done {
print("RESPONSE-DONE")
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
}
self.reloadAndScrollToBottom(forceScrollToBottom)
}
}
......@@ -292,19 +287,15 @@ class YHAIRobotChatViewController: YHBaseViewController {
}
func stopAutoResponse(completion:((Bool)->())? = nil) {
self.manager.cancelCurrentRequest()
self.reloadAndScrollToBottom()
self.chatConfig.disableHandleMessage = true
self.manager.disableHandleMessage = true
self.chatConfig.removeThinkingMessageFromChatList(&self.messages)
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
completion?(true)
self.manager.stopChat(chatId: self.manager.chatId, conversationId: self.conversationId) { success, error in
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
if success {
self.reloadAndScrollToBottom()
self.manager.request?.cancel()
self.chatConfig.disableHandleMessage = true
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
self.chatConfig.removeThinkingMessageFromChatList(&self.messages)
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
self.tableView.reloadData()
completion?(success)
}
}
}
}
......@@ -415,9 +406,7 @@ extension YHAIRobotChatViewController: UITableViewDelegate, UITableViewDataSourc
if self.isNeedStopResonse() {
self.stopAutoResponse { success in
if success {
self.sendMessage(text, true)
}
self.sendMessage(text, true)
}
} else {
self.sendMessage(text, true)
......@@ -497,6 +486,47 @@ extension YHAIRobotChatViewController: UITableViewDelegate, UITableViewDataSourc
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if 0 <= indexPath.row, indexPath.row < messages.count {
let message = messages[indexPath.row]
let msgType = message.getType()
if !message.isTextMessage() {
return UITableView.automaticDimension
}
let text = message.body.contentText // 要显示的文本内容
let font = UIFont.PFSC_R(ofSize: 14) // 字体大小
let maxWidth = KScreenWidth-20*2-16*2 // 最大宽度限制
let attributes = [NSAttributedString.Key.font : font] as [NSAttributedString.Key : Any]
let size = (text as NSString).boundingRect(with: CGSize(width: maxWidth, height: .greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: attributes, context: nil).size
var textHeight = ceil(size.height)
if textHeight < 20.0 {
textHeight = 20.0
}
if message.isSelf || msgType == .recommendText {
return textHeight + 16.0*2 + 16.0
}
let complete = message.isDone
let isNeedShowCopyView = complete
let isNeedShowLoadingView = !complete
var resultHeight = textHeight+16.0*2.0
if isNeedShowLoadingView {
resultHeight += (18+6)
}
if isNeedShowCopyView {
resultHeight += (16+37)
} else {
resultHeight += 16
}
return resultHeight
}
return UITableView.automaticDimension
}
......
......@@ -154,7 +154,7 @@ class YHAIChatMessage: CustomStringConvertible, NSCopying {
//
func isUserfulMessage() -> Bool {
if !self.body.isStart() && !self.body.isDone() {
if !self.body.isStart() {
return true
}
return false
......
......@@ -30,7 +30,7 @@ class YHAITextMessageCell: UITableViewCell {
whiteContentView.snp.remakeConstraints { make in
make.left.greaterThanOrEqualTo(20)
make.right.equalTo(-20)
make.top.equalTo(20)
make.top.equalTo(16)
make.bottom.equalTo(0)
}
......@@ -46,11 +46,6 @@ class YHAITextMessageCell: UITableViewCell {
} else {
messageLabel.text = message.body.contentText
// let text = message.body.contentText
// if text.count >= message.body.contentTextIndex {
// messageLabel.text = String(text.prefix(message.body.contentTextIndex))
// }
whiteContentView.backgroundColor = .white
messageLabel.textColor = .mainTextColor
......@@ -58,7 +53,7 @@ class YHAITextMessageCell: UITableViewCell {
whiteContentView.snp.remakeConstraints { make in
make.left.equalTo(20)
make.right.equalTo(-20)
make.top.equalTo(20)
make.top.equalTo(16)
make.bottom.equalTo(0)
}
......
......@@ -136,7 +136,7 @@ private extension YHHomePageViewController {
if liveInfo.status == 1 {
let playbackInfo = YHPlayerManager.PlaybackInfo(id: liveInfo.id, token: liveInfo.token, channelId: liveInfo.rtmp_channel, uid: UInt(liveInfo.user_id), isLive: true, scene: .floating, playerType: .main)
YHPlayerManager.shared.enterFloating(from: nil, playbackInfo: playbackInfo, isConfigured: true)
} else {
} else if YHPlayerManager.shared.floatingWindow?.source == .configured {
YHPlayerManager.shared.exitFloating()
}
}
......
......@@ -24,17 +24,19 @@ class YHHomeBannerView: UIView {
self.indicatorView.curIndicatorIndex = 0
// 指定显示图片为第一个
bannerView.selectItem(at: 0, animated: false)
if let index = dataArr.firstIndex(where: {
$0.skip_type == 100
}) {
// 开启定时器开始滚动
bannerView.automaticSlidingInterval = 0
bannerView.scrollToItem(at: index, animated: false)
indicatorView.curIndicatorIndex = index
} else {
// 开启定时器开始滚动
bannerView.automaticSlidingInterval = bannerSildingInterval
}
// 开启定时器开始滚动
bannerView.automaticSlidingInterval = bannerSildingInterval
// if let index = dataArr.firstIndex(where: {
// $0.skip_type == 100
// }) {
// // 开启定时器开始滚动
// bannerView.automaticSlidingInterval = 0
// bannerView.scrollToItem(at: index, animated: false)
// indicatorView.curIndicatorIndex = index
// } else {
// // 开启定时器开始滚动
// bannerView.automaticSlidingInterval = bannerSildingInterval
// }
bannerView.removesInfiniteLoopForSingleItem = true
bannerView.alwaysBounceHorizontal = true
}
......@@ -244,10 +246,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
return
}
let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
if let player = YHPlayerManager.shared.getPlayer(.secondary) {
YHPlayerManager.shared.leaveChannel(for: player)
player.clearPlayerView()
}
// if let player = YHPlayerManager.shared.getPlayer(.secondary) {
// YHPlayerManager.shared.leaveChannel(for: player)
// player.clearPlayerView()
// }
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: nil, title: nil, roomId: nil, token: model.token, channelId: model.rtmp_channel, uid: model.user_id != 0 ? UInt(model.user_id) : nil, isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo)
printLog("跳转直播")
......@@ -268,10 +270,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
if !checkLogin() {
return
}
if let player = YHPlayerManager.shared.getPlayer(.secondary) {
YHPlayerManager.shared.leaveChannel(for: player)
player.clearPlayerView()
}
// if let player = YHPlayerManager.shared.getPlayer(.secondary) {
// YHPlayerManager.shared.leaveChannel(for: player)
// player.clearPlayerView()
// }
let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: model.live_pull_url, title: nil, roomId: nil, token: model.token, channelId: model.rtmp_channel, uid: UInt(model.user_id), isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo)
......@@ -291,7 +293,7 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
func pagerViewDidEndScrollAnimation(_ pagerView: FSPagerView) {
self.indicatorView.curIndicatorIndex = pagerView.currentIndex
}
/*
func pagerView(_ pagerView: FSPagerView, willDisplay cell: FSPagerViewCell, forItemAt index: Int) {
if index >= dataArr.count {
......@@ -333,4 +335,5 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
}
}
}
*/
}
......@@ -630,10 +630,10 @@ extension YHJsApi {
return
}
if type == 1 {
let playbackInfo = YHPlayerManager.PlaybackInfo(id: id.intValue(), isLive: true)
let playbackInfo = YHPlayerManager.PlaybackInfo(id: id.intValue(), isLive: true, isFromSaleDetail: true)
YHPlayerManager.shared.enterLive(from: nil, playbackInfo: playbackInfo)
} else if type == 2 {
let playbackInfo = YHPlayerManager.PlaybackInfo(id: id.intValue(), isLive: false, needHideZoomButton: true)
let playbackInfo = YHPlayerManager.PlaybackInfo(id: id.intValue(), isLive: false, isFromSaleDetail: true)
YHPlayerManager.shared.enterVOD(from: nil, playbackInfo: playbackInfo)
}
......
......@@ -27,6 +27,7 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
private var isFirstAppear = true
private var timer: DispatchSourceTimer?
private var isDisappearFromZoom = false
private let timeCount: Int = 120
// MARK: - UI Components
......@@ -182,9 +183,20 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
}
topBarView.zoomButtonClickEvent = { [weak self] in
self?.isDisappearFromZoom = true
self?.leaveLiveRoom()
self?.enterFloating()
if let playbackInfo = self?.playbackInfo, playbackInfo.isFromSaleDetail {
self?.clearInfo()
if let nav = self?.navigationController, nav.viewControllers.count > 1 {
nav.popViewController(animated: true)
} else {
self?.dismiss(animated: true)
}
} else {
self?.isDisappearFromZoom = true
self?.quitChatRoom()
self?.leaveLiveRoom()
// self?.clearInfo()
self?.enterFloating()
}
}
topBarView.shareButtonClickEvent = { [weak self] in
......@@ -315,11 +327,11 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
// MARK: - Public Methods
func play(url: String, title: String? = nil) {
currentPlayingURL = url
currentVideoTitle = title
YHPlayerManager.shared.play(url: url, inView: playerView, title: title)
}
// func play(url: String, title: String? = nil) {
// currentPlayingURL = url
// currentVideoTitle = title
// YHPlayerManager.shared.play(url: url, inView: playerView, title: title)
// }
func enterFloating() {
guard let playbackInfo = playbackInfo else {
......@@ -377,15 +389,23 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
}
}
}
private func closeLive() {
private func clearInfo() {
quitChatRoom()
leaveLiveRoom()
// YHPlayerManager.shared.stop(type: .main)
if let player = player {
YHPlayerManager.shared.leaveChannel(for: player)
}
dismiss(animated: true)
}
private func closeLive() {
clearInfo()
if let nav = navigationController, nav.viewControllers.count > 1 {
nav.popViewController(animated: true)
} else {
dismiss(animated: true)
}
}
private func shareLive() {
......@@ -618,7 +638,7 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
/// 设置定时器
private func setupTimer() {
timer = DispatchSource.makeTimerSource(queue: .main)
timer?.schedule(deadline: .now(), repeating: .seconds(120))
timer?.schedule(deadline: .now(), repeating: .seconds(timeCount))
timer?.setEventHandler(handler: { [weak self] in
guard let self = self else {
return
......
......@@ -31,7 +31,7 @@ class YHPlayerManager: NSObject {
let isLive: Bool
var scene: PlaybackScene
var playerType: YHPlayerType
var needHideZoomButton: Bool = false
var isFromSaleDetail: Bool = false
init(id: Int,
url: String? = nil,
......@@ -43,7 +43,7 @@ class YHPlayerManager: NSObject {
isLive: Bool,
scene: PlaybackScene = .fullscreen,
playerType: YHPlayerType = .main,
needHideZoomButton: Bool = false) {
isFromSaleDetail: Bool = false) {
self.id = id
self.url = url
self.title = title
......@@ -54,7 +54,7 @@ class YHPlayerManager: NSObject {
self.isLive = isLive
self.scene = scene
self.playerType = playerType
self.needHideZoomButton = needHideZoomButton
self.isFromSaleDetail = isFromSaleDetail
}
static func == (lhs: Self, rhs: Self) -> Bool {
......@@ -71,7 +71,7 @@ class YHPlayerManager: NSObject {
private var secondaryChannelDelegate: YHSecondaryChannelDelegate?
private var activePlayers: [YHPlayerType: YHPlayer] = [:]
private var currentPlaybackInfo: [YHPlayerType: PlaybackInfo] = [:]
private var floatingWindow: YHFloatingWindow?
private(set) var floatingWindow: YHFloatingWindow?
private(set) var isInRecommendPage: Bool = false
private(set) var isConfigFloating: Bool? = nil
private var bannerAutoPlayEnabled: Bool = true
......@@ -145,7 +145,7 @@ class YHPlayerManager: NSObject {
activePlayers.forEach { $0.value.stop() }
// 释放副播放器
releasePlayer(.secondary)
//releasePlayer(.secondary)
// 清理播放信息
currentPlaybackInfo.removeAll()
......@@ -302,14 +302,14 @@ class YHPlayerManager: NSObject {
// 如果是从banner跳转,需要转移播放进度
var startPosition: Int = 0
if let bannerPlayer = activePlayers[.secondary] {
startPosition = bannerPlayer.getPosition()
if bannerPlayer.playMode == .live {
leaveChannel(for: bannerPlayer)
} else {
bannerPlayer.pause()
}
}
// if let bannerPlayer = activePlayers[.secondary] {
// startPosition = bannerPlayer.getPosition()
// if bannerPlayer.playMode == .live {
// leaveChannel(for: bannerPlayer)
// } else {
// bannerPlayer.pause()
// }
// }
var lastVodVC: YHVODPlayerViewController?
var lastNav: UINavigationController?
var lastLiveVC: YHLivePlayerViewController?
......@@ -372,13 +372,13 @@ class YHPlayerManager: NSObject {
updatedInfo.playerType = playerType
// 如果是从banner跳转,需要转移播放进度
if let bannerPlayer = activePlayers[.secondary] {
if bannerPlayer.playMode == .live {
leaveChannel(for: bannerPlayer)
} else {
bannerPlayer.pause()
}
}
// if let bannerPlayer = activePlayers[.secondary] {
// if bannerPlayer.playMode == .live {
// leaveChannel(for: bannerPlayer)
// } else {
// bannerPlayer.pause()
// }
// }
var lastVodVC: YHVODPlayerViewController?
var lastNav: UINavigationController?
var lastLiveVC: YHLivePlayerViewController?
......@@ -471,13 +471,13 @@ class YHPlayerManager: NSObject {
}
// 如果是从banner跳转,需要转移播放进度
if let bannerPlayer = activePlayers[.secondary] {
if bannerPlayer.playMode == .live {
leaveChannel(for: bannerPlayer)
} else {
bannerPlayer.pause()
}
}
// if let bannerPlayer = activePlayers[.secondary] {
// if bannerPlayer.playMode == .live {
// leaveChannel(for: bannerPlayer)
// } else {
// bannerPlayer.pause()
// }
// }
let playerType = determinePlayerType(for: .floating)
let player: YHPlayer = player(for: playerType)
......@@ -781,20 +781,20 @@ extension YHPlayerManager {
if isRecommendPage {
if isConfigFloating == true {
if let window = floatingWindow, let player = window.player, window.source == .configured {
stopBannerPlayback()
//stopBannerPlayback()
resumeConfiguredFloatingWindow(window, player)
}
} else {
if let window = floatingWindow, window.source == .configured {
exitFloating()
}
enableBannerAutoPlay()
//enableBannerAutoPlay()
}
} else {
if let window = floatingWindow, window.source == .configured {
exitFloating()
}
stopBannerPlayback()
//stopBannerPlayback()
}
}
......@@ -828,45 +828,45 @@ extension YHPlayerManager {
}
}
private func stopBannerPlayback() {
bannerAutoPlayEnabled = false
if let player = getPlayer(.secondary) {
if player.playMode == .live {
leaveChannel(for: player)
} else {
player.stop()
}
}
}
// private func stopBannerPlayback() {
// bannerAutoPlayEnabled = false
// if let player = getPlayer(.secondary) {
// if player.playMode == .live {
// leaveChannel(for: player)
// } else {
// player.stop()
// }
// }
// }
private func resumeBannerPlayback() {
guard bannerAutoPlayEnabled, let bannerPlayerView = bannerPlayerView else {
return
}
if let player = getPlayer(.secondary) {
if let playbackInfo = currentPlaybackInfo[.secondary] {
if playbackInfo.isLive {
if let token = playbackInfo.token,
let channelId = playbackInfo.channelId,
let uid = playbackInfo.uid {
joinChannel(for: player,
token: token,
channelId: channelId,
uid: uid,
view: bannerPlayerView, defaultMuted: true)
}
} else {
if let url = playbackInfo.url {
player.play(url: url,
title: playbackInfo.title,
view: bannerPlayerView)
player.isMuted = true
}
}
}
}
}
// private func resumeBannerPlayback() {
// guard bannerAutoPlayEnabled, let bannerPlayerView = bannerPlayerView else {
// return
// }
// if let player = getPlayer(.secondary) {
// if let playbackInfo = currentPlaybackInfo[.secondary] {
// if playbackInfo.isLive {
// if let token = playbackInfo.token,
// let channelId = playbackInfo.channelId,
// let uid = playbackInfo.uid {
// joinChannel(for: player,
// token: token,
// channelId: channelId,
// uid: uid,
// view: bannerPlayerView, defaultMuted: true)
// }
// } else {
// if let url = playbackInfo.url {
// player.play(url: url,
// title: playbackInfo.title,
// view: bannerPlayerView)
// player.isMuted = true
// }
// }
// }
//
// }
// }
private func enableBannerAutoPlay() {
bannerAutoPlayEnabled = true
......
......@@ -22,6 +22,11 @@ class YHVODPlayerViewController: YHBasePlayerViewController {
return view
}()
private lazy var bottomImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "live_player_bg"))
return imageView
}()
private var isFirstAppear = true
// MARK: - Initialization
......@@ -58,16 +63,27 @@ class YHVODPlayerViewController: YHBasePlayerViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// if !isFirstAppear {
// player?.resume()
// }
if player?.currentURL != nil {
player?.resume()
if !isFirstAppear {
if player?.getPlayState() != .paused {
if let url = playbackInfo?.url {
play(url: url, title: playbackInfo?.title)
player?.seek(to: startPosition)
player?.resume()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: {
self.progressControl.setPlaying(self.player?.getPlayState() == .playing)
})
}
} else {
player?.resume()
}
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let player = player {
startPosition = player.getPosition()
}
player?.pause()
}
......@@ -81,6 +97,11 @@ class YHVODPlayerViewController: YHBasePlayerViewController {
// MARK: - SetupView
private func setupUI() {
playerView.addSubview(bottomImageView)
bottomImageView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
containerView.addSubview(progressControl)
progressControl.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
......@@ -127,7 +148,11 @@ class YHVODPlayerViewController: YHBasePlayerViewController {
private func closeLive() {
YHPlayerManager.shared.stop(type: .main)
dismiss(animated: true)
if let nav = navigationController, nav.viewControllers.count > 1 {
nav.popViewController(animated: true)
} else {
dismiss(animated: true)
}
}
private func shareLive() {
......
......@@ -118,6 +118,11 @@ class YHFloatingWindow: NSObject {
view.frame = CGRect(x: 0, y: 0, width: Size.defaultWidth, height: 20)
return view
}()
private lazy var bottomImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "live_player_bg"))
return imageView
}()
// MARK: - Initialization
......@@ -143,7 +148,7 @@ class YHFloatingWindow: NSObject {
containerView.layer.shadowOffset = CGSize(width: 0, height: 2)
containerView.layer.shadowRadius = 4
containerView.layer.shadowOpacity = 0.3
containerView.addSubview(contentView)
contentView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
......@@ -152,6 +157,15 @@ class YHFloatingWindow: NSObject {
contentView.topAnchor.constraint(equalTo: containerView.topAnchor),
contentView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
])
contentView.addSubview(bottomImageView)
bottomImageView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
bottomImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
bottomImageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
bottomImageView.topAnchor.constraint(equalTo: contentView.topAnchor),
bottomImageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
])
containerView.addSubview(closeButtonContainer)
closeButtonContainer.translatesAutoresizingMaskIntoConstraints = false
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment