ソースを参照

[feat]键盘插件,原生监听键盘切换,还未转发给flutter

hezihao 7 ヶ月 前
コミット
6c0d928c57

+ 12 - 0
lib/module/keyboard_guide/keyboard_guide_controller.dart

@@ -6,6 +6,7 @@ import 'package:keyboard/resource/string.gen.dart';
 
 import '../../base/base_controller.dart';
 import '../../data/bean/keyboard_guide_msg.dart';
+import '../../plugins/keyboard_android_platform.dart';
 import '../../utils/keyboard_guide_record_util.dart';
 import '../../utils/toast_util.dart';
 import 'guide_overlay/keyboard_guide_overlay_dialog.dart';
@@ -31,6 +32,9 @@ class KeyboardGuidePageController extends BaseController {
   /// 消息列表
   final RxList<KeyboardGuideMsg> msgList = <KeyboardGuideMsg>[].obs;
 
+  /// 是否选择了键盘
+  final Rx<bool> isChooseKeyboard = false.obs;
+
   @override
   void onInit() {
     super.onInit();
@@ -39,6 +43,7 @@ class KeyboardGuidePageController extends BaseController {
     _initMsgList();
     // 进入页面,就获取输入框焦点
     // inputFocusNode.requestFocus();
+    checkKeyboardEnable();
   }
 
   @override
@@ -51,6 +56,13 @@ class KeyboardGuidePageController extends BaseController {
     super.onClose();
   }
 
+  /// 检查键盘是否已启用
+  void checkKeyboardEnable() {
+    KeyboardAndroidPlatform.isTargetKeyboardEnabled().then((enable) {
+      isChooseKeyboard.value = enable;
+    });
+  }
+
   /// 关闭页面
   clickBack() {
     Get.back();

+ 39 - 13
lib/module/keyboard_guide/keyboard_guide_page.dart

@@ -4,6 +4,7 @@ import 'package:get/get.dart';
 import 'package:keyboard/module/keyboard_guide/keyboard_guide_controller.dart';
 import 'package:keyboard/router/app_pages.dart';
 import 'package:keyboard/utils/toast_util.dart';
+import 'package:lottie/lottie.dart';
 
 import '../../base/base_page.dart';
 import '../../data/bean/keyboard_guide_msg.dart';
@@ -48,19 +49,7 @@ class KeyboardGuidePage extends BasePage<KeyboardGuidePageController> {
             // 标题栏
             _buildTitleBar(),
             // 消息列表
-            Expanded(
-              flex: 1,
-              child: Obx(() {
-                return ListView.builder(
-                  controller: controller.scrollController,
-                  itemCount: controller.msgList.length,
-                  itemBuilder: (BuildContext context, int index) {
-                    KeyboardGuideMsg msg = controller.msgList[index];
-                    return _buildMsgItem(msg, index);
-                  },
-                );
-              }),
-            ),
+            Expanded(flex: 1, child: _buildContent()),
             // 底部输入栏
             _buildBottomInput(),
           ],
@@ -134,6 +123,43 @@ class KeyboardGuidePage extends BasePage<KeyboardGuidePageController> {
     );
   }
 
+  /// 内容
+  Widget _buildContent() {
+    return Obx(() {
+      // 键盘已启用,显示聊天列表
+      if (controller.isChooseKeyboard.value) {
+        return _buildChatList();
+      } else {
+        // 未启用,显示引导动画
+        return _buildGuideAnimation();
+      }
+    });
+  }
+
+  /// 引导动画
+  Widget _buildGuideAnimation() {
+    return Container(
+      child: Lottie.asset(
+        Assets.anim.animKeyboardFloatingWindowChooseKeyboard,
+        repeat: true,
+      ),
+    );
+  }
+
+  /// 聊天列表
+  Widget _buildChatList() {
+    return Obx(() {
+      return ListView.builder(
+        controller: controller.scrollController,
+        itemCount: controller.msgList.length,
+        itemBuilder: (BuildContext context, int index) {
+          KeyboardGuideMsg msg = controller.msgList[index];
+          return _buildMsgItem(msg, index);
+        },
+      );
+    });
+  }
+
   /// 构建底部输入框
   Widget _buildBottomInput() {
     return Center(

+ 7 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/KeyboardAndroidPlugin.kt

@@ -9,6 +9,7 @@ import com.atmob.keyboard_android.component.listener.ComponentUpdateLoggingListe
 import com.atmob.keyboard_android.floating.FloatingButtonService
 import com.atmob.keyboard_android.util.FloatingWindowUtil
 import com.atmob.keyboard_android.util.InputMethodUtil
+import com.atmob.keyboard_android.util.KeyboardWatcher
 import com.atmob.keyboard_android.util.LogUtil
 import io.flutter.embedding.engine.plugins.FlutterPlugin
 import io.flutter.plugin.common.MethodCall
@@ -47,6 +48,9 @@ class KeyboardAndroidPlugin : FlutterPlugin, MethodCallHandler {
         channel = MethodChannel(flutterPluginBinding.binaryMessenger, "keyboard_android")
         channel.setMethodCallHandler(this)
 
+        // 注册键盘切换监听
+        KeyboardWatcher.init()
+
         LogUtil.d("KeyboardAndroidPlugin 初始化")
     }
 
@@ -105,6 +109,9 @@ class KeyboardAndroidPlugin : FlutterPlugin, MethodCallHandler {
     }
 
     override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
+        // 注销键盘切换监听
+        KeyboardWatcher.unInit()
+
         channel.setMethodCallHandler(null)
     }
 }

+ 11 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/InputMethodUtil.kt

@@ -34,6 +34,17 @@ class InputMethodUtil private constructor() {
         }
 
         /**
+         * 我的自定义输入法,是否是默认输入法
+         */
+        fun isDefaultKeyboard(context: Context): Boolean {
+            val currentInputMethodId = Settings.Secure.getString(
+                context.contentResolver,
+                Settings.Secure.DEFAULT_INPUT_METHOD
+            )
+            return currentInputMethodId != null && currentInputMethodId.contains(context.packageName)
+        }
+
+        /**
          * 粘贴文本到自己的输入框中
          */
         fun pasteText2EditText(

+ 75 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/KeyboardWatcher.kt

@@ -0,0 +1,75 @@
+package com.atmob.keyboard_android.util
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import java.util.concurrent.CopyOnWriteArrayList
+
+
+/**
+ * 键盘监听器
+ */
+@SuppressLint("StaticFieldLeak")
+object KeyboardWatcher {
+    private val mContext = ContextUtil.getContext()
+
+    /**
+     * 监听器列表
+     */
+    private val mListenerList = CopyOnWriteArrayList<OnKeyboardChangeListener>()
+
+    /**
+     * 初始化,注册监听
+     */
+    fun init() {
+        val filter = IntentFilter(Intent.ACTION_INPUT_METHOD_CHANGED)
+        mContext.registerReceiver(mImeChangeReceiver, filter)
+    }
+
+    /**
+     * 解注册,注销监听
+     */
+    fun unInit() {
+        mContext.unregisterReceiver(mImeChangeReceiver)
+    }
+
+    interface OnKeyboardChangeListener {
+        /**
+         * 当前键盘,被设置为默认键盘
+         */
+        fun onDefaultKeyboard()
+    }
+
+    /**
+     * 默认软键盘,切换监听
+     */
+    private val mImeChangeReceiver: BroadcastReceiver = object : BroadcastReceiver() {
+        override fun onReceive(context: Context?, intent: Intent) {
+            if (Intent.ACTION_INPUT_METHOD_CHANGED == intent.action) {
+                if (InputMethodUtil.isDefaultKeyboard(mContext)) {
+                    for (listener in mListenerList) {
+                        listener.onDefaultKeyboard()
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 注册监听器
+     */
+    fun registerListener(listener: OnKeyboardChangeListener) {
+        if (!mListenerList.contains(listener)) {
+            mListenerList.add(listener)
+        }
+    }
+
+    /**
+     *
+     */
+    fun unRegisterListener(listener: OnKeyboardChangeListener) {
+        mListenerList.remove(listener);
+    }
+}