Переглянути джерело

[feat]键盘插件,处理未登录时,选择键盘,提示需要登录后,选中状态要切回之前的键盘

hezihao 11 місяців тому
батько
коміт
11f87e21a7

+ 1 - 1
lib/data/consts/constants.dart

@@ -3,7 +3,7 @@ import '../../utils/mmkv_util.dart';
 class Constants {
   Constants._();
 
-  static const String env = envProd;
+  static const String env = envTest;
 
   static const String envDev = 'dev';
 

+ 55 - 14
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/KeyboardSelectComponent.kt

@@ -15,6 +15,7 @@ import com.atmob.keyboard_android.component.item.EmptyPlaceholderViewBinder
 import com.atmob.keyboard_android.component.item.KeyboardSelectViewBinder
 import com.atmob.keyboard_android.constant.Constants
 import com.atmob.keyboard_android.ext.click
+import com.atmob.keyboard_android.ext.deepCopy
 import com.atmob.keyboard_android.model.EmptyPlaceholderModel
 import com.atmob.keyboard_android.util.KeyboardHolder
 import com.atmob.keyboard_android.util.bridge.model.resp.KeyboardInfo
@@ -37,6 +38,11 @@ class KeyboardSelectComponent @JvmOverloads constructor(
     private lateinit var mListItems: Items
     private lateinit var mListAdapter: MultiTypeAdapter
 
+    /**
+     * 上一个选择的键盘,用于保存失败时,切回之前的选中状态
+     */
+    private var mPreSelectItem: KeyboardInfo? = null
+
     override fun onInflateViewId(): Int {
         return R.layout.component_keyboard_select
     }
@@ -63,8 +69,17 @@ class KeyboardSelectComponent @JvmOverloads constructor(
             }
             // 保存,用户选择的键盘
             selectedKeyboard(selectKeyboard, onSuccess = {
-                // 关闭选择器
+                // 保存成功,更新选中信息
+                mPreSelectItem = it.deepCopy(it.javaClass).apply {
+                    isSelect = true
+                }
+                // 关闭页面
                 hide()
+            }, onFail = {
+                // 保存失败,切换回之前选中的键盘
+                if (mPreSelectItem != null) {
+                    renderSelectKeyboardItem(mPreSelectItem!!)
+                }
             })
         }
 
@@ -76,16 +91,7 @@ class KeyboardSelectComponent @JvmOverloads constructor(
                 register(EmptyPlaceholderModel::class.java, EmptyPlaceholderViewBinder())
                 // 键盘条目
                 register(KeyboardInfo::class.java, KeyboardSelectViewBinder { item ->
-                    // 先全部取消选中,再选中当前设置的键盘
-                    mListItems.map { element ->
-                        if (element is KeyboardInfo) {
-                            element.isSelect = false
-                        }
-                    }
-                    val targetPosition = mListItems.indexOf(item)
-                    val targetItem = mListItems[targetPosition] as KeyboardInfo
-                    targetItem.isSelect = true
-                    notifyDataSetChanged()
+                    renderSelectKeyboardItem(item)
                 })
             }
             layoutManager =
@@ -135,6 +141,19 @@ class KeyboardSelectComponent @JvmOverloads constructor(
         KeyboardHolder.getKeyboardService()?.run {
             // 监听键盘列表更新
             getKeyboardViewModel().keyboardList.observe(getLifecycleOwner()) { newKeyboardList ->
+                // 保存选中的键盘信息
+                if (newKeyboardList.isNotEmpty()) {
+                    val selectList = newKeyboardList.filter {
+                        it.isSelect == true
+                    }.toList()
+                    if (selectList.isNotEmpty()) {
+                        val targetItem = selectList.first()
+                        mPreSelectItem = targetItem.deepCopy(targetItem.javaClass).apply {
+                            isSelect = true
+                        }
+                    }
+                }
+
                 mListItems.clear()
 
                 // 添加空占位条目
@@ -183,13 +202,35 @@ class KeyboardSelectComponent @JvmOverloads constructor(
      */
     private fun selectedKeyboard(
         selectModel: KeyboardInfo,
-        onSuccess: () -> Unit
+        onSuccess: (newKeyboardInfo: KeyboardInfo) -> Unit,
+        onFail: () -> Unit,
     ) {
         KeyboardHolder.getKeyboardService()?.getKeyboardViewModel()?.selectedKeyboard(
             selectModel,
             onSuccess = {
-                onSuccess.invoke()
-            }
+                onSuccess.invoke(selectModel)
+            },
+            onFail = onFail
         )
     }
+
+    /**
+     * 选择某个键盘了,重新渲染列表
+     */
+    @SuppressLint("NotifyDataSetChanged")
+    private fun renderSelectKeyboardItem(item: KeyboardInfo) {
+        // 先全部取消选中,再选中当前设置的键盘
+        mListItems.map { element ->
+            if (element is KeyboardInfo) {
+                element.isSelect = false
+            }
+        }
+        val targetItem = mListItems.filterIsInstance<KeyboardInfo>().find {
+            it.id == item.id
+        }
+        targetItem?.let {
+            it.isSelect = true
+            mListAdapter.notifyDataSetChanged()
+        }
+    }
 }

+ 8 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/ext/CoroutinesExt.kt

@@ -46,10 +46,16 @@ suspend inline fun <T> callback2Coroutines(
 }
 
 /**
- * 协程转Flow
+ * 协程转Flow,运行在IO线程
+ */
+fun <T> asFlowIO(block: suspend () -> T): Flow<BaseResp<T>> =
+    asFlow(dispatcher = Dispatchers.IO, block = block)
+
+/**
+ * 协程转Flow,默认运行在主线程
  */
 fun <T> asFlow(
-    dispatcher: CoroutineDispatcher = Dispatchers.IO,
+    dispatcher: CoroutineDispatcher = Dispatchers.Main,
     block: suspend () -> T
 ): Flow<BaseResp<T>> = flow {
     emit(BaseResp.success<T>(block()))

+ 11 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/ext/ObjectExt.kt

@@ -0,0 +1,11 @@
+package com.atmob.keyboard_android.ext
+
+import com.atmob.keyboard_android.util.JsonUtil
+
+/**
+ * 深拷贝
+ */
+fun <T> Any.deepCopy(clazz: Class<T>): T {
+    val json = JsonUtil.toJson(this)
+    return JsonUtil.parseJsonByClass<T>(json, clazz)
+}

+ 1 - 1
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/keyboard/CustomKeyboardService.kt

@@ -38,7 +38,7 @@ class CustomKeyboardService : InputMethodLifecycleService(), ICustomKeyboardServ
         ClipboardHelper.registerClipboardListener(this)
     }
 
-    override fun onCreateInputView(): View {
+    override fun onCreateInputMethodView(): View? {
         return layoutInflater.inflate(R.layout.keyboard_layout, null)
     }
 

+ 47 - 1
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/keyboard/ext/InputMethodLifecycleService.kt

@@ -2,18 +2,26 @@ package com.atmob.keyboard_android.keyboard.ext
 
 import android.content.Intent
 import android.inputmethodservice.InputMethodService
+import android.view.View
+import android.view.Window
 import androidx.annotation.CallSuper
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ServiceLifecycleDispatcher
 import androidx.lifecycle.ViewModelStore
 import androidx.lifecycle.ViewModelStoreOwner
+import androidx.lifecycle.setViewTreeLifecycleOwner
+import androidx.lifecycle.setViewTreeViewModelStoreOwner
+import androidx.savedstate.SavedStateRegistry
+import androidx.savedstate.SavedStateRegistryController
+import androidx.savedstate.SavedStateRegistryOwner
+import androidx.savedstate.setViewTreeSavedStateRegistryOwner
 
 /**
  * 拓展InputMethodService,支持Jetpack组件的Lifecycle生命周期组件,参考自LifecycleService,并同时实现了ViewModelStoreOwner,支持使用ViewModel
  */
 open class InputMethodLifecycleService() :
-    InputMethodService(), LifecycleOwner, ViewModelStoreOwner {
+    InputMethodService(), LifecycleOwner, ViewModelStoreOwner, SavedStateRegistryOwner {
     private val dispatcher = ServiceLifecycleDispatcher(this)
 
     // 实现ViewModelStore组件
@@ -25,10 +33,48 @@ open class InputMethodLifecycleService() :
     override val lifecycle: Lifecycle
         get() = dispatcher.lifecycle
 
+    // 实现SavedStateRegistryOwner
+    private val savedStateRegistryController = SavedStateRegistryController.create(this)
+    override val savedStateRegistry: SavedStateRegistry
+        get() = savedStateRegistryController.savedStateRegistry
+
     @CallSuper
     override fun onCreate() {
+        savedStateRegistryController.performRestore(null)
         dispatcher.onServicePreSuperOnCreate()
         super.onCreate()
+        val decorView = window.window?.decorView
+        decorView?.apply {
+            setViewTreeLifecycleOwner(this@InputMethodLifecycleService)
+            setViewTreeViewModelStoreOwner(this@InputMethodLifecycleService)
+            setViewTreeSavedStateRegistryOwner(this@InputMethodLifecycleService)
+        }
+    }
+
+    override fun onConfigureWindow(win: Window?, isFullscreen: Boolean, isCandidatesOnly: Boolean) {
+        super.onConfigureWindow(win, isFullscreen, isCandidatesOnly)
+    }
+
+    final override fun onCreateInputView(): View? {
+        super.onCreateInputView()
+        val rootView = onCreateInputMethodView()
+        if (rootView != null) {
+            onInputMethodViewCreated(rootView)
+        }
+        return rootView
+    }
+
+    /**
+     * 创建软键盘的View
+     */
+    protected open fun onCreateInputMethodView(): View? {
+        return null
+    }
+
+    /**
+     * 软键盘View创建完成
+     */
+    protected open fun onInputMethodViewCreated(view: View) {
     }
 
     // onBind()方法,被InputMethodService类,修饰为final,无法被重写,所以只能重写该方法来代替

+ 40 - 40
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/mvvm/repository/KeyboardRepository.kt

@@ -1,5 +1,8 @@
 package com.atmob.keyboard_android.mvvm.repository
 
+import com.atmob.keyboard_android.ext.asFlow
+import com.atmob.keyboard_android.ext.callback2Coroutines
+import com.atmob.keyboard_android.model.base.BaseResp
 import com.atmob.keyboard_android.mvvm.base.BaseRepository
 import com.atmob.keyboard_android.util.bridge.FlutterBridgeManager
 import com.atmob.keyboard_android.util.bridge.model.base.EmptyResp
@@ -10,8 +13,8 @@ import com.atmob.keyboard_android.util.bridge.model.resp.KeyboardInfo
 import com.atmob.keyboard_android.util.bridge.model.resp.KeyboardListResp
 import com.atmob.keyboard_android.util.bridge.model.resp.PrologueListResp
 import com.atmob.keyboard_android.util.bridge.model.resp.PrologueResp
-import com.atmob.keyboard_android.util.bridge.model.resp.SuperReplyResp
 import com.atmob.keyboard_android.util.bridge.model.resp.SuperSpeakResp
+import kotlinx.coroutines.flow.Flow
 
 /**
  * 键盘Repository
@@ -40,11 +43,10 @@ class KeyboardRepository : BaseRepository() {
     /**
      * 获取键盘列表
      */
-    fun getKeyboardList(
-        onSuccess: (resultObj: KeyboardListResp) -> Unit,
-        onFail: (errorCode: Int, errorMsg: String) -> Unit
-    ) {
-        FlutterBridgeManager.getKeyboardList(onSuccess, onFail)
+    fun getKeyboardList(): Flow<BaseResp<KeyboardListResp>> = asFlow {
+        callback2Coroutines { onSuccess, onFail ->
+            FlutterBridgeManager.getKeyboardList(onSuccess, onFail)
+        }
     }
 
     /**
@@ -52,24 +54,23 @@ class KeyboardRepository : BaseRepository() {
      */
     fun selectedKeyboard(
         keyboardId: String,
-        onSuccess: (resultObj: EmptyResp) -> Unit,
-        onFail: (errorCode: Int, errorMsg: String) -> Unit
-    ) {
-        FlutterBridgeManager.selectedKeyboard(
-            keyboardId,
-            onSuccess,
-            onFail
-        )
+    ): Flow<BaseResp<EmptyResp>> = asFlow {
+        callback2Coroutines { onSuccess, onFail ->
+            FlutterBridgeManager.selectedKeyboard(
+                keyboardId,
+                onSuccess,
+                onFail
+            )
+        }
     }
 
     /**
      * 获取当前键盘信息
      */
-    fun getCurrentKeyboardInfo(
-        onSuccess: (resultObj: KeyboardInfo) -> Unit,
-        onFail: (errorCode: Int, errorMsg: String) -> Unit
-    ) {
-        FlutterBridgeManager.getCurrentKeyboardInfo(onSuccess, onFail)
+    fun getCurrentKeyboardInfo(): Flow<BaseResp<KeyboardInfo>> = asFlow {
+        callback2Coroutines { onSuccess, onFail ->
+            FlutterBridgeManager.getCurrentKeyboardInfo(onSuccess, onFail)
+        }
     }
 
     /**
@@ -77,20 +78,19 @@ class KeyboardRepository : BaseRepository() {
      */
     fun getCharacterList(
         keyboardId: String,
-        onSuccess: (CharacterListResp) -> Unit,
-        onFail: (errorCode: Int, errorMsg: String) -> Unit
-    ) {
-        FlutterBridgeManager.getCharacterList(keyboardId, onSuccess, onFail)
+    ): Flow<BaseResp<CharacterListResp>> = asFlow {
+        callback2Coroutines { onSuccess, onFail ->
+            FlutterBridgeManager.getCharacterList(keyboardId, onSuccess, onFail)
+        }
     }
 
     /**
      * 获取开场白列表
      */
-    fun getPrologueList(
-        onSuccess: (PrologueListResp) -> Unit,
-        onFail: (errorCode: Int, errorMsg: String) -> Unit
-    ) {
-        FlutterBridgeManager.getPrologueList(onSuccess, onFail)
+    fun getPrologueList(): Flow<BaseResp<PrologueListResp>> = asFlow {
+        callback2Coroutines { onSuccess, onFail ->
+            FlutterBridgeManager.getPrologueList(onSuccess, onFail)
+        }
     }
 
     /**
@@ -98,10 +98,10 @@ class KeyboardRepository : BaseRepository() {
      */
     fun chatSuperReply(
         req: SuperReplyReq,
-        onSuccess: (SuperReplyResp) -> Unit,
-        onFail: (errorCode: Int, errorMsg: String) -> Unit
-    ) {
-        FlutterBridgeManager.chatSuperReply(req, onSuccess, onFail)
+    ) = asFlow {
+        callback2Coroutines { onSuccess, onFail ->
+            FlutterBridgeManager.chatSuperReply(req, onSuccess, onFail)
+        }
     }
 
     /**
@@ -109,10 +109,10 @@ class KeyboardRepository : BaseRepository() {
      */
     fun chatSuperSpeak(
         req: SuperSpeakReq,
-        onSuccess: (SuperSpeakResp) -> Unit,
-        onFail: (errorCode: Int, errorMsg: String) -> Unit
-    ) {
-        FlutterBridgeManager.chatSuperSpeak(req, onSuccess, onFail)
+    ): Flow<BaseResp<SuperSpeakResp>> = asFlow {
+        callback2Coroutines { onSuccess, onFail ->
+            FlutterBridgeManager.chatSuperSpeak(req, onSuccess, onFail)
+        }
     }
 
     /**
@@ -120,9 +120,9 @@ class KeyboardRepository : BaseRepository() {
      */
     fun chatPrologue(
         name: String,
-        onSuccess: (PrologueResp) -> Unit,
-        onFail: (errorCode: Int, errorMsg: String) -> Unit
-    ) {
-        FlutterBridgeManager.chatPrologue(name, onSuccess, onFail)
+    ): Flow<BaseResp<PrologueResp>> = asFlow {
+        callback2Coroutines { onSuccess, onFail ->
+            FlutterBridgeManager.chatPrologue(name, onSuccess, onFail)
+        }
     }
 }

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

@@ -16,6 +16,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.single
 
 /**
  * 键盘ViewModel
@@ -242,9 +243,12 @@ class KeyboardViewModel : BaseViewModel() {
     /**
      * 获取键盘列表
      */
-    fun getKeyboardList() {
-        mKeyboardRepository.getKeyboardList(onSuccess = {
-            val infos = it.keyboardInfos
+    fun getKeyboardList() = launch {
+        val resp = mKeyboardRepository.getKeyboardList().single()
+        if (ErrorHandler.isError(resp)) {
+            ErrorHandler.handleError(resp.code, resp.message)
+        } else {
+            val infos = resp.data?.keyboardInfos ?: mutableListOf<KeyboardInfo>()
             val keyboardList = infos.map {
                 fixKeyboardSelectField(it)
             }.toList()
@@ -263,9 +267,7 @@ class KeyboardViewModel : BaseViewModel() {
                 }
             }
             _keyboardList.value = infos
-        }, onFail = { errorCode, errorMsg ->
-            ErrorHandler.handleError(errorCode, errorMsg)
-        })
+        }
     }
 
     /**
@@ -282,15 +284,20 @@ class KeyboardViewModel : BaseViewModel() {
      */
     fun selectedKeyboard(
         selectModel: KeyboardInfo,
-        onSuccess: (resultObj: EmptyResp) -> Unit
+        onSuccess: (resultObj: EmptyResp) -> Unit,
+        onFail: () -> Unit,
     ) {
-        mKeyboardRepository.selectedKeyboard(selectModel.id!!, onSuccess = {
-            // 更新键盘信息
-            _currentKeyboardInfo.value = selectModel
-            onSuccess.invoke(it)
-        }, onFail = { errorCode, errorMsg ->
-            ErrorHandler.handleError(errorCode, errorMsg)
-        })
+        launch {
+            val resp = mKeyboardRepository.selectedKeyboard(selectModel.id!!).single()
+            if (ErrorHandler.isError(resp)) {
+                ErrorHandler.handleError(resp.code, resp.message)
+                onFail.invoke()
+            } else {
+                // 更新键盘信息
+                _currentKeyboardInfo.value = selectModel
+                onSuccess.invoke(resp.data!!)
+            }
+        }
     }
 
     /**
@@ -317,9 +324,15 @@ class KeyboardViewModel : BaseViewModel() {
             val keyboardName = keyboardInfo.name
             LogUtil.d("加载人设列表, id: ${keyboardId}, name: $keyboardName")
             // 查询该键盘下的人设列表
-            mKeyboardRepository.getCharacterList(keyboardId, onSuccess = {
-                _characterList.value = it.characterInfos ?: listOf()
-            }, errorCallback)
+            launch {
+                val resp = mKeyboardRepository.getCharacterList(keyboardId).single()
+                if (ErrorHandler.isError(resp)) {
+                    errorCallback.invoke(resp.code, resp.message)
+                } else {
+                    val data = resp.data
+                    _characterList.value = data?.characterInfos ?: listOf()
+                }
+            }
         }, onFail = errorCallback)
     }
 
@@ -327,11 +340,15 @@ class KeyboardViewModel : BaseViewModel() {
      * 获取开场白列表
      */
     fun getPrologueList() {
-        mKeyboardRepository.getPrologueList(onSuccess = {
-            _prologueList.value = it.prologues ?: listOf()
-        }, onFail = { errorCode, errorMsg ->
-            ErrorHandler.handleError(errorCode, errorMsg)
-        })
+        launch {
+            val resp = mKeyboardRepository.getPrologueList().single()
+            if (ErrorHandler.isError(resp)) {
+                ErrorHandler.handleError(resp.code, resp.message)
+            } else {
+                val data = resp.data
+                _prologueList.value = data?.prologues ?: listOf()
+            }
+        }
     }
 
     /**
@@ -368,14 +385,18 @@ class KeyboardViewModel : BaseViewModel() {
                 content = _userClipboardData.value ?: ""
             )
             _chatSuperReplyResult.value = ""
-            mKeyboardRepository.chatSuperReply(req, onSuccess = {
-                // 只有一条数据,直接添加到输入框
-                _chatSuperReplyResult.value = it.content
-                onSuccess.invoke()
-            }, onFail = { errorCode, errorMsg ->
-                ErrorHandler.handleError(errorCode, errorMsg)
-                onFail.invoke(errorMsg)
-            })
+            launch {
+                val resp = mKeyboardRepository.chatSuperReply(req).single()
+                if (ErrorHandler.isError(resp)) {
+                    ErrorHandler.handleError(resp.code, resp.message)
+                    onFail.invoke(resp.message)
+                } else {
+                    // 只有一条数据,直接添加到输入框
+                    val data = resp.data
+                    _chatSuperReplyResult.value = data?.content ?: ""
+                    onSuccess.invoke()
+                }
+            }
         }
 
         var keyboardId = _currentKeyboardInfo.value?.id ?: ""
@@ -415,14 +436,18 @@ class KeyboardViewModel : BaseViewModel() {
                 // 用户粘贴板中的内容
                 content = _userClipboardData.value ?: ""
             )
-            mKeyboardRepository.chatSuperSpeak(req, onSuccess = {
-                // 有多条数据,需要跳转列表页面中显示
-                _superSpeakChatListResult.value = it.list
-                onSuccess.invoke()
-            }, onFail = { errorCode, errorMsg ->
-                ErrorHandler.handleError(errorCode, errorMsg)
-                onFail.invoke(errorMsg)
-            })
+            launch {
+                val resp = mKeyboardRepository.chatSuperSpeak(req).single()
+                if (ErrorHandler.isError(resp)) {
+                    ErrorHandler.handleError(resp.code, resp.message)
+                    onFail.invoke(resp.message)
+                } else {
+                    val data = resp.data
+                    // 有多条数据,需要跳转列表页面中显示
+                    _superSpeakChatListResult.value = data?.list ?: mutableListOf()
+                    onSuccess.invoke()
+                }
+            }
         }
 
         var keyboardId = _currentKeyboardInfo.value?.id ?: ""
@@ -451,14 +476,18 @@ class KeyboardViewModel : BaseViewModel() {
     ) {
         onStart.invoke()
         _prologueChatListResult.value = listOf<String>()
-        mKeyboardRepository.chatPrologue(name, onSuccess = {
-            // 有多条数据,需要跳转列表页面中显示
-            _prologueChatListResult.value = it.list
-            onSuccess.invoke()
-        }, onFail = { errorCode, errorMsg ->
-            ErrorHandler.handleError(errorCode, errorMsg)
-            onFail.invoke(errorMsg)
-        })
+        launch {
+            val resp = mKeyboardRepository.chatPrologue(name).single()
+            if (ErrorHandler.isError(resp)) {
+                ErrorHandler.handleError(resp.code, resp.message)
+                onFail.invoke(resp.message)
+            } else {
+                // 有多条数据,需要跳转列表页面中显示
+                val data = resp.data
+                _prologueChatListResult.value = data?.list ?: mutableListOf()
+                onSuccess.invoke()
+            }
+        }
     }
 
     /**
@@ -468,41 +497,58 @@ class KeyboardViewModel : BaseViewModel() {
         onSuccess: (model: KeyboardInfo) -> Unit,
         onFail: (errorCode: Int, errorMsg: String) -> Unit
     ) {
-        mKeyboardRepository.getCurrentKeyboardInfo(onSuccess = {
-            // 如果当前未在键盘中,手动选择过,就会为null
-            if (it.id.isNullOrBlank()) {
-                mKeyboardRepository.getKeyboardList(onSuccess = {
-                    val infos = it.keyboardInfos.map {
-                        fixKeyboardSelectField(it)
-                    }
-                    // 数据为空
-                    if (infos.isEmpty()) {
-                        onFail.invoke(-1, "")
-                    } else {
-                        // 先找已选中的键盘,否则找系统键盘
-                        val selectedKeyboard = infos.filter {
-                            it.isSelect == true
-                        }.toList().firstOrNull()
-                        if (selectedKeyboard != null) {
-                            onSuccess.invoke(selectedKeyboard)
+        launch {
+            val resp = mKeyboardRepository.getCurrentKeyboardInfo().single()
+            if (ErrorHandler.isError(resp)) {
+                onFail.invoke(resp.code, resp.message)
+            } else {
+                // 如果当前未在键盘中,手动选择过,就会为null
+                val data = resp.data
+                if (data == null) {
+                    onFail.invoke(-1, resp.message)
+                    return@launch
+                }
+                if (data.id.isNullOrBlank()) {
+                    launch {
+                        val resp = mKeyboardRepository.getKeyboardList().single()
+                        if (ErrorHandler.isError(resp)) {
+                            ErrorHandler.handleError(resp.code, resp.message)
+                            onFail.invoke(resp.code, resp.message)
+                            return@launch
                         } else {
-                            // 没有找到选中的键盘,则使用系统键盘
-                            val systemKeyboard = infos.filter {
-                                KeyboardType.isSystem(it.type ?: "")
-                            }.toList()
-                            if (systemKeyboard.isNotEmpty()) {
-                                onSuccess.invoke(systemKeyboard.first())
+                            val infos = resp.data?.keyboardInfos?.map {
+                                fixKeyboardSelectField(it)
+                            } ?: mutableListOf()
+                            // 数据为空
+                            if (infos.isEmpty()) {
+                                onFail.invoke(-1, "")
                             } else {
-                                // 连系统键盘都没有,则取第一个
-                                onSuccess.invoke(infos[0])
+                                // 先找已选中的键盘,否则找系统键盘
+                                val selectedKeyboard = infos.filter {
+                                    it.isSelect == true
+                                }.toList().firstOrNull()
+                                if (selectedKeyboard != null) {
+                                    onSuccess.invoke(selectedKeyboard)
+                                } else {
+                                    // 没有找到选中的键盘,则使用系统键盘
+                                    val systemKeyboard = infos.filter {
+                                        KeyboardType.isSystem(it.type ?: "")
+                                    }.toList()
+                                    if (systemKeyboard.isNotEmpty()) {
+                                        onSuccess.invoke(systemKeyboard.first())
+                                    } else {
+                                        // 连系统键盘都没有,则取第一个
+                                        onSuccess.invoke(infos[0])
+                                    }
+                                }
                             }
                         }
                     }
-                }, onFail)
-            } else {
-                onSuccess.invoke(fixKeyboardSelectField(it))
+                } else {
+                    onSuccess.invoke(fixKeyboardSelectField(data))
+                }
             }
-        }, onFail)
+        }
     }
 
     /**

+ 1 - 1
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/JsonUtil.kt

@@ -13,7 +13,7 @@ class JsonUtil {
         /**
          * 解析Json为实体类
          */
-        fun <T> parseJson(json: String): T {
+        fun <T>  parseJson(json: String): T {
             return sGson.fromJson<T>(json, object : TypeToken<T>() {})
         }
 

+ 15 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/error/ErrorHandler.kt

@@ -3,6 +3,7 @@ package com.atmob.keyboard_android.util.error
 import com.atmob.keyboard_android.component.ComponentMediator
 import com.atmob.keyboard_android.component.root.IKeyboardRootComponent
 import com.atmob.keyboard_android.enums.ServerErrorCode
+import com.atmob.keyboard_android.model.base.BaseResp
 import com.atmob.keyboard_android.util.ToastUtil
 import com.atmob.keyboard_android.util.UserInfoHelper
 
@@ -12,6 +13,20 @@ import com.atmob.keyboard_android.util.UserInfoHelper
 class ErrorHandler private constructor() {
     companion object {
         /**
+         * 是否是错误
+         */
+        fun isError(resp: BaseResp<*>): Boolean {
+            return isError(resp.code)
+        }
+
+        /**
+         * 是否是错误
+         */
+        fun isError(errorCode: Int): Boolean {
+            return errorCode != ServerErrorCode.SUCCESS.code
+        }
+
+        /**
          * 处理错误
          *
          * @param errorCode 错误码