SprayingResultActivity.kt 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package com.nova.brain.glass.ui
  2. import android.app.Activity
  3. import android.content.Intent
  4. import android.graphics.Paint
  5. import android.os.Environment
  6. import android.view.WindowManager
  7. import androidx.activity.result.contract.ActivityResultContracts
  8. import androidx.core.view.doOnLayout
  9. import androidx.recyclerview.widget.RecyclerView
  10. import com.nova.brain.glass.R
  11. import com.nova.brain.glass.databinding.ActivitySprayingResultBinding
  12. import com.nova.brain.glass.helper.BitmapDecodeHelper
  13. import com.nova.brain.glass.helper.OfflineCmdListener
  14. import com.nova.brain.glass.helper.OfflineCmdServiceHelper
  15. import com.nova.brain.glass.helper.SprayingPhotoManager
  16. import com.nova.brain.glass.model.ItemItem
  17. import com.nova.brain.glass.viewmodel.SprayingResultVM
  18. import com.rokid.security.glass3.open.sdk.GlassSdk
  19. import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution
  20. import com.rokid.security.system.server.media.callback.PhotoFileCallback
  21. import com.xuqm.base.adapter.BasePagedAdapter
  22. import com.xuqm.base.adapter.CommonPagedAdapter
  23. import com.xuqm.base.adapter.ViewHolder
  24. import com.xuqm.base.common.LogHelper
  25. import com.xuqm.base.extensions.showMessage
  26. import com.xuqm.base.ui.BaseListFormLayoutNormalActivity
  27. import java.io.File
  28. import java.util.concurrent.Executors
  29. import java.util.UUID
  30. class SprayingResultActivity :
  31. BaseListFormLayoutNormalActivity<ItemItem, SprayingResultVM, ActivitySprayingResultBinding>() {
  32. override fun getLayoutId(): Int = R.layout.activity_spraying_result
  33. override fun fullscreen(): Boolean = true
  34. override fun getRecyclerOrientation(): Int = RecyclerView.HORIZONTAL
  35. private val imageDecodeExecutor = Executors.newSingleThreadExecutor()
  36. private var status = true
  37. private val manualResultLauncher =
  38. registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
  39. if (result.resultCode != Activity.RESULT_OK) {
  40. return@registerForActivityResult
  41. }
  42. when (result.data?.getStringExtra(SprayingManualResultActivity.EXTRA_MANUAL_RESULT)) {
  43. SprayingManualResultActivity.RESULT_PASS -> {
  44. status = true
  45. setStatusImage()
  46. }
  47. SprayingManualResultActivity.RESULT_FAIL -> {
  48. status = false
  49. setStatusImage()
  50. }
  51. }
  52. }
  53. private val finishLauncher =
  54. registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
  55. if (result.resultCode != Activity.RESULT_OK) {
  56. return@registerForActivityResult
  57. }
  58. when (result.data?.getStringExtra(SprayingFinishActivity.EXTRA_FINISH_ACTION)) {
  59. SprayingFinishActivity.ACTION_SUPPLEMENT -> {
  60. runOnUiThread {
  61. binding.hint.text = "拍照中,请稍后..."
  62. }
  63. isPhoto = true
  64. takePhoto()
  65. }
  66. SprayingFinishActivity.ACTION_SUBMIT -> {
  67. SprayingPhotoManager.clear()
  68. finish()
  69. }
  70. }
  71. }
  72. private val listener = object : OfflineCmdListener {
  73. override fun onOfflineCmd(cmd: String) {
  74. runOnUiThread {
  75. when (cmd) {
  76. "退出", "返回", "退回" -> {
  77. finish()
  78. }
  79. "重拍", "重新拍", "继续拍照", "再拍一次", "继续拍摄" -> {
  80. runOnUiThread {
  81. binding.hint.text = "拍照中,请稍后..."
  82. }
  83. isPhoto = true
  84. takePhoto()
  85. }
  86. "人工更正结果", "更正结果", "人工更正", "更正" -> {
  87. rest()
  88. }
  89. "结束任务", "完成任务", "完成", "结束" -> {
  90. taskFinish()
  91. }
  92. }
  93. }
  94. }
  95. }
  96. fun takePhoto() {
  97. val fileName = "test_${System.currentTimeMillis()}.png"
  98. val publicPicturesDir =
  99. Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
  100. val file = File(publicPicturesDir, fileName)
  101. GlassSdk.getGlassMediaService()
  102. ?.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath)
  103. }
  104. fun rest() {
  105. manualResultLauncher.launch(Intent(this, SprayingManualResultActivity::class.java))
  106. }
  107. fun taskFinish() {
  108. finishLauncher.launch(Intent(this, SprayingFinishActivity::class.java))
  109. }
  110. private val photoCallbackId = UUID.randomUUID().toString()
  111. private val mPhotoFileCallback = object : PhotoFileCallback.Stub() {
  112. override fun onTakePhoto(path: String) {
  113. LogHelper.d("onTakePhoto-->path = $path")
  114. }
  115. override fun getCallbackId(): String {
  116. return photoCallbackId
  117. }
  118. override fun onTakePhotoV2(path: String?, width: Int, height: Int) {
  119. LogHelper.d("width:$width--height:$height")
  120. if (path == null) {
  121. if (isPhoto) {
  122. isPhoto = false
  123. takePhoto()
  124. } else {
  125. runOnUiThread {
  126. binding.hint.text = "单击或语音输入“开始”,进入下一步"
  127. }
  128. "相机异常".showMessage()
  129. }
  130. } else {
  131. SprayingPhotoManager.addPhoto(path)
  132. startActivity(
  133. Intent(
  134. this@SprayingResultActivity, SprayingOCRActivity::class.java
  135. ).apply {
  136. putExtra("path", path)
  137. })
  138. finish()
  139. }
  140. }
  141. }
  142. override fun initData() {
  143. super.initData()
  144. window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
  145. intent.getStringExtra("path")?.apply {
  146. showResultImage(this)
  147. setStatusImage()
  148. }
  149. }
  150. fun setStatusImage() {
  151. binding.tvTaskHeader.text = if (status) "OCR识别结果:合格" else "OCR识别结果:不合格"
  152. binding.status.setImageResource(if (status) R.mipmap.ocr_true else R.mipmap.ocr_false)
  153. if (status) {
  154. binding.value1.paintFlags =
  155. binding.value1.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
  156. binding.value2.paintFlags =
  157. binding.value2.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
  158. binding.value3.paintFlags =
  159. binding.value3.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
  160. } else {
  161. binding.value1.paintFlags = binding.value1.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
  162. binding.value2.paintFlags = binding.value2.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
  163. binding.value3.paintFlags = binding.value3.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
  164. }
  165. }
  166. override fun onResume() {
  167. super.onResume()
  168. OfflineCmdServiceHelper.addOnLineListener(listener)
  169. GlassSdk.getGlassMediaService()?.addPhotoCallback(mPhotoFileCallback)
  170. }
  171. override fun onPause() {
  172. super.onPause()
  173. OfflineCmdServiceHelper.removeOnLineListener(listener)
  174. GlassSdk.getGlassMediaService()?.removePhotoCallback(mPhotoFileCallback)
  175. }
  176. override fun onDestroy() {
  177. super.onDestroy()
  178. }
  179. private var isPhoto = false
  180. private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_menu) {
  181. override fun convert(holder: ViewHolder, item: ItemItem, position: Int) {
  182. holder.setText(
  183. when (position) {
  184. 1 -> R.id.text
  185. else -> R.id.text2
  186. }, item.text
  187. )
  188. .setVisibility(
  189. when (position) {
  190. 1 -> R.id.da
  191. else -> R.id.xiao
  192. }, true
  193. )
  194. .setClickListener(R.id.photo) {
  195. when (item.text) {
  196. "继续拍摄" -> {
  197. runOnUiThread {
  198. binding.hint.text = "拍照中,请稍后..."
  199. }
  200. isPhoto = true
  201. takePhoto()
  202. }
  203. "结束任务" -> {
  204. taskFinish()
  205. }
  206. "人工更正结果" -> {
  207. rest()
  208. }
  209. }
  210. }
  211. }
  212. }
  213. override fun adapter(): BasePagedAdapter<ItemItem> = adapter
  214. private fun showResultImage(path: String) {
  215. binding.iv.doOnLayout {
  216. val targetWidth = it.width.coerceAtLeast(1)
  217. val targetHeight = it.height.coerceAtLeast(1)
  218. imageDecodeExecutor.execute {
  219. val bitmap = BitmapDecodeHelper.decodeSampledBitmap(path, targetWidth, targetHeight)
  220. runOnUiThread {
  221. if (isFinishing || isDestroyed) {
  222. return@runOnUiThread
  223. }
  224. binding.iv.setImageBitmap(bitmap)
  225. }
  226. }
  227. }
  228. }
  229. }