|
|
@@ -11,6 +11,7 @@ import com.grkj.iscs.R
|
|
|
import com.grkj.iscs.databinding.FragmentSetFaceBinding
|
|
|
import com.grkj.iscs.features.main.viewmodel.user_info.UserInfoViewModel
|
|
|
import com.grkj.shared.utils.ArcSoftUtil
|
|
|
+import com.grkj.shared.utils.CancellableTimer
|
|
|
import com.grkj.ui_base.base.BaseFragment
|
|
|
import com.sik.sikcore.date.TimeUtils
|
|
|
import com.sik.sikcore.extension.file
|
|
|
@@ -18,7 +19,6 @@ import com.sik.sikcore.extension.setDebouncedClickListener
|
|
|
import com.sik.sikcore.extension.toJson
|
|
|
import com.sik.sikimage.ImageConvertUtils
|
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
|
-import kotlin.math.log
|
|
|
|
|
|
/**
|
|
|
* 设置人脸
|
|
|
@@ -27,7 +27,26 @@ import kotlin.math.log
|
|
|
class SetFaceFragment : BaseFragment<FragmentSetFaceBinding>() {
|
|
|
private val viewModel: UserInfoViewModel by viewModels()
|
|
|
private var mCapturedBitmap: Bitmap? = null
|
|
|
- private var isFaceChecking: Boolean = false
|
|
|
+ private var isFaceDetect: Boolean = false
|
|
|
+ private var isInCountDown: Boolean = false
|
|
|
+ private val captureTimer = CancellableTimer(4000, 1000, {
|
|
|
+ binding.countDownTip.text = "${(3000 - it) / 1000}"
|
|
|
+ }) {
|
|
|
+ ArcSoftUtil.inDetecting = true
|
|
|
+ isFaceDetect = true
|
|
|
+ binding.previewLayout.visibility = View.INVISIBLE
|
|
|
+ binding.image.visibility = View.VISIBLE
|
|
|
+ binding.recapture.visibility = View.VISIBLE
|
|
|
+ binding.confirm.visibility = View.VISIBLE
|
|
|
+ binding.countDownTip.text = getString(R.string.detect_face_tip)
|
|
|
+ binding.countDownTip.isVisible = false
|
|
|
+ }
|
|
|
+ private val reCaptureTimer = CancellableTimer(2000, 1000, {}) {
|
|
|
+ isFaceDetect = false
|
|
|
+ ArcSoftUtil.inDetecting = false
|
|
|
+ isInCountDown = false
|
|
|
+ }
|
|
|
+
|
|
|
override fun getLayoutId(): Int {
|
|
|
return R.layout.fragment_set_face
|
|
|
}
|
|
|
@@ -40,18 +59,19 @@ class SetFaceFragment : BaseFragment<FragmentSetFaceBinding>() {
|
|
|
binding.setOrResetFace.setDebouncedClickListener {
|
|
|
binding.faceViewLayout.isVisible = false
|
|
|
binding.faceSetLayout.isVisible = true
|
|
|
- isFaceChecking = false
|
|
|
+ binding.image.isVisible = false
|
|
|
+ binding.previewLayout.isVisible = true
|
|
|
startFace()
|
|
|
}
|
|
|
binding.cancel.setDebouncedClickListener {
|
|
|
releaseFace()
|
|
|
- isFaceChecking = false
|
|
|
binding.faceViewLayout.isVisible = true
|
|
|
binding.faceSetLayout.isVisible = false
|
|
|
+ binding.image.isVisible = false
|
|
|
+ binding.previewLayout.isVisible = true
|
|
|
}
|
|
|
binding.confirm.setDebouncedClickListener {
|
|
|
releaseFace()
|
|
|
- isFaceChecking = false
|
|
|
binding.faceViewLayout.isVisible = true
|
|
|
binding.faceSetLayout.isVisible = false
|
|
|
val saveFileName =
|
|
|
@@ -70,9 +90,12 @@ class SetFaceFragment : BaseFragment<FragmentSetFaceBinding>() {
|
|
|
}
|
|
|
}
|
|
|
binding.recapture.setDebouncedClickListener {
|
|
|
- isFaceChecking = false
|
|
|
+ reCaptureTimer.start()
|
|
|
+ binding.countDownTip.isVisible = false
|
|
|
binding.image.isVisible = false
|
|
|
binding.previewLayout.isVisible = true
|
|
|
+ binding.confirm.isVisible = false
|
|
|
+ binding.recapture.isVisible = false
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -114,35 +137,46 @@ class SetFaceFragment : BaseFragment<FragmentSetFaceBinding>() {
|
|
|
binding.preview,
|
|
|
true
|
|
|
) { bitmap, faceSize, alive ->
|
|
|
- if (isFaceChecking) {
|
|
|
- ArcSoftUtil.inDetecting = false
|
|
|
- return@initCamera
|
|
|
- }
|
|
|
- isFaceChecking = true
|
|
|
binding.tipTv.isVisible = faceSize > 1 || alive == false
|
|
|
logger.info("人脸检测结果: ${bitmap == null},$faceSize,$alive")
|
|
|
if (faceSize > 1) {
|
|
|
binding.tipTv.text = getString(R.string.only_one_person_allowed)
|
|
|
- isFaceChecking = false
|
|
|
ArcSoftUtil.inDetecting = false
|
|
|
+ stopCountDown()
|
|
|
return@initCamera
|
|
|
}
|
|
|
if (alive == false) {
|
|
|
binding.tipTv.text =
|
|
|
getString(R.string.real_person_verification_required)
|
|
|
- isFaceChecking = false
|
|
|
ArcSoftUtil.inDetecting = false
|
|
|
+ stopCountDown()
|
|
|
return@initCamera
|
|
|
}
|
|
|
- binding.previewLayout.visibility = View.INVISIBLE
|
|
|
- binding.image.visibility = View.VISIBLE
|
|
|
- mCapturedBitmap = bitmap
|
|
|
- binding.image.setImageBitmap(bitmap)
|
|
|
- binding.recapture.visibility = View.VISIBLE
|
|
|
- binding.confirm.visibility = View.VISIBLE
|
|
|
+ if (!isInCountDown) {
|
|
|
+ startCountDown()
|
|
|
+ }
|
|
|
+ if (!isFaceDetect) {
|
|
|
+ mCapturedBitmap = bitmap
|
|
|
+ binding.image.setImageBitmap(bitmap)
|
|
|
+ }
|
|
|
+ ArcSoftUtil.inDetecting = false
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private fun startCountDown() {
|
|
|
+ isInCountDown = true
|
|
|
+ binding.countDownTip.text = getString(R.string.detect_face_tip)
|
|
|
+ binding.countDownTip.isVisible = true
|
|
|
+ captureTimer.start()
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun stopCountDown() {
|
|
|
+ isInCountDown = false
|
|
|
+ binding.countDownTip.text = getString(R.string.detect_face_tip)
|
|
|
+ binding.countDownTip.isVisible = false
|
|
|
+ captureTimer.cancel()
|
|
|
+ }
|
|
|
+
|
|
|
private fun releaseFace() {
|
|
|
ArcSoftUtil.stop()
|
|
|
}
|