Sfoglia il codice sorgente

[feat]键盘插件,实现组件交互、登录页切换效果

hezihao 1 anno fa
parent
commit
5e701dd8f1
41 ha cambiato i file con 565 aggiunte e 142 eliminazioni
  1. 37 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/ComponentMediator.kt
  2. 0 24
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/LoginComponent.kt
  3. 0 32
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/ToolBarComponent.kt
  4. 0 24
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/VipComponent.kt
  5. 38 3
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/BaseUIComponent.kt
  6. 6 12
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/IUIComponent.kt
  7. 36 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/RouteComponent.kt
  8. 34 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/ComponentAnimator.kt
  9. 64 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/impl/AlphaAnimator.kt
  10. 23 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/impl/NoOptAnimator.kt
  11. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/IAiChatComponent.kt
  12. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/IAiKeyboardComponent.kt
  13. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/IKeyBoardContainerComponent.kt
  14. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/IKeyboardSelectComponent.kt
  15. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/IPasteBarComponent.kt
  16. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/IPermissionTipComponent.kt
  17. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/IQuickSwitchComponent.kt
  18. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/ISettingComponent.kt
  19. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/IToolBarComponent.kt
  20. 7 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/AiChatComponent.kt
  21. 7 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/AiKeyboardComponent.kt
  22. 8 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/KeyBoardContainerComponent.kt
  23. 11 4
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/KeyboardSelectComponent.kt
  24. 7 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/PasteBarComponent.kt
  25. 8 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/PermissionTipComponent.kt
  26. 7 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/QuickSwitchComponent.kt
  27. 7 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/SettingComponent.kt
  28. 48 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/ToolBarComponent.kt
  29. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/page/ILoginPageComponent.kt
  30. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/page/IVipPageComponent.kt
  31. 50 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/page/impl/LoginPageComponent.kt
  32. 29 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/page/impl/VipPageComponent.kt
  33. 17 10
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/AiKeyboardContentComponent.kt
  34. 1 1
      plugins/keyboard_android/android/src/main/res/layout/component_ai_keyboard.xml
  35. 3 3
      plugins/keyboard_android/android/src/main/res/layout/component_key_board_container.xml
  36. 3 1
      plugins/keyboard_android/android/src/main/res/layout/component_login.xml
  37. 4 3
      plugins/keyboard_android/android/src/main/res/layout/component_tool_bar.xml
  38. 0 0
      plugins/keyboard_android/android/src/main/res/layout/component_vip_page.xml
  39. 8 8
      plugins/keyboard_android/android/src/main/res/layout/keyboard_layout.xml
  40. 1 1
      plugins/keyboard_android/android/src/main/res/layout/pager_ai_keyboard_content.xml
  41. 2 2
      plugins/keyboard_android/android/src/main/res/layout/component_ai_keyboard_content.xml

+ 37 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/ComponentMediator.kt

@@ -0,0 +1,37 @@
+package com.atmob.keyboard_android.component
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 组件协调者,也是组件中介,负责组件之间的通信和交互
+ */
+object ComponentMediator {
+    /**
+     * 组件Map,保存组件的实例
+     */
+    private val mComponentMap: MutableMap<Class<*>, IUIComponent> = mutableMapOf()
+
+    /**
+     * 注册组件
+     */
+    fun <T : IUIComponent> registerComponent(
+        componentInterfaceClazz: Class<T>,
+        component: IUIComponent
+    ) {
+        mComponentMap[componentInterfaceClazz] = component
+    }
+
+    /**
+     * 取消注册组件
+     */
+    fun <T : IUIComponent> unRegisterComponent(componentInterfaceClazz: Class<T>) {
+        mComponentMap.remove(componentInterfaceClazz)
+    }
+
+    /**
+     * 查找组件
+     */
+    fun <T : IUIComponent> findComponent(componentInterfaceClazz: Class<T>): T? {
+        return mComponentMap[componentInterfaceClazz] as T?
+    }
+}

+ 0 - 24
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/LoginComponent.kt

@@ -1,24 +0,0 @@
-package com.atmob.keyboard_android.component
-
-import android.content.Context
-import android.util.AttributeSet
-import android.view.View
-import com.atmob.keyboard_android.R
-import com.atmob.keyboard_android.component.base.BaseUIComponent
-
-/**
- * 登录页
- */
-class LoginComponent @JvmOverloads constructor(
-    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
-    override fun onInflateViewId(): Int {
-        return R.layout.component_login
-    }
-
-    override fun findView(view: View) {
-    }
-
-    override fun bindView(view: View) {
-    }
-}

