[Chat]车聊聊异常逻辑优化
[Chat]车聊聊异常逻辑优化
This commit is contained in:
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user