Jelajahi Sumber

[feat]键盘插件,对接Flutter的人设列表

hezihao 8 bulan lalu
induk
melakukan
2f260bc1cd
12 mengubah file dengan 219 tambahan dan 25 penghapusan
  1. 21 15
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/AiKeyboardComponent.kt
  2. 11 1
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/enums/FlutterMethod.kt
  3. 8 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/model/AiKeyboardKeyModel.kt
  4. 23 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/mvvm/repository/KeyboardRepository.kt
  5. 14 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/mvvm/viewmodel/KeyboardViewModel.kt
  6. 28 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/FlutterBridgeManager.kt
  7. 19 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/IBridgeApi.kt
  8. 56 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/model/resp/CharacterListResp.kt
  9. 13 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/model/resp/CurrentKeyboardIdResp.kt
  10. 3 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/model/resp/KeyboardListResp.kt
  11. 21 7
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/util/FlutterMethodCaller.kt
  12. 2 0
      plugins/keyboard_android/android/src/main/res/layout/item_ai_keyboard_key.xml

+ 21 - 15
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/AiKeyboardComponent.kt

@@ -27,6 +27,7 @@ import com.atmob.keyboard_android.util.recyclerview.GridDivider
 import com.atmob.keyboard_android.widget.LongTouchContainer
 import com.atmob.keyboard_android.widget.indicator.TabPagerTitleView
 import com.blankj.utilcode.util.ConvertUtils
+import com.blankj.utilcode.util.ToastUtils
 import me.drakeet.multitype.Items
 import me.drakeet.multitype.MultiTypeAdapter
 import net.lucode.hackware.magicindicator.MagicIndicator
@@ -281,21 +282,21 @@ class AiKeyboardComponent @JvmOverloads constructor(
      */
     @SuppressLint("NotifyDataSetChanged")
     private fun loadKeyListByTab(tab: Tab) {
-        val newList = mutableListOf<AiKeyboardKeyModel>().apply {
-            add(AiKeyboardKeyModel("暧昧推拉"))
-            add(AiKeyboardKeyModel("欲拒还迎"))
-            add(AiKeyboardKeyModel("哄女友"))
-            add(AiKeyboardKeyModel("暧昧推拉"))
-            add(AiKeyboardKeyModel("甜蜜暴击"))
-            add(AiKeyboardKeyModel("暧昧推拉"))
-            add(AiKeyboardKeyModel("彩虹屁专家"))
-            add(AiKeyboardKeyModel("恋爱脑"))
-            add(AiKeyboardKeyModel("调皮回复"))
-        }
-        mKeyListItems.clear()
-        // 随机打乱顺序
-        mKeyListItems.addAll(newList.shuffled())
-        mKeyListAdapter.notifyDataSetChanged()
+        KeyboardHolder.getKeyboardService()?.getKeyboardViewModel()?.getCharacterList(onSuccess = {
+            val newList = (it.characterInfos ?: listOf()).map {
+                AiKeyboardKeyModel(
+                    // 显示的文本 = 表情 + 名字
+                    text = "${it.emoji} ${it.name}",
+                    // 是否需要VIP
+                    isVip = it.isVip
+                )
+            }
+            mKeyListItems.clear()
+            mKeyListItems.addAll(newList)
+            mKeyListAdapter.notifyDataSetChanged()
+        }, onFail = {
+            ToastUtils.showShort(it)
+        })
     }
 
     /**
@@ -314,6 +315,11 @@ class AiKeyboardComponent @JvmOverloads constructor(
         }
         // 隐藏AI生成内容面板
         controlAiChatPageShowing(false)
+
+        // 重新加载人设列表
+        KeyboardHolder.getKeyboardService()?.getKeyboardViewModel()?.tab?.value?.let {
+            loadKeyListByTab(it)
+        }
     }
 
     /**

+ 11 - 1
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/enums/FlutterMethod.kt

@@ -12,5 +12,15 @@ enum class FlutterMethod(val methodName: String) {
     /**
      * 选择键盘
      */
-    SELECTED_KEY_BOARD("selectedKeyboard")
+    SELECTED_KEY_BOARD("selectedKeyboard"),
+
+    /**
+     * 获取当前键盘Id
+     */
+    GET_CURRENT_KEYBOARD_ID("getCurrentKeyboardId"),
+
+    /**
+     * 获取人设列表
+     */
+    GET_CHARACTER_LIST("getCharacterList")
 }

+ 8 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/model/AiKeyboardKeyModel.kt

@@ -6,6 +6,12 @@ import java.io.Serializable
  * AI键盘-按钮模型
  */
 data class AiKeyboardKeyModel(
-    // 文字
-    val text: String
+    /**
+     * 文字
+     */
+    val text: String,
+    /**
+     * 是否需要VIP
+     */
+    val isVip: Boolean = false
 ) : Serializable

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