+ 0 - 32
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/ToolBarComponent.kt

@@ -1,32 +0,0 @@
-package com.atmob.keyboard_android.component
-
-import android.content.Context
-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.ext.click
-
-/**
- * 工具类组件
- */
-class ToolBarComponent @JvmOverloads constructor(
-    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
-    private lateinit var vKeyboardSwitchBtn: View
-
-    override fun onInflateViewId(): Int {
-        return R.layout.component_tool_bar
-    }
-
-    override fun findView(view: View) {
-        vKeyboardSwitchBtn = view.findViewById(R.id.keyboard_switch_btn)
-    }
-
-    override fun bindView(view: View) {
-        vKeyboardSwitchBtn.click {
-            // TODO: hezihao,测试权限确认弹窗
-            // PermissionDialogUtil.showPermissionDialog(context)
-        }
-    }
-}

+ 0 - 24
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/VipComponent.kt

@@ -1,24 +0,0 @@
-package com.atmob.keyboard_android.component
-
-import android.content.Context
-import android.util.AttributeSet
-import android.view.View
-import com.atmob.keyboard_android.R
-import com.atmob.keyboard_android.component.base.BaseUIComponent
-
-/**
- * Vip页
- */
-class VipComponent @JvmOverloads constructor(
-    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
-    override fun onInflateViewId(): Int {
-        return R.layout.component_vip
-    }
-
-    override fun findView(view: View) {
-    }
-
-    override fun bindView(view: View) {
-    }
-}

+ 38 - 3
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/BaseUIComponent.kt

@@ -3,21 +3,56 @@ package com.atmob.keyboard_android.component.base
 import android.content.Context
 import android.util.AttributeSet
 import android.view.LayoutInflater
+import android.view.View
 import android.view.ViewGroup
-import android.widget.FrameLayout
+import com.atmob.keyboard_android.component.ComponentMediator
+import com.atmob.keyboard_android.component.base.animator.impl.NoOptAnimator
 
 /**
  * UI组件抽象类,定义生命周期方法
  */
