Forráskód Böngészése

删除作业票执行步骤页冗余代码;人脸设置完成基础页面和弹框

Frankensteinly 7 hónapja
szülő
commit
3e9ff0d8b2

+ 67 - 0
app/src/main/java/com/grkj/iscs/view/dialog/FaceCaptureDialog.kt

@@ -0,0 +1,67 @@
+package com.grkj.iscs.view.dialog
+
+import android.graphics.Bitmap
+import android.view.View
+import com.grkj.iscs.databinding.DialogFaceCaptureBinding
+import com.grkj.iscs.util.Executor
+import com.grkj.iscs.view.activity.test.face.FaceDetectorHelper
+import com.grkj.iscs.view.base.BaseActivity
+import com.grkj.iscs.view.base.BaseDialog
+
+/**
+ * 人脸采集弹框
+ */
+class FaceCaptureDialog(val ctx: BaseActivity<*>, var callback: (Bitmap?) -> Unit) :
+    BaseDialog<DialogFaceCaptureBinding>(ctx) {
+
+    private val faceDetectorHelper by lazy {
+        FaceDetectorHelper()
+    }
+
+    override val viewBinding: DialogFaceCaptureBinding
+        get() = DialogFaceCaptureBinding.inflate(layoutInflater)
+
+    override fun initView() {
+        mBinding?.cbRecapture?.setOnClickListener {
+            mBinding?.preview?.visibility = View.VISIBLE
+            mBinding?.preview?.bringToFront()
+            faceDetectorHelper.startDetector()
+
+            mBinding?.cbRecapture?.visibility = View.GONE
+            mBinding?.cbConfirm?.visibility = View.GONE
+        }
+
+        mBinding?.cbCancel?.setOnClickListener {
+            mBinding?.cbRecapture?.visibility = View.GONE
+            mBinding?.cbConfirm?.visibility = View.GONE
+            dismiss()
+        }
+    }
+
+    override fun show() {
+        super.show()
+        // 启动预览
+        mBinding?.preview?.visibility = View.VISIBLE
+        mBinding?.preview?.bringToFront()
+        faceDetectorHelper.startPreview(ctx, mBinding?.preview!!) {
+            // 注意切换线程
+            Executor.runOnMain {
+                // 关闭识别
+                faceDetectorHelper.stopDetector()
+                // 设置图片
+                mBinding?.image?.setImageBitmap(it)
+                mBinding?.image?.bringToFront()
+                // 隐藏预览页面
+                mBinding?.preview?.visibility = View.INVISIBLE
+                mBinding?.cbRecapture?.visibility = View.VISIBLE
+                mBinding?.cbConfirm?.visibility = View.VISIBLE
+            }
+        }
+        faceDetectorHelper.startDetector()
+    }
+
+    override fun dismiss() {
+        super.dismiss()
+        faceDetectorHelper.release()
+    }
+}

+ 59 - 0
app/src/main/java/com/grkj/iscs/view/fragment/FaceConfigFragment.kt

@@ -1,9 +1,16 @@
 package com.grkj.iscs.view.fragment
 
+import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentFaceConfigBinding
+import com.grkj.iscs.model.vo.characteristic.CharacteristicPageRespVO
+import com.grkj.iscs.util.ToastUtils
+import com.grkj.iscs.view.base.BaseActivity
 import com.grkj.iscs.view.base.BaseMvpFragment
+import com.grkj.iscs.view.dialog.FaceCaptureDialog
 import com.grkj.iscs.view.iview.IFaceConfigView
 import com.grkj.iscs.view.presenter.FaceConfigPresenter
