Procházet zdrojové kódy

[fix]键盘插件,键盘引导弹窗,改用View实现,原来用PopupWindow弹窗来实现,在国产手机上,默认有一个抬高键盘的功能,会把键盘网上顶,但是不会把PopupWindow也一起往上顶,导致覆盖错位

hezihao před 7 měsíci
rodič
revize
1b1d6ccf7e

+ 13 - 11
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/RouteComponent.kt

@@ -53,20 +53,22 @@ class RouteComponent @JvmOverloads constructor(
             routeCallback?.onLost()
         } else {
             // 找到目标组件
-            routeCallback?.onFound()
+            routeCallback?.onFound(targetComponent)
 
             // 路由前,执行路由拦截器
-            RouteInterceptorManager.executeInterceptors(targetComponent, object : InterceptorCallback {
-                override fun onContinue() {
-                    // 拦截器放行,继续路由
-                    routeAction.invoke()
-                }
+            RouteInterceptorManager.executeInterceptors(
+                targetComponent,
+                object : InterceptorCallback {
+                    override fun onContinue() {
+                        // 拦截器放行,继续路由
+                        routeAction.invoke()
+                    }
 
-                override fun onInterrupt(error: Throwable) {
-                    // 路由被拦截器拦截了,回调外部
-                    routeCallback?.onInterrupt()
-                }
-            })
+                    override fun onInterrupt(error: Throwable) {
+                        // 路由被拦截器拦截了,回调外部
+                        routeCallback?.onInterrupt(targetComponent, error)
+                    }
+                })
         }
     }
 }

+ 4 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/interceptor/RouteCallback.kt

@@ -1,5 +1,7 @@
 package com.atmob.keyboard_android.component.base.interceptor
 
+import com.atmob.keyboard_android.component.base.IUIComponent
+
 /**
  * 路由跳转回调
  */
