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

refactor(voice): 重构离线语音命令服务实现

- 提取通用关键词到 COMMON_CMDS 常量中
- 添加 registerBeans 和 removeBeans 辅助方法统一管理语音命令
- 在初始化时注册通用关键词,避免在每个页面重复注册
- 为每个页面添加对应的移除方法,在页面离开时清理独有关键词
- 将页面特定关键词注册从 initData 移至 onResume,注销从 onDestroy 移至 onPause
- 删除不再使用的 addListenerFo 方法中的重复代码
- 统一管理页面生命周期中的语音命令注册和注销逻辑
徐勤民 пре 1 дан
родитељ
комит
2d8770040f

+ 163 - 184
app/src/main/java/com/nova/brain/glass/helper/OfflineCmdServiceHelper.kt

@@ -81,43 +81,48 @@ object OfflineCmdServiceHelper {
         //
     }
 
+    // 所有页面通用关键词
+    private val COMMON_CMDS = listOf(
+        OfflineCmdBean("退出", "tui chu"),
+        OfflineCmdBean("返回", "fan hui")
+    )
+
     private var service: IOfflineCmdService? = null
+
+    private fun registerBeans(beans: List<OfflineCmdBean>) {
+
+        for (bean in beans) {
+            LogHelper.d("------>>>>>>>>>--------${service !== null}")
+            service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
+                override fun onVoiceTriggered() {
+                    LogHelper.d("onOfflineCmd: ${bean.text}")
+                    for (l in listenerList) {
+                        l.onOfflineCmd(bean.text)
+                    }
+                }
+            }))
+        }
+    }
+
+    private val noopCallback = object : IVoiceCallback.Stub() {
+        override fun onVoiceTriggered() {}
+    }
+
+    private fun removeBeans(beans: List<OfflineCmdBean>) {
+        for (bean in beans) {
+            service?.remove(VoiceAction(bean.text, bean.pinyin, noopCallback))
+        }
+    }
+
+    private fun addCommonCmds() {
+        registerBeans(COMMON_CMDS)
+    }
+
     @Synchronized
     fun init(){
         service = GlassSdk.getGlassOfflineCmdService()
-//        LogHelper.d("init")
-//        if (initialized || initializing) {
-//            return
-//        }
-//        LogHelper.d("init111")
-//        initializing = true
-//        LogHelper.d("init222")
-//        initExecutor.execute {
-//            try {
-//                val service = GlassSdk.getGlassOfflineCmdService()
-//                if (service == null){
-//                    LogHelper.e("OfflineCmdServiceHelper","service is null")
-//                    return@execute
-//                }
-//                LogHelper.d("init444")
-//                LogHelper.e("OfflineCmdServiceHelper","service 存在")
-//                for (bean in list) {
-//                    service.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
-//                        override fun onVoiceTriggered() {
-//                            LogHelper.d("onOfflineCmd: ${bean.text}")
-//                            for (l in listenerList) {
-//                                l.onOfflineCmd(bean.text)
-//                            }
-//                        }
-//                    }))
-//                }
-//                LogHelper.d("init555")
-//                initialized = true
-//            } finally {
-//                LogHelper.d("init333")
-//                initializing = false
-//            }
-//        }
+        // 通用关键词在 init 时注册一次,页面切换不会移除它们
+        addCommonCmds()
     }
     fun addOnLineListener(listener: OfflineCmdListener){
         this.listenerList.add(listener)
@@ -127,175 +132,149 @@ object OfflineCmdServiceHelper {
     }
 
     fun addListenerList(){
-        for (bean in mutableListOf<OfflineCmdBean>().apply {
-            // 任务列表
-            add(OfflineCmdBean("下一页", "xia yi ye"))
-            add(OfflineCmdBean("上一页", "shang yi ye"))
-
-            add(OfflineCmdBean("退出", "tui chu"))
-            add(OfflineCmdBean("返回", "fan hui"))
-
-            add(OfflineCmdBean("查看第一项任务", "cha kan di yi xiang ren wu"))
-            add(OfflineCmdBean("第一个", "di yi ge"))
-
-            add(OfflineCmdBean("查看第二项任务", "cha kan di er xiang ren wu"))
-            add(OfflineCmdBean("第二个", "di er ge"))
-
-            add(OfflineCmdBean("查看第三项任务", "cha kan di san xiang ren wu"))
-            add(OfflineCmdBean("第三个", "di san ge"))
-
-            add(OfflineCmdBean("查看第四项任务", "cha kan di si xiang ren wu"))
-            add(OfflineCmdBean("第四个", "di si ge"))
-
-            add(OfflineCmdBean("查看第五项任务", "cha kan di wu xiang ren wu"))
-            add(OfflineCmdBean("第五个", "di wu ge"))
-
-            add(OfflineCmdBean("查看第六项任务", "cha kan di liu xiang ren wu"))
-            add(OfflineCmdBean("第六个", "di liu ge"))
-        }) {
-            LogHelper.d("------>>>>>>>>>--------${service!==null}")
-            service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
-                override fun onVoiceTriggered() {
-                    LogHelper.d("onOfflineCmd: ${bean.text}")
-                    for (l in listenerList) {
-                        l.onOfflineCmd(bean.text)
-                    }
-                }
-            }))
-        }
+        // 任务列表独有关键词(通用关键词已在 init 注册,无需重复)
+        registerBeans(listOf(
+            OfflineCmdBean("下一页", "xia yi ye"),
+            OfflineCmdBean("上一页", "shang yi ye"),
+            OfflineCmdBean("查看第一项任务", "cha kan di yi xiang ren wu"),
+            OfflineCmdBean("第一个", "di yi ge"),
+            OfflineCmdBean("查看第二项任务", "cha kan di er xiang ren wu"),
+            OfflineCmdBean("第二个", "di er ge"),
+            OfflineCmdBean("查看第三项任务", "cha kan di san xiang ren wu"),
+            OfflineCmdBean("第三个", "di san ge"),
+            OfflineCmdBean("查看第四项任务", "cha kan di si xiang ren wu"),
+            OfflineCmdBean("第四个", "di si ge"),
+            OfflineCmdBean("查看第五项任务", "cha kan di wu xiang ren wu"),
+            OfflineCmdBean("第五个", "di wu ge"),
+            OfflineCmdBean("查看第六项任务", "cha kan di liu xiang ren wu"),
+            OfflineCmdBean("第六个", "di liu ge")
+        ))
     }
