Преглед изворни кода

feat(glass): 添加离线语音命令支持和任务列表页面功能

- 在离线命令服务中添加首页和任务列表分类注释
- 增加1-10条/项任务的查看、打开、处理命令支持
- 添加RecyclerView滚动监听以支持页面位置跟踪
- 实现可见项目顺序刷新功能
- 添加页面起始位置管理逻辑
- 在适配器中显示基于页面的序号而非全局序号
- 为第一条任务相关命令添加向上一页跳转功能
- 优化页面切换时的UI刷新机制
徐勤民 пре 2 дана
родитељ
комит
2c891e177f

+ 73 - 0
app/src/main/java/com/nova/brain/glass/helper/OfflineCmdServiceHelper.kt

@@ -11,9 +11,11 @@ object OfflineCmdServiceHelper {
     private var listenerList = mutableListOf<OfflineCmdListener>()
     private var listenerList = mutableListOf<OfflineCmdListener>()
 
 
     private val list = mutableListOf<OfflineCmdBean>().apply {
     private val list = mutableListOf<OfflineCmdBean>().apply {
+        // 首页
         add(OfflineCmdBean("任务列表", "ren wu lie biao"))
         add(OfflineCmdBean("任务列表", "ren wu lie biao"))
         add(OfflineCmdBean("查看任务", "cha kan ren wu"))
         add(OfflineCmdBean("查看任务", "cha kan ren wu"))
         add(OfflineCmdBean("查看任务列表", "cha kan ren wu lie biao"))
         add(OfflineCmdBean("查看任务列表", "cha kan ren wu lie biao"))
+        // 任务列表
         add(OfflineCmdBean("下一页", "xia yi ye"))
         add(OfflineCmdBean("下一页", "xia yi ye"))
         add(OfflineCmdBean("翻页", "fan ye"))
         add(OfflineCmdBean("翻页", "fan ye"))
         add(OfflineCmdBean("查看下一页", "cha kan xia yi ye"))
         add(OfflineCmdBean("查看下一页", "cha kan xia yi ye"))
@@ -22,14 +24,85 @@ object OfflineCmdServiceHelper {
         add(OfflineCmdBean("上一页", "shang yi ye"))
         add(OfflineCmdBean("上一页", "shang yi ye"))
         add(OfflineCmdBean("查看上一页", "cha kan shang yi ye"))
         add(OfflineCmdBean("查看上一页", "cha kan shang yi ye"))
         add(OfflineCmdBean("继续上一页", "ji xu shang yi ye"))
         add(OfflineCmdBean("继续上一页", "ji xu shang yi ye"))
+
         add(OfflineCmdBean("退出", "tui chu"))
         add(OfflineCmdBean("退出", "tui chu"))
         add(OfflineCmdBean("返回", "fan hui"))
         add(OfflineCmdBean("返回", "fan hui"))
         add(OfflineCmdBean("退回", "tui hui"))
         add(OfflineCmdBean("退回", "tui hui"))
+
         add(OfflineCmdBean("同意", "tong yi"))
         add(OfflineCmdBean("同意", "tong yi"))
         add(OfflineCmdBean("驳回", "bo hui"))
         add(OfflineCmdBean("驳回", "bo hui"))
         add(OfflineCmdBean("不同意", "bu tong yi"))
         add(OfflineCmdBean("不同意", "bu tong yi"))
         add(OfflineCmdBean("拒绝", "ju jue"))
         add(OfflineCmdBean("拒绝", "ju jue"))
         add(OfflineCmdBean("通过", "tong guo"))
         add(OfflineCmdBean("通过", "tong guo"))
+
+        add(OfflineCmdBean("查看第一条任务", "cha kan di yi tiao ren wu"))
+        add(OfflineCmdBean("查看第一项任务", "cha kan di yi xiang ren wu"))
+        add(OfflineCmdBean("打开第一条任务", "da kai di yi tiao ren wu"))
+        add(OfflineCmdBean("打开第一项任务", "da kai di yi xiang ren wu"))
+        add(OfflineCmdBean("处理第一条任务", "chu li di yi tiao ren wu"))
+        add(OfflineCmdBean("处理第一项任务", "chu li di yi xiang ren wu"))
+        add(OfflineCmdBean("查看第二条任务", "cha kan di er tiao ren wu"))
+        add(OfflineCmdBean("查看第二项任务", "cha kan di er xiang ren wu"))
+        add(OfflineCmdBean("打开第二条任务", "da kai di er tiao ren wu"))
+        add(OfflineCmdBean("打开第二项任务", "da kai di er xiang ren wu"))
+        add(OfflineCmdBean("处理第二条任务", "chu li di er tiao ren wu"))
+        add(OfflineCmdBean("处理第二项任务", "chu li di er xiang ren wu"))
+
+        add(OfflineCmdBean("查看第三条任务", "cha kan di san tiao ren wu"))
+        add(OfflineCmdBean("查看第三项任务", "cha kan di san xiang ren wu"))
+        add(OfflineCmdBean("打开第三条任务", "da kai di san tiao ren wu"))
+        add(OfflineCmdBean("打开第三项任务", "da kai di san xiang ren wu"))
+        add(OfflineCmdBean("处理第三条任务", "chu li di san tiao ren wu"))
+        add(OfflineCmdBean("处理第三项任务", "chu li di san xiang ren wu"))
+
+        add(OfflineCmdBean("查看第四条任务", "cha kan di si tiao ren wu"))
+        add(OfflineCmdBean("查看第四项任务", "cha kan di si xiang ren wu"))
+        add(OfflineCmdBean("打开第四条任务", "da kai di si tiao ren wu"))
+        add(OfflineCmdBean("打开第四项任务", "da kai di si xiang ren wu"))
+        add(OfflineCmdBean("处理第四条任务", "chu li di si tiao ren wu"))
+        add(OfflineCmdBean("处理第四项任务", "chu li di si xiang ren wu"))
+
+        add(OfflineCmdBean("查看第五条任务", "cha kan di wu tiao ren wu"))
+        add(OfflineCmdBean("查看第五项任务", "cha kan di wu xiang ren wu"))
+        add(OfflineCmdBean("打开第五条任务", "da kai di wu tiao ren wu"))
+        add(OfflineCmdBean("打开第五项任务", "da kai di wu xiang ren wu"))
+        add(OfflineCmdBean("处理第五条任务", "chu li di wu tiao ren wu"))
+        add(OfflineCmdBean("处理第五项任务", "chu li di wu xiang ren wu"))
+
+        add(OfflineCmdBean("查看第六条任务", "cha kan di liu tiao ren wu"))
+        add(OfflineCmdBean("查看第六项任务", "cha kan di liu xiang ren wu"))
+        add(OfflineCmdBean("打开第六条任务", "da kai di liu tiao ren wu"))
+        add(OfflineCmdBean("打开第六项任务", "da kai di liu xiang ren wu"))
+        add(OfflineCmdBean("处理第六条任务", "chu li di liu tiao ren wu"))
+        add(OfflineCmdBean("处理第六项任务", "chu li di liu xiang ren wu"))
+
+        add(OfflineCmdBean("查看第七条任务", "cha kan di qi tiao ren wu"))
+        add(OfflineCmdBean("查看第七项任务", "cha kan di qi xiang ren wu"))
+        add(OfflineCmdBean("打开第七条任务", "da kai di qi tiao ren wu"))
+        add(OfflineCmdBean("打开第七项任务", "da kai di qi xiang ren wu"))
+        add(OfflineCmdBean("处理第七条任务", "chu li di qi tiao ren wu"))
+        add(OfflineCmdBean("处理第七项任务", "chu li di qi xiang ren wu"))
+
+        add(OfflineCmdBean("查看第八条任务", "cha kan di ba tiao ren wu"))
+        add(OfflineCmdBean("查看第八项任务", "cha kan di ba xiang ren wu"))
+        add(OfflineCmdBean("打开第八条任务", "da kai di ba tiao ren wu"))
+        add(OfflineCmdBean("打开第八项任务", "da kai di ba xiang ren wu"))
+        add(OfflineCmdBean("处理第八条任务", "chu li di ba tiao ren wu"))
+        add(OfflineCmdBean("处理第八项任务", "chu li di ba xiang ren wu"))
+
+        add(OfflineCmdBean("查看第九条任务", "cha kan di jiu tiao ren wu"))
+        add(OfflineCmdBean("查看第九项任务", "cha kan di jiu xiang ren wu"))
+        add(OfflineCmdBean("打开第九条任务", "da kai di jiu tiao ren wu"))
+        add(OfflineCmdBean("打开第九项任务", "da kai di jiu xiang ren wu"))
+        add(OfflineCmdBean("处理第九条任务", "chu li di jiu tiao ren wu"))
+        add(OfflineCmdBean("处理第九项任务", "chu li di jiu xiang ren wu"))
+
+        add(OfflineCmdBean("查看第十条任务", "cha kan di shi tiao ren wu"))
+        add(OfflineCmdBean("查看第十项任务", "cha kan di shi xiang ren wu"))
+        add(OfflineCmdBean("打开第十条任务", "da kai di shi tiao ren wu"))
+        add(OfflineCmdBean("打开第十项任务", "da kai di shi xiang ren wu"))
+        add(OfflineCmdBean("处理第十条任务", "chu li di shi tiao ren wu"))
+        add(OfflineCmdBean("处理第十项任务", "chu li di shi xiang ren wu"))
     }
     }
     fun init(){
     fun init(){
         val service = GlassSdk.getGlassOfflineCmdService()
         val service = GlassSdk.getGlassOfflineCmdService()

+ 29 - 1
app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt

@@ -2,6 +2,7 @@ package com.nova.brain.glass.ui
 
 
 import android.content.Intent
 import android.content.Intent
 import android.os.Bundle
 import android.os.Bundle
+import androidx.recyclerview.widget.RecyclerView
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.nova.brain.glass.R
 import com.nova.brain.glass.R
 import com.nova.brain.glass.databinding.ActivityTaskListBinding
 import com.nova.brain.glass.databinding.ActivityTaskListBinding
@@ -21,10 +22,21 @@ class TaskListActivity :
     BaseListFormLayoutActivity<TaskItem, TaskListVM, ActivityTaskListBinding>() {
     BaseListFormLayoutActivity<TaskItem, TaskListVM, ActivityTaskListBinding>() {
     override fun getLayoutId(): Int = R.layout.activity_task_list
     override fun getLayoutId(): Int = R.layout.activity_task_list
     override fun fullscreen(): Boolean = true
     override fun fullscreen(): Boolean = true
+    private var pageStartPosition = 0
 
 
     override fun initView(savedInstanceState: Bundle?) {
     override fun initView(savedInstanceState: Bundle?) {
         super.initView(savedInstanceState)
         super.initView(savedInstanceState)
         window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
         window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
+        binding.baseRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
+            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
+                    refreshVisibleOrder()
+                }
+            }
+        })
+        binding.baseRecyclerView.post {
+            refreshVisibleOrder()
+        }
 
 
         binding.xia.setOnClickListener {
         binding.xia.setOnClickListener {
             toNext()
             toNext()
@@ -45,6 +57,9 @@ class TaskListActivity :
                     "上一页", "查看上一页", "继续上一页" -> {
                     "上一页", "查看上一页", "继续上一页" -> {
                         toPre()
                         toPre()
                     }
                     }
+                    "查看第一条任务", "查看第一项任务", "打开第一条任务","打开第一项任务", "处理第一条任务", "处理第一项任务" -> {
+                        toPre()
+                    }
                 }
                 }
             }
             }
         }
         }
