Sfoglia il codice sorgente

[feat]键盘插件,实现键盘按键和Ai生成列表的切换交互

hezihao 8 mesi fa
parent
commit
30bb1085f5
22 ha cambiato i file con 325 aggiunte e 304 eliminazioni
  1. 0 48
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/adapter/AiKeyboardPagerAdapter.kt
  2. 2 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/IUIComponent.kt
  3. 4 4
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/RouteComponent.kt
  4. 2 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/ComponentAnimator.kt
  5. 10 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/impl/AlphaAnimator.kt
  6. 6 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/impl/NoOptAnimator.kt
  7. 10 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/impl/TransitionAnimator.kt
  8. 10 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/IAiKeyboardComponent.kt
  9. 18 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/AiChatComponent.kt
  10. 134 17
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/AiKeyboardComponent.kt
  11. 0 5
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/KeyboardSelectComponent.kt
  12. 5 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/QuickSwitchComponent.kt
  13. 8 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/ToolBarComponent.kt
  14. 0 6
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/page/impl/LoginPageComponent.kt
  15. 15 1
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/page/impl/VipPageComponent.kt
  16. 0 107
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/view/AiKeyboardContentView.kt
  17. 9 11
      plugins/keyboard_android/android/src/main/res/layout/component_ai_chat.xml
  18. 84 7
      plugins/keyboard_android/android/src/main/res/layout/component_ai_keyboard.xml
  19. 3 1
      plugins/keyboard_android/android/src/main/res/layout/component_vip_page.xml
  20. 5 4
      plugins/keyboard_android/android/src/main/res/layout/floating_button_layout.xml
  21. 0 4
      plugins/keyboard_android/android/src/main/res/layout/pager_ai_keyboard_content.xml
  22. 0 79
      plugins/keyboard_android/android/src/main/res/layout/view_ai_keyboard_content.xml

+ 0 - 48
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/adapter/AiKeyboardPagerAdapter.kt

@@ -1,48 +0,0 @@
-package com.atmob.keyboard_android.component.adapter
-
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.viewpager.widget.PagerAdapter
-import com.atmob.keyboard_android.R
-
-/**
- * AI键盘Tab的adapter
- */
-class AiKeyboardPagerAdapter(private val mDataList: List<String>) : PagerAdapter() {
-    override fun getCount(): Int {
-        return mDataList.size
-    }
-
-    override fun isViewFromObject(view: View, `object`: Any): Boolean {
-        return view === `object`
-    }
-
-    override fun instantiateItem(container: ViewGroup, position: Int): Any {
-        // 创建每一页的键盘
-        val context = container.context
-        val contentView = LayoutInflater.from(context)
-            .inflate(R.layout.pager_ai_keyboard_content, container, false)
-        container.addView(contentView)
-        return contentView
-    }
-
-    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
-        container.removeView(`object` as View?)
-    }
-
-    override fun getItemPosition(`object`: Any): Int {
-        val textView = `object` as TextView
-        val text = textView.getText().toString()
-        val index = mDataList.indexOf(text)
-        if (index >= 0) {
-            return index
-        }
-        return POSITION_NONE
-    }
-
-    override fun getPageTitle(position: Int): CharSequence? {
-        return mDataList[position]
-    }
-}

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

@@ -14,10 +14,10 @@ interface IUIComponent {
     /**
      * 显示组件
      */
-    fun show()
+    fun show(onStart: (() -> Unit)? = null, onFinish: (() -> Unit)? = null)
 
     /**
      * 隐藏组件
      */
-    fun hide()
+    fun hide(onStart: (() -> Unit)? = null, onFinish: (() -> Unit)? = null)
 }

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

@@ -21,12 +21,12 @@ abstract class RouteComponent @JvmOverloads constructor(
         mComponentAnimator.attachUIComponent(this)
     }
 