+
     fun removeAll(){
         service?.removeAll()
     }
 
-    fun addListenerFo(){
-        for (bean in mutableListOf<OfflineCmdBean>().apply {
-            add(OfflineCmdBean("退出", "tui chu"))
-            add(OfflineCmdBean("返回", "fan hui"))
-        }) {
-            LogHelper.d("------>>>>>>>>>--------${service!==null}")
-            service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
-                override fun onVoiceTriggered() {
-                    LogHelper.d("onOfflineCmd: ${bean.text}")
-                    for (l in listenerList) {
-                        l.onOfflineCmd(bean.text)
-                    }
-                }
-            }))
-        }
-    }
+    // addListenerFo: 无独有关键词,通用关键词已在 init 注册
+    fun addListenerFo(){ }
+
     fun addListenerInspection(){
-        for (bean in mutableListOf<OfflineCmdBean>().apply {
-            add(OfflineCmdBean("退出", "tui chu"))
-            add(OfflineCmdBean("返回", "fan hui"))
-            add(OfflineCmdBean("驳回", "bo hui"))
-            add(OfflineCmdBean("通过", "tong guo"))
-            add(OfflineCmdBean("同意", "bo hui"))
-        }) {
-            LogHelper.d("------>>>>>>>>>--------${service!==null}")
-            service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
-                override fun onVoiceTriggered() {
-                    LogHelper.d("onOfflineCmd: ${bean.text}")
-                    for (l in listenerList) {
-                        l.onOfflineCmd(bean.text)
-                    }
-                }
-            }))
-        }
+        // 巡检页独有关键词
+        registerBeans(listOf(
+            OfflineCmdBean("驳回", "bo hui"),
+            OfflineCmdBean("通过", "tong guo"),
+            OfflineCmdBean("同意", "tong yi")
+        ))
     }
+
     fun addListenerSpraying(){
-        for (bean in mutableListOf<OfflineCmdBean>().apply {
-            add(OfflineCmdBean("退出", "tui chu"))
-            add(OfflineCmdBean("返回", "fan hui"))
-            add(OfflineCmdBean("开始任务", "kai shi ren wu"))
-        }) {
-            LogHelper.d("------>>>>>>>>>--------${service!==null}")
-            service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
-                override fun onVoiceTriggered() {
-                    LogHelper.d("onOfflineCmd: ${bean.text}")
-                    for (l in listenerList) {
-                        l.onOfflineCmd(bean.text)
-                    }
-                }
-            }))
-        }
+        // 喷涂页独有关键词
+        registerBeans(listOf(
+            OfflineCmdBean("开始任务", "kai shi ren wu")
+        ))
     }
