Browse Source

feat: 修复多窗口IM无法发送语音

DoggyZhang 2 weeks ago
parent
commit
6bc3b291f2

+ 12 - 0
app/src/main/java/com/adealink/weparty/util/WindowUtil.kt

@@ -29,4 +29,16 @@ fun Activity?.applyImmersive(onMargin: (top: Int) -> Unit) {
     }
 
     onMargin.invoke(statusBarHeight())
+}
+
+fun Activity?.isMultiWindowMode(): Boolean {
+    if (this == null) {
+        return false
+    }
+
+    //多窗口/画中画
+    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+        return isInMultiWindowMode || isInPictureInPictureMode
+    }
+    return false
 }

+ 7 - 1
module/im/src/main/java/com/adealink/weparty/im/session/SessionFragment.kt

@@ -49,6 +49,7 @@ import com.tencent.qcloud.tuikit.tuichat.bean.GroupChatInfo
 import com.tencent.qcloud.tuikit.tuichat.bean.message.TextMessageBean
 import com.tencent.qcloud.tuikit.tuichat.component.audio.AudioPlayer
 import com.tencent.qcloud.tuikit.tuichat.component.audio.AudioRecorder
+import com.tencent.qcloud.tuikit.tuichat.interfaces.OnEmptySpaceClickListener
 import com.tencent.qcloud.tuikit.tuichat.interfaces.OnGestureScrollListener
 import com.tencent.qcloud.tuikit.tuichat.presenter.C2CChatPresenter
 import com.tencent.qcloud.tuikit.tuichat.presenter.ChatPresenter
@@ -111,6 +112,11 @@ class SessionFragment : BaseFragment(R.layout.fragment_session) {
         sessionAdapter.setOnItemClickListener(onMessageItemClickListener)
         sessionAdapter.setOnPlaymateOrderClickListener(onOrderMessageItemClick)
         binding.rvMessage.addItemDecoration(VerticalSpaceItemDecoration(0, 24.dp(), 10.dp()))
+        binding.rvMessage.emptySpaceClickListener = object : OnEmptySpaceClickListener {
+            override fun onClick() {
+                inputViewModel.execute(InputAction.EMPTY_CLICKED)
+            }
+        }
         binding.rvMessage.setOnGestureScrollListener(object : OnGestureScrollListener {
             override fun onScroll(
                 m1: MotionEvent?,
@@ -193,7 +199,7 @@ class SessionFragment : BaseFragment(R.layout.fragment_session) {
             messageList.doOnPreDraw {
                 messageList.scrollToEnd()
             }
-            inputViewModel.notifySoftInputVisible(bottomInset > 0)
+            inputViewModel.notifyBottomSoftInputVisible(bottomInset > 0)
             insets
         }
     }

+ 16 - 2
module/im/src/main/java/com/adealink/weparty/im/session/comp/SessionBottomInputComp.kt

@@ -6,6 +6,7 @@ import android.text.Editable
 import android.text.TextWatcher
 import android.view.KeyEvent
 import android.view.MotionEvent
+import android.view.View
 import android.view.inputmethod.EditorInfo
 import android.widget.TextView
 import android.widget.TextView.OnEditorActionListener
@@ -32,6 +33,7 @@ import com.adealink.weparty.im.session.comp.input.InputAction
 import com.adealink.weparty.im.session.comp.input.InputState
 import com.adealink.weparty.im.session.comp.viewmodel.SessionInputViewModel
 import com.adealink.weparty.module.im.data.TAG_IM_SESSION
+import com.adealink.weparty.util.isMultiWindowMode
 import com.qmuiteam.qmui.widget.util.QMUIKeyboardHelper
 import com.tencent.qcloud.tuikit.timcommon.bean.ChatFace
 import com.tencent.qcloud.tuikit.timcommon.component.face.FaceManager
@@ -156,6 +158,17 @@ class SessionBottomInputComp(
                 return true
             }
         })
+        inputBar.etInputMessage.onFocusChangeListener = object : View.OnFocusChangeListener {
+            override fun onFocusChange(v: View?, hasFocus: Boolean) {
+                //多窗口模式
+                if (activity.isMultiWindowMode()) {
+                    if (hasFocus) {
+                        //获取焦点
+                        sessionInputViewModel.execute(InputAction.CLICK_INPUT)
+                    }
+                }
+            }
+        }
         inputBar.etInputMessage.addTextChangedListener(object : TextWatcher {
             override fun beforeTextChanged(
                 s: CharSequence?,
@@ -319,8 +332,9 @@ class SessionBottomInputComp(
             }
         }
 
-        sessionInputViewModel.inputVisibleLD.observe(viewLifecycleOwner) { visible ->
-            if (!visible) {
+        //处理非全屏窗口底部输入栏
+        sessionInputViewModel.bottomImeVisibleLD.observe(viewLifecycleOwner) { visible ->
+            if (!activity.isMultiWindowMode() && !visible) {
                 if (sessionInputViewModel.inputStateLD.value?.currentState != InputState.STATE_NONE) {
                     sessionInputViewModel.execute(InputAction.EMPTY_CLICKED)
                 }

+ 3 - 3
module/im/src/main/java/com/adealink/weparty/im/session/comp/viewmodel/SessionInputViewModel.kt

@@ -43,10 +43,10 @@ data class SessionInputState(
 
 class SessionInputViewModel : BaseViewModel() {
 
-    val inputVisibleLD = ExtMutableLiveData<Boolean>()
+    val bottomImeVisibleLD = ExtMutableLiveData<Boolean>()
 
-    fun notifySoftInputVisible(visible: Boolean) {
-        inputVisibleLD.send(visible)
+    fun notifyBottomSoftInputVisible(visible: Boolean) {
+        bottomImeVisibleLD.send(visible)
     }
 
 

+ 1 - 4
module/im/src/main/java/com/adealink/weparty/im/session/widget/MessageRecyclerView.kt

@@ -100,10 +100,7 @@ class MessageRecyclerView @JvmOverloads constructor(
                 }
 
                 override fun onDown(e: MotionEvent): Boolean {
-                    return emptySpaceClickListener?.let {
-                        it.onClick()
-                        true
-                    } ?: false
+                    return false
                 }
 
                 override fun onScroll(