From 3270625e09b7af486d2ca5e7fc2f065f1789c7f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Tue, 14 Apr 2026 22:33:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(glass):=20=E6=B7=BB=E5=8A=A0=E5=96=B7?= =?UTF-8?q?=E6=B4=92=E6=A3=80=E6=B5=8B=E6=89=8B=E5=8A=A8=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在OfflineCmdServiceHelper中新增合格/不合格相关语音命令 - 将SprayingResultActivity中的离线命令监听器生命周期从onDestroy移至onResume/onPause - 新增SprayingManualResultActivity用于手动选择检测结果 - 新增SprayingManualResultVM作为手动结果页面的数据模型 - 添加activity_spraying_manual_result和item_manual_result_action布局文件 - 实现手动结果选择的Activity Result回调处理逻辑 - 在AndroidManifest.xml中注册新的手动结果Activity --- app/src/main/AndroidManifest.xml | 3 + .../glass/helper/OfflineCmdServiceHelper.kt | 8 ++ .../com/nova/brain/glass/ui/FoActivity.kt | 5 +- .../nova/brain/glass/ui/InspectionActivity.kt | 8 +- .../nova/brain/glass/ui/SprayingActivity.kt | 12 ++- .../glass/ui/SprayingManualResultActivity.kt | 74 +++++++++++++++++++ .../brain/glass/ui/SprayingOCRActivity.kt | 12 ++- .../brain/glass/ui/SprayingResultActivity.kt | 65 +++++++++++----- .../nova/brain/glass/ui/TaskListActivity.kt | 1 + .../glass/viewmodel/SprayingManualResultVM.kt | 20 +++++ .../activity_spraying_manual_result.xml | 51 +++++++++++++ .../res/layout/item_manual_result_action.xml | 19 +++++ 12 files changed, 249 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/com/nova/brain/glass/ui/SprayingManualResultActivity.kt create mode 100644 app/src/main/java/com/nova/brain/glass/viewmodel/SprayingManualResultVM.kt create mode 100644 app/src/main/res/layout/activity_spraying_manual_result.xml create mode 100644 app/src/main/res/layout/item_manual_result_action.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f329398..3658d39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -87,6 +87,9 @@ + () { OfflineCmdServiceHelper.addOnLineListener(listener) } - override fun onDestroy() { - super.onDestroy() + + override fun onPause() { + super.onPause() OfflineCmdServiceHelper.removeOnLineListener(listener) } } diff --git a/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt index 9cd31a2..4b3b9e4 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt @@ -38,11 +38,15 @@ class InspectionActivity : BaseListFormLayoutNormalActivity() { + override fun getLayoutId(): Int = R.layout.activity_spraying_manual_result + override fun fullscreen(): Boolean = true + + override fun getRecyclerOrientation(): Int = RecyclerView.VERTICAL + + private val listener = object : OfflineCmdListener { + override fun onOfflineCmd(cmd: String) { + runOnUiThread { + when (cmd) { + "合格", "改为合格", "设置为合格" -> chooseResult(RESULT_PASS) + "不合格", "改为不合格", "设置为不合格" -> chooseResult(RESULT_FAIL) + "取消", "取消修改", "返回", "退回", "退出" -> finish() + } + } + } + } + + override fun initData() { + super.initData() + OfflineCmdServiceHelper.addOnLineListener(listener) + } + + override fun onDestroy() { + super.onDestroy() + OfflineCmdServiceHelper.removeOnLineListener(listener) + } + + private val adapter = object : CommonPagedAdapter(R.layout.item_manual_result_action) { + override fun convert(holder: ViewHolder, item: ItemItem, position: Int) { + holder + .setText(R.id.text, item.text) + .setClickListener(R.id.actionRoot) { + when (item.text) { + "合格" -> chooseResult(RESULT_PASS) + "不合格" -> chooseResult(RESULT_FAIL) + "取消" -> finish() + } + } + } + } + + override fun adapter(): BasePagedAdapter = adapter + + private fun chooseResult(result: String) { + setResult(Activity.RESULT_OK, Intent().apply { + putExtra(EXTRA_MANUAL_RESULT, result) + }) + finish() + } + + companion object { + const val EXTRA_MANUAL_RESULT = "extra_manual_result" + const val RESULT_PASS = "pass" + const val RESULT_FAIL = "fail" + } +} diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt index 5ef06d2..b7b55e4 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt @@ -97,15 +97,19 @@ class SprayingOCRActivity : override fun initData() { super.initData() window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - OfflineCmdServiceHelper.addOnLineListener(listener) - GlassSdk.getGlassMediaService()?.addPhotoCallback(mPhotoFileCallback) intent.getStringExtra("path")?.apply { showPhoto(this) } } - override fun onDestroy() { - super.onDestroy() + override fun onResume() { + super.onResume() + + OfflineCmdServiceHelper.addOnLineListener(listener) + GlassSdk.getGlassMediaService()?.addPhotoCallback(mPhotoFileCallback) + } + override fun onPause() { + super.onPause() resultCountdown?.cancel() OfflineCmdServiceHelper.removeOnLineListener(listener) GlassSdk.getGlassMediaService()?.removePhotoCallback(mPhotoFileCallback) diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt index 9c4238c..36595e7 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt @@ -1,10 +1,12 @@ package com.nova.brain.glass.ui +import android.app.Activity import android.content.Intent import android.graphics.BitmapFactory import android.graphics.Paint import android.os.Environment import android.view.WindowManager +import androidx.activity.result.contract.ActivityResultContracts import androidx.recyclerview.widget.RecyclerView import com.nova.brain.glass.R import com.nova.brain.glass.databinding.ActivitySprayingResultBinding @@ -31,6 +33,24 @@ class SprayingResultActivity : override fun getRecyclerOrientation(): Int = RecyclerView.HORIZONTAL private var status = true + private val manualResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode != Activity.RESULT_OK) { + return@registerForActivityResult + } + when (result.data?.getStringExtra(SprayingManualResultActivity.EXTRA_MANUAL_RESULT)) { + SprayingManualResultActivity.RESULT_PASS -> { + status = true + setStatusImage() + } + + SprayingManualResultActivity.RESULT_FAIL -> { + status = false + setStatusImage() + } + } + } + private val listener = object : OfflineCmdListener { override fun onOfflineCmd(cmd: String) { runOnUiThread { @@ -66,7 +86,7 @@ class SprayingResultActivity : } fun rest() { - + manualResultLauncher.launch(Intent(this, SprayingManualResultActivity::class.java)) } private val photoCallbackId = UUID.randomUUID().toString() @@ -108,31 +128,42 @@ class SprayingResultActivity : override fun initData() { super.initData() window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - OfflineCmdServiceHelper.addOnLineListener(listener) - GlassSdk.getGlassMediaService()?.addPhotoCallback(mPhotoFileCallback) intent.getStringExtra("path")?.apply { binding.iv.setImageBitmap(BitmapFactory.decodeFile(this)) setStatusImage() } } -fun setStatusImage(){ - binding.tvTaskHeader.text = if (status) "OCR识别结果:合格" else "OCR识别结果:不合格" - binding.status.setImageResource(if (status) R.mipmap.ocr_true else R.mipmap.ocr_false) - if (status){ - binding.value1.paintFlags = binding.value1.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() - binding.value2.paintFlags = binding.value2.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() - binding.value3.paintFlags = binding.value3.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() - }else{ - binding.value1.paintFlags = binding.value1.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG - binding.value2.paintFlags = binding.value2.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG - binding.value3.paintFlags = binding.value3.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG + + fun setStatusImage() { + binding.tvTaskHeader.text = if (status) "OCR识别结果:合格" else "OCR识别结果:不合格" + binding.status.setImageResource(if (status) R.mipmap.ocr_true else R.mipmap.ocr_false) + if (status) { + binding.value1.paintFlags = + binding.value1.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() + binding.value2.paintFlags = + binding.value2.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() + binding.value3.paintFlags = + binding.value3.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() + } else { + binding.value1.paintFlags = binding.value1.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG + binding.value2.paintFlags = binding.value2.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG + binding.value3.paintFlags = binding.value3.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG + } } -} - override fun onDestroy() { - super.onDestroy() + + override fun onResume() { + super.onResume() + OfflineCmdServiceHelper.addOnLineListener(listener) + GlassSdk.getGlassMediaService()?.addPhotoCallback(mPhotoFileCallback) + } + override fun onPause() { + super.onPause() OfflineCmdServiceHelper.removeOnLineListener(listener) GlassSdk.getGlassMediaService()?.removePhotoCallback(mPhotoFileCallback) } + override fun onDestroy() { + super.onDestroy() + } private var isPhoto = false private val adapter = object : CommonPagedAdapter(R.layout.item_menu) { diff --git a/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt index 7b2667c..3933839 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt @@ -172,6 +172,7 @@ class TaskListActivity : override fun onResume() { super.onResume() + LogHelper.d(">>>>>>>>>>>>--------------------") OfflineCmdServiceHelper.addOnLineListener(offlineCmdListener) } diff --git a/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingManualResultVM.kt b/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingManualResultVM.kt new file mode 100644 index 0000000..8f8b2e9 --- /dev/null +++ b/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingManualResultVM.kt @@ -0,0 +1,20 @@ +package com.nova.brain.glass.viewmodel + +import com.nova.brain.glass.model.ItemItem +import com.xuqm.base.viewmodel.BaseListViewModel +import com.xuqm.base.viewmodel.callback.Response + +class SprayingManualResultVM : BaseListViewModel() { + override fun loadData( + page: Int, + onResponse: Response + ) { + onResponse.onResponse( + arrayListOf().apply { + add(ItemItem("合格")) + add(ItemItem("不合格")) + add(ItemItem("取消")) + } + ) + } +} diff --git a/app/src/main/res/layout/activity_spraying_manual_result.xml b/app/src/main/res/layout/activity_spraying_manual_result.xml new file mode 100644 index 0000000..c37a56a --- /dev/null +++ b/app/src/main/res/layout/activity_spraying_manual_result.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_manual_result_action.xml b/app/src/main/res/layout/item_manual_result_action.xml new file mode 100644 index 0000000..ff7493e --- /dev/null +++ b/app/src/main/res/layout/item_manual_result_action.xml @@ -0,0 +1,19 @@ + + + + + +