+
     fun addListenerSprayingFinish(){
-        for (bean in mutableListOf<OfflineCmdBean>().apply {
-            add(OfflineCmdBean("退出", "tui chu"))
-            add(OfflineCmdBean("返回", "fan hui"))
-            add(OfflineCmdBean("补充照片", "bu chong zhao pian"))
-            add(OfflineCmdBean("确认提交", "que ren ti jiao"))
-        }) {
-            LogHelper.d("------>>>>>>>>>--------${service!==null}")
-            service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
-                override fun onVoiceTriggered() {
-                    LogHelper.d("onOfflineCmd: ${bean.text}")
-                    for (l in listenerList) {
-                        l.onOfflineCmd(bean.text)
-                    }
-                }
-            }))
-        }
+        // 喷涂完成页独有关键词
+        registerBeans(listOf(
+            OfflineCmdBean("补充照片", "bu chong zhao pian"),
+            OfflineCmdBean("确认提交", "que ren ti jiao")
+        ))
     }
+
     fun addListenerSprayingManualResulth(){
-        for (bean in mutableListOf<OfflineCmdBean>().apply {
-            add(OfflineCmdBean("退出", "tui chu"))
-            add(OfflineCmdBean("返回", "fan hui"))
-            add(OfflineCmdBean("合格", "he ge"))
-            add(OfflineCmdBean("不合格", "bu he ge"))
-            add(OfflineCmdBean("取消", "qu xiao"))
-        }) {
-            LogHelper.d("------>>>>>>>>>--------${service!==null}")
-            service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
-                override fun onVoiceTriggered() {
-                    LogHelper.d("onOfflineCmd: ${bean.text}")
-                    for (l in listenerList) {
-                        l.onOfflineCmd(bean.text)
-                    }
-                }
-            }))
-        }
+        // 喷涂人工更正页独有关键词
+        registerBeans(listOf(
+            OfflineCmdBean("合格", "he ge"),
+            OfflineCmdBean("不合格", "bu he ge"),
+            OfflineCmdBean("取消", "qu xiao")
+        ))
     }
+
     fun addListenerSprayingOCR(){
-        for (bean in mutableListOf<OfflineCmdBean>().apply {
-            add(OfflineCmdBean("退出", "tui chu"))
-            add(OfflineCmdBean("返回", "fan hui"))
-            add(OfflineCmdBean("重拍", "chong pai"))
-        }) {
-            LogHelper.d("------>>>>>>>>>--------${service!==null}")
-            service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
-                override fun onVoiceTriggered() {
-                    LogHelper.d("onOfflineCmd: ${bean.text}")
-                    for (l in listenerList) {
-                        l.onOfflineCmd(bean.text)
-                    }
-                }
-            }))
-        }
+        // 喷涂OCR页独有关键词
+        registerBeans(listOf(
+            OfflineCmdBean("重拍", "chong pai")
+        ))
     }
+
     fun addListenerSprayingResult(){
-        for (bean in mutableListOf<OfflineCmdBean>().apply {
-            add(OfflineCmdBean("退出", "tui chu"))
-            add(OfflineCmdBean("返回", "fan hui"))
-            add(OfflineCmdBean("重拍", "chong pai"))
-            add(OfflineCmdBean("继续拍摄", "ji xu pai she"))
-            add(OfflineCmdBean("人工更正结果", "ren gong geng zheng jie guo"))
-            add(OfflineCmdBean("更正", "geng zheng"))
-            add(OfflineCmdBean("结束任务", "jie shu ren wu"))
-        }) {
-            LogHelper.d("------>>>>>>>>>--------${service!==null}")
-            service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
-                override fun onVoiceTriggered() {
-                    LogHelper.d("onOfflineCmd: ${bean.text}")
-                    for (l in listenerList) {
-                        l.onOfflineCmd(bean.text)
-                    }
-                }
-            }))
-        }
+        // 喷涂结果页独有关键词
+        registerBeans(listOf(
+            OfflineCmdBean("重拍", "chong pai"),
+            OfflineCmdBean("继续拍摄", "ji xu pai she"),
+            OfflineCmdBean("人工更正结果", "ren gong geng zheng jie guo"),
+            OfflineCmdBean("更正", "geng zheng"),
+            OfflineCmdBean("结束任务", "jie shu ren wu")
+        ))
+    }
+
+    // ---- 各页面离开时移除独有关键词(退出/返回为公共关键词,不移除)----
+
+    fun removeListenerList(){
+        removeBeans(listOf(
+            OfflineCmdBean("下一页", "xia yi ye"),
+            OfflineCmdBean("上一页", "shang yi ye"),
+            OfflineCmdBean("查看第一项任务", "cha kan di yi xiang ren wu"),
+            OfflineCmdBean("第一个", "di yi ge"),
+            OfflineCmdBean("查看第二项任务", "cha kan di er xiang ren wu"),
+            OfflineCmdBean("第二个", "di er ge"),
+            OfflineCmdBean("查看第三项任务", "cha kan di san xiang ren wu"),
+            OfflineCmdBean("第三个", "di san ge"),
+            OfflineCmdBean("查看第四项任务", "cha kan di si xiang ren wu"),
+            OfflineCmdBean("第四个", "di si ge"),
+            OfflineCmdBean("查看第五项任务", "cha kan di wu xiang ren wu"),
+            OfflineCmdBean("第五个", "di wu ge"),
+            OfflineCmdBean("查看第六项任务", "cha kan di liu xiang ren wu"),
+            OfflineCmdBean("第六个", "di liu ge")
+        ))
     }
 
