Ver Fonte

接入查询用户特征(指纹、面部)-分页、删除用户特征(指纹、面部)接口;添加指纹设置页和相关功能;修复钥匙数据上报解析问题

Frankensteinly há 7 meses atrás
pai
commit
31f60357aa
26 ficheiros alterados com 577 adições e 1 exclusões
  1. 9 0
      app/src/main/java/com/grkj/iscs/extentions/ViewHolder.kt
  2. 10 0
      app/src/main/java/com/grkj/iscs/model/UrlConsts.kt
  3. 32 0
      app/src/main/java/com/grkj/iscs/model/vo/characteristic/CharacteristicPageRespVO.kt
  4. 44 0
      app/src/main/java/com/grkj/iscs/util/NetApi.kt
  5. 6 0
      app/src/main/java/com/grkj/iscs/util/SPUtils.kt
  6. 24 0
      app/src/main/java/com/grkj/iscs/view/adapter/SettingAdapter.kt
  7. 39 0
      app/src/main/java/com/grkj/iscs/view/dialog/FingerScanDialog.kt
  8. 24 0
      app/src/main/java/com/grkj/iscs/view/fragment/FaceConfigFragment.kt
  9. 106 0
      app/src/main/java/com/grkj/iscs/view/fragment/FingerprintConfigFragment.kt
  10. 35 0
      app/src/main/java/com/grkj/iscs/view/fragment/SettingFragment.kt
  11. 6 0
      app/src/main/java/com/grkj/iscs/view/iview/IFaceConfigView.kt
  12. 6 0
      app/src/main/java/com/grkj/iscs/view/iview/IFingerprintConfigView.kt
  13. 7 0
      app/src/main/java/com/grkj/iscs/view/presenter/FaceConfigPresetner.kt
  14. 45 0
      app/src/main/java/com/grkj/iscs/view/presenter/FingerprintConfigPresenter.kt
  15. 5 0
      app/src/main/java/com/grkj/iscs/view/widget/CommonBtn.kt
  16. 6 0
      app/src/main/res/drawable/common_btn_white_bg.xml
  17. 4 0
      app/src/main/res/drawable/item_rv_setting_bg_selector.xml
  18. 36 0
      app/src/main/res/layout/dialog_finger_scan.xml
  19. 8 0
      app/src/main/res/layout/fragment_face_config.xml
  20. 44 0
      app/src/main/res/layout/fragment_fingerprint_config.xml
  21. 41 1
      app/src/main/res/layout/fragment_setting.xml
  22. 23 0
      app/src/main/res/layout/item_rv_finger.xml
  23. 8 0
      app/src/main/res/layout/item_rv_setting.xml
  24. BIN
      app/src/main/res/mipmap/delete.png
  25. 1 0
      app/src/main/res/values/attrs.xml
  26. 8 0
      app/src/main/res/values/strings.xml

+ 9 - 0
app/src/main/java/com/grkj/iscs/extentions/ViewHolder.kt

@@ -0,0 +1,9 @@
+package com.grkj.iscs.extentions
+
+import android.view.View
+import com.zhy.adapter.recyclerview.base.ViewHolder
+
+fun ViewHolder.setSelected(viewId: Int, isSelected: Boolean) {
+    val view = getView<View>(viewId)
+    view.isSelected = isSelected
+}

+ 10 - 0
app/src/main/java/com/grkj/iscs/model/UrlConsts.kt

@@ -216,4 +216,14 @@ object UrlConsts {
      * 系统用户登录-指纹验证登录dat
      */
     const val LOGIN_FINGERPRINT = "/loginByFingerprintDat"
+
+    /**
+     * 查询用户特征(指纹、面部)-分页
+     */
+    const val USER_CHARACTERISTIC_PAGE = "/system/user/characteristic/getSysUserCharacteristicPage"
+
+    /**
+     * 删除用户特征(指纹、面部)
+     */
+    const val REMOVE_USER_CHARACTERISTIC = "/system/user/characteristic/removeSysUserCharacteristicByRecordIds"
 }

+ 32 - 0
app/src/main/java/com/grkj/iscs/model/vo/characteristic/CharacteristicPageRespVO.kt

