diff --git a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/media/MedialControlFacade.kt b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/media/MedialControlFacade.kt index 0d09802484..99d04bc74c 100644 --- a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/media/MedialControlFacade.kt +++ b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/media/MedialControlFacade.kt @@ -17,36 +17,44 @@ internal object MedialControlFacade : IMoGoMediaFacade { } override fun play(context: Context, audioSources: Int, isLoop: Boolean, channel: Int) { - val player = player.get()?.get() ?: MediaPlayer().also { player.set(WeakReference(it)) } - resetStatus(player) - val file = context.resources.openRawResourceFd(audioSources) - player.apply { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - setAudioStreamType(channel) - } else { - setAudioAttributes(AudioAttributes.Builder().setLegacyStreamType(channel).build()) - } - setDataSource(file.fileDescriptor, file.startOffset, file.length) - file.close() - isLooping = isLoop - prepareAsync() - setOnPreparedListener { player -> - log(ChatConsts.TAG,"real play 准备播放音频====") - player.start() - } - setOnCompletionListener { player -> - log(ChatConsts.TAG,"播放完成====") - player.reset() + try { + val player = player.get()?.get() ?: MediaPlayer().also { player.set(WeakReference(it)) } + resetStatus(player) + val file = context.resources.openRawResourceFd(audioSources) + player.apply { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + setAudioStreamType(channel) + } else { + setAudioAttributes(AudioAttributes.Builder().setLegacyStreamType(channel).build()) + } + setDataSource(file.fileDescriptor, file.startOffset, file.length) + file.close() + isLooping = isLoop + prepareAsync() + setOnPreparedListener { player -> + log(ChatConsts.TAG,"real play 准备播放音频====") + player.start() + } + setOnCompletionListener { player -> + log(ChatConsts.TAG,"播放完成====") + player.reset() + } } + } catch (t: Throwable) { + log(ChatConsts.TAG, "播放铃声异常:$t") } } override fun release() { - val player = this.player.get()?.get() ?: return - log(ChatConsts.TAG,"release 释放音频播放====") - player.run { - resetStatus(this) - release() + try { + val player = this.player.get()?.get() ?: return + log(ChatConsts.TAG,"release 释放音频播放====") + player.run { + resetStatus(this) + release() + } + } catch (t: Throwable) { + log(ChatConsts.TAG, "释放MediaPlay异常: $t") } } diff --git a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/ui/CallChatWindowManager.kt b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/ui/CallChatWindowManager.kt index e1529b3690..02d8a353b6 100644 --- a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/ui/CallChatWindowManager.kt +++ b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/ui/CallChatWindowManager.kt @@ -69,6 +69,10 @@ internal class CallChatWindowManager { private var hasHangUpped = false + private var isInComingShow = false + private var isCallingShow = false + + @OptIn(ExperimentalCoroutinesApi::class) private var interrupt = Channel(RENDEZVOUS) @Synchronized @@ -141,10 +145,14 @@ internal class CallChatWindowManager { var refuse = incomingView.findViewById(R.id.module_carchatting_incoming_hangUp) val dismissJob = AtomicReference() var timer: Job? = null - var ring: Job? = null + var ring: Job? launch { - speak(REQUEST_CLOUD_VOICE_CALL) - calling() + try { + speak(REQUEST_CLOUD_VOICE_CALL) + calling() + } catch (t: Throwable) { + log(TAG, "来电呼叫异常:$t") + } }.also { ring = it } answer.onClick { timer = resetInComingTimer(timer, user, incomingView) @@ -160,10 +168,11 @@ internal class CallChatWindowManager { ToastUtils.showShort("正在处理, 请稍候...") return@onClick } - doRefuse(user) + doRefuse(user, inComingView = incomingView, isAnswerFail = false) } incomingView.observe(arrayOf(ON_CREATE, ON_DESTROY)) { itx -> if (itx == ON_CREATE) { + isInComingShow = true timer = inComingTimer(user, incomingView) launch(Dispatchers.Main) { val d1 = async { @@ -201,6 +210,7 @@ internal class CallChatWindowManager { }.also { dismissJob.set(it) } } if (itx == ON_DESTROY) { + isInComingShow = false ring?.safeCancel() timer?.safeCancel() hasAnswered = false @@ -263,7 +273,7 @@ internal class CallChatWindowManager { log(TAG, "延迟30s消失计时开始...") delay(DEFAULT_MAX_DIALING_TIME) log(TAG, "延迟30s消失计时结束...") - doRefuse(user, false) + doRefuse(user, false, incomingView, false) hide(incomingView) releaseAudioAndVoice() } @@ -300,9 +310,10 @@ internal class CallChatWindowManager { } doHangUp(user, callingView) } - callingView.observe(arrayOf(ON_CREATE, ON_DESTROY)) { + callingView.observe(arrayOf(ON_CREATE, ON_DESTROY)) { itx -> var job: Job? = null - if (it == ON_CREATE) { + if (itx == ON_CREATE) { + isCallingShow = true launch(Dispatchers.Main) { val d1 = async { log(ChatConsts.TAG, "等着新用户进来...") @@ -344,7 +355,8 @@ internal class CallChatWindowManager { facade.audioFocus().releaseAudioFocus() }.also { job = it } } - if (it == ON_DESTROY) { + if (itx == ON_DESTROY) { + isCallingShow = false job?.safeCancel() callerEnter.safeCancel() exitRoom.safeCancel() @@ -407,23 +419,29 @@ internal class CallChatWindowManager { } private fun onNewUserEnterRoom() { + if (!isCallingShow) { + return + } scope.launch { callerEnter.send(true) } } private fun onCallInterrupt() { + if (!isInComingShow) { + return + } scope.launch { interrupt.send(true) } } - private fun doAnswer(user: UserInfo, incommingView: View) { + private fun doAnswer(user: UserInfo, inComingView: View) { answer( user, onEnter = { releaseAudioAndVoice() - hide(incommingView) + hide(inComingView) showCallingView(user) }, onNewEnter = { @@ -442,9 +460,9 @@ internal class CallChatWindowManager { ToastUtils.showShort("应答失败") } } - doRefuse(user, false) + doRefuse(user, false, inComingView, true) releaseAudioAndVoice() - hide(incommingView) + hide(inComingView) facade.audioFocus().releaseAudioFocus() } ) @@ -489,7 +507,7 @@ internal class CallChatWindowManager { } } - private fun doRefuse(user: UserInfo, notify: Boolean = true) { + private fun doRefuse(user: UserInfo, notify: Boolean = true, inComingView: View, isAnswerFail: Boolean) { refuse(user, onSuccess = { if (notify) { @@ -499,7 +517,14 @@ internal class CallChatWindowManager { }, onError = { code, msg, extra -> log(TAG, "-- 拒绝失败 --: code:: $code; msg:: $msg; extra:: $extra") - ToastUtils.showShort("拒绝异常") + if (isAnswerFail) { + ToastUtils.showShort("应答异常") + } else { + ToastUtils.showShort("拒绝异常") + } + releaseAudioAndVoice() + hide(inComingView) + facade.audioFocus().releaseAudioFocus() }) } @@ -543,12 +568,18 @@ internal class CallChatWindowManager { } private fun exitRoom() { + if (!isCallingShow) { + return + } scope.launch { exitRoom.send(true) } } private fun onRefuseOK() { + if (!isInComingShow) { + return + } scope.launch { refused.send(true) }