+    // addListenerFo 无独有关键词,无需对应 remove 方法
+
+    fun removeListenerInspection(){
+        removeBeans(listOf(
+            OfflineCmdBean("驳回", "bo hui"),
+            OfflineCmdBean("通过", "tong guo"),
+            OfflineCmdBean("同意", "tong yi")
+        ))
+    }
+
+    fun removeListenerSpraying(){
+        removeBeans(listOf(
+            OfflineCmdBean("开始任务", "kai shi ren wu")
+        ))
+    }
 
+    fun removeListenerSprayingFinish(){
+        removeBeans(listOf(
+            OfflineCmdBean("补充照片", "bu chong zhao pian"),
+            OfflineCmdBean("确认提交", "que ren ti jiao")
+        ))
+    }
+
+    fun removeListenerSprayingManualResulth(){
+        removeBeans(listOf(
+            OfflineCmdBean("合格", "he ge"),
+            OfflineCmdBean("不合格", "bu he ge"),
+            OfflineCmdBean("取消", "qu xiao")
+        ))
+    }
+
+    fun removeListenerSprayingOCR(){
+        removeBeans(listOf(
+            OfflineCmdBean("重拍", "chong pai")
+        ))
+    }
+
+    fun removeListenerSprayingResult(){
+        removeBeans(listOf(
+            OfflineCmdBean("重拍", "chong pai"),
+            OfflineCmdBean("继续拍摄", "ji xu pai she"),
+            OfflineCmdBean("人工更正结果", "ren gong geng zheng jie guo"),
+            OfflineCmdBean("更正", "geng zheng"),
+            OfflineCmdBean("结束任务", "jie shu ren wu")
+        ))
+    }
 
 }

+ 4 - 3
app/src/main/java/com/nova/brain/glass/ui/FoActivity.kt

@@ -25,16 +25,17 @@ class FoActivity : BaseActivity<ActivityFoBinding>() {
     }
     override fun initData() {
         super.initData()
-        OfflineCmdServiceHelper.addListenerFo()
-        OfflineCmdServiceHelper.addOnLineListener(listener)
         val html = "<b>加粗</b>  <br><br>换行 <br><br><h1>h1</h1>"
         binding.content.text = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
     }
 
+    override fun onResume() {
+        super.onResume()
+        OfflineCmdServiceHelper.addOnLineListener(listener)
+    }
 
     override fun onPause() {
         super.onPause()
-        OfflineCmdServiceHelper.removeAll()
         OfflineCmdServiceHelper.removeOnLineListener(listener)
     }
 }

+ 3 - 2
app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt

