|
|
@@ -12,6 +12,7 @@ import com.grkj.iscs.R
|
|
|
import com.grkj.iscs.databinding.FragmentUserInfoBinding
|
|
|
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.grkj.ui_base.dialog.TipDialog
|
|
|
import com.grkj.ui_base.utils.CommonUtils
|
|
|
@@ -30,7 +31,25 @@ import dagger.hilt.android.AndroidEntryPoint
|
|
|
class UserInfoFragment : BaseFragment<FragmentUserInfoBinding>() {
|
|
|
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.setAvatarConfirm.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_user_info
|
|
|
@@ -45,23 +64,26 @@ class UserInfoFragment : BaseFragment<FragmentUserInfoBinding>() {
|
|
|
navController.popBackStack()
|
|
|
}
|
|
|
binding.avatar.setDebouncedClickListener {
|
|
|
- binding.showUserInfoLayout.isVisible = false
|
|
|
binding.faceSetLayout.isVisible = true
|
|
|
- isFaceChecking = false
|
|
|
+ binding.image.isVisible = false
|
|
|
+ binding.previewLayout.isVisible = true
|
|
|
+ binding.setAvatarConfirm.isVisible = false
|
|
|
+ binding.recapture.isVisible = false
|
|
|
startFace()
|
|
|
}
|
|
|
binding.setAvatarCancel.setDebouncedClickListener {
|
|
|
releaseFace()
|
|
|
- isFaceChecking = false
|
|
|
- binding.showUserInfoLayout.isVisible = true
|
|
|
binding.faceSetLayout.isVisible = false
|
|
|
+ binding.image.isVisible = false
|
|
|
+ binding.previewLayout.isVisible = true
|
|
|
+ binding.setAvatarConfirm.isVisible = false
|
|
|
+ binding.recapture.isVisible = false
|
|
|
}
|
|
|
binding.setAvatarConfirm.setDebouncedClickListener {
|
|
|
releaseFace()
|
|
|
- isFaceChecking = false
|
|
|
- binding.avatar.load(mCapturedBitmap)
|
|
|
- binding.showUserInfoLayout.isVisible = true
|
|
|
binding.faceSetLayout.isVisible = false
|
|
|
+ binding.setAvatarConfirm.isVisible = false
|
|
|
+ binding.recapture.isVisible = false
|
|
|
val saveFileName =
|
|
|
"${MainDomainData.userInfo?.userId}_avatar_${TimeUtils.nowString("yyyyMMddHHmmss")}"
|
|
|
FileStorageUtils.writeText(
|
|
|
@@ -76,9 +98,13 @@ class UserInfoFragment : BaseFragment<FragmentUserInfoBinding>() {
|
|
|
viewModel.saveUserAvatar(savePath).observe(this) {}
|
|
|
}
|
|
|
binding.recapture.setDebouncedClickListener {
|
|
|
- isFaceChecking = false
|
|
|
+ reCaptureTimer.start()
|
|
|
+ binding.countDownTip.isVisible = false
|
|
|
binding.image.isVisible = false
|
|
|
- binding.preview.isVisible = true
|
|
|
+ binding.previewLayout.isVisible = true
|
|
|
+ binding.setAvatarConfirm.isVisible = false
|
|
|
+ binding.recapture.isVisible = false
|
|
|
+ binding.faceOverlayView.setFaceRect(null)
|
|
|
}
|
|
|
binding.confirm.setDebouncedClickListener {
|
|
|
if (checkData()) {
|
|
|
@@ -110,7 +136,7 @@ class UserInfoFragment : BaseFragment<FragmentUserInfoBinding>() {
|
|
|
binding.nicknameEt.setText(MainDomainData.userInfo?.nickName)
|
|
|
binding.phoneEt.setText(MainDomainData.userInfo?.phoneNumber)
|
|
|
MainDomainData.userInfo?.avatar?.let {
|
|
|
- if (it.isEmpty()){
|
|
|
+ if (it.isEmpty()) {
|
|
|
return
|
|
|
}
|
|
|
if (it.file().exists()) {
|
|
|
@@ -133,43 +159,56 @@ class UserInfoFragment : BaseFragment<FragmentUserInfoBinding>() {
|
|
|
}
|
|
|
|
|
|
private fun startFace() {
|
|
|
- ArcSoftUtil.inDetecting = false
|
|
|
- binding.preview.isVisible = true
|
|
|
+ binding.previewLayout.isVisible = true
|
|
|
binding.image.isVisible = false
|
|
|
+ ArcSoftUtil.inDetecting = false
|
|
|
ArcSoftUtil.initCamera(
|
|
|
requireContext(),
|
|
|
requireActivity().windowManager,
|
|
|
- binding.preview
|
|
|
+ binding.preview,
|
|
|
+ binding.faceOverlayView,
|
|
|
+ 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.preview.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()
|
|
|
}
|