-abstract class BaseUIComponent @JvmOverloads constructor(
+abstract class BaseUIComponent<T : IUIComponent> @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : FrameLayout(context, attrs, defStyleAttr), IUIComponent {
+) : RouteComponent(context, attrs, defStyleAttr), IUIComponent {
     init {
+        // 组件创建,注册组件
+        ComponentMediator.registerComponent(getComponentInterfaceClazz(), this)
         val view = LayoutInflater.from(context).inflate(onInflateViewId(), this, true)
         findView(view)
         bindView(view)
     }
 
+    override fun onDetachedFromWindow() {
+        super.onDetachedFromWindow()
+        // 组件销毁,解开注册
+        ComponentMediator.unRegisterComponent(getComponentInterfaceClazz())
+    }
+
+    /**
+     * 获取组件的视图布局Id
+     */
+    abstract fun onInflateViewId(): Int
+
+    /**
+     * 查找控件
+     */
+    abstract fun findView(view: View)
+
+    /**
+     * 绑定控件
+     */
+    abstract fun bindView(view: View)
+
+    /**
+     * 返回组件的接口
+     */
+    abstract fun getComponentInterfaceClazz(): Class<T>
+
+    override fun getComponentAnimator(): Class<*> {
+        // 默认不使用动画,进行切换
+        return NoOptAnimator::class.java
+    }
+
     override fun asView(): ViewGroup {
         return this
     }

+ 6 - 12
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/IUIComponent.kt

@@ -1,6 +1,5 @@
 package com.atmob.keyboard_android.component.base
 
-import android.view.View
 import android.view.ViewGroup
 
 /**
@@ -8,22 +7,17 @@ import android.view.ViewGroup
  */
 interface IUIComponent {
     /**
-     * 获取组件的视图布局
-     */
-    fun onInflateViewId(): Int
-
-    /**
-     * 查找控件
+     * 将组件转换为View实例
      */
-    fun findView(view: View)
+    fun asView(): ViewGroup
 
     /**
-     * 绑定控
+     * 显示组件
      */
-    fun bindView(view: View)
+    fun show()
 
     /**
-     * 将组件转换为View实例
+     * 隐藏组件
      */
-    fun asView(): ViewGroup
+    fun hide()
 }

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

@@ -0,0 +1,36 @@
+package com.atmob.keyboard_android.component.base
+
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.FrameLayout
+import com.atmob.keyboard_android.component.base.animator.ComponentAnimator
+
+/**
+ * 带有路由功能的组件基类
+ */
+abstract class RouteComponent @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : FrameLayout(context, attrs, defStyleAttr), IUIComponent {
+    /**
+     * 动画执行器
+     */
+    private val mComponentAnimator: ComponentAnimator
+
+    init {
+        mComponentAnimator = getComponentAnimator().newInstance() as ComponentAnimator
+        mComponentAnimator.attachUIComponent(this)
+    }
+
+    override fun show() {
+        mComponentAnimator.show()
+    }
+
+    override fun hide() {
+        mComponentAnimator.hide()
+    }
+
+    /**
+     * 获取组件的动画执行器
+     */
+    abstract fun getComponentAnimator(): Class<*>
+}

+ 34 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/ComponentAnimator.kt

@@ -0,0 +1,34 @@
+package com.atmob.keyboard_android.component.base.animator
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 组件动画执行器抽象类,具体动画实现,交给子类去实现
+ */
+abstract class ComponentAnimator {
+    protected var mUIComponent: IUIComponent? = null
+
+    /**
+     * 设置组件实例
+     */
+    fun attachUIComponent(component: IUIComponent) {
+        this.mUIComponent = component
+    }
+
+    /**
+     * 获取组件实例
+     */
+    fun getUIComponent(): IUIComponent? {
+        return mUIComponent
+    }
+
+    /**
+     * 显示组件
+     */
+    abstract fun show()
+
+    /**
+     * 隐藏组件
+     */
+    abstract fun hide()
+}

+ 64 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/impl/AlphaAnimator.kt

@@ -0,0 +1,64 @@
+package com.atmob.keyboard_android.component.base.animator.impl
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.ValueAnimator
+import android.view.View
+import android.view.animation.LinearInterpolator
+import com.atmob.keyboard_android.component.base.animator.ComponentAnimator
+
+/**
+ * 渐变效果的动画执行器
+ */
+class AlphaAnimator : ComponentAnimator() {
+    private var mShowAnimator: ValueAnimator? = null
+    private var mHideAnimator: ValueAnimator? = null
+
+    override fun show() {
+        if (mShowAnimator != null && mShowAnimator!!.isRunning) {
+            return
+        }
+        val uiComponent = getUIComponent()
+        uiComponent?.asView()?.let { rootView ->
+            mShowAnimator = ValueAnimator.ofFloat(0f, 1f).apply {
+                duration = 300
+                interpolator = LinearInterpolator()
+                addUpdateListener { animation ->
+                    val alpha = animation.animatedValue as Float
+                    rootView.alpha = alpha
+                }
+                addListener(object : AnimatorListenerAdapter() {
+                    override fun onAnimationStart(animation: Animator) {
+                        super.onAnimationStart(animation)
+                        rootView.visibility = View.VISIBLE
+                    }
+                })
+            }
+            mShowAnimator!!.start()
+        }
+    }
+
+    override fun hide() {
+        if (mHideAnimator != null && mHideAnimator!!.isRunning) {
+            return
+        }
+        val uiComponent = getUIComponent()
+        uiComponent?.asView()?.let { rootView ->
+            mHideAnimator = ValueAnimator.ofFloat(1f, 0f).apply {
+                duration = 200
+                interpolator = LinearInterpolator()
+                addUpdateListener { animation ->
+                    val alpha = animation.animatedValue as Float
+                    rootView.alpha = alpha
+                }
+                addListener(object : AnimatorListenerAdapter() {
+                    override fun onAnimationEnd(animation: Animator) {
+                        super.onAnimationEnd(animation)
+                        rootView.visibility = View.GONE
+                    }
+                })
+            }
+            mHideAnimator!!.start()
+        }
+    }
+}

+ 23 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/impl/NoOptAnimator.kt

@@ -0,0 +1,23 @@
+package com.atmob.keyboard_android.component.base.animator.impl
+
+import android.view.View
+import com.atmob.keyboard_android.component.base.animator.ComponentAnimator
+
+/**
+ * 没有动画效果的动画执行器
+ */
+class NoOptAnimator : ComponentAnimator() {
+    override fun show() {
+        val uiComponent = getUIComponent()
+        uiComponent?.asView()?.let { rootView ->
+            rootView.visibility = View.VISIBLE
+        }
+    }
+
+    override fun hide() {
+        val uiComponent = getUIComponent()
+        uiComponent?.asView()?.let { rootView ->
+            rootView.visibility = View.GONE
+        }
+    }
+}

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

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.child
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * Ai生成组件接口
+ */
+interface IAiChatComponent : IUIComponent{
+}

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

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.child
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * Ai键盘组件接口
+ */
+interface IAiKeyboardComponent : IUIComponent {
+}

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

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.child
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 键盘容器组件接口
+ */
+interface IKeyBoardContainerComponent: IUIComponent {
+}

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

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.child
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 键盘选择页组件接口
+ */
+interface IKeyboardSelectComponent : IUIComponent {
+}

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

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.child
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 粘贴栏组件接口
+ */
+interface IPasteBarComponent : IUIComponent {
+}

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

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.child
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 权限提示组件接口
+ */
+interface IPermissionTipComponent : IUIComponent {
+}

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

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.child
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 快速切换组件接口
+ */
+interface IQuickSwitchComponent : IUIComponent{
+}

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

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.child
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 设置页组件接口
+ */
+interface ISettingComponent : IUIComponent {
+}

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

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.child
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 工具类组件接口
+ */
+interface IToolBarComponent : IUIComponent{
+}

+ 7 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/AiChatComponent.kt

@@ -1,4 +1,4 @@
-package com.atmob.keyboard_android.component
+package com.atmob.keyboard_android.component.child.impl
 
 import android.annotation.SuppressLint
 import android.content.Context
@@ -8,6 +8,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.atmob.keyboard_android.R
 import com.atmob.keyboard_android.component.base.BaseUIComponent
+import com.atmob.keyboard_android.component.child.IAiChatComponent
 import com.atmob.keyboard_android.component.item.AiChatViewBinder
 import com.atmob.keyboard_android.ext.click
 import com.atmob.keyboard_android.model.AiChatModel
@@ -21,7 +22,7 @@ import me.drakeet.multitype.MultiTypeAdapter
  */
 class AiChatComponent @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
+) : BaseUIComponent<IAiChatComponent>(context, attrs, defStyleAttr), IAiChatComponent {
     private lateinit var vBackBtn: View
     private lateinit var vReGenerateBtn: View
     private lateinit var vChatList: RecyclerView
@@ -75,6 +76,10 @@ class AiChatComponent @JvmOverloads constructor(
         setData()
     }
 
+    override fun getComponentInterfaceClazz(): Class<IAiChatComponent> {
+        return IAiChatComponent::class.java
+    }
+
     /**
      * 设置数据
      */

+ 7 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/AiKeyboardComponent.kt

@@ -1,4 +1,4 @@
-package com.atmob.keyboard_android.component
+package com.atmob.keyboard_android.component.child.impl
 
 import android.content.Context
 import android.util.AttributeSet
@@ -6,6 +6,7 @@ import android.view.View
 import com.atmob.keyboard_android.R
 import com.atmob.keyboard_android.component.adapter.AiKeyboardPagerAdapter
 import com.atmob.keyboard_android.component.base.BaseUIComponent
+import com.atmob.keyboard_android.component.child.IAiKeyboardComponent
 import com.atmob.keyboard_android.ext.setGone
 import com.atmob.keyboard_android.widget.NoSwipeViewPager
 import com.atmob.keyboard_android.widget.indicator.TabPagerTitleView
@@ -24,7 +25,7 @@ import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.Li
  */
 class AiKeyboardComponent @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
+) : BaseUIComponent<IAiKeyboardComponent>(context, attrs, defStyleAttr), IAiKeyboardComponent {
     private lateinit var vTabBarLayout: View
     private lateinit var vMagicIndicator: MagicIndicator
     private lateinit var vViewPager: NoSwipeViewPager
@@ -49,6 +50,10 @@ class AiKeyboardComponent @JvmOverloads constructor(
         setupViewPager()
     }
 
+    override fun getComponentInterfaceClazz(): Class<IAiKeyboardComponent> {
+        return IAiKeyboardComponent::class.java
+    }
+
     /**
      * 配置Tab栏
      */

+ 8 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/KeyBoardContainerComponent.kt

@@ -1,17 +1,19 @@
-package com.atmob.keyboard_android.component
+package com.atmob.keyboard_android.component.child.impl
 
 import android.content.Context
 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.child.IKeyBoardContainerComponent
 
 /**
  * 键盘容器组件,包含多个键盘,例如拼音键盘和AI键盘,顶部是工具栏组件
  */
 class KeyBoardContainerComponent @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
+) : BaseUIComponent<IKeyBoardContainerComponent>(context, attrs, defStyleAttr),
+    IKeyBoardContainerComponent {
     override fun onInflateViewId(): Int {
         return R.layout.component_key_board_container
     }
@@ -21,4 +23,8 @@ class KeyBoardContainerComponent @JvmOverloads constructor(
 
     override fun bindView(view: View) {
     }
+
+    override fun getComponentInterfaceClazz(): Class<IKeyBoardContainerComponent> {
+        return IKeyBoardContainerComponent::class.java
+    }
 }

+ 11 - 4
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/KeyboardSelectComponent.kt

@@ -1,4 +1,4 @@
-package com.atmob.keyboard_android.component
+package com.atmob.keyboard_android.component.child.impl
 
 import android.annotation.SuppressLint
 import android.content.Context
@@ -8,6 +8,7 @@ import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.atmob.keyboard_android.R
 import com.atmob.keyboard_android.component.base.BaseUIComponent
+import com.atmob.keyboard_android.component.child.IKeyboardSelectComponent
 import com.atmob.keyboard_android.component.item.EmptyPlaceholderViewBinder
 import com.atmob.keyboard_android.component.item.KeyboardSelectViewBinder
 import com.atmob.keyboard_android.constant.Constants
@@ -24,7 +25,8 @@ import me.drakeet.multitype.MultiTypeAdapter
  */
 class KeyboardSelectComponent @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
+) : BaseUIComponent<IKeyboardSelectComponent>(context, attrs, defStyleAttr),
+    IKeyboardSelectComponent {
     private lateinit var vBackBtn: View
     private lateinit var vList: RecyclerView
     private lateinit var vSaveBtn: View
@@ -71,11 +73,12 @@ class KeyboardSelectComponent @JvmOverloads constructor(
                     notifyDataSetChanged()
                 })
             }