-    override fun show() {
-        mComponentAnimator.show()
+    override fun show(onStart: (() -> Unit)?, onFinish: (() -> Unit)?) {
+        mComponentAnimator.show(onStart, onFinish)
     }
 
-    override fun hide() {
-        mComponentAnimator.hide()
+    override fun hide(onStart: (() -> Unit)?, onFinish: (() -> Unit)?) {
+        mComponentAnimator.hide(onStart, onFinish)
     }
 
     /**

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

@@ -25,10 +25,10 @@ abstract class ComponentAnimator {
     /**
      * 显示组件
      */
-    abstract fun show()
+    abstract fun show(onStart: (() -> Unit)? = null, onFinish: (() -> Unit)? = null)
 
     /**
      * 隐藏组件
      */
-    abstract fun hide()
+    abstract fun hide(onStart: (() -> Unit)? = null, onFinish: (() -> Unit)? = null)
 }

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

@@ -19,7 +19,7 @@ class AlphaAnimator : ComponentAnimator() {
      */
     private var isShow = false
 
-    override fun show() {
+    override fun show(onStart: (() -> Unit)?, onFinish: (() -> Unit)?) {
         if (isShow) {
             return
         }
@@ -39,11 +39,13 @@ class AlphaAnimator : ComponentAnimator() {
                     override fun onAnimationStart(animation: Animator) {
                         super.onAnimationStart(animation)
                         rootView.visibility = View.VISIBLE
+                        onStart?.invoke()
                     }
 
                     override fun onAnimationEnd(animation: Animator) {
                         super.onAnimationEnd(animation)
                         isShow = true
+                        onFinish?.invoke()
                     }
                 })
             }
@@ -51,7 +53,7 @@ class AlphaAnimator : ComponentAnimator() {
         }
     }
 
-    override fun hide() {
+    override fun hide(onStart: (() -> Unit)?, onFinish: (() -> Unit)?) {
         if (!isShow) {
             return
         }
@@ -68,10 +70,16 @@ class AlphaAnimator : ComponentAnimator() {
                     rootView.alpha = alpha
                 }
                 addListener(object : AnimatorListenerAdapter() {
+                    override fun onAnimationStart(animation: Animator) {
+                        super.onAnimationStart(animation)
+                        onStart?.invoke()
+                    }
+
                     override fun onAnimationEnd(animation: Animator) {
                         super.onAnimationEnd(animation)
                         rootView.visibility = View.GONE
                         isShow = false
+                        onFinish?.invoke()
                     }
                 })
             }

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

@@ -7,17 +7,21 @@ import com.atmob.keyboard_android.component.base.animator.ComponentAnimator
  * 没有动画效果的动画执行器
  */
 class NoOptAnimator : ComponentAnimator() {
-    override fun show() {
+    override fun show(onStart: (() -> Unit)?, onFinish: (() -> Unit)?) {
         val uiComponent = getUIComponent()
         uiComponent?.asView()?.let { rootView ->
+            onStart?.invoke()
             rootView.visibility = View.VISIBLE
+            onFinish?.invoke()
         }
     }
 
-    override fun hide() {
+    override fun hide(onStart: (() -> Unit)?, onFinish: (() -> Unit)?) {
         val uiComponent = getUIComponent()
         uiComponent?.asView()?.let { rootView ->
+            onStart?.invoke()
             rootView.visibility = View.GONE
+            onFinish?.invoke()
         }
     }
 }

+ 10 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/animator/impl/TransitionAnimator.kt

@@ -20,7 +20,7 @@ class TransitionAnimator : ComponentAnimator() {
      */
     private var isShow = false
 
-    override fun show() {
+    override fun show(onStart: (() -> Unit)?, onFinish: (() -> Unit)?) {
         if (isShow) {
             return
         }
@@ -42,11 +42,13 @@ class TransitionAnimator : ComponentAnimator() {
                     override fun onAnimationStart(animation: Animator) {
                         super.onAnimationStart(animation)
                         rootView.visibility = View.VISIBLE
+                        onStart?.invoke()
                     }
 
                     override fun onAnimationEnd(animation: Animator) {
                         super.onAnimationEnd(animation)
                         isShow = true
+                        onFinish?.invoke()
                     }
                 })
             }
@@ -54,7 +56,7 @@ class TransitionAnimator : ComponentAnimator() {
         }
     }
 
-    override fun hide() {
+    override fun hide(onStart: (() -> Unit)?, onFinish: (() -> Unit)?) {
         if (!isShow) {
             return
         }
@@ -73,10 +75,16 @@ class TransitionAnimator : ComponentAnimator() {
                     rootView.translationX = translationX
                 }
                 addListener(object : AnimatorListenerAdapter() {
+                    override fun onAnimationStart(animation: Animator) {
+                        super.onAnimationStart(animation)
+                        onStart?.invoke()
+                    }
+
                     override fun onAnimationEnd(animation: Animator) {
                         super.onAnimationEnd(animation)
                         rootView.visibility = View.GONE
                         isShow = false
+                        onFinish?.invoke()
                     }
                 })
             }

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

@@ -1,9 +1,19 @@
 package com.atmob.keyboard_android.component.child
 
 import com.atmob.keyboard_android.component.base.IUIComponent
+import com.atmob.keyboard_android.enums.Mode
 
 /**
  * Ai键盘组件接口
  */
 interface IAiKeyboardComponent : IUIComponent {
+    /**
+     * 更新模式,刷新布局
+     */
+    fun updateKeyboardMode(mode: Mode)
+
+    /**
+     * 重置布局
+     */
+    fun reset()
 }

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

@@ -7,13 +7,18 @@ import android.view.View
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 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.IAiChatComponent
+import com.atmob.keyboard_android.component.child.IAiKeyboardComponent
 import com.atmob.keyboard_android.component.item.AiChatViewBinder
+import com.atmob.keyboard_android.component.item.EmptyPlaceholderViewBinder
 import com.atmob.keyboard_android.ext.click
 import com.atmob.keyboard_android.model.AiChatModel
+import com.atmob.keyboard_android.model.EmptyPlaceholderModel
 import com.atmob.keyboard_android.util.recyclerview.LinearDivider
 import com.blankj.utilcode.util.ConvertUtils
+import com.blankj.utilcode.util.ToastUtils
 import me.drakeet.multitype.Items
 import me.drakeet.multitype.MultiTypeAdapter
 
@@ -44,13 +49,23 @@ class AiChatComponent @JvmOverloads constructor(
     override fun bindView(view: View) {
         vBackBtn.click {
             // 关闭面板
+            hide(onFinish = {
+                // 重新显示键盘列表
+                val aiKeyboardComponent =
+                    ComponentMediator.findComponent(IAiKeyboardComponent::class.java)
+                aiKeyboardComponent?.reset()
+            })
         }
         vReGenerateBtn.click {
             // 重新生成
+            ToastUtils.showShort("重新生成")
         }
         vChatList.apply {
             mListItems = Items()
             mListAdapter = MultiTypeAdapter(mListItems).apply {
+                // 空占位条目
+                register(EmptyPlaceholderModel::class.java, EmptyPlaceholderViewBinder())
+                // 生成内容条目
                 register(AiChatModel::class.java, AiChatViewBinder { item ->
                     // 先全部取消选中
                     mListItems.filterIsInstance<AiChatModel>().map {
@@ -86,6 +101,9 @@ class AiChatComponent @JvmOverloads constructor(
     @SuppressLint("NotifyDataSetChanged")
     private fun setData() {
         mListItems.apply {
+            // 空占位条目
+            add(EmptyPlaceholderModel(ConvertUtils.dp2px(40f)))
+            // 生成内容条目
             add(AiChatModel("巴拉巴拉小魔仙?呵,这种无聊的东西,以后不准再提。", true))
             add(AiChatModel("巴拉巴拉小魔仙?呵,这种无聊的东西"))
             add(AiChatModel("巴拉巴拉小魔仙?"))

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

@@ -1,18 +1,28 @@
 package com.atmob.keyboard_android.component.child.impl
 
+import android.annotation.SuppressLint
 import android.content.Context
 import android.util.AttributeSet
 import android.view.View
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
 import com.atmob.keyboard_android.R
-import com.atmob.keyboard_android.component.adapter.AiKeyboardPagerAdapter
+import com.atmob.keyboard_android.component.ComponentMediator
 import com.atmob.keyboard_android.component.base.BaseUIComponent
+import com.atmob.keyboard_android.component.child.IAiChatComponent
 import com.atmob.keyboard_android.component.child.IAiKeyboardComponent
+import com.atmob.keyboard_android.component.item.AiKeyboardKeyViewBinder
+import com.atmob.keyboard_android.enums.Mode
+import com.atmob.keyboard_android.ext.click
 import com.atmob.keyboard_android.ext.setGone
-import com.atmob.keyboard_android.widget.NoSwipeViewPager
+import com.atmob.keyboard_android.ext.setVisible
+import com.atmob.keyboard_android.model.AiKeyboardKeyModel
+import com.atmob.keyboard_android.util.recyclerview.GridDivider
 import com.atmob.keyboard_android.widget.indicator.TabPagerTitleView
 import com.blankj.utilcode.util.ConvertUtils
+import me.drakeet.multitype.Items
+import me.drakeet.multitype.MultiTypeAdapter
 import net.lucode.hackware.magicindicator.MagicIndicator
-import net.lucode.hackware.magicindicator.ViewPagerHelper
 import net.lucode.hackware.magicindicator.buildins.UIUtil
 import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator
 import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter
@@ -28,13 +38,25 @@ class AiKeyboardComponent @JvmOverloads constructor(
 ) : BaseUIComponent<IAiKeyboardComponent>(context, attrs, defStyleAttr), IAiKeyboardComponent {
     private lateinit var vTabBarLayout: View
     private lateinit var vMagicIndicator: MagicIndicator
-    private lateinit var vViewPager: NoSwipeViewPager
+    private lateinit var vPasteBarLayout: View
+    private lateinit var vKeyList: RecyclerView
+    private lateinit var vDeleteBtn: View
+    private lateinit var vClearBtn: View
+    private lateinit var vSendBtn: View
+
+    private lateinit var mKeyListItems: Items
+    private lateinit var mKeyListAdapter: MultiTypeAdapter
 
     /**
      * Tab列表
      */
     private lateinit var mTabList: List<String>
 
+    /**
+     * 当前选中的Tab的索引
+     */
+    private var mCurrentTabIndex = 0
+
     override fun onInflateViewId(): Int {
         return R.layout.component_ai_keyboard
     }
@@ -42,12 +64,18 @@ class AiKeyboardComponent @JvmOverloads constructor(
     override fun findView(view: View) {
         vTabBarLayout = view.findViewById(R.id.tar_bar_layout)
         vMagicIndicator = view.findViewById(R.id.magic_indicator)
-        vViewPager = view.findViewById(R.id.view_pager)
+        vPasteBarLayout = view.findViewById(R.id.paste_bar_layout)
+        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) {
         setupTabBar()
-        setupViewPager()
+        setupKeyList()
+        setupActionBtn()
+        setData()
     }
 
     override fun getComponentInterfaceClazz(): Class<IAiKeyboardComponent> {
@@ -58,9 +86,6 @@ class AiKeyboardComponent @JvmOverloads constructor(
      * 配置Tab栏
      */
     private fun setupTabBar() {
-        // TODO: 隐藏Tab栏,用于测试
-        vTabBarLayout.setGone()
-
         mTabList = listOf(
             "发起聊天",
             "邀约话术",
@@ -71,6 +96,7 @@ class AiKeyboardComponent @JvmOverloads constructor(
         // 配置指示器
         vMagicIndicator.setNavigator(CommonNavigator(context).apply {
             scrollPivotX = 0.35f
+            // 设置适配器
             setAdapter(object : CommonNavigatorAdapter() {
                 override fun getCount(): Int {
                     return mTabList.size
@@ -104,7 +130,15 @@ class AiKeyboardComponent @JvmOverloads constructor(
                     // 点击Tab,切换页面
                     titleView.setOnClickListener(object : OnClickListener {
                         override fun onClick(v: View?) {
-                            vViewPager.setCurrentItem(index, false)
+                            if (mCurrentTabIndex == index) {
+                                return
+                            }
+                            // 根据Tab类型,刷新内容
+                            val tab = mTabList[index]
+                            refreshContent(tab)
+                            // 切换Tab
+                            mCurrentTabIndex = index
+                            vMagicIndicator.onPageSelected(index)
                         }
                     })
                     return titleView
@@ -128,13 +162,96 @@ class AiKeyboardComponent @JvmOverloads constructor(
     }
 
     /**
-     * 配置ViewPager
+     * 设置列表
      */
-    private fun setupViewPager() {
-        // 配置ViewPager
-        vViewPager.setSwipeEnabled(false)
-        vViewPager.adapter = AiKeyboardPagerAdapter(mTabList)
-        // 绑定ViewPager和MagicIndicator
-        ViewPagerHelper.bind(vMagicIndicator, vViewPager)
+    private fun setupKeyList() {
+        // 列数
+        val spanCount = 3
+        vKeyList.apply {
+            mKeyListItems = Items()
+            mKeyListAdapter = MultiTypeAdapter(mKeyListItems).apply {
+                register(AiKeyboardKeyModel::class.java, AiKeyboardKeyViewBinder {
+                    // 点击键盘按键,打开AI生成内容面板
+                    val aiChatComponent =
+                        ComponentMediator.findComponent(IAiChatComponent::class.java)
+                    aiChatComponent?.show()
+                    // 隐藏键盘列表
+                    vKeyList.setGone()
+                })
+            }
+            layoutManager = GridLayoutManager(context, spanCount)
+            adapter = mKeyListAdapter
+            // 分割线
+            addItemDecoration(GridDivider(spanCount, ConvertUtils.dp2px(6f)))
+        }
+    }
+
+    /**
+     * 设置操作按钮
+     */
+    private fun setupActionBtn() {
+        vDeleteBtn.click {
+        }
+        vClearBtn.click {
+        }
+        vSendBtn.click {
+        }
+    }
+
+    /**
+     * 填充数据
+     */
+    @SuppressLint("NotifyDataSetChanged")
+    private fun setData() {
+        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()
+    }
+
+    /**
+     * 刷新内容
+     *
+     * @param tab 选择了哪个Tab
+     */
+    private fun refreshContent(tab: String) {
+        setData()
+    }
+
+    override fun updateKeyboardMode(mode: Mode) {
+        // 根据不同的模式,切换不同的键盘
+        if (Mode.OPEN_REMARKS == mode) {
+            // 开场白,显示Tab布局,隐藏粘贴栏
+            vTabBarLayout.setVisible()
+            vPasteBarLayout.setGone()
+        } else {
+            // 其他模式,隐藏Tab布局,显示粘贴栏
+            vTabBarLayout.setGone()
+            vPasteBarLayout.setVisible()
+        }
+        // 隐藏AI生成内容面板
+        val aiChatComponent =
+            ComponentMediator.findComponent(IAiChatComponent::class.java)
+        aiChatComponent?.hide()
+        // 显示键盘列表
+        vKeyList.setVisible()
+    }
+
+    override fun reset() {
+        vKeyList.setVisible()
+        val aiChatComponent =
+            ComponentMediator.findComponent(IAiChatComponent::class.java)
+        aiChatComponent?.hide()
     }
 }

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

@@ -8,7 +8,6 @@ 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.base.animator.impl.TransitionAnimator
 import com.atmob.keyboard_android.component.child.IKeyboardSelectComponent
 import com.atmob.keyboard_android.component.item.EmptyPlaceholderViewBinder
 import com.atmob.keyboard_android.component.item.KeyboardSelectViewBinder
@@ -96,10 +95,6 @@ class KeyboardSelectComponent @JvmOverloads constructor(
         return IKeyboardSelectComponent::class.java
     }
 
-    override fun getComponentAnimator(): Class<*> {
-        return TransitionAnimator::class.java
-    }
-
     @SuppressLint("NotifyDataSetChanged")
     private fun setData() {
         // TODO: 加载键盘列表

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

@@ -7,6 +7,7 @@ import android.widget.TextView
 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.IAiKeyboardComponent
 import com.atmob.keyboard_android.component.child.IKeyboardSelectComponent
 import com.atmob.keyboard_android.component.child.IQuickSwitchComponent
 import com.atmob.keyboard_android.enums.Mode
@@ -47,7 +48,11 @@ class QuickSwitchComponent @JvmOverloads constructor(
                 mModeSwitchPopupWindow.show(vModeSwitchLayout, Mode.HELP_CHAT, object :
                     ModeSwitchPopupWindow.OnModeSelectedListener {
                     override fun onModeSelected(mode: Mode) {
+                        // 切换模式文字
                         vModeText.text = mode.modeName
+                        // 切换键盘布局
+                        val aiKeyboardComponent = ComponentMediator.findComponent(IAiKeyboardComponent::class.java)
+                        aiKeyboardComponent?.updateKeyboardMode(mode)
                     }
                 })
             }

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

@@ -8,6 +8,7 @@ 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.component.page.IVipPageComponent
 import com.atmob.keyboard_android.ext.click
 import com.atmob.keyboard_android.keyboard.InputMethodPickerActivity
 
@@ -17,6 +18,7 @@ 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 vIcon: View
     private lateinit var vKeyboardSwitchBtn: View
     private lateinit var vIntimacyLayout: View
 
@@ -25,11 +27,17 @@ class ToolBarComponent @JvmOverloads constructor(
     }
 
     override fun findView(view: View) {
+        vIcon = view.findViewById(R.id.icon)
         vKeyboardSwitchBtn = view.findViewById(R.id.keyboard_switch_btn)
         vIntimacyLayout = view.findViewById(R.id.intimacy_layout)
     }
 
     override fun bindView(view: View) {
+        vIcon.click {
+            // TODO: hezhiao,测试显示vip页
+            val vipPageComponent = ComponentMediator.findComponent(IVipPageComponent::class.java)
+            vipPageComponent?.show()
+        }
         vKeyboardSwitchBtn.click {
             // 打开系统输入法选择器
             InputMethodPickerActivity.start(context)

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

@@ -5,7 +5,6 @@ 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
@@ -39,11 +38,6 @@ class LoginPageComponent @JvmOverloads constructor(
         }
     }
 
-    override fun getComponentAnimator(): Class<*> {
-        // 设置动画执行器
-        return AlphaAnimator::class.java
-    }
-
     override fun getComponentInterfaceClazz(): Class<ILoginPageComponent> {
         return ILoginPageComponent::class.java
     }

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

@@ -6,21 +6,35 @@ 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
+import com.atmob.keyboard_android.ext.click
+import com.blankj.utilcode.util.ToastUtils
 
 /**
  * Vip页组件
  */
 class VipPageComponent @JvmOverloads constructor(
     context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : BaseUIComponent<IVipPageComponent>(context, attrs, defStyleAttr) {
+) : BaseUIComponent<IVipPageComponent>(context, attrs, defStyleAttr), IVipPageComponent {
+    private lateinit var vBackBtn: View
+    private lateinit var vJoinVipBtn: View
+
     override fun onInflateViewId(): Int {
         return R.layout.component_vip_page
     }
 
     override fun findView(view: View) {
+        vBackBtn = view.findViewById(R.id.back_btn)
+        vJoinVipBtn = view.findViewById(R.id.join_vip_btn)
     }
 
     override fun bindView(view: View) {
+        vBackBtn.click {
+            hide()
+        }
+        vJoinVipBtn.click {
+            ToastUtils.showShort("购买VIP")
+            hide()
+        }
     }
 
     override fun getComponentInterfaceClazz(): Class<IVipPageComponent> {

+ 0 - 107
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/view/AiKeyboardContentView.kt

@@ -1,107 +0,0 @@
-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.item.AiKeyboardKeyViewBinder
-import com.atmob.keyboard_android.ext.click
-import com.atmob.keyboard_android.model.AiKeyboardKeyModel
-import com.atmob.keyboard_android.util.recyclerview.GridDivider
-import com.blankj.utilcode.util.ConvertUtils
-import me.drakeet.multitype.Items
-import me.drakeet.multitype.MultiTypeAdapter
-
-/**
- * AI键盘内容View
- */
-class AiKeyboardContentView @JvmOverloads constructor(
-    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
-) : FrameLayout(context, attrs, defStyleAttr) {
-    private lateinit var vKeyList: RecyclerView
-    private lateinit var vDeleteBtn: View
-    private lateinit var vClearBtn: View
-    private lateinit var vSendBtn: View
-
-    private lateinit var mListItems: Items
-    private lateinit var mListAdapter: MultiTypeAdapter
-
-    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
-    }
-
-    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)
-    }
-
-    private fun bindView() {
-        setupKeyList()
-        setupActionBtn()
-    }
-
-    /**
-     * 设置列表
-     */
-    private fun setupKeyList() {
-        // 列数
-        val spanCount = 3
-        vKeyList.apply {
-            mListItems = Items()
-            mListAdapter = MultiTypeAdapter(mListItems).apply {
-                register(AiKeyboardKeyModel::class.java, AiKeyboardKeyViewBinder {
-                    // 点击键盘按键
-                })
-            }
-            layoutManager = GridLayoutManager(context, spanCount)
-            adapter = mListAdapter
-            // 分割线
-            addItemDecoration(GridDivider(spanCount, ConvertUtils.dp2px(6f)))
-        }
-    }
-
-    /**
-     * 设置操作按钮
-     */
-    private fun setupActionBtn() {
-        vDeleteBtn.click {
-        }
-        vClearBtn.click {
-        }
-        vSendBtn.click {
-        }
-    }
-
-    /**
-     * 填充数据
-     */
-    @SuppressLint("NotifyDataSetChanged")
-    private fun setData() {
-        mListItems.apply {
-            add(AiKeyboardKeyModel("暧昧推拉"))
-            add(AiKeyboardKeyModel("欲拒还迎"))
-            add(AiKeyboardKeyModel("哄女友"))
-            add(AiKeyboardKeyModel("暧昧推拉"))
-            add(AiKeyboardKeyModel("甜蜜暴击"))
-            add(AiKeyboardKeyModel("暧昧推拉"))
-            add(AiKeyboardKeyModel("彩虹屁专家"))
-            add(AiKeyboardKeyModel("恋爱脑"))
-            add(AiKeyboardKeyModel("调皮回复"))
-        }
-        mListAdapter.notifyDataSetChanged()
-    }
-}

+ 9 - 11
plugins/keyboard_android/android/src/main/res/layout/component_ai_chat.xml

@@ -1,8 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
+    android:layout_height="wrap_content">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/chat_list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingBottom="15dp" />
 
     <RelativeLayout
         android:layout_width="match_parent"
@@ -26,11 +31,4 @@
             android:textColor="@color/text_color_primary"
             android:textSize="12sp" />
     </RelativeLayout>
-
-    <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/chat_list"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="6dp"
-        android:paddingBottom="15dp" />
-</LinearLayout>
+</FrameLayout>

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

@@ -21,12 +21,15 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_horizontal"
-        android:layout_marginTop="6dp"
+        android:layout_marginTop="14dp"
         android:layout_marginBottom="14dp"
         android:background="@drawable/bg_tab_indicator"
-        android:padding="2dp"
-        android:paddingStart="1dp"
-        android:paddingEnd="1dp">
+        android:paddingStart="2.5dp"
+        android:paddingTop="2dp"
+        android:paddingEnd="2.5dp"
+        android:paddingBottom="2dp"
+        android:visibility="gone"
+        tools:visibility="visible">
 
         <net.lucode.hackware.magicindicator.MagicIndicator
             android:id="@+id/magic_indicator"
@@ -35,10 +38,84 @@
             android:layout_gravity="center" />
     </FrameLayout>
 
-    <com.atmob.keyboard_android.widget.NoSwipeViewPager
-        android:id="@+id/view_pager"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1"
-        tools:background="@android:color/holo_blue_dark" />
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/paste_bar_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="6dp"
+            android:orientation="horizontal">
+
+            <com.atmob.keyboard_android.component.child.impl.PasteBarComponent
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                tools:background="@android:color/holo_red_dark"
+                tools:layout_height="46dp" />
+
+            <TextView
+                android:id="@+id/paste_btn"
+                style="@style/keyboard_action_btn2"
+                android:layout_marginStart="10dp"
+                android:layout_marginTop="6dp"
+                android:layout_marginEnd="10dp"
+                android:text="@string/paste" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <FrameLayout
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_marginEnd="6dp"
+                android:layout_weight="1">
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/key_list"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    tools:layout_height="150dp" />
+
+                <com.atmob.keyboard_android.component.child.impl.AiChatComponent
+                    android:id="@+id/ai_chat_component"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:visibility="gone"
+                    tools:visibility="visible" />
+            </FrameLayout>
+
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="10dp"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/delete_btn"
+                    style="@style/keyboard_action_btn"
+                    android:text="@string/delete" />
+
+                <TextView
+                    android:id="@+id/clear_btn"
+                    style="@style/keyboard_action_btn"
+                    android:text="@string/clear" />
+
+                <TextView
+                    android:id="@+id/send_btn"
+                    style="@style/keyboard_action_btn"
+                    android:text="@string/send" />
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
 </LinearLayout>

+ 3 - 1
plugins/keyboard_android/android/src/main/res/layout/component_vip_page.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"
@@ -51,6 +52,7 @@
     </FrameLayout>
 
     <com.atmob.keyboard_android.widget.IconFontTextView
+        android:id="@+id/join_vip_btn"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="30dp"

+ 5 - 4
plugins/keyboard_android/android/src/main/res/layout/floating_button_layout.xml

@@ -5,10 +5,11 @@
 
     <ImageView
         android:id="@+id/floating_button"
-        android:layout_width="60dp"
-        android:layout_height="60dp"
-        android:background="@android:color/holo_blue_light"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
         android:padding="10dp"
         android:scaleType="centerInside"
-        android:src="@android:drawable/ic_menu_manage" />
+        android:scaleX="2"
+        android:scaleY="2"
+        android:src="@mipmap/ic_keyboard_icon" />
 </FrameLayout>

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

@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<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" />

+ 0 - 79
plugins/keyboard_android/android/src/main/res/layout/view_ai_keyboard_content.xml

@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="6dp"
-        android:orientation="horizontal">
-
-        <com.atmob.keyboard_android.component.child.impl.PasteBarComponent
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:layout_marginStart="10dp"
-            android:layout_weight="1"
-            tools:background="@android:color/holo_red_dark"
-            tools:layout_height="46dp" />
-
-        <TextView
-            android:id="@+id/paste_btn"
-            style="@style/keyboard_action_btn2"
-            android:layout_marginStart="10dp"
-            android:layout_marginTop="6dp"
-            android:layout_marginEnd="10dp"
-            android:text="@string/paste" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal">
-
-        <FrameLayout
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="10dp"
-            android:layout_marginEnd="6dp"
-            android:layout_weight="1">
-
-            <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/key_list"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                tools:layout_height="150dp" />
-
-            <com.atmob.keyboard_android.component.child.impl.AiChatComponent
-                android:id="@+id/ai_chat_component"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:visibility="gone" />
-        </FrameLayout>
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="10dp"
-            android:orientation="vertical">
-
-            <TextView
-                android:id="@+id/delete_btn"
-                style="@style/keyboard_action_btn"
-                android:text="@string/delete" />
-
-            <TextView
-                android:id="@+id/clear_btn"
-                style="@style/keyboard_action_btn"
-                android:text="@string/clear" />
-
-            <TextView
-                android:id="@+id/send_btn"
-                style="@style/keyboard_action_btn"
-                android:text="@string/send" />
-        </LinearLayout>
-    </LinearLayout>
-</LinearLayout>