| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- 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<ItemItem, SprayingResultVM, ActivitySprayingResultBinding>() {
- 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<ItemItem>(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<ItemItem> = 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)
- }
- }
- }
- }
- }
|