-            layoutManager = GridLayoutManager(context, Constants.KEYBOARD_SELECT_SPAN_COUNT)
+            layoutManager =
+                GridLayoutManager(context, Constants.Companion.KEYBOARD_SELECT_SPAN_COUNT)
             adapter = mListAdapter
             addItemDecoration(
                 GridDivider(
-                    spanCount = Constants.KEYBOARD_SELECT_SPAN_COUNT,
+                    spanCount = Constants.Companion.KEYBOARD_SELECT_SPAN_COUNT,
                     spacing = ConvertUtils.dp2px(9f)
                 )
             )
@@ -84,6 +87,10 @@ class KeyboardSelectComponent @JvmOverloads constructor(
         setData()
     }
 
+    override fun getComponentInterfaceClazz(): Class<IKeyboardSelectComponent> {
+        return IKeyboardSelectComponent::class.java
+    }
+
     @SuppressLint("NotifyDataSetChanged")
     private fun setData() {
         // TODO: 加载键盘列表

+ 7 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/PasteBarComponent.kt

@@ -1,10 +1,11 @@
-package com.atmob.keyboard_android.component
+package com.atmob.keyboard_android.component.child.impl
 
 import android.content.Context
 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.child.IPasteBarComponent
 import com.atmob.keyboard_android.ext.click
 
 /**
@@ -12,7 +13,7 @@ import com.atmob.keyboard_android.ext.click
  */
 class PasteBarComponent @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
+) : BaseUIComponent<IPasteBarComponent>(context, attrs, defStyleAttr), IPasteBarComponent {
     private lateinit var vClearBtn: View
 
     override fun onInflateViewId(): Int {
@@ -28,4 +29,8 @@ class PasteBarComponent @JvmOverloads constructor(
             // 清空输入框内容
         }
     }
+
+    override fun getComponentInterfaceClazz(): Class<IPasteBarComponent> {
+        return IPasteBarComponent::class.java
+    }
 }

