SprayingOCRActivity.kt 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package com.nova.brain.glass.ui
  2. import android.content.Intent
  3. import android.os.CountDownTimer
  4. import android.os.Environment
  5. import android.view.WindowManager
  6. import androidx.core.view.doOnLayout
  7. import androidx.recyclerview.widget.RecyclerView
  8. import com.nova.brain.glass.R
  9. import com.nova.brain.glass.databinding.ActivitySprayingOcrBinding
  10. import com.nova.brain.glass.helper.BitmapDecodeHelper
  11. import com.nova.brain.glass.helper.GlassMediaServiceHelper
  12. import com.nova.brain.glass.helper.OfflineCmdListener
  13. import com.nova.brain.glass.helper.OfflineCmdServiceHelper
  14. import com.nova.brain.glass.helper.SprayingPhotoManager
  15. import com.nova.brain.glass.model.ItemItem
  16. import com.nova.brain.glass.viewmodel.SprayingOCRVM
  17. import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution
  18. import com.rokid.security.system.server.media.callback.PhotoFileCallback
  19. import com.xuqm.base.adapter.BasePagedAdapter
  20. import com.xuqm.base.adapter.CommonPagedAdapter
  21. import com.xuqm.base.adapter.ViewHolder
  22. import com.xuqm.base.common.LogHelper
  23. import com.xuqm.base.extensions.showMessage
  24. import com.xuqm.base.ui.BaseListFormLayoutNormalActivity
  25. import java.io.File
  26. import java.util.concurrent.Executors
  27. import java.util.UUID
  28. class SprayingOCRActivity :
  29. BaseListFormLayoutNormalActivity<ItemItem, SprayingOCRVM, ActivitySprayingOcrBinding>() {
  30. override fun getLayoutId(): Int = R.layout.activity_spraying_ocr
  31. override fun fullscreen(): Boolean = true
  32. override fun getRecyclerOrientation(): Int = RecyclerView.VERTICAL
  33. private val listener = object : OfflineCmdListener {
  34. override fun onOfflineCmd(cmd: String) {
  35. runOnUiThread {
  36. when (cmd) {
  37. "退出", "返回", "退回" -> {
  38. finish()
  39. }
  40. "开始", "拍照", "开始拍照", "开始任务", "重拍", "重新拍", "在拍一次" -> {
  41. runOnUiThread {
  42. binding.hint.text = "拍照中,请稍后..."
  43. }
  44. isPhoto = true
  45. takePhoto()
  46. }
  47. }
  48. }
  49. }
  50. }
  51. fun takePhoto() {
  52. resultCountdown?.cancel()
  53. resultCountdown = null
  54. val fileName = "test_${System.currentTimeMillis()}.png"
  55. val publicPicturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
  56. val file = File(publicPicturesDir, fileName)
  57. GlassMediaServiceHelper.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath)
  58. }
  59. private val photoCallbackId = UUID.randomUUID().toString()
  60. private var resultCountdown: CountDownTimer? = null
  61. private val imageDecodeExecutor = Executors.newSingleThreadExecutor()
  62. private val mPhotoFileCallback = object : PhotoFileCallback.Stub() {
  63. override fun onTakePhoto(path: String) {
  64. LogHelper.d("onTakePhoto-->path = $path")
  65. }
  66. override fun getCallbackId(): String {
  67. return photoCallbackId
  68. }
  69. override fun onTakePhotoV2(path: String?, width: Int, height: Int) {
  70. LogHelper.d("width:$width--height:$height")
  71. if (path == null) {
  72. if (isPhoto) {
  73. isPhoto = false
  74. takePhoto()
  75. } else {
  76. runOnUiThread {
  77. binding.hint.text = "单击或语音输入“重拍”,可重新拍摄"
  78. }
  79. "相机异常".showMessage()
  80. }
  81. } else {
  82. SprayingPhotoManager.addPhoto(path)
  83. runOnUiThread {
  84. binding.hint.text = "单击或语音输入“重拍”,可重新拍摄"
  85. showPhoto(path)
  86. }
  87. }
  88. }
  89. }
  90. override fun initData() {
  91. super.initData()
  92. window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
  93. intent.getStringExtra("path")?.apply {
  94. showPhoto(this)
  95. }
  96. }
  97. override fun onResume() {
  98. super.onResume()
  99. OfflineCmdServiceHelper.addOnLineListener(listener)
  100. GlassMediaServiceHelper.addPhotoCallback(mPhotoFileCallback)
  101. }
  102. override fun onPause() {
  103. super.onPause()
  104. resultCountdown?.cancel()
  105. OfflineCmdServiceHelper.removeOnLineListener(listener)
  106. GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
  107. }
  108. override fun onDestroy() {
  109. super.onDestroy()
  110. binding.content.setImageDrawable(null)
  111. }
  112. private var isPhoto = false
  113. private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_photo) {
  114. override fun convert(holder: ViewHolder, item: ItemItem, position: Int) {
  115. holder
  116. .setText(R.id.text, item.text)
  117. .setClickListener(R.id.photo) {
  118. when (item.text) {
  119. "重拍" -> {
  120. runOnUiThread {
  121. binding.hint.text = "拍照中,请稍后..."
  122. }
  123. isPhoto = true
  124. takePhoto()
  125. }
  126. }
  127. }
  128. }
  129. }
  130. override fun adapter(): BasePagedAdapter<ItemItem> = adapter
  131. private fun showPhoto(path: String) {
  132. binding.content.doOnLayout {
  133. val targetWidth = it.width.coerceAtLeast(1)
  134. val targetHeight = it.height.coerceAtLeast(1)
  135. imageDecodeExecutor.execute {
  136. val bitmap = BitmapDecodeHelper.decodeSampledBitmap(path, targetWidth, targetHeight)
  137. runOnUiThread {
  138. if (isFinishing || isDestroyed) {
  139. return@runOnUiThread
  140. }
  141. binding.content.setImageBitmap(bitmap)
  142. restartResultCountdown(path)
  143. }
  144. }
  145. }
  146. }
  147. private fun restartResultCountdown(path: String) {
  148. resultCountdown?.cancel()
  149. resultCountdown = object : CountDownTimer(5_000, 1_000) {
  150. override fun onTick(millisUntilFinished: Long) {
  151. }
  152. override fun onFinish() {
  153. startActivity(Intent(this@SprayingOCRActivity, SprayingResultActivity::class.java).apply {
  154. putExtra("path", path)
  155. })
  156. finish()
  157. }
  158. }.start()
  159. }
  160. }