|
|
@@ -1,8 +1,12 @@
|
|
|
package com.adealink.weparty.im.session.comp
|
|
|
|
|
|
+import android.Manifest
|
|
|
import android.annotation.SuppressLint
|
|
|
+import androidx.fragment.app.FragmentActivity
|
|
|
import androidx.lifecycle.LifecycleOwner
|
|
|
+import androidx.lifecycle.lifecycleScope
|
|
|
import com.adealink.frame.aab.util.getCompatColor
|
|
|
+import com.adealink.frame.aab.util.getCompatString
|
|
|
import com.adealink.frame.log.Log
|
|
|
import com.adealink.frame.mvvm.view.ViewComponent
|
|
|
import com.adealink.frame.mvvm.viewmodel.activityViewModels
|
|
|
@@ -18,15 +22,19 @@ import com.adealink.weparty.im.session.comp.input.InputState
|
|
|
import com.adealink.weparty.im.session.comp.viewmodel.SessionAudioViewModel
|
|
|
import com.adealink.weparty.im.session.comp.viewmodel.SessionInputViewModel
|
|
|
import com.adealink.weparty.module.im.data.TAG_IM_AUDIO
|
|
|
-import com.tencent.qcloud.tuicore.TUIConstants
|
|
|
+import com.adealink.weparty.permission.PermissionUtils
|
|
|
+import com.tencent.qcloud.tuicore.TUIConstants.TUICalling
|
|
|
import com.tencent.qcloud.tuikit.tuichat.bean.ChatInfo
|
|
|
import com.tencent.qcloud.tuikit.tuichat.component.audio.AudioPlayer
|
|
|
import com.tencent.qcloud.tuikit.tuichat.component.audio.AudioRecorder
|
|
|
import com.tencent.qcloud.tuikit.tuichat.component.audio.AudioRecorder.AudioRecorderCallback
|
|
|
import com.tencent.qcloud.tuikit.tuichat.presenter.ChatPresenter
|
|
|
import com.tencent.qcloud.tuikit.tuichat.util.ChatMessageBuilder
|
|
|
+import kotlinx.coroutines.launch
|
|
|
+import kotlinx.coroutines.suspendCancellableCoroutine
|
|
|
import java.util.Timer
|
|
|
import java.util.TimerTask
|
|
|
+import kotlin.coroutines.resume
|
|
|
import kotlin.math.max
|
|
|
import kotlin.math.pow
|
|
|
import com.adealink.weparty.R as APP_R
|
|
|
@@ -208,9 +216,10 @@ class SessionBottomAudioComp(
|
|
|
"startAudioRecord, onFailed, errorCode:$errorCode, errorMessage:$errorMessage"
|
|
|
)
|
|
|
hideVoiceLayout()
|
|
|
- if (errorCode == TUIConstants.TUICalling.ERROR_MIC_PERMISSION_REFUSED) {
|
|
|
+ if (errorCode == TUICalling.ERROR_MIC_PERMISSION_REFUSED) {
|
|
|
//没有授予权限
|
|
|
- } else if (errorCode == AudioRecorder.ERROR_CODE_MIC_IS_BEING_USED || errorCode == TUIConstants.TUICalling.ERROR_STATUS_IN_CALL) {
|
|
|
+ requestPermission()
|
|
|
+ } else if (errorCode == AudioRecorder.ERROR_CODE_MIC_IS_BEING_USED || errorCode == TUICalling.ERROR_STATUS_IN_CALL) {
|
|
|
showToast(R.string.im_mic_is_being_used_cant_record)
|
|
|
} else {
|
|
|
showToast(R.string.im_record_audio_failed)
|
|
|
@@ -246,6 +255,47 @@ class SessionBottomAudioComp(
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ private fun requestPermission() {
|
|
|
+ val act = activity ?: return
|
|
|
+ viewLifecycleOwner.lifecycleScope.launch {
|
|
|
+ val granted = requestPermission(act)
|
|
|
+ if (granted) {
|
|
|
+ inputViewModel.execute(InputAction.CLICK_AUDIO)
|
|
|
+ } else {
|
|
|
+ inputViewModel.execute(InputAction.EMPTY_CLICKED)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private val permissions = arrayOf(Manifest.permission.RECORD_AUDIO)
|
|
|
+ private suspend fun requestPermission(activity: FragmentActivity): Boolean {
|
|
|
+ return suspendCancellableCoroutine { coroutine ->
|
|
|
+ if (PermissionUtils.hasPermissions(activity, *permissions)) {
|
|
|
+ if (coroutine.isActive) {
|
|
|
+ coroutine.resume(true)
|
|
|
+ }
|
|
|
+ return@suspendCancellableCoroutine
|
|
|
+ }
|
|
|
+ PermissionUtils.requestPermissions(
|
|
|
+ activity,
|
|
|
+ permissions.toList(),
|
|
|
+ getCompatString(R.string.im_audio_permission_request_tips),
|
|
|
+ onGranted = {
|
|
|
+ if (coroutine.isActive) {
|
|
|
+ coroutine.resume(true)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onDenied = {
|
|
|
+ if (coroutine.isActive) {
|
|
|
+ coroutine.resume(false)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private fun pauseAudioRecord() {
|
|
|
Log.d(TAG_IM_AUDIO, "pauseAudioRecord")
|
|
|
voiceBar.vVoiceWave.pause()
|