Jelajahi Sumber

[feat]键盘插件,修复选择键盘列表,会有2个同时选中的问题

hezihao 6 bulan lalu
induk
melakukan
c6a9174fc8

+ 73 - 46
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/mvvm/viewmodel/KeyboardViewModel.kt

@@ -2,6 +2,8 @@ package com.atmob.keyboard_android.mvvm.viewmodel
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.asLiveData
+import androidx.lifecycle.viewModelScope
 import com.atmob.keyboard_android.enums.HelpMode
 import com.atmob.keyboard_android.enums.KeyboardGlobalType
 import com.atmob.keyboard_android.enums.KeyboardType
@@ -16,6 +18,7 @@ import com.atmob.keyboard_android.util.bridge.model.resp.KeyboardInfo
 import com.atmob.keyboard_android.util.bridge.model.resp.PrologueListResp.PrologueListItem
 import com.atmob.keyboard_android.util.bridge.model.resp.PrologueListResp.Topic
 import com.atmob.keyboard_android.util.error.ErrorHandler
+import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.single
 
 /**
@@ -32,50 +35,57 @@ class KeyboardViewModel : BaseViewModel() {
     /**
      * 登录页,是否展示
      */
-    private val _loginPageShowing = MutableLiveData(false)
-    val loginPageShowing: LiveData<Boolean> = _loginPageShowing
+    private val _loginPageShowing = MutableStateFlow(false)
+    val loginPageShowing: LiveData<Boolean> =
+        _loginPageShowing.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * 设置页,是否展示
      */
-    private val _settingPageShowing = MutableLiveData(false)
-    val settingPageShowing: LiveData<Boolean> = _settingPageShowing
+    private val _settingPageShowing = MutableStateFlow(false)
+    val settingPageShowing: LiveData<Boolean> =
+        _settingPageShowing.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * VIP页,是否显示
      */
-    private val _vipPageShowing = MutableLiveData(false)
-    val vipPageShowing: LiveData<Boolean> = _vipPageShowing
+    private val _vipPageShowing = MutableStateFlow(false)
+    val vipPageShowing: LiveData<Boolean> =
+        _vipPageShowing.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * 键盘选择页,是否显示
      */
-    private val _keyboardSelectPageShowing = MutableLiveData(false)
-    val keyboardSelectPageShowing: LiveData<Boolean> = _keyboardSelectPageShowing
+    private val _keyboardSelectPageShowing = MutableStateFlow(false)
+    val keyboardSelectPageShowing: LiveData<Boolean> =
+        _keyboardSelectPageShowing.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * 超会说-Ai生成内容页,是否显示
      */
-    private val _superSpeakAiChatPageShowing = MutableLiveData(false)
-    val superSpeakAiChatPageShowing: LiveData<Boolean> = _superSpeakAiChatPageShowing
+    private val _superSpeakAiChatPageShowing = MutableStateFlow(false)
+    val superSpeakAiChatPageShowing: LiveData<Boolean> =
+        _superSpeakAiChatPageShowing.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * 开场白-Ai生成内容页,是否显示
      */
-    private val _prologueAiChatPageShowing = MutableLiveData(false)
-    val prologueAiChatPageShowing: LiveData<Boolean> = _prologueAiChatPageShowing
+    private val _prologueAiChatPageShowing = MutableStateFlow(false)
+    val prologueAiChatPageShowing: LiveData<Boolean> =
+        _prologueAiChatPageShowing.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * 帮助模式,帮聊、教你说、开场白等
      */
-    private val _helpMode = MutableLiveData(HelpMode.HELP_CHAT)
-    val helpMode: LiveData<HelpMode> = _helpMode
+    private val _helpMode = MutableStateFlow(HelpMode.HELP_CHAT)
+    val helpMode: LiveData<HelpMode> = _helpMode.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * 全局键盘类型
      */