@@ -59,6 +74,7 @@ class TaskListActivity :
                 val pageSize = (lastVisible - firstVisible).coerceAtLeast(1)
                 val pageSize = (lastVisible - firstVisible).coerceAtLeast(1)
                 val previousPosition = (firstVisible - pageSize).coerceAtLeast(0)
                 val previousPosition = (firstVisible - pageSize).coerceAtLeast(0)
                 layoutManager.scrollToPositionWithOffset(previousPosition, 0)
                 layoutManager.scrollToPositionWithOffset(previousPosition, 0)
+                binding.baseRecyclerView.post { refreshVisibleOrder() }
             } else {
             } else {
                 ToolsHelper.showMessage("没有上一页了")
                 ToolsHelper.showMessage("没有上一页了")
             }
             }
@@ -72,12 +88,23 @@ class TaskListActivity :
             val nextPosition = lastVisible + 1
             val nextPosition = lastVisible + 1
             if (nextPosition < adapter.itemCount) {
             if (nextPosition < adapter.itemCount) {
                 layoutManager.scrollToPositionWithOffset(nextPosition, 0)
                 layoutManager.scrollToPositionWithOffset(nextPosition, 0)
+                binding.baseRecyclerView.post { refreshVisibleOrder() }
             } else {
             } else {
                 ToolsHelper.showMessage("没有下一页了")
                 ToolsHelper.showMessage("没有下一页了")
             }
             }
         }
         }
     }
     }
 
 