+ 8 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/PermissionTipComponent.kt

@@ -1,4 +1,4 @@
-package com.atmob.keyboard_android.component
+package com.atmob.keyboard_android.component.child.impl
 
 import android.content.Context
 import android.util.AttributeSet
@@ -6,6 +6,7 @@ import android.view.View
 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.IPermissionTipComponent
 import com.atmob.keyboard_android.ext.click
 
 /**
@@ -13,7 +14,8 @@ import com.atmob.keyboard_android.ext.click
  */
 class PermissionTipComponent @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
+) : BaseUIComponent<IPermissionTipComponent>(context, attrs, defStyleAttr),
+    IPermissionTipComponent {
     private lateinit var vTip: TextView
     private lateinit var vCloseBtn: View
 
@@ -33,4 +35,8 @@ class PermissionTipComponent @JvmOverloads constructor(
             // 关闭提示条
         }
     }
+
+    override fun getComponentInterfaceClazz(): Class<IPermissionTipComponent> {
+        return IPermissionTipComponent::class.java
+    }
 }

+ 7 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/QuickSwitchComponent.kt

@@ -1,10 +1,11 @@
-package com.atmob.keyboard_android.component
+package com.atmob.keyboard_android.component.child.impl
 
 import android.content.Context
 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.child.IQuickSwitchComponent
 import com.atmob.keyboard_android.ui.popup.ModeSwitchPopupWindow
 
 /**
@@ -12,7 +13,7 @@ import com.atmob.keyboard_android.ui.popup.ModeSwitchPopupWindow
  */
 class QuickSwitchComponent @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
