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