-    private val _keyboardGlobalType = MutableLiveData(KeyboardGlobalType.AI_KEYBOARD)
-    val keyboardGlobalType: LiveData<KeyboardGlobalType> = _keyboardGlobalType
+    private val _keyboardGlobalType = MutableStateFlow(KeyboardGlobalType.AI_KEYBOARD)
+    val keyboardGlobalType: LiveData<KeyboardGlobalType> =
+        _keyboardGlobalType.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * 当前键盘信息
@@ -92,45 +102,52 @@ class KeyboardViewModel : BaseViewModel() {
     /**
      * 人设列表
      */
-    private val _characterList = MutableLiveData<List<CharacterInfo>>()
-    val characterList: LiveData<List<CharacterInfo>> = _characterList
+    private val _characterList = MutableStateFlow<List<CharacterInfo>>(listOf())
+    val characterList: LiveData<List<CharacterInfo>> =
+        _characterList.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * 开场白列表
      */
     private val _prologueList =
-        MutableLiveData<List<PrologueListItem>>()
-    val prologueList: LiveData<List<PrologueListItem>> = _prologueList
+        MutableStateFlow<List<PrologueListItem>>(listOf())
+    val prologueList: LiveData<List<PrologueListItem>> =
+        _prologueList.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * AI聊天-超会回(帮聊)结果
      */
-    private val _chatSuperReplyResult = MutableLiveData<String>()
-    val chatSuperReplyResult: LiveData<String> = _chatSuperReplyResult
+    private val _chatSuperReplyResult = MutableStateFlow<String>("")
+    val chatSuperReplyResult: LiveData<String> =
+        _chatSuperReplyResult.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * AI聊天-超会说(教你说)结果
      */
-    private val _superSpeakChatListResult = MutableLiveData<List<String>>()
-    val superSpeakChatListResult: LiveData<List<String>> = _superSpeakChatListResult
+    private val _superSpeakChatListResult = MutableStateFlow<List<String>>(listOf())
+    val superSpeakChatListResult: LiveData<List<String>> =
+        _superSpeakChatListResult.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * AI聊天-开场白结果
      */
-    private val _prologueChatListResult = MutableLiveData<List<String>>()
-    val prologueChatListResult: LiveData<List<String>> = _prologueChatListResult
+    private val _prologueChatListResult = MutableStateFlow<List<String>>(listOf())
+    val prologueChatListResult: LiveData<List<String>> =
+        _prologueChatListResult.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * 用户的剪切板数据
      */
-    private val _userClipboardData = MutableLiveData("")
-    val userClipboardData: LiveData<String> = _userClipboardData
+    private val _userClipboardData = MutableStateFlow("")
+    val userClipboardData: LiveData<String> =
+        _userClipboardData.asLiveData(viewModelScope.coroutineContext)
 
     /**
      * 键盘选择列表数据
      */
-    private val _keyboardList = MutableLiveData<List<KeyboardInfo>>()
-    val keyboardList: LiveData<List<KeyboardInfo>> = _keyboardList
+    private val _keyboardList = MutableStateFlow<List<KeyboardInfo>>(listOf())
+    val keyboardList: LiveData<List<KeyboardInfo>> =
+        _keyboardList.asLiveData(viewModelScope.coroutineContext)
 
     // ----------------------------------- 更新状态方法 -----------------------------------
 
@@ -250,21 +267,33 @@ class KeyboardViewModel : BaseViewModel() {
         } else {
             val infos = resp.data?.keyboardInfos ?: mutableListOf<KeyboardInfo>()
             val keyboardList = infos.map {
+                // 用户未手动选择过键盘,但服务端记录选择过,先认为未选中,下面的fix函数,会以isChoose字段来赋值isSelect字段
+                // 用来解决选中了系统键盘,但服务端那边记录的值也是选中,导致2个都选中的问题
+                if (it.isSelect == null && it.isChoose == true) {
+                    it.isSelect = false
+                }
+                it
+            }.map {
                 fixKeyboardSelectField(it)
             }.toList()
+
+            // 找到系统键盘
+            val systemKeyboardList = infos.filter {
+                KeyboardType.isSystem(it.type ?: "")
+            }.toList()
+            val systemKeyboard = if (systemKeyboardList.isNotEmpty()) {
+                systemKeyboardList.first()
+            } else {
+                null
+            }
+
             // 如果所有都没选中,则默认选中通用键盘
             val hasSelectKeyboard = keyboardList.filter {
                 it.isSelect == true
             }.toList().isNotEmpty()
+            // 勾选默认键盘
             if (!hasSelectKeyboard) {
-                // 找到系统键盘
-                val systemKeyboard = infos.filter {
-                    KeyboardType.isSystem(it.type ?: "")
-                }.toList()
-                // 勾选默认键盘
-                if (systemKeyboard.isNotEmpty()) {
-                    systemKeyboard.first().isSelect = true
-                }
+                systemKeyboard?.isSelect = true
             }
             _keyboardList.value = infos
         }
@@ -358,7 +387,7 @@ class KeyboardViewModel : BaseViewModel() {
      */
     fun filterPrologueListByTab(tab: String): List<Topic> {
         // 按照选择Tab,过滤出对应Tab的开场白数据
-        val tabPrologues = _prologueList.value?.firstOrNull {
+        val tabPrologues = _prologueList.value.firstOrNull {
             it.title == tab
         }
         // 该Tab下的开场白列表
@@ -382,7 +411,7 @@ class KeyboardViewModel : BaseViewModel() {
                 // 人设Id
                 characterId = characterId,
                 // 用户粘贴板中的内容
-                content = _userClipboardData.value ?: ""
+                content = _userClipboardData.value
             )
             _chatSuperReplyResult.value = ""
             launch {
@@ -434,7 +463,7 @@ class KeyboardViewModel : BaseViewModel() {
                 // 人设Id
                 characterId = characterId,
                 // 用户粘贴板中的内容
-                content = _userClipboardData.value ?: ""
+                content = _userClipboardData.value
             )
             launch {
                 val resp = mKeyboardRepository.chatSuperSpeak(req).single()
@@ -555,11 +584,9 @@ class KeyboardViewModel : BaseViewModel() {
      * 处理isSelect字段
      */
     private fun fixKeyboardSelectField(info: KeyboardInfo): KeyboardInfo {
-        // 统一使用isSelect字段,优先使用isSelect字段,代表是用户手动在键盘中操作过的,否则就用isChoose,是其他页面中选择过的
-        info.isSelect = if (info.isSelect != null) {
-            info.isSelect == true
-        } else {
-            info.isChoose == true
+        // 如果isSelect字段为null,则使用isChoose字段来赋值
+        if (info.isSelect == null) {
+            info.isSelect = info.isChoose == true
         }
         return info
     }