+) : BaseUIComponent<IQuickSwitchComponent>(context, attrs, defStyleAttr), IQuickSwitchComponent {
     private lateinit var vModeSwitchLayout: View
 
     /**
@@ -38,4 +39,8 @@ class QuickSwitchComponent @JvmOverloads constructor(
             }
         }
     }
+
+    override fun getComponentInterfaceClazz(): Class<IQuickSwitchComponent> {
+        return IQuickSwitchComponent::class.java
+    }
 }

+ 7 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/SettingComponent.kt

@@ -1,17 +1,18 @@
-package com.atmob.keyboard_android.component
+package com.atmob.keyboard_android.component.child.impl
 
 import android.content.Context
 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.child.ISettingComponent
 
 /**
  * 设置页
  */
 class SettingComponent @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
+) : BaseUIComponent<ISettingComponent>(context, attrs, defStyleAttr), ISettingComponent {
     private lateinit var vSettingCustomPersonLayout: View
     private lateinit var vSettingMarketLayout: View
     private lateinit var vSettingUnlockVipLayout: View
@@ -34,4 +35,8 @@ class SettingComponent @JvmOverloads constructor(
         vSettingUnlockVipLayout.setOnClickListener {
         }
     }
+
+    override fun getComponentInterfaceClazz(): Class<ISettingComponent> {
+        return ISettingComponent::class.java
+    }
 }

+ 48 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/ToolBarComponent.kt

@@ -0,0 +1,48 @@
+package com.atmob.keyboard_android.component.child.impl
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import com.atmob.keyboard_android.R
+import com.atmob.keyboard_android.component.ComponentMediator
+import com.atmob.keyboard_android.component.base.BaseUIComponent
+import com.atmob.keyboard_android.component.child.IToolBarComponent
+import com.atmob.keyboard_android.component.page.ILoginPageComponent
+import com.atmob.keyboard_android.ext.click
+import com.atmob.keyboard_android.keyboard.InputMethodPickerActivity
+
+/**
+ * 工具类组件
+ */
+class ToolBarComponent @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BaseUIComponent<IToolBarComponent>(context, attrs, defStyleAttr), IToolBarComponent {
+    private lateinit var vKeyboardSwitchBtn: View
+    private lateinit var vIntimacyLayout: View
+
+    override fun onInflateViewId(): Int {
+        return R.layout.component_tool_bar
+    }
+
+    override fun findView(view: View) {
+        vKeyboardSwitchBtn = view.findViewById(R.id.keyboard_switch_btn)
+        vIntimacyLayout = view.findViewById(R.id.intimacy_layout)
+    }
+
+    override fun bindView(view: View) {
+        vKeyboardSwitchBtn.click {
+            // 打开系统输入法选择器
+            InputMethodPickerActivity.start(context)
+        }
+        vIntimacyLayout.click {
+            // 点击亲密度布局
+            val loginPageComponent =
+                ComponentMediator.findComponent(ILoginPageComponent::class.java)
+            loginPageComponent?.show()
+        }
+    }
+
+    override fun getComponentInterfaceClazz(): Class<IToolBarComponent> {
+        return IToolBarComponent::class.java
+    }
+}

+ 9 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/page/ILoginPageComponent.kt

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.page
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * 登录页组件接口
+ */
+interface ILoginPageComponent : IUIComponent {
+}

+ 9 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/page/IVipPageComponent.kt

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.component.page
+
+import com.atmob.keyboard_android.component.base.IUIComponent
+
+/**
+ * VIP页组件的接口
+ */
+interface IVipPageComponent : IUIComponent {
+}

+ 50 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/page/impl/LoginPageComponent.kt