@@ -2,6 +2,8 @@ package com.atmob.keyboard_android.mvvm.repository
 
 import com.atmob.keyboard_android.util.bridge.FlutterBridgeManager
 import com.atmob.keyboard_android.util.bridge.model.base.EmptyResp
+import com.atmob.keyboard_android.util.bridge.model.resp.CharacterListResp
+import com.atmob.keyboard_android.util.bridge.model.resp.CurrentKeyboardIdResp
 import com.atmob.keyboard_android.util.bridge.model.resp.KeyboardListResp
 
 /**
@@ -32,4 +34,25 @@ class KeyboardRepository {
             onFail
         )
     }
+
+    /**
+     * 获取当前键盘Id
+     */
+    fun getCurrentKeyboardId(
+        onSuccess: (resultObj: CurrentKeyboardIdResp) -> Unit,
+        onFail: (msg: String) -> Unit
+    ) {
+        FlutterBridgeManager.getCurrentKeyboardId(onSuccess, onFail)
+    }
+
+    /**
+     * 获取人设列表
+     */
+    fun getCharacterList(
+        keyboardId: String,
+        onSuccess: (CharacterListResp) -> Unit,
+        onFail: (String) -> Unit
+    ) {
+        FlutterBridgeManager.getCharacterList(keyboardId, onSuccess, onFail)
+    }
 }

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

@@ -11,6 +11,7 @@ import com.atmob.keyboard_android.model.KeyboardSelectModel
 import com.atmob.keyboard_android.mvvm.repository.KeyboardRepository
 import com.atmob.keyboard_android.util.ContextUtil
 import com.atmob.keyboard_android.util.bridge.model.base.EmptyResp
+import com.atmob.keyboard_android.util.bridge.model.resp.CharacterListResp
 
 /**
  * 键盘ViewModel
@@ -183,4 +184,17 @@ class KeyboardViewModel : ViewModel() {
             onSuccess.invoke(it)
         }, onFail)
     }
+
+    /**
+     * 获取人设列表
+     */
+    fun getCharacterList(
+        onSuccess: (CharacterListResp) -> Unit,
+        onFail: (String) -> Unit
+    ) {
+        mKeyboardRepository.getCurrentKeyboardId(onSuccess = {
+            val keyboardId = it.keyboardId ?: ""
+            mKeyboardRepository.getCharacterList(keyboardId, onSuccess, onFail)
+        }, onFail)
+    }
 }

+ 28 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/FlutterBridgeManager.kt

@@ -3,6 +3,8 @@ package com.atmob.keyboard_android.util.bridge
 import com.atmob.keyboard_android.constant.PluginConfig
 import com.atmob.keyboard_android.enums.FlutterMethod
 import com.atmob.keyboard_android.util.bridge.model.base.EmptyResp
+import com.atmob.keyboard_android.util.bridge.model.resp.CharacterListResp
+import com.atmob.keyboard_android.util.bridge.model.resp.CurrentKeyboardIdResp
 import com.atmob.keyboard_android.util.bridge.model.resp.KeyboardListResp
 import com.atmob.keyboard_android.util.bridge.util.FlutterMethodCaller
 import com.atmob.keyboard_android.util.bridge.util.NativeMethodRegistry
@@ -74,4 +76,30 @@ object FlutterBridgeManager : IBridgeApi {
             onFail = onFail
         )
     }
+
+    override fun getCurrentKeyboardId(
+        onSuccess: (CurrentKeyboardIdResp) -> Unit,
+        onFail: (String) -> Unit
+    ) {
+        mFlutterMethodCaller.callMethod<CurrentKeyboardIdResp>(
+            FlutterMethod.GET_CURRENT_KEYBOARD_ID.methodName,
+            modelClazz = CurrentKeyboardIdResp::class.java,
+            onSuccess = onSuccess,
+            onFail = onFail
+        )
+    }
+
+    override fun getCharacterList(
+        keyboardId: String,
+        onSuccess: (CharacterListResp) -> Unit,
+        onFail: (String) -> Unit
+    ) {
+        mFlutterMethodCaller.callMethod<CharacterListResp>(
+            FlutterMethod.GET_CHARACTER_LIST.methodName,
+            args = mapOf("keyboardId" to keyboardId),
+            modelClazz = CharacterListResp::class.java,
+            onSuccess = onSuccess,
+            onFail = onFail
+        )
+    }
 }

+ 19 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/IBridgeApi.kt

@@ -1,6 +1,8 @@
 package com.atmob.keyboard_android.util.bridge
 
 import com.atmob.keyboard_android.util.bridge.model.base.EmptyResp