+    private fun refreshVisibleOrder() {
+        val layoutManager = binding.baseRecyclerView.layoutManager as? LinearLayoutManager ?: return
+        val firstVisible = layoutManager.findFirstVisibleItemPosition()
+        if (firstVisible == RecyclerView.NO_POSITION || firstVisible == pageStartPosition) {
+            return
+        }
+        pageStartPosition = firstVisible
+        adapter.notifyDataSetChanged()
+    }
+
     override fun onResume() {
     override fun onResume() {
         super.onResume()
         super.onResume()
         OfflineCmdServiceHelper.addOnLineListener(offlineCmdListener)
         OfflineCmdServiceHelper.addOnLineListener(offlineCmdListener)
@@ -90,8 +117,9 @@ class TaskListActivity :
 
 
     private val adapter = object : CommonPagedAdapter<TaskItem>(R.layout.item_task_list) {
     private val adapter = object : CommonPagedAdapter<TaskItem>(R.layout.item_task_list) {
         override fun convert(holder: ViewHolder, item: TaskItem, position: Int) {
         override fun convert(holder: ViewHolder, item: TaskItem, position: Int) {
+            val displayPosition = (position - pageStartPosition + 1).coerceAtLeast(1)
             holder
             holder
-                .setText(R.id.tv_title, "${position}.张三提交的出差预算申请审核任务,从上海到北京,3月23开始3月24结束,预算金额¥1800元。【已逾期】")
+                .setText(R.id.tv_title, "${displayPosition}.张三提交的出差预算申请审核任务,从上海到北京,3月23开始3月24结束,预算金额¥1800元。【已逾期】")
                 .setClickListener(R.id.tv_title
                 .setClickListener(R.id.tv_title
                 ) {
                 ) {
                     when(position%4){
                     when(position%4){