@@ -0,0 +1,50 @@
+package com.atmob.keyboard_android.component.page.impl
+
+import android.content.Context
+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.animator.impl.AlphaAnimator
+import com.atmob.keyboard_android.component.page.ILoginPageComponent
+import com.atmob.keyboard_android.ext.click
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * 登录页组件
+ */
+class LoginPageComponent @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BaseUIComponent<ILoginPageComponent>(context, attrs, defStyleAttr), ILoginPageComponent {
+    private lateinit var vBackBtn: View
+    private lateinit var vLoginBtn: View
+
+    override fun onInflateViewId(): Int {
+        return R.layout.component_login_page
+    }
+
+    override fun findView(view: View) {
+        vBackBtn = view.findViewById(R.id.back_btn)
+        vLoginBtn = view.findViewById(R.id.login_btn)
+    }
+
+    override fun bindView(view: View) {
+        vBackBtn.click {
+            // 关闭
+            hide()
+        }
+        vLoginBtn.click {
+            // 跳转到登录页
+            ToastUtils.showShort("跳转到登录页")
+        }
+    }
+
+    override fun getComponentAnimator(): Class<*> {
+        // 设置动画执行器
+        return AlphaAnimator::class.java
+    }
+
+    override fun getComponentInterfaceClazz(): Class<ILoginPageComponent> {
+        return ILoginPageComponent::class.java
+    }
+}

+ 29 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/page/impl/VipPageComponent.kt

@@ -0,0 +1,29 @@
+package com.atmob.keyboard_android.component.page.impl
+
+import android.content.Context
+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.page.IVipPageComponent
+
+/**
+ * Vip页组件
+ */
+class VipPageComponent @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BaseUIComponent<IVipPageComponent>(context, attrs, defStyleAttr) {
+    override fun onInflateViewId(): Int {
+        return R.layout.component_vip_page
+    }
+
+    override fun findView(view: View) {
+    }
+
+    override fun bindView(view: View) {
+    }
+
+    override fun getComponentInterfaceClazz(): Class<IVipPageComponent> {
+        return IVipPageComponent::class.java
+    }
+}

+ 17 - 10
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/AiKeyboardContentComponent.kt

@@ -1,13 +1,14 @@
-package com.atmob.keyboard_android.component
+package com.atmob.keyboard_android.component.view
 
 import android.annotation.SuppressLint
 import android.content.Context
 import android.util.AttributeSet
+import android.view.LayoutInflater
 import android.view.View
+import android.widget.FrameLayout
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.atmob.keyboard_android.R
-import com.atmob.keyboard_android.component.base.BaseUIComponent
 import com.atmob.keyboard_android.component.item.AiKeyboardKeyViewBinder
 import com.atmob.keyboard_android.ext.click
 import com.atmob.keyboard_android.model.AiKeyboardKeyModel
@@ -17,11 +18,11 @@ import me.drakeet.multitype.Items
 import me.drakeet.multitype.MultiTypeAdapter
 
 /**
- * AI键盘内容组件
+ * AI键盘内容View
  */