@@ -38,22 +38,23 @@ class InspectionActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM
     override fun initData() {
         super.initData()
         window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
-        OfflineCmdServiceHelper.addListenerInspection()
     }
 
     override fun onResume() {
         super.onResume()
+        OfflineCmdServiceHelper.addListenerInspection()
         OfflineCmdServiceHelper.addOnLineListener(listener)
     }
 
     override fun onPause() {
         super.onPause()
+        OfflineCmdServiceHelper.removeListenerInspection()
         OfflineCmdServiceHelper.removeOnLineListener(listener)
     }
 
     override fun onDestroy() {
         super.onDestroy()
-        OfflineCmdServiceHelper.removeAll()
+        window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
     }
     private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_item) {
         override fun convert(holder: ViewHolder, item: ItemItem, position: Int) {

+ 12 - 3
app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt

@@ -37,15 +37,24 @@ class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, Ac
     }
     override fun initData() {
         super.initData()
-        OfflineCmdServiceHelper.addListenerInspection()
         window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        OfflineCmdServiceHelper.addListenerInspection()
         OfflineCmdServiceHelper.addOnLineListener(listener)
     }
 
+    override fun onPause() {
+        super.onPause()
+        OfflineCmdServiceHelper.removeListenerInspection()
+        OfflineCmdServiceHelper.removeOnLineListener(listener)
+    }
+
     override fun onDestroy() {
         super.onDestroy()
-        OfflineCmdServiceHelper.removeOnLineListener(listener)
-        OfflineCmdServiceHelper.removeAll()
+        window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
     }
 
     private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_item) {

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

@@ -111,9 +111,9 @@ class SprayingActivity :
 
     override fun onPause() {
         super.onPause()
+        OfflineCmdServiceHelper.removeListenerSpraying()
         OfflineCmdServiceHelper.removeOnLineListener(listener)
         GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
-        OfflineCmdServiceHelper.removeAll()
     }
 
     private var isPhoto = false

+ 12 - 4
app/src/main/java/com/nova/brain/glass/ui/SprayingFinishActivity.kt

@@ -40,18 +40,26 @@ class SprayingFinishActivity :
 
     override fun initData() {
         super.initData()
-        OfflineCmdServiceHelper.addOnLineListener(listener)
-        OfflineCmdServiceHelper.addListenerSprayingFinish()
         renderPhotos()
     }
 
+    override fun onResume() {
+        super.onResume()
+        OfflineCmdServiceHelper.addListenerSprayingFinish()
+        OfflineCmdServiceHelper.addOnLineListener(listener)
+    }
+
+    override fun onPause() {
+        super.onPause()
+        OfflineCmdServiceHelper.removeListenerSprayingFinish()
+        OfflineCmdServiceHelper.removeOnLineListener(listener)
+    }
+
     override fun onDestroy() {
         super.onDestroy()
         binding.photo1.setImageDrawable(null)
         binding.photo2.setImageDrawable(null)
         binding.photo3.setImageDrawable(null)
-        OfflineCmdServiceHelper.removeOnLineListener(listener)
-        OfflineCmdServiceHelper.removeAll()
     }
 
     private fun renderPhotos() {

+ 5 - 5
app/src/main/java/com/nova/brain/glass/ui/SprayingManualResultActivity.kt

@@ -33,15 +33,15 @@ class SprayingManualResultActivity :
         }
     }
 
-    override fun initData() {
-        super.initData()
+    override fun onResume() {
+        super.onResume()
         OfflineCmdServiceHelper.addListenerSprayingManualResulth()
         OfflineCmdServiceHelper.addOnLineListener(listener)
     }
 
-    override fun onDestroy() {
-        super.onDestroy()
-        OfflineCmdServiceHelper.removeAll()
+    override fun onPause() {
+        super.onPause()
+        OfflineCmdServiceHelper.removeListenerSprayingManualResulth()
         OfflineCmdServiceHelper.removeOnLineListener(listener)
     }
 

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

@@ -116,9 +116,9 @@ class SprayingOCRActivity :
     override fun onPause() {
         super.onPause()
         resultCountdown?.cancel()
+        OfflineCmdServiceHelper.removeListenerSprayingOCR()
         OfflineCmdServiceHelper.removeOnLineListener(listener)
         GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
-        OfflineCmdServiceHelper.removeAll()
     }
 
     override fun onDestroy() {

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

@@ -192,8 +192,8 @@ class SprayingResultActivity :
     }
     override fun onPause() {
         super.onPause()
+        OfflineCmdServiceHelper.removeListenerSprayingResult()
         OfflineCmdServiceHelper.removeOnLineListener(listener)
-        OfflineCmdServiceHelper.removeAll()
         GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
     }
     override fun onDestroy() {

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

@@ -179,7 +179,7 @@ class TaskListActivity :
 
     override fun onPause() {
         super.onPause()
-        OfflineCmdServiceHelper.removeAll()
+        OfflineCmdServiceHelper.removeListenerList()
         OfflineCmdServiceHelper.removeOnLineListener(offlineCmdListener)
     }