+import com.atmob.keyboard_android.util.bridge.model.resp.CharacterListResp
+import com.atmob.keyboard_android.util.bridge.model.resp.CurrentKeyboardIdResp
 import com.atmob.keyboard_android.util.bridge.model.resp.KeyboardListResp
 
 /**
@@ -48,4 +50,21 @@ interface IBridgeApi {
         onSuccess: (resultObj: EmptyResp) -> Unit,
         onFail: (msg: String) -> Unit
     )
+
+    /**
+     * 获取当前键盘Id
+     */
+    fun getCurrentKeyboardId(
+        onSuccess: (CurrentKeyboardIdResp) -> Unit,
+        onFail: (msg: String) -> Unit
+    )
+
+    /**
+     * 获取人设列表
+     */
+    fun getCharacterList(
+        keyboardId: String,
+        onSuccess: (resultObj: CharacterListResp) -> Unit,
+        onFail: (msg: String) -> Unit
+    )
 }

+ 56 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/model/resp/CharacterListResp.kt

@@ -0,0 +1,56 @@
+package com.atmob.keyboard_android.util.bridge.model.resp
+
+import java.io.Serializable
+
+/**
+ * 获取人设列表的响应体
+ */
+data class CharacterListResp(
+    /**
+     * 人设列表
+     */
+    val characterInfos: List<CharacterInfo>? = null,
+) : Serializable {
+    data class CharacterInfo(
+        /**
+         * 人设id
+         */
+        val id: String,
+        /**
+         * 名称
+         */
+        val name: String,
+        /**
+         * 头像
+         */
+        val imageUrl: String,
+        /**
+         * 描述
+         */
+        val description: String,
+        /**
+         * 表情
+         */
+        val emoji: String,
+        /**
+         * 是否是VIP可用
+         */
+        val isVip: Boolean,
+        /**
+         * 生日(定制人设)
+         */
+        val birthday: String,
+        /**
+         * 爱好列表(定制人设)
+         */
+        // val hobbies: List<String>,
+        /**
+         * 性格列表(定制人设)
+         */
+        // val characters: List<String>,
+        /**
+         * 性别
+         */
+        val gender: Int,
+    ) : Serializable
+}

+ 13 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/model/resp/CurrentKeyboardIdResp.kt

@@ -0,0 +1,13 @@
+package com.atmob.keyboard_android.util.bridge.model.resp
+
+import java.io.Serializable
+
+/**
+ * 获取当前键盘Id的响应体
+ */
+data class CurrentKeyboardIdResp(
+    /**
+     * 键盘Id
+     */
+    val keyboardId: String? = null
+) : Serializable

+ 3 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/model/resp/KeyboardListResp.kt

@@ -7,5 +7,8 @@ import java.io.Serializable
  * 键盘列表模型
  */
 data class KeyboardListResp(
+    /**
+     * 键盘列表
+     */
     val keyboardInfos: List<KeyboardSelectModel>
 ) : Serializable

+ 21 - 7
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/util/FlutterMethodCaller.kt

@@ -33,25 +33,39 @@ class FlutterMethodCaller {
 
     /**
      * 调用Flutter方法
+     *
+     * @param methodName 方法名
+     * @param modelClazz 方法返回值类型
+     * @param isReturnJson 方法是否返回json格式
+     * @param onSuccess 成功回调
+     * @param onFail 失败回调
      */
     fun <T> callMethod(
         methodName: String,
         args: Any? = null,
         modelClazz: Class<T>,
+        isReturnJson: Boolean = true,
         onSuccess: ((resultObj: T) -> Unit)? = null,
         onFail: ((msg: String) -> Unit)? = null
     ) {
         mMethodChannel.invokeMethod(methodName, args, object : MethodChannel.Result {
             override fun success(result: Any?) {
-                try {
-                    val resultJson = result.toString()
-                    val resultObj = JsonUtil.parseJsonByClass<T>(resultJson, modelClazz)
-                    runOnUIThread {
-                        onSuccess?.invoke(resultObj)
+                if (isReturnJson) {
+                    try {
+                        val resultJson = result.toString()
+                        val resultObj = JsonUtil.parseJsonByClass<T>(resultJson, modelClazz)
+                        runOnUIThread {
+                            onSuccess?.invoke(resultObj)
+                        }
+                    } catch (e: Throwable) {
+                        runOnUIThread {
+                            onFail?.invoke(e.message ?: "call error")
+                        }
                     }
-                } catch (e: Throwable) {
+                } else {
+                    // 返回值,不是json,那么直接返回对象
                     runOnUIThread {
-                        onFail?.invoke(e.message ?: "call error")
+                        onSuccess?.invoke(result as T)
                     }
                 }
             }

+ 2 - 0
plugins/keyboard_android/android/src/main/res/layout/item_ai_keyboard_key.xml

@@ -11,7 +11,9 @@
         android:layout_height="46dp"
         android:layout_gravity="center"
         android:background="@drawable/bg_ai_keyboard_key"
+        android:ellipsize="end"
         android:gravity="center"
+        android:maxLines="1"
         android:textColor="@color/text_color_primary"
         android:textSize="14sp"
         tools:text="哄女友" />