@@ -0,0 +1,32 @@
+package com.grkj.iscs.model.vo.characteristic
+
+data class CharacteristicPageRespVO(
+    val countId: Any,
+    val current: Int,
+    val maxLimit: Any,
+    val optimizeCountSql: Boolean,
+    val orders: MutableList<Any>,
+    val pages: Int,
+    val records: MutableList<Record>,
+    val searchCount: Boolean,
+    val size: Int,
+    val total: Int
+) {
+    data class Record(
+        val recordId: Long?,
+
+        val userId: Long?,
+
+        val type: String?,
+
+        val content: String?,
+
+        val imageUrl: String?,
+
+        val imagePath: String?,
+
+        val orderNum: Int?,
+
+        val delFlag: String?,
+    )
+}

+ 44 - 0
app/src/main/java/com/grkj/iscs/util/NetApi.kt

@@ -6,6 +6,7 @@ import com.grkj.iscs.model.Token
 import com.grkj.iscs.model.UrlConsts
 import com.grkj.iscs.model.vo.FileStreamReqParam
 import com.grkj.iscs.model.vo.card.CardInfoRespVO
+import com.grkj.iscs.model.vo.characteristic.CharacteristicPageRespVO
 import com.grkj.iscs.model.vo.dept.DeptListRespVO
 import com.grkj.iscs.model.vo.finger.LoginFingerprintRespVO
 import com.grkj.iscs.model.vo.key.KeyInfoRespVO
@@ -853,4 +854,47 @@ object NetApi {
             }, isGet = false, isAuth = false, fileList = fileList
        )
     }
+
+    /**
+     * 查询用户特征(指纹、面部)-分页
+     *
+     * @param type 1-指纹,2-面部
+     */
+    fun getUserCharacteristicPage(pages: Int, size: Int, type: String, userId: Long, callBack: (CharacteristicPageRespVO?) -> Unit) {
+        NetHttpManager.getInstance().doRequestNet(
+            UrlConsts.USER_CHARACTERISTIC_PAGE,
+            false,
+            mapOf(
+                "pages" to pages,
+                "size" to size,
+                "type" to type,
+                "userId" to userId
+            ),
+            { res, _, _ ->
+                res?.let {
+                    callBack(getRefBean(it))
+                }
+            }, isGet = true, isAuth = true
+        )
+    }
+
+    /**
+     * 删除用户特征(指纹、面部)
+     */
+    fun deleteUserCharacteristic(recordIds: String, callBack: (Boolean) -> Unit) {
+        NetHttpManager.getInstance().doRequestNet(
+            UrlConsts.REMOVE_USER_CHARACTERISTIC,
+            false,
+            mapOf(
+                "recordIds" to recordIds
+            ),
+            { res, _, _ ->
+                res?.let {
+                    callBack.invoke(true)
+                } ?: run {
+                    callBack.invoke(false)
+                }
+            }, isGet = true, isAuth = true
+        )
+    }
 }

+ 6 - 0
app/src/main/java/com/grkj/iscs/util/SPUtils.kt