@@ -7,12 +9,12 @@ interface RouteCallback {
     /**
      * 路由跳转成功
      */
-    fun onFound()
+    fun onFound(targetComponent: IUIComponent)
 
     /**
      * 路由跳转被拦截了
      */
-    fun onInterrupt()
+    fun onInterrupt(targetComponent: IUIComponent, error: Throwable)
 
     /**
      * 路由跳转失败

+ 20 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/interceptor/RouteCallbackAdapter.kt

@@ -0,0 +1,20 @@
+package com.atmob.keyboard_android.component.base.interceptor
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 路由跳转回调空实现
+ */
+open class RouteCallbackAdapter: RouteCallback {
+    override fun onFound(targetComponent: IUIComponent) {
+    }
+
+    override fun onInterrupt(
+        targetComponent: IUIComponent,
+        error: Throwable
+    ) {
+    }
+
+    override fun onLost() {
+    }
+}

+ 26 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/IKeyboardGuideComponent.kt

@@ -0,0 +1,26 @@
+package com.atmob.keyboard_android.component.child
+
+import android.view.View
+import com.atmob.keyboard_android.component.base.IUIComponent
+import com.atmob.keyboard_android.model.AiKeyboardKeyModel
+
+/**
+ * 键盘引导组件
+ */
+interface IKeyboardGuideComponent : IUIComponent {
+    interface OnActionCallback {
+        /**
+         * 结束引导时回调
+         */
+        fun onFinishGuide()
+    }
+
+    /**
+     * 绑定引导数据
+     */
+    fun bindGuideData(
+        targetView: View,
+        dataModel: AiKeyboardKeyModel,
+        finishCallback: OnActionCallback
+    )
+}

+ 2 - 3
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/AiKeyboardCommonPanelComponent.kt

@@ -14,6 +14,7 @@ import com.atmob.keyboard_android.component.base.FakeComponent
 import com.atmob.keyboard_android.component.base.RouteComponent
 import com.atmob.keyboard_android.component.child.IAiChatComponent
 import com.atmob.keyboard_android.component.child.IAiKeyboardCommonPanelComponent
+import com.atmob.keyboard_android.component.child.IKeyboardGuideComponent
 import com.atmob.keyboard_android.component.child.impl.ai.SuperSpeakAiChatComponent
 import com.atmob.keyboard_android.component.item.AddCharacterViewBinder
 import com.atmob.keyboard_android.component.item.AiKeyboardKeyViewBinder
@@ -24,7 +25,6 @@ import com.atmob.keyboard_android.ext.setGone
 import com.atmob.keyboard_android.ext.setVisible
 import com.atmob.keyboard_android.model.AddCharacterModel
 import com.atmob.keyboard_android.model.AiKeyboardKeyModel
-import com.atmob.keyboard_android.ui.popup.guide.KeyboardGuideDialog
 import com.atmob.keyboard_android.util.ClipboardHelper
 import com.atmob.keyboard_android.util.InputMethodUtil
 import com.atmob.keyboard_android.util.KeyboardGuideDialogUtil
@@ -353,8 +353,7 @@ class AiKeyboardCommonPanelComponent @JvmOverloads constructor(
             // 找到目标条目,则显示引导
             if (viewHolder != null) {
                 val itemView = viewHolder.itemView
-                KeyboardGuideDialogUtil.showGuideDialog(itemView, itemData, object :
-                    KeyboardGuideDialog.OnActionCallback {
+                KeyboardGuideDialogUtil.showGuideDialog(itemView, itemData, object : IKeyboardGuideComponent.OnActionCallback {
                     override fun onFinishGuide() {
                         mKeyboardGuideShowing = false
                         KeyboardGuideRecordUtil.setFirstShowKeyboardGuide(false)

+ 24 - 51
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/ui/popup/guide/KeyboardGuideDialog.kt

@@ -1,22 +1,25 @@
-package com.atmob.keyboard_android.ui.popup.guide
+package com.atmob.keyboard_android.component.child.impl
 
 import android.content.Context
+import android.util.AttributeSet
 import android.view.View
-import android.view.Window
 import android.widget.TextView
 import com.atmob.keyboard_android.R
+import com.atmob.keyboard_android.component.base.BaseUIComponent
+import com.atmob.keyboard_android.component.child.IKeyboardGuideComponent
 import com.atmob.keyboard_android.ext.click
 import com.atmob.keyboard_android.ext.measureView
 import com.atmob.keyboard_android.model.AiKeyboardKeyModel
-import com.atmob.keyboard_android.ui.popup.base.BasePopupDialog
 import com.atmob.keyboard_android.util.ViewLocationUtil
 import com.blankj.utilcode.util.ConvertUtils
 
 /**
- * 键盘引导弹窗
+ * 键盘引导组件实现
  */
-class KeyboardGuideDialog(context: Context, hostWindow: Window) :
-    BasePopupDialog(context, hostWindow) {
+class KeyboardGuideComponent @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BaseUIComponent<IKeyboardGuideComponent>(context, attrs, defStyleAttr),
+    IKeyboardGuideComponent {
     private lateinit var vRoot: View
     private lateinit var vFakeTargetView: View
     private lateinit var vKeyText: TextView
@@ -29,45 +32,30 @@ class KeyboardGuideDialog(context: Context, hostWindow: Window) :
     /**
      * 操作回调
      */
-    private var mOnActionCallback: OnActionCallback? = null
+    private var mOnActionCallback: IKeyboardGuideComponent.OnActionCallback? = null
 
-    override fun onInflaterViewId(): Int {
-        return R.layout.layout_keyboard_guide
+    override fun onInflateViewId(): Int {
+        return R.layout.component_keyboard_guide
     }
 
-    override fun onInflaterViewAfter(view: View) {
-        super.onInflaterViewAfter(view)
+    override fun findView(view: View) {
         vRoot = view.findViewById(R.id.root)
         vFakeTargetView = view.findViewById(R.id.fake_target_view)
         vKeyText = view.findViewById(R.id.key_text)
     }
 
-    override fun onBindView(view: View) {
-        super.onBindView(view)
+    override fun bindView(view: View) {
         vRoot.click {
-            // 关闭弹窗
-            dismiss()
+            // 隐藏
+            hide()
             // 结束引导
             mOnActionCallback?.onFinishGuide()
         }
         render()
     }
 
-    override fun isCanOutsideTouchable(): Boolean {
-        // 禁止点击外部区域关闭弹窗,自定义点击事件来实现关闭
-        return false
-    }
-
-    override fun onSetupDialogFrameSize(
-        context: Context,
-        windowWidth: Int,
-        windowHeight: Int
-    ): IntArray {
-        return intArrayOf(
-            windowWidth,
-            // 键盘的高度
-            context.resources.getDimensionPixelSize(R.dimen.keyboard_height)
-        )
+    override fun getComponentInterfaceClazz(): Class<IKeyboardGuideComponent> {
+        return IKeyboardGuideComponent::class.java
     }
 
     private fun render() {
@@ -111,17 +99,11 @@ class KeyboardGuideDialog(context: Context, hostWindow: Window) :
         val dataModel: AiKeyboardKeyModel
     )
 
-    interface OnActionCallback {
-        /**
-         * 结束引导时回调
-         */
-        fun onFinishGuide()
-    }
-
-    /**
-     * 绑定目标View
-     */
-    fun bindTargetView(targetView: View, dataModel: AiKeyboardKeyModel): KeyboardGuideDialog {
+    override fun bindGuideData(
+        targetView: View,
+        dataModel: AiKeyboardKeyModel,
+        finishCallback: IKeyboardGuideComponent.OnActionCallback
+    ) {
         // View在Window中的位置
         val viewLocationInWindow = ViewLocationUtil.getViewLocationInWindow(targetView)
         // View的宽高
@@ -138,15 +120,6 @@ class KeyboardGuideDialog(context: Context, hostWindow: Window) :
 
         // 重新渲染
         render()
-
-        return this
-    }
-
-    /**
-     * 绑定操作回调
-     */
-    fun bindOnActionCallback(callback: OnActionCallback): KeyboardGuideDialog {
-        this.mOnActionCallback = callback
-        return this
+        this.mOnActionCallback = finishCallback
     }
 }

+ 12 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/root/IKeyboardRootComponent.kt

@@ -1,6 +1,9 @@
 package com.atmob.keyboard_android.component.root
 
+import android.view.View
 import com.atmob.keyboard_android.component.base.IUIComponent
+import com.atmob.keyboard_android.component.child.IKeyboardGuideComponent.OnActionCallback
+import com.atmob.keyboard_android.model.AiKeyboardKeyModel
 
 /**
  * 键盘根组件接口
@@ -30,4 +33,13 @@ interface IKeyboardRootComponent : IUIComponent {
      * 切换到键盘页
      */
     fun switchKeyBoardPage()
+
+    /**
+     * 显示键盘引导弹窗
+     */
+    fun showKeyboardGuideDialog(
+        targetView: View,
+        dataModel: AiKeyboardKeyModel,
+        finishCallback: OnActionCallback
+    )
 }

+ 26 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/root/KeyboardRootComponent.kt

@@ -5,12 +5,17 @@ import android.util.AttributeSet
 import android.view.View
 import com.atmob.keyboard_android.R
 import com.atmob.keyboard_android.component.base.BaseUIComponent
+import com.atmob.keyboard_android.component.base.IUIComponent
 import com.atmob.keyboard_android.component.base.RouteComponent
+import com.atmob.keyboard_android.component.base.interceptor.RouteCallbackAdapter
 import com.atmob.keyboard_android.component.child.IKeyBoardContainerComponent
+import com.atmob.keyboard_android.component.child.IKeyboardGuideComponent
+import com.atmob.keyboard_android.component.child.IKeyboardGuideComponent.OnActionCallback
 import com.atmob.keyboard_android.component.child.IKeyboardSelectComponent
 import com.atmob.keyboard_android.component.child.ISettingComponent
 import com.atmob.keyboard_android.component.page.ILoginPageComponent
 import com.atmob.keyboard_android.component.page.IVipPageComponent
+import com.atmob.keyboard_android.model.AiKeyboardKeyModel
 
 /**
  * 键盘根组件
@@ -54,4 +59,25 @@ class KeyboardRootComponent @JvmOverloads constructor(
     override fun switchKeyBoardPage() {
         vRouteComponent.routeChildComponent(IKeyBoardContainerComponent::class.java)
     }
+
+    override fun showKeyboardGuideDialog(
+        targetView: View,
+        dataModel: AiKeyboardKeyModel,
+        finishCallback: OnActionCallback
+    ) {
+        vRouteComponent.routeChildComponent(
+            IKeyboardGuideComponent::class.java,
+            mutex = false,
+            object : RouteCallbackAdapter() {
+                override fun onFound(targetComponent: IUIComponent) {
+                    super.onFound(targetComponent)
+                    // 绑定引导数据
+                    (targetComponent as IKeyboardGuideComponent).bindGuideData(
+                        targetView,
+                        dataModel,
+                        finishCallback
+                    )
+                }
+            })
+    }
 }

+ 10 - 15
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/KeyboardGuideDialogUtil.kt

@@ -1,9 +1,10 @@
 package com.atmob.keyboard_android.util
 
 import android.view.View
+import com.atmob.keyboard_android.component.ComponentMediator
+import com.atmob.keyboard_android.component.child.IKeyboardGuideComponent
+import com.atmob.keyboard_android.component.root.IKeyboardRootComponent
 import com.atmob.keyboard_android.model.AiKeyboardKeyModel
-import com.atmob.keyboard_android.ui.popup.guide.KeyboardGuideDialog
-import com.atmob.keyboard_android.ui.popup.guide.KeyboardGuideDialog.OnActionCallback
 
 /**
  * 键盘引导弹窗工具类
@@ -11,24 +12,18 @@ import com.atmob.keyboard_android.ui.popup.guide.KeyboardGuideDialog.OnActionCal
 class KeyboardGuideDialogUtil {
     companion object {
         /**
-         * 显示权限弹窗
+         * 显示键盘引导弹窗
          */
         fun showGuideDialog(
             targetView: View,
             dataModel: AiKeyboardKeyModel,
-            actionCallback: OnActionCallback
+            actionCallback: IKeyboardGuideComponent.OnActionCallback
         ) {
-            val keyboardService = KeyboardHolder.getKeyboardService()
-            if (keyboardService == null) {
-                return
-            }
-
-            val keyboardWindow = keyboardService.getKeyboardWindow()
-
-            KeyboardGuideDialog(targetView.context, keyboardWindow)
-                .bindTargetView(targetView, dataModel)
-                .bindOnActionCallback(actionCallback)
-                .show()
+            val keyboardRootComponent =
+                ComponentMediator.findComponent<IKeyboardRootComponent>(
+                    IKeyboardRootComponent::class.java
+                )
+            keyboardRootComponent?.showKeyboardGuideDialog(targetView, dataModel, actionCallback)
         }
     }
 }

plugins/keyboard_android/android/src/main/res/layout/layout_keyboard_guide.xml → plugins/keyboard_android/android/src/main/res/layout/component_keyboard_guide.xml


+ 5 - 0
plugins/keyboard_android/android/src/main/res/layout/component_keyboard_root.xml

@@ -9,6 +9,11 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
 
+    <!-- 键盘引导组件 -->
+    <com.atmob.keyboard_android.component.child.impl.KeyboardGuideComponent
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
     <!-- 键盘选择页 -->
     <com.atmob.keyboard_android.component.child.impl.KeyboardSelectComponent
         android:layout_width="match_parent"