[Chat]车聊聊异常逻辑优化

[Chat]车聊聊异常逻辑优化
This commit is contained in:
renwj
2022-04-01 17:32:03 +08:00
parent 1d2071d95f
commit 0a094e4751
2 changed files with 78 additions and 39 deletions

View File

@@ -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")
}
}

View File

@@ -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<Boolean>(RENDEZVOUS)
@Synchronized
@@ -141,10 +145,14 @@ internal class CallChatWindowManager {
var refuse = incomingView.findViewById<View>(R.id.module_carchatting_incoming_hangUp)
val dismissJob = AtomicReference<Job>()
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)
}