瀏覽代碼

[feat]键盘,如果启用键盘或悬浮窗权限后,跳到键盘引导页,此时用户去设置中取消掉,页面就要跳回教程页

hezihao 7 月之前
父節點
當前提交
a4db51ea9c

+ 2 - 1
lib/module/keyboard/keyboard_controller.dart

@@ -15,6 +15,7 @@ import 'package:keyboard/module/user_profile/user_profile_page.dart';
 
 import '../../data/api/response/keyboard_love_index_response.dart';
 import '../../utils/atmob_log.dart';
+import '../../utils/keyboard_tutorial_util.dart';
 import '../intimacy_analyse/intimacy_analyse_page.dart';
 import '../intimacy_scale/intimacy_scale_page.dart';
 import '../keyboard_guide/keyboard_guide_page.dart';
@@ -64,7 +65,7 @@ class KeyBoardController extends BaseController {
   }
 
   void clickEasyReply() {
-    KeyboardGuidePage.start();
+    KeyboardTutorialUtil.start();
     debugPrint("click easy reply");
   }
 

+ 26 - 16
lib/module/keyboard_guide/keyboard_guide_controller.dart

@@ -2,13 +2,16 @@ import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 import 'package:injectable/injectable.dart';
 import 'package:keyboard/module/keyboard_guide/enums/keyboard_guide_msg_type.dart';
+import 'package:keyboard/module/keyboard_tutorial/keyboard_tutorial_page.dart';
 import 'package:keyboard/resource/string.gen.dart';
 
 import '../../base/base_controller.dart';
 import '../../data/bean/keyboard_guide_msg.dart';
 import '../../plugins/default_keyboard_change_listener.dart';
 import '../../plugins/keyboard_android_platform.dart';
+import '../../utils/floating_window_util.dart';
 import '../../utils/keyboard_guide_record_util.dart';
+import '../../utils/keyboard_tutorial_util.dart';
 import '../../utils/toast_util.dart';
 import 'guide_overlay/keyboard_guide_overlay_dialog.dart';
 
@@ -42,9 +45,14 @@ class KeyboardGuidePageController extends BaseController {
     inputFocusNode.addListener(_handleTextFieldFocusChange);
     // 初始化消息列表
     _initMsgList();
+    // 监听默认键盘切换事件
+    DefaultKeyboardMonitor.registerDefaultKeyboardChangeEvent(
+      _handleDefaultKeyboardChange,
+    );
+    checkSetting();
+
     // 进入页面,就获取输入框焦点
     // inputFocusNode.requestFocus();
-    _registerDefaultKeyboardChangeEvent();
   }
 
   @override
@@ -54,29 +62,31 @@ class KeyboardGuidePageController extends BaseController {
     inputFocusNode.dispose();
     editingController.dispose();
     scrollController.dispose();
-    _unRegisterDefaultKeyboardChangeEvent();
-    super.onClose();
-  }
-
-  /// 监听默认键盘切换事件
-  void _registerDefaultKeyboardChangeEvent() {
-    DefaultKeyboardMonitor.registerDefaultKeyboardChangeEvent(
-      handleDefaultKeyboardChange,
-    );
-  }
-
-  /// 取消监听默认键盘切换事件
-  void _unRegisterDefaultKeyboardChangeEvent() {
+    // 取消监听默认键盘切换事件
     DefaultKeyboardMonitor.unRegisterDefaultKeyboardChangeEvent(
-      handleDefaultKeyboardChange,
+      _handleDefaultKeyboardChange,
     );
+    super.onClose();
   }
 
   /// 处理默认键盘切换