@@ -125,6 +125,9 @@ object SPUtils {
     fun getUpdateLockPoint(context: Context): MutableList<LockPointUpdateReqVO> {
         val sp = context.getSharedPreferences(SP_DATA, Context.MODE_PRIVATE)
         val listJson = sp.getString(KEY_DATA_UPDATE_LOCK_POINT, null)
+        if (listJson.isNullOrEmpty()) {
+            return Collections.emptyList()
+        }
         try {
             val tempList: MutableList<LockPointUpdateReqVO> = Gson().fromJson(
                 listJson,
@@ -156,6 +159,9 @@ object SPUtils {
     fun getUpdateKeyReturn(context: Context): MutableList<UpdateKeyReturnBO> {
         val sp = context.getSharedPreferences(SP_DATA, Context.MODE_PRIVATE)
         val listJson = sp.getString(KEY_DATA_UPDATE_KEY_RETURN, null)
+        if (listJson.isNullOrEmpty()) {
+            return Collections.emptyList()
+        }
         try {
             val tempList: MutableList<UpdateKeyReturnBO> =
                 Gson().fromJson(listJson, object : TypeToken<UpdateKeyReturnBO>() {}.type)

+ 24 - 0
app/src/main/java/com/grkj/iscs/view/adapter/SettingAdapter.kt

@@ -0,0 +1,24 @@
+package com.grkj.iscs.view.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.lifecycle.Lifecycle
+import androidx.viewpager2.adapter.FragmentStateAdapter
+
+/**
+ * 设置页菜单适配器
+ */
+class SettingAdapter(
+    fragmentManager: FragmentManager,
+    lifecycle: Lifecycle,
+    private val fragmentList: MutableList<Fragment>
+) : FragmentStateAdapter(fragmentManager, lifecycle) {
+
+    override fun getItemCount(): Int {
+        return fragmentList.size
+    }
+
+    override fun createFragment(position: Int): Fragment {
+        return fragmentList[position]
+    }
+}

+ 39 - 0
app/src/main/java/com/grkj/iscs/view/dialog/FingerScanDialog.kt

@@ -0,0 +1,39 @@
+package com.grkj.iscs.view.dialog
+
+import android.content.Context
+import android.graphics.Bitmap
+import com.grkj.iscs.databinding.DialogFingerScanBinding
+import com.grkj.iscs.util.FingerprintUtil
+import com.grkj.iscs.view.base.BaseDialog
+
+/**
+ * 指纹采集弹框
+ */
+class FingerScanDialog(val ctx: Context, var callback: (Bitmap?) -> Unit) :
+    BaseDialog<DialogFingerScanBinding>(ctx) {
+    override val viewBinding: DialogFingerScanBinding
+        get() = DialogFingerScanBinding.inflate(layoutInflater)
+
+    override fun initView() {
+        mBinding?.tvCancel?.setOnClickListener {
+            dismiss()
+        }
+    }
+
+    override fun show() {
+        super.show()
+        FingerprintUtil.init(ctx)
+        FingerprintUtil.start()
+        FingerprintUtil.setScanListener(object : FingerprintUtil.OnScanListener {
+            override fun onScan(bitmap: Bitmap) {
+                callback(bitmap)
+            }
+        })
+    }
+
+    override fun dismiss() {
+        super.dismiss()
+        FingerprintUtil.stop()
+        FingerprintUtil.unInit()
+    }
+}

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

@@ -0,0 +1,24 @@
+package com.grkj.iscs.view.fragment
+
+import com.grkj.iscs.databinding.FragmentFaceConfigBinding
+import com.grkj.iscs.view.base.BaseMvpFragment
+import com.grkj.iscs.view.iview.IFaceConfigView
+import com.grkj.iscs.view.presenter.FaceConfigPresenter
+
+/**
+ * 人脸设置页
+ */
+class FaceConfigFragment :
+    BaseMvpFragment<IFaceConfigView, FaceConfigPresenter, FragmentFaceConfigBinding>() {
+
+    override val viewBinding: FragmentFaceConfigBinding
+        get() = FragmentFaceConfigBinding.inflate(layoutInflater)
+
+    override fun initView() {
+
+    }
+
+    override fun initPresenter(): FaceConfigPresenter {
+        return FaceConfigPresenter()
+    }
+}

+ 106 - 0
app/src/main/java/com/grkj/iscs/view/fragment/FingerprintConfigFragment.kt

@@ -0,0 +1,106 @@
+package com.grkj.iscs.view.fragment
+
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.FragmentFingerprintConfigBinding
+import com.grkj.iscs.model.vo.characteristic.CharacteristicPageRespVO
+import com.grkj.iscs.util.ToastUtils
+import com.grkj.iscs.view.base.BaseMvpFragment
+import com.grkj.iscs.view.dialog.FingerScanDialog
+import com.grkj.iscs.view.dialog.TipDialog
+import com.grkj.iscs.view.iview.IFingerprintConfigView
+import com.grkj.iscs.view.presenter.FingerprintConfigPresenter
+import com.zhy.adapter.recyclerview.CommonAdapter
+import com.zhy.adapter.recyclerview.base.ViewHolder
+
+/**
+ * 指纹设置页
+ */
+class FingerprintConfigFragment :
+    BaseMvpFragment<IFingerprintConfigView, FingerprintConfigPresenter, FragmentFingerprintConfigBinding>() {
+
+    private val mFingerList = mutableListOf<CharacteristicPageRespVO.Record>()
+    private var mTipDialog: TipDialog? = null
+    private var mFingerDialog: FingerScanDialog?  = null
+
+    override val viewBinding: FragmentFingerprintConfigBinding
+        get() = FragmentFingerprintConfigBinding.inflate(layoutInflater)
+
+    override fun initView() {
+        mBinding?.cbAddFinger?.setOnClickListener {
+            if (mFingerList.size >= 3) {
+                ToastUtils.tip(R.string.fingerprint_config_tip)
+                return@setOnClickListener
+            }
+            showFingerScanDialog()
+        }
+
+        mBinding?.rvFinger?.adapter = object : CommonAdapter<CharacteristicPageRespVO.Record>(
+            requireContext(),
+            R.layout.item_rv_finger,
+            mFingerList
+        ) {
+            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
+                    )
+                }
+            }
+        }
+
+        refreshFingerList()
+    }
+
+    private fun refreshFingerList() {
+        presenter?.getFingerPage {
+            mFingerList.clear()
+            it?.records?.let {
+                mFingerList.addAll(it)
+            }
+            mBinding?.rvFinger?.adapter?.notifyDataSetChanged()
+        }
+    }
+
+    private fun showTipDialog(tip: String, recordId: Long? = null, isAdd: Boolean = false) {
+        mTipDialog ?: let {
+            mTipDialog = TipDialog(requireContext())
+        }
+        mTipDialog?.setTip(tip)
+        mTipDialog?.setType(if (isAdd) TipDialog.TYPE_CONFIRM else TipDialog.TYPE_ALL)
+        mTipDialog?.setConfirmListener {
+            if (!isAdd) {
+                recordId?.let {
+                    presenter?.deleteFinger(it) {
+                        refreshFingerList()
+                    }
+                }
+            }
+        }
+        mTipDialog?.show()
+    }
+
+    private fun showFingerScanDialog() {
+        mFingerDialog ?: let {
+            mFingerDialog = FingerScanDialog(requireContext()) {
+                if (it != null) {
+                    presenter?.insertFinger(it) {
+                        mFingerDialog?.dismiss()
+                        if (it) {
+                            showTipDialog(getString(R.string.fingerprint_add_success_tip), isAdd = true)
+                            refreshFingerList()
+                        }
+                    }
+                }
+            }
+        }
+        mFingerDialog?.show()
+    }
+
+    override fun initPresenter(): FingerprintConfigPresenter {
+        return FingerprintConfigPresenter()
+    }
+}

+ 35 - 0
app/src/main/java/com/grkj/iscs/view/fragment/SettingFragment.kt

@@ -1,8 +1,11 @@
 package com.grkj.iscs.view.fragment
 
 import android.content.Intent
+import androidx.fragment.app.Fragment
 import com.grkj.iscs.BusinessManager
+import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentSettingBinding
+import com.grkj.iscs.extentions.setSelected
 import com.grkj.iscs.modbus.ModBusController.controlKeyBuckle
 import com.grkj.iscs.modbus.ModBusController.controlLockBuckle
 import com.grkj.iscs.modbus.ModBusController.dockList
@@ -11,18 +14,25 @@ import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_LOCK
 import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
 import com.grkj.iscs.util.NetApi
 import com.grkj.iscs.view.activity.LoginActivity
+import com.grkj.iscs.view.adapter.SettingAdapter
 import com.grkj.iscs.view.base.BaseFragment
+import com.zhy.adapter.recyclerview.CommonAdapter
+import com.zhy.adapter.recyclerview.base.ViewHolder
 
 /**
  * 设置页
  */
 class SettingFragment : BaseFragment<FragmentSettingBinding>() {
 
+    private var mSelectIndex = 0
+    private val mFragmentList = mutableListOf<Fragment>()
+
     override val viewBinding: FragmentSettingBinding
         get() = FragmentSettingBinding.inflate(layoutInflater)
 
     override fun initView() {
         mBinding?.cbLogout?.setOnClickListener {
+            mSelectIndex = 0
             NetApi.logout()
             // 关所有有设备的卡扣
             dockList.filter { it.type == DOCK_TYPE_LOCK || it.type == DOCK_TYPE_PORTABLE }.forEach { dockBean ->
@@ -40,5 +50,30 @@ class SettingFragment : BaseFragment<FragmentSettingBinding>() {
             BusinessManager.mDeviceTakeList.clear()
             startActivity(Intent(context, LoginActivity::class.java))
         }
+
+        mBinding?.rvFunc?.adapter = object : CommonAdapter<String>(
+            requireContext(),
+            R.layout.item_rv_setting,
+            mutableListOf(getString(R.string.fingerprint_config), getString(R.string.face_config))
+        ) {
+            override fun convert(holder: ViewHolder, str: String, position: Int) {
+                holder.setText(R.id.tv_setting, str)
+                holder.setOnClickListener(R.id.tv_setting) {
+                    mSelectIndex = position
+                    mBinding?.vp?.currentItem = position
+                    mBinding?.rvFunc?.adapter?.notifyDataSetChanged()
+                }
+                holder.setSelected(R.id.tv_setting, position == mSelectIndex)
+            }
+        }
+
+        mFragmentList.add(FingerprintConfigFragment())
+        mFragmentList.add(FaceConfigFragment())
+
+        val pageAdapter = SettingAdapter(requireActivity().supportFragmentManager, lifecycle, mFragmentList)
+
+        mBinding?.vp?.isUserInputEnabled = false
+        mBinding?.vp?.offscreenPageLimit = 2
+        mBinding?.vp?.adapter = pageAdapter
     }
 }

+ 6 - 0
app/src/main/java/com/grkj/iscs/view/iview/IFaceConfigView.kt

@@ -0,0 +1,6 @@
+package com.grkj.iscs.view.iview
+
+import com.grkj.iscs.view.base.IView
+
+interface IFaceConfigView : IView {
+}

+ 6 - 0
app/src/main/java/com/grkj/iscs/view/iview/IFingerprintConfigView.kt

@@ -0,0 +1,6 @@
+package com.grkj.iscs.view.iview
+
+import com.grkj.iscs.view.base.IView
+
+interface IFingerprintConfigView : IView {
+}

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

@@ -0,0 +1,7 @@
+package com.grkj.iscs.view.presenter
+
+import com.grkj.iscs.view.base.BasePresenter
+import com.grkj.iscs.view.iview.IFaceConfigView
+
+class FaceConfigPresenter : BasePresenter<IFaceConfigView>() {
+}

+ 45 - 0
app/src/main/java/com/grkj/iscs/view/presenter/FingerprintConfigPresenter.kt

@@ -0,0 +1,45 @@
+package com.grkj.iscs.view.presenter
+
+import android.graphics.Bitmap
+import com.grkj.iscs.MyApplication
+import com.grkj.iscs.model.vo.FileStreamReqParam
+import com.grkj.iscs.model.vo.characteristic.CharacteristicPageRespVO
+import com.grkj.iscs.util.BitmapUtil
+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.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)
+            }
+        }
+    }
+
+    fun insertFinger(bitmap: Bitmap, callBack: (Boolean) -> Unit) {
+        NetApi.insertFinger(
+            SPUtils.getLoginUser(MyApplication.instance!!.applicationContext)?.userName!!,
+            mutableListOf(FileStreamReqParam("file", BitmapUtil.bitmapToByteArray(bitmap), ".bmp"))
+        ) {
+            Executor.runOnMain {
+                callBack(it)
+            }
+        }
+    }
+
+    fun deleteFinger(recordId: Long, callBack: (Boolean) -> Unit) {
+        NetApi.deleteUserCharacteristic(recordId.toString()) {
+            Executor.runOnMain {
+                callBack(it)
+            }
+        }
+    }
+}

+ 5 - 0
app/src/main/java/com/grkj/iscs/view/widget/CommonBtn.kt

@@ -24,6 +24,11 @@ class CommonBtn(private val ctx: Context, attrs: AttributeSet) : LinearLayout(ct
         val btnText = attrSet.getString(R.styleable.CommonBtn_btn_name)
         mBinding.tvName.text = btnText
 
+        val btnTextColor = attrSet.getColor(R.styleable.CommonBtn_btn_text_color, 0)
+        if (btnTextColor != 0) {
+            mBinding.tvName.setTextColor(btnTextColor)
+        }
+
         val btnIcon = attrSet.getResourceId(R.styleable.CommonBtn_btn_icon, 0)
         if (btnIcon != 0) {
             mBinding.iv.visibility = View.VISIBLE

+ 6 - 0
app/src/main/res/drawable/common_btn_white_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/white" />
+</shape>

+ 4 - 0
app/src/main/res/drawable/item_rv_setting_bg_selector.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@color/common_bg_white_30" android:state_selected="true" />
+</selector>

+ 36 - 0
app/src/main/res/layout/dialog_finger_scan.xml

@@ -0,0 +1,36 @@
+<?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/dialog_card_login_bg"
+    app:strokeColor="@color/common_transparent">
+
+    <LinearLayout
+        android:layout_width="165dp"
+        android:layout_height="165dp"
+        android:layout_gravity="center"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/iv_icon"
+            android:layout_width="100dp"
+            android:layout_height="100dp"
+            android:layout_marginBottom="5dp"
+            android:background="@mipmap/login_fingerprint" />
+
+        <TextView
+            style="@style/CommonTextView"
+            android:layout_marginVertical="@dimen/common_spacing_small"
+            android:text="@string/fingerprint_scan_tip" />
+
+        <TextView
+            android:id="@+id/tv_cancel"
+            style="@style/CommonTextView"
+            android:padding="@dimen/common_spacing_small"
+            android:text="@string/cancel"
+            android:textSize="@dimen/common_text_size_small" />
+    </LinearLayout>
+</com.google.android.material.card.MaterialCardView>

+ 8 - 0
app/src/main/res/layout/fragment_face_config.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".view.fragment.FaceConfigFragment">
+
+</FrameLayout>

+ 44 - 0
app/src/main/res/layout/fragment_fingerprint_config.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<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.FingerprintConfigFragment">
+
+    <TextView
+        style="@style/CommonTextView"
+        android:layout_marginBottom="@dimen/common_spacing"
+        android:text="@string/fingerprint_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_finger"
+            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_fingerprint"
+            app:btn_text_color="@color/black" />
+
+        <TextView
+            style="@style/CommonTextView"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:text="@string/fingerprint_config_tip" />
+    </LinearLayout>
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_finger"
+        style="@style/CommonRecyclerView"
+        android:layout_width="wrap_content" />
+</LinearLayout>

+ 41 - 1
app/src/main/res/layout/fragment_setting.xml

@@ -6,11 +6,51 @@
     android:layout_height="match_parent"
     tools:context=".view.fragment.SettingFragment">
 
+    <LinearLayout
+        android:id="@+id/ll_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:layout_width="@dimen/common_icon_size"
+            android:layout_height="@dimen/common_icon_size"
+            android:background="@mipmap/settings" />
+
+        <TextView
+            style="@style/CommonTextView"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:text="@string/settings" />
+    </LinearLayout>
+
     <com.grkj.iscs.view.widget.CommonBtn
         android:id="@+id/cb_logout"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_centerInParent="true"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentBottom="true"
         app:btn_bg="@drawable/common_btn_red_bg"
         app:btn_name="@string/logout" />
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@id/cb_logout"
+        android:layout_below="@id/ll_title"
+        android:layout_marginVertical="@dimen/common_spacing"
+        android:background="@drawable/item_rv_technology_sop_bg_normal">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv_func"
+            style="@style/CommonRecyclerView"
+            android:layout_width="100dp"
+            android:background="@color/main_color_dark" />
+
+        <androidx.viewpager2.widget.ViewPager2
+            android:id="@+id/vp"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_toRightOf="@id/rv_func" />
+    </RelativeLayout>
 </RelativeLayout>

+ 23 - 0
app/src/main/res/layout/item_rv_finger.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/root"
+    android:layout_width="100dp"
+    android:layout_height="wrap_content"
+    android:layout_marginVertical="@dimen/common_spacing_small">
+
+    <ImageView
+        android:id="@+id/iv_delete"
+        android:layout_width="@dimen/common_icon_size_small"
+        android:layout_height="@dimen/common_icon_size_small"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:background="@mipmap/delete" />
+
+    <TextView
+        android:id="@+id/tv_name"
+        style="@style/CommonTextView"
+        android:layout_width="match_parent"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="@dimen/common_spacing_small"
+        android:layout_toLeftOf="@id/iv_delete" />
+</RelativeLayout>

+ 8 - 0
app/src/main/res/layout/item_rv_setting.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/tv_setting"
+    style="@style/CommonTextView"
+    android:layout_width="match_parent"
+    android:background="@drawable/item_rv_setting_bg_selector"
+    android:paddingVertical="@dimen/common_spacing_small"
+    android:textSize="@dimen/common_text_size_big" />

BIN
app/src/main/res/mipmap/delete.png


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

@@ -23,5 +23,6 @@
         <attr name="btn_name" format="string" />
         <attr name="btn_icon" format="reference" />
         <attr name="btn_bg" format="reference" />
+        <attr name="btn_text_color" format="reference" />
     </declare-styleable>
 </resources>

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

@@ -215,4 +215,12 @@
     <string name="exception_report_level">严重等级:</string>
     <string name="exception_report_level_hint">请选择严重等级</string>
     <string name="exception_report_description">异常描述:</string>
+    <string name="fingerprint_config">指纹设置</string>
+    <string name="face_config">人脸设置</string>
+    <string name="add_fingerprint">添加指纹</string>
+    <string name="fingerprint_config_tip">最多可以添加3个指纹数据</string>
+    <string name="fingerprint">指纹</string>
+    <string name="fingerprint_delete_confirm_tip">确定要删除%s吗?</string>
+    <string name="fingerprint_scan_tip">请按压指纹识别区</string>
+    <string name="fingerprint_add_success_tip">已成功添加指纹数据</string>
 </resources>