package com.nova.brain.glass.ui import android.app.Activity import android.content.Intent import android.graphics.Paint import android.os.Environment import android.view.WindowManager import androidx.activity.result.contract.ActivityResultContracts import androidx.core.view.doOnLayout import androidx.recyclerview.widget.RecyclerView import com.nova.brain.glass.R import com.nova.brain.glass.databinding.ActivitySprayingResultBinding import com.nova.brain.glass.helper.BitmapDecodeHelper import com.nova.brain.glass.helper.OfflineCmdListener import com.nova.brain.glass.helper.OfflineCmdServiceHelper import com.nova.brain.glass.helper.SprayingPhotoManager import com.nova.brain.glass.model.ItemItem import com.nova.brain.glass.viewmodel.SprayingResultVM import com.rokid.security.glass3.open.sdk.GlassSdk import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution import com.rokid.security.system.server.media.callback.PhotoFileCallback import com.xuqm.base.adapter.BasePagedAdapter import com.xuqm.base.adapter.CommonPagedAdapter import com.xuqm.base.adapter.ViewHolder import com.xuqm.base.common.LogHelper import com.xuqm.base.extensions.showMessage import com.xuqm.base.ui.BaseListFormLayoutNormalActivity import java.io.File import java.util.concurrent.Executors import java.util.UUID class SprayingResultActivity : BaseListFormLayoutNormalActivity() { override fun getLayoutId(): Int = R.layout.activity_spraying_result override fun fullscreen(): Boolean = true override fun getRecyclerOrientation(): Int = RecyclerView.HORIZONTAL private val imageDecodeExecutor = Executors.newSingleThreadExecutor() 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 finishLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode != Activity.RESULT_OK) { return@registerForActivityResult } when (result.data?.getStringExtra(SprayingFinishActivity.EXTRA_FINISH_ACTION)) { SprayingFinishActivity.ACTION_SUPPLEMENT -> { runOnUiThread { binding.hint.text = "拍照中,请稍后..." } isPhoto = true takePhoto() } SprayingFinishActivity.ACTION_SUBMIT -> { SprayingPhotoManager.clear() finish() } } } private val listener = object : OfflineCmdListener { override fun onOfflineCmd(cmd: String) { runOnUiThread { when (cmd) { "退出", "返回", "退回" -> { finish() } "重拍", "重新拍", "继续拍照", "再拍一次", "继续拍摄" -> { runOnUiThread { binding.hint.text = "拍照中,请稍后..." } isPhoto = true takePhoto() } "人工更正结果", "更正结果", "人工更正", "更正" -> { rest() } "结束任务", "完成任务", "完成", "结束" -> { taskFinish() } } } } } fun takePhoto() { val fileName = "test_${System.currentTimeMillis()}.png" val publicPicturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) val file = File(publicPicturesDir, fileName) GlassSdk.getGlassMediaService() ?.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath) } fun rest() { manualResultLauncher.launch(Intent(this, SprayingManualResultActivity::class.java)) } fun taskFinish() { finishLauncher.launch(Intent(this, SprayingFinishActivity::class.java)) } private val photoCallbackId = UUID.randomUUID().toString() private val mPhotoFileCallback = object : PhotoFileCallback.Stub() { override fun onTakePhoto(path: String) { LogHelper.d("onTakePhoto-->path = $path") } override fun getCallbackId(): String { return photoCallbackId } override fun onTakePhotoV2(path: String?, width: Int, height: Int) { LogHelper.d("width:$width--height:$height") if (path == null) { if (isPhoto) { isPhoto = false takePhoto() } else { runOnUiThread { binding.hint.text = "单击或语音输入“开始”,进入下一步" } "相机异常".showMessage() } } else { SprayingPhotoManager.addPhoto(path) startActivity( Intent( this@SprayingResultActivity, SprayingOCRActivity::class.java ).apply { putExtra("path", path) }) finish() } } } override fun initData() { super.initData() window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) intent.getStringExtra("path")?.apply { showResultImage(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 } } 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) { override fun convert(holder: ViewHolder, item: ItemItem, position: Int) { holder.setText( when (position) { 1 -> R.id.text else -> R.id.text2 }, item.text ) .setVisibility( when (position) { 1 -> R.id.da else -> R.id.xiao }, true ) .setClickListener(R.id.photo) { when (item.text) { "继续拍摄" -> { runOnUiThread { binding.hint.text = "拍照中,请稍后..." } isPhoto = true takePhoto() } "结束任务" -> { taskFinish() } "人工更正结果" -> { rest() } } } } } override fun adapter(): BasePagedAdapter = adapter private fun showResultImage(path: String) { binding.iv.doOnLayout { val targetWidth = it.width.coerceAtLeast(1) val targetHeight = it.height.coerceAtLeast(1) imageDecodeExecutor.execute { val bitmap = BitmapDecodeHelper.decodeSampledBitmap(path, targetWidth, targetHeight) runOnUiThread { if (isFinishing || isDestroyed) { return@runOnUiThread } binding.iv.setImageBitmap(bitmap) } } } } }