-  void handleDefaultKeyboardChange(bool isDefaultKeyboard) {
+  void _handleDefaultKeyboardChange(bool isDefaultKeyboard) {
     isChooseDefaultKeyboard.value = isDefaultKeyboard;
   }
 
+  /// 马上检查设置
+  void checkSetting() async {
+    KeyboardAndroidPlatform.isDefaultKeyboard().then((isDefaultKeyboard) {
+      _handleDefaultKeyboardChange(isDefaultKeyboard);
+    });
+    // 没有完成键盘教程,却跳到了键盘引导页,说明是用户手动去设置修改了权限,则关闭该页面,跳回键盘教程页
+    if (!await KeyboardTutorialUtil.isTutorialComplete()) {
+      KeyboardTutorialPage.startAndOffMe();
+    }
+    // 有权限,则马上显示悬浮窗
+    FloatingWindowUtil.showFloatingBall();
+  }
+
   /// 关闭页面
   clickBack() {
     Get.back();

+ 23 - 14
lib/module/keyboard_guide/keyboard_guide_page.dart

@@ -13,6 +13,7 @@ import '../../resource/colors.gen.dart';
 import '../../resource/string.gen.dart';
 import '../../utils/clipboard_util.dart';
 import '../../utils/url_launcher_util.dart';
+import '../../widget/app_lifecycle_widget.dart';
 import '../../widget/delegate_lifecycle_widget.dart';
 import '../intimacy_scale/intimacy_scale_page.dart';
 import 'enums/keyboard_guide_msg_type.dart';
@@ -40,22 +41,30 @@ class KeyboardGuidePage extends BasePage<KeyboardGuidePageController> {
   Widget buildBody(BuildContext context) {
     return Scaffold(
       backgroundColor: backgroundColor(),
-      body: DelegateLifecycleWidget(
-        onCreateCallback: () {
-          // 选择为默认键盘,则尝试显示引导弹窗
-          if (controller.isChooseDefaultKeyboard.value) {
-            controller.showGuideOverlayDialog();
+      body: AppLifecycleWidget(
+        onAppLifecycleCallback: (isForeground) {
+          // 切换到前台时,重新检查设置,更新按钮状态
+          if (isForeground) {
+            controller.checkSetting();
           }
         },
-        child: Column(
-          children: [
-            // 标题栏
-            _buildTitleBar(),
-            // 消息列表
-            Expanded(flex: 1, child: _buildContent()),
-            // 底部输入栏
-            _buildBottomInput(),
-          ],
+        child: DelegateLifecycleWidget(
+          onCreateCallback: () {
+            // 选择为默认键盘,则尝试显示引导弹窗
+            if (controller.isChooseDefaultKeyboard.value) {
+              controller.showGuideOverlayDialog();
+            }
+          },
+          child: Column(
+            children: [
+              // 标题栏
+              _buildTitleBar(),
+              // 消息列表
+              Expanded(flex: 1, child: _buildContent()),
+              // 底部输入栏
+              _buildBottomInput(),
+            ],
+          ),
         ),
       ),
     );

+ 6 - 6
lib/module/keyboard_tutorial/keyboard_tutorial_controller.dart

@@ -4,6 +4,8 @@ import 'package:keyboard/base/base_controller.dart';
 import 'package:keyboard/module/keyboard_guide/keyboard_guide_page.dart';
 
 import '../../plugins/keyboard_android_platform.dart';
+import '../../utils/floating_window_util.dart';
+import '../../utils/keyboard_tutorial_util.dart';
 
 /// 键盘使用教程-引导页Controller
 @injectable
@@ -33,11 +35,9 @@ class KeyboardTutorialController extends BaseController {
     // 检查是否有悬浮窗权限
     KeyboardAndroidPlatform.hasFloatingWindowPermission().then((hasPermission) {
       isFloatingWindowEnable.value = hasPermission;
-      // 有权限,则启动悬浮窗
-      if (hasPermission) {
-        KeyboardAndroidPlatform.enableFloatingWindow(true);
-      }
     });
+    // 有权限,则开启悬浮窗
+    FloatingWindowUtil.showFloatingBall();
   }
 
   /// 点击返回
@@ -66,9 +66,9 @@ class KeyboardTutorialController extends BaseController {
   }
 
   /// 检查,是否步骤都完成了
-  bool checkHasComplete() {
+  Future<bool> checkHasComplete() async {
     // 都完成了,则跳转到键盘引导页
-    if (isStepComplete) {
+    if (await KeyboardTutorialUtil.isTutorialComplete()) {
       jump2KeyboardGuide();
       return true;
     }

+ 7 - 2
lib/module/keyboard_tutorial/keyboard_tutorial_page.dart

@@ -21,6 +21,11 @@ class KeyboardTutorialPage extends BasePage<KeyboardTutorialController> {
     Get.toNamed(RoutePath.keyboardTutorial);
   }
 
+  /// 跳转并关闭当前页
+  static void startAndOffMe() {
+    Get.offNamed(RoutePath.keyboardTutorial);
+  }
+
   @override
   bool immersive() {
     // 开启沉浸式
@@ -37,9 +42,9 @@ class KeyboardTutorialPage extends BasePage<KeyboardTutorialController> {
     return Scaffold(
       backgroundColor: backgroundColor(),
       body: AppLifecycleWidget(
-        onAppLifecycleCallback: (isForeground) {
+        onAppLifecycleCallback: (isForeground) async {
           // 步骤都做完了,则跳转去键盘引导页
-          if (controller.checkHasComplete()) {
+          if (await controller.checkHasComplete()) {
             return;
           }
           // 未完成,则每次切换到前台时,重新检查设置,更新按钮状态

+ 6 - 6
lib/module/mine/mine_controller.dart

@@ -64,8 +64,8 @@ class MineController extends BaseController {
     } else {
       LoginDialog.show();
     }
-    KeyboardAndroidPlatform.enableFloatingWindow(true);
-    KeyboardAndroidPlatform.openInputMethodSettings();
+    // KeyboardAndroidPlatform.enableFloatingWindow(true);
+    // KeyboardAndroidPlatform.openInputMethodSettings();
   }
 
   clickOnlineCustomerService() {
@@ -111,10 +111,10 @@ class MineController extends BaseController {
     debugPrint('clickTutorials');
     KeyboardTutorialUtil.start();
   //   测试模isDebug式才生效
-    if (BuildConfig.isDebug) {
-      KeyboardAndroidPlatform.enableFloatingWindow(true);
-      KeyboardAndroidPlatform.openInputMethodSettings();
-    }
+  //   if (BuildConfig.isDebug) {
+  //     KeyboardAndroidPlatform.enableFloatingWindow(true);
+  //     KeyboardAndroidPlatform.openInputMethodSettings();
+  //   }
   }
 
 

+ 7 - 0
lib/plugins/keyboard_android_platform.dart

@@ -90,4 +90,11 @@ class KeyboardAndroidPlatform {
     debugPrint('isTargetKeyboardEnabled value: $result');
     return result;
   }
+
+  /// 是否是默认输入法
+  static Future<bool> isDefaultKeyboard() async {
+    final result = await _keyboardAndroidService.isDefaultKeyboard();
+    debugPrint('isTargetKeyboardEnabled value: $result');
+    return result;
+  }
 }

+ 4 - 0
lib/plugins/keyboard_android_service.dart

@@ -26,4 +26,8 @@ class KeyboardAndroidService {
   Future<bool> isTargetKeyboardEnabled() {
     return _plugin.isTargetKeyboardEnabled();
   }
+
+  Future<bool> isDefaultKeyboard() {
+    return _plugin.isDefaultKeyboard();
+  }
 }

+ 17 - 0
lib/utils/floating_window_util.dart

@@ -0,0 +1,17 @@
+import '../plugins/keyboard_android_platform.dart';
+
+/// 悬浮窗工具类
+class FloatingWindowUtil {
+  FloatingWindowUtil._();
+
+  /// 显示悬浮窗
+  static void showFloatingBall() {
+    // 检查是否有悬浮窗权限
+    KeyboardAndroidPlatform.hasFloatingWindowPermission().then((hasPermission) {
+      // 有权限,则启动悬浮窗
+      if (hasPermission) {
+        KeyboardAndroidPlatform.enableFloatingWindow(true);
+      }
+    });
+  }
+}

+ 2 - 2
lib/utils/keyboard_tutorial_util.dart

@@ -6,7 +6,7 @@ import '../plugins/keyboard_android_platform.dart';
 class KeyboardTutorialUtil {
   /// 跳转方法
   static void start() async {
-    bool isComplete = await _isTutorialComplete();
+    bool isComplete = await isTutorialComplete();
     if (isComplete) {
       // 如果完成了教程,则跳转到键盘引导页
       KeyboardGuidePage.start();
@@ -17,7 +17,7 @@ class KeyboardTutorialUtil {
   }
 
   /// 是否完成了教程
-  static Future<bool> _isTutorialComplete() async {
+  static Future<bool> isTutorialComplete() async {
     // 是否有悬浮窗权限
     bool hasFloatingWindowPermission =
         await KeyboardAndroidPlatform.hasFloatingWindowPermission();

+ 10 - 1
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/KeyboardAndroidPlugin.kt

@@ -6,6 +6,7 @@ import com.atmob.keyboard_android.component.ComponentMediator
 import com.atmob.keyboard_android.component.base.interceptor.LoginRouteInterceptor
 import com.atmob.keyboard_android.component.base.interceptor.RouteInterceptorManager
 import com.atmob.keyboard_android.component.listener.ComponentUpdateLoggingListener
+import com.atmob.keyboard_android.constant.PluginConfig
 import com.atmob.keyboard_android.floating.FloatingButtonService
 import com.atmob.keyboard_android.util.FloatingWindowUtil
 import com.atmob.keyboard_android.util.InputMethodUtil
@@ -45,7 +46,10 @@ class KeyboardAndroidPlugin : FlutterPlugin, MethodCallHandler {
 
     override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
         context = flutterPluginBinding.applicationContext
-        channel = MethodChannel(flutterPluginBinding.binaryMessenger, "keyboard_android")
+        channel = MethodChannel(
+            flutterPluginBinding.binaryMessenger,
+            PluginConfig.FLUTTER_METHOD_CHANNEL_NAME
+        )
         channel.setMethodCallHandler(this)
 
         LogUtil.d("KeyboardAndroidPlugin 初始化")
@@ -95,6 +99,11 @@ class KeyboardAndroidPlugin : FlutterPlugin, MethodCallHandler {
                 result.success(InputMethodUtil.isTargetKeyboardEnabled(context))
             }
 
+            // 是否是默认输入法
+            "isDefaultKeyboard" -> {
+                result.success(InputMethodUtil.isDefaultKeyboard(context))
+            }
+
             else -> {
                 result.notImplemented()
             }

+ 5 - 0
plugins/keyboard_android/lib/keyboard_android.dart

@@ -35,6 +35,11 @@ class KeyboardAndroid {
     return KeyboardAndroidPlatform.instance.isTargetKeyboardEnabled();
   }
 
+  /// 是否是默认输入法
+  Future<bool> isDefaultKeyboard() async {
+    return KeyboardAndroidPlatform.instance.isDefaultKeyboard();
+  }
+
   // /// 获取键映射
   // static Future<List<Map<String, String>>> getKeyMappings() {
   //   return KeyboardAndroidPlatform.instance.getKeyMappings();

+ 5 - 0
plugins/keyboard_android/lib/keyboard_android_method_channel.dart

@@ -51,6 +51,11 @@ class MethodChannelKeyboardAndroid extends KeyboardAndroidPlatform {
         false;
   }
 
+  @override
+  Future<bool> isDefaultKeyboard() async {
+    return await methodChannel.invokeMethod<bool>('isDefaultKeyboard') ?? false;
+  }
+
   // /// 获取键映射
   // @override
   // Future<List<Map<String, String>>> getKeyMappings() async {

+ 6 - 0
plugins/keyboard_android/lib/keyboard_android_platform_interface.dart

@@ -63,6 +63,12 @@ abstract class KeyboardAndroidPlatform extends PlatformInterface {
     );
   }
 
+  Future<bool> isDefaultKeyboard() {
+    throw UnimplementedError(
+      'isDefaultKeyboard() has not been implemented.',
+    );
+  }
+
   // /// 获取键映射(需要在 `MethodChannelKeyboardAndroid` 实现)
   // Future<List<Map<String, String>>> getKeyMappings() {
   //   throw UnimplementedError('getKeyMappings() has not been implemented.');

+ 5 - 0
plugins/keyboard_android/test/keyboard_android_test.dart

@@ -39,6 +39,11 @@ class MockKeyboardAndroidPlatform
   void jumpFloatingWindowSetting() {
     throw UnimplementedError();
   }
+
+  @override
+  Future<bool> isDefaultKeyboard() {
+    throw UnimplementedError();
+  }
 }
 
 void main() {