+import com.zhy.adapter.recyclerview.CommonAdapter
+import com.zhy.adapter.recyclerview.base.ViewHolder
 
 /**
  * 人脸设置页
@@ -11,11 +18,63 @@ import com.grkj.iscs.view.presenter.FaceConfigPresenter
 class FaceConfigFragment :
     BaseMvpFragment<IFaceConfigView, FaceConfigPresenter, FragmentFaceConfigBinding>() {
 
+    private val mFaceList = mutableListOf<CharacteristicPageRespVO.Record>()
+    private var mCaptureDialog: FaceCaptureDialog? = null
+
     override val viewBinding: FragmentFaceConfigBinding
         get() = FragmentFaceConfigBinding.inflate(layoutInflater)
 
     override fun initView() {
+        mBinding?.cbAddFace?.setOnClickListener {
+            if (mFaceList.size >= 1) {
+                ToastUtils.tip(R.string.face_config_tip)
+                return@setOnClickListener
+            }
+            showCaptureDialog()
+        }
+
+        mBinding?.rvFace?.adapter = object : CommonAdapter<CharacteristicPageRespVO.Record>(
+            requireContext(),
+            R.layout.item_rv_finger,
+            mFaceList
+        ) {
+            override fun convert(
+                holder: ViewHolder,
+                record: CharacteristicPageRespVO.Record,
+                position: Int
+            ) {
+                holder.setText(R.id.tv_name, "${getString(R.string.fingerprint)}${position + 1}")
+                holder.setOnClickListener(R.id.root) {
+//                    showTipDialog(
+//                        getString(
+//                            R.string.fingerprint_delete_confirm_tip,
+//                            "${getString(R.string.fingerprint)}${position + 1}"
+//                        ), record.recordId
+//                    )
+                }
+            }
+        }
+
+        refreshFaceList()
+    }
+
+    private fun refreshFaceList() {
+        presenter?.getFacePage {
+            mFaceList.clear()
+            it?.records?.let {
+                mFaceList.addAll(it)
+            }
+            mBinding?.rvFace?.adapter?.notifyDataSetChanged()
+        }
+    }
+
+    private fun showCaptureDialog() {
+        mCaptureDialog ?: let {
+            mCaptureDialog = FaceCaptureDialog(activity as BaseActivity<*>) {
 
+            }
+        }
+        mCaptureDialog?.show()
     }
 
     override fun initPresenter(): FaceConfigPresenter {

+ 0 - 22
app/src/main/java/com/grkj/iscs/view/fragment/StepFragment.kt

@@ -3,8 +3,6 @@ package com.grkj.iscs.view.fragment
 import android.graphics.PointF
 import android.view.View
 import android.widget.ImageView
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.recyclerview.widget.GridLayoutManager
 import com.bumptech.glide.Glide
 import com.google.android.material.card.MaterialCardView
 import com.grkj.iscs.R
@@ -24,8 +22,6 @@ import com.grkj.iscs.view.widget.CustomStationLayer
 import com.onlylemi.mapview.library.MapViewListener
 import com.zhy.adapter.recyclerview.CommonAdapter
 import com.zhy.adapter.recyclerview.base.ViewHolder
-import kotlin.math.ceil
-import kotlin.math.sqrt
 
 /**
  * 作业票执行步骤页 - 八大步骤
@@ -92,19 +88,6 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
             }
         }
 
-        mBinding?.rvLoto?.adapter = object : CommonAdapter<LotoMapRespVO>(requireContext(), R.layout.item_rv_loto, mLotoList) {
-            override fun convert(holder: ViewHolder, loto: LotoMapRespVO, position: Int) {
-                val cl = holder.getView<ConstraintLayout>(R.id.cl_container)
-                val param = cl.layoutParams
-                param.width = param.width * 3 / (mBinding?.rvLoto?.layoutManager as GridLayoutManager).spanCount
-                cl.layoutParams = param
-
-                Glide.with(this@StepFragment).load(loto.pointIcon).into(holder.getView(R.id.iv_icon))
-                holder.setText(R.id.tv_name, loto.pointName)
-                holder.setVisible(R.id.rl_cover, mMachineryDetail?.pointIdList?.contains(loto.pointId!!) == true)
-            }
-        }
-
         mBinding?.cbBack?.setOnClickListener { goBack() }
 
         mBinding?.cbAction?.setOnClickListener {
@@ -202,11 +185,6 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
                 mLotoList.addAll(it)
             } ?: mLotoList.clear()
 
-            val spanCount = (ceil(sqrt(mLotoList.size.toFloat())) - 1).toInt()
-            (mBinding?.rvLoto?.layoutManager as GridLayoutManager).spanCount = spanCount
-
-            mBinding?.rvLoto?.adapter?.notifyDataSetChanged()
-
             if (mLotoList.isNotEmpty()) {
                 mLotoList[0].mapId?.let { itId ->
                     presenter?.getMapInfo(itId) { itMapInfo ->

+ 15 - 0
app/src/main/java/com/grkj/iscs/view/presenter/FaceConfigPresetner.kt

@@ -1,7 +1,22 @@
 package com.grkj.iscs.view.presenter
 
+import com.grkj.iscs.MyApplication
+import com.grkj.iscs.model.vo.characteristic.CharacteristicPageRespVO
+import com.grkj.iscs.util.Executor
+import com.grkj.iscs.util.NetApi
+import com.grkj.iscs.util.SPUtils
 import com.grkj.iscs.view.base.BasePresenter
 import com.grkj.iscs.view.iview.IFaceConfigView
 
 class FaceConfigPresenter : BasePresenter<IFaceConfigView>() {
+
+    fun getFacePage(callBack: (CharacteristicPageRespVO?) -> Unit) {
+        SPUtils.getLoginUser(MyApplication.instance!!.applicationContext)?.userId?.let {
+            NetApi.getUserCharacteristicPage(1, -1, "2", it) {
+                Executor.runOnMain {
+                    callBack(it)
+                }
+            }
+        }
+    }
 }

+ 5 - 6
app/src/main/java/com/grkj/iscs/view/presenter/FingerprintConfigPresenter.kt

@@ -14,12 +14,11 @@ import com.grkj.iscs.view.iview.IFingerprintConfigView
 class FingerprintConfigPresenter : BasePresenter<IFingerprintConfigView>() {
 
     fun getFingerPage(callBack: (CharacteristicPageRespVO?) -> Unit) {
-        NetApi.getUserCharacteristicPage(
-            1, -1, "1",
-            SPUtils.getLoginUser(MyApplication.instance!!.applicationContext)?.userId!!
-        ) {
-            Executor.runOnMain {
-                callBack(it)
+        SPUtils.getLoginUser(MyApplication.instance!!.applicationContext)?.userId?.let {
+            NetApi.getUserCharacteristicPage(1, -1, "1", it) {
+                Executor.runOnMain {
+                    callBack(it)
+                }
             }
         }
     }

+ 6 - 0
app/src/main/res/drawable/common_btn_green_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="@dimen/common_radius_small" />
+    <solid android:color="@color/common_btn_green_bg" />
+</shape>

+ 8 - 0
app/src/main/res/drawable/face_capture_tip_bg.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="@dimen/common_radius_small" />
+    <stroke
+        android:width="@dimen/divider_line_width"
+        android:color="@color/black" />
+</shape>

+ 116 - 0
app/src/main/res/layout/dialog_face_capture.xml

@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    app:cardBackgroundColor="@color/common_bg_white_60"
+    app:strokeColor="@color/common_transparent">
+
+    <RelativeLayout
+        android:layout_width="456dp"
+        android:layout_height="284dp"
+        android:padding="@dimen/common_spacing">
+
+        <TextView
+            android:id="@+id/tv_title"
+            style="@style/CommonTextView"
+            android:layout_centerHorizontal="true"
+            android:text="@string/add_face"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_text_size_big"
+            android:textStyle="bold" />
+
+        <LinearLayout
+            android:id="@+id/ll_action"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:orientation="horizontal">
+
+            <com.grkj.iscs.view.widget.CommonBtn
+                android:id="@+id/cb_confirm"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentRight="true"
+                android:layout_alignParentBottom="true"
+                android:visibility="gone"
+                app:btn_bg="@drawable/common_btn_green_bg"
+                app:btn_name="@string/confirm" />
+
+            <com.grkj.iscs.view.widget.CommonBtn
+                android:id="@+id/cb_recapture"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentRight="true"
+                android:layout_alignParentBottom="true"
+                android:layout_marginHorizontal="@dimen/common_spacing"
+                android:visibility="gone"
+                app:btn_bg="@drawable/common_btn_blue_bg"
+                app:btn_name="@string/recapture" />
+
+            <com.grkj.iscs.view.widget.CommonBtn
+                android:id="@+id/cb_cancel"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentRight="true"
+                android:layout_alignParentBottom="true"
+                app:btn_bg="@drawable/common_btn_red_bg"
+                app:btn_name="@string/cancel" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_above="@id/ll_action"
+            android:layout_below="@id/tv_title"
+            android:layout_marginVertical="@dimen/common_spacing"
+            android:orientation="horizontal">
+
+            <FrameLayout
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_marginHorizontal="@dimen/common_spacing_small"
+                android:layout_weight="1"
+                android:background="@drawable/face_capture_tip_bg">
+
+                <androidx.camera.view.PreviewView
+                    android:id="@+id/preview"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:visibility="invisible" />
+
+                <ImageView
+                    android:id="@+id/image"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:scaleType="centerCrop" />
+            </FrameLayout>
+
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_marginHorizontal="@dimen/common_spacing_small"
+                android:layout_weight="1"
+                android:background="@drawable/face_capture_tip_bg"
+                android:orientation="vertical"
+                android:padding="@dimen/common_spacing_small">
+
+                <TextView
+                    style="@style/CommonTextView"
+                    android:text="@string/capture_tip_title"
+                    android:textColor="@color/black"
+                    android:textSize="@dimen/common_text_size_small" />
+
+                <TextView
+                    style="@style/CommonTextView"
+                    android:layout_marginTop="@dimen/common_spacing"
+                    android:gravity="left"
+                    android:text="@string/capture_tip_content"
+                    android:textColor="@color/black"
+                    android:textSize="@dimen/common_text_size_small" />
+            </LinearLayout>
+        </LinearLayout>
+    </RelativeLayout>
+</com.google.android.material.card.MaterialCardView>

+ 38 - 2
app/src/main/res/layout/fragment_face_config.xml

@@ -1,8 +1,44 @@
 <?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:padding="@dimen/common_spacing"
     tools:context=".view.fragment.FaceConfigFragment">
 
-</FrameLayout>
+    <TextView
+        style="@style/CommonTextView"
+        android:layout_marginBottom="@dimen/common_spacing"
+        android:text="@string/face_config"
+        android:textSize="@dimen/common_text_size_big" />
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginVertical="@dimen/common_spacing"
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+
+        <com.grkj.iscs.view.widget.CommonBtn
+            android:id="@+id/cb_add_face"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentRight="true"
+            android:layout_alignParentBottom="true"
+            app:btn_bg="@drawable/common_btn_white_bg"
+            app:btn_name="@string/add_face"
+            app:btn_text_color="@color/black" />
+
+        <TextView
+            style="@style/CommonTextView"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:text="@string/face_config_tip" />
+    </LinearLayout>
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_face"
+        style="@style/CommonRecyclerView"
+        android:layout_width="wrap_content" />
+</LinearLayout>

+ 0 - 14
app/src/main/res/layout/fragment_step.xml

@@ -127,20 +127,6 @@
                     android:paddingVertical="@dimen/common_spacing_smallest"
                     android:text="@string/lock_station" />
 
-                <androidx.recyclerview.widget.RecyclerView
-                    android:id="@+id/rv_loto"
-                    style="@style/CommonRecyclerView"
-                    android:layout_marginHorizontal="20dp"
-                    android:layout_marginVertical="@dimen/common_spacing_small"
-                    android:background="@mipmap/cabinet_small"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingTop="10dp"
-                    android:paddingBottom="12dp"
-                    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
-                    app:spanCount="3"
-                    tools:listitem="@layout/item_rv_loto"
-                    android:visibility="gone"/>
-
                 <com.onlylemi.mapview.library.MapView
                     android:id="@+id/mapview"
                     android:layout_width="match_parent"

+ 1 - 0
app/src/main/res/values/colors.xml

@@ -27,6 +27,7 @@
     <color name="dialog_card_login_bg">#990E57EA</color>
     <color name="home_menu_bg">#4D2B7AE9</color>
     <color name="common_btn_red_bg">#80FF0000</color>
+    <color name="common_btn_green_bg">#047b0f</color>
     <color name="lock_status_unlocked">#99008000</color>
     <color name="lock_status_locked">#CCFF0000</color>
     <color name="point_text_bg">#70b26f</color>

+ 11 - 0
app/src/main/res/values/strings.xml

@@ -226,4 +226,15 @@
     <string name="exception_type_tip">请选择异常类型</string>
     <string name="exception_level_tip">请选择异常等级</string>
     <string name="exception_submit_success_tip">异常提交成功</string>
+    <string name="add_face">录入人脸</string>
+    <string name="face_config_tip">最多可以录入1组人脸数据</string>
+    <string name="recapture">重拍</string>
+    <string name="capture_tip_title">录入提示</string>
+    <string name="capture_tip_content">1. 系统将自动拍摄照片,在拍摄过程中请确保:
+     \n · ⾯部正对摄像头
+     \n · 保持适当距离,让整个脸部出现在左侧框中
+     \n · 光线充⾜
+     \n · 表情⾃然
+\n2. 拍摄完成后,您可以点击确认按钮进行提交,也可以点击重拍按钮重新进行拍摄。
+\n3. 取消录入,请点击取消按钮</string>
 </resources>