-class AiKeyboardContentComponent @JvmOverloads constructor(
+class AiKeyboardContentView @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent(context, attrs, defStyleAttr) {
+) : FrameLayout(context, attrs, defStyleAttr) {
     private lateinit var vKeyList: RecyclerView
     private lateinit var vDeleteBtn: View
     private lateinit var vClearBtn: View
@@ -30,21 +31,27 @@ class AiKeyboardContentComponent @JvmOverloads constructor(
     private lateinit var mListItems: Items
     private lateinit var mListAdapter: MultiTypeAdapter
 
-    override fun onInflateViewId(): Int {
-        return R.layout.component_ai_keyboard_content
+    init {
+        val view = LayoutInflater.from(context).inflate(onInflateViewId(), this, true)
+        findView(view)
+        bindView()
+        setData()
+    }
+
+    private fun onInflateViewId(): Int {
+        return R.layout.view_ai_keyboard_content
     }
 
-    override fun findView(view: View) {
+    private fun findView(view: View) {
         vKeyList = view.findViewById(R.id.key_list)
         vDeleteBtn = view.findViewById(R.id.delete_btn)
         vClearBtn = view.findViewById(R.id.clear_btn)
         vSendBtn = view.findViewById(R.id.send_btn)
     }
 
-    override fun bindView(view: View) {
+    private fun bindView() {
         setupKeyList()
         setupActionBtn()
-        setData()
     }
 
     /**

+ 1 - 1
plugins/keyboard_android/android/src/main/res/layout/component_ai_keyboard.xml

@@ -6,7 +6,7 @@
     android:orientation="vertical"
     tools:background="@mipmap/bg_keyboard">
 
-    <com.atmob.keyboard_android.component.PermissionTipComponent
+    <com.atmob.keyboard_android.component.child.impl.PermissionTipComponent
         android:id="@+id/permission_tip"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"

+ 3 - 3
plugins/keyboard_android/android/src/main/res/layout/component_key_board_container.xml

@@ -5,7 +5,7 @@
     android:orientation="vertical">
 
     <!-- 工具栏 -->
-    <com.atmob.keyboard_android.component.ToolBarComponent
+    <com.atmob.keyboard_android.component.child.impl.ToolBarComponent
         android:id="@+id/tool_bar"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
@@ -19,12 +19,12 @@
         <!-- 拼音键盘 -->
 
         <!-- AI键盘 -->
-        <com.atmob.keyboard_android.component.AiKeyboardComponent
+        <com.atmob.keyboard_android.component.child.impl.AiKeyboardComponent
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
 
         <!-- 键盘选择页 -->
-        <com.atmob.keyboard_android.component.KeyboardSelectComponent
+        <com.atmob.keyboard_android.component.child.impl.KeyboardSelectComponent
             android:id="@+id/keyboard_select_component"
             android:layout_width="match_parent"
             android:layout_height="match_parent"

+ 3 - 1
plugins/keyboard_android/android/src/main/res/layout/component_login.xml

@@ -4,7 +4,8 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="@dimen/keyboard_height"
-    tools:background="@mipmap/bg_keyboard">
+    android:background="@mipmap/bg_keyboard"
+    android:clickable="true">
 
     <ImageView
         android:id="@+id/back_btn"
@@ -39,6 +40,7 @@
         app:layout_constraintTop_toBottomOf="@+id/app_icon" />
 
     <TextView
+        android:id="@+id/login_btn"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="30dp"

+ 4 - 3
plugins/keyboard_android/android/src/main/res/layout/component_tool_bar.xml

@@ -23,7 +23,7 @@
         app:layout_constraintTop_toTopOf="parent" />
 
     <!-- 快速切换组件 -->
-    <com.atmob.keyboard_android.component.QuickSwitchComponent
+    <com.atmob.keyboard_android.component.child.impl.QuickSwitchComponent
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginStart="12dp"
@@ -46,8 +46,8 @@
             android:id="@+id/pinyin_switch_btn"
             android:layout_width="34dp"
             android:layout_height="34dp"
-            android:visibility="gone"
-            android:src="@mipmap/ic_pinyin_btn" />
+            android:src="@mipmap/ic_pinyin_btn"
+            android:visibility="gone" />
 
         <ImageView
             android:id="@+id/keyboard_switch_btn"
@@ -58,6 +58,7 @@
             android:src="@mipmap/ic_keyboard" />
 
         <FrameLayout
+            android:id="@+id/intimacy_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content">
 

plugins/keyboard_android/android/src/main/res/layout/component_vip.xml → plugins/keyboard_android/android/src/main/res/layout/component_vip_page.xml


+ 8 - 8
plugins/keyboard_android/android/src/main/res/layout/keyboard_layout.xml

@@ -4,29 +4,29 @@
     android:layout_height="@dimen/keyboard_height"
     android:background="@mipmap/bg_keyboard">
 
+    <!-- 键盘组件 -->
+    <com.atmob.keyboard_android.component.child.impl.KeyBoardContainerComponent
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
     <!-- 登录组件 -->
-    <com.atmob.keyboard_android.component.LoginComponent
+    <com.atmob.keyboard_android.component.page.impl.LoginPageComponent
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:visibility="gone" />
 
     <!-- VIP组件 -->
-    <com.atmob.keyboard_android.component.VipComponent
+    <com.atmob.keyboard_android.component.page.impl.VipPageComponent
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:visibility="gone" />
 
     <!-- 设置组件 -->
-    <com.atmob.keyboard_android.component.SettingComponent
+    <com.atmob.keyboard_android.component.child.impl.SettingComponent
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:visibility="gone" />
 
-    <!-- 键盘组件 -->
-    <com.atmob.keyboard_android.component.KeyBoardContainerComponent
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content" />
-
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"

+ 1 - 1
plugins/keyboard_android/android/src/main/res/layout/pager_ai_keyboard_content.xml

@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<com.atmob.keyboard_android.component.AiKeyboardContentComponent xmlns:android="http://schemas.android.com/apk/res/android"
+<com.atmob.keyboard_android.component.view.AiKeyboardContentView xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />

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

@@ -15,7 +15,7 @@
         android:layout_marginBottom="6dp"
         android:orientation="horizontal">
 
-        <com.atmob.keyboard_android.component.PasteBarComponent
+        <com.atmob.keyboard_android.component.child.impl.PasteBarComponent
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
@@ -51,7 +51,7 @@
                 android:layout_height="wrap_content"
                 tools:layout_height="150dp" />
 
-            <com.atmob.keyboard_android.component.AiChatComponent
+            <com.atmob.keyboard_android.component.child.impl.AiChatComponent
                 android:id="@+id/ai_chat_component"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"