فهرست منبع

refactor(更新) :
- 充电开启延迟增加

周文健 5 ماه پیش
والد
کامیت
e475367be7
21فایلهای تغییر یافته به همراه147 افزوده شده و 70 حذف شده
  1. 27 27
      app/src/main/java/com/grkj/iscs/BusinessManager.kt
  2. 1 1
      app/src/main/java/com/grkj/iscs/ble/BleConnectionManager.kt
  3. 11 1
      app/src/main/java/com/grkj/iscs/model/DictAndSystemConstants.kt
  4. 7 2
      app/src/main/java/com/grkj/iscs/view/fragment/FaceConfigFragment.kt
  5. 18 5
      app/src/main/java/com/grkj/iscs/view/fragment/FingerprintConfigFragment.kt
  6. 0 1
      app/src/main/java/com/grkj/iscs/view/fragment/JobProgressFragment.kt
  7. 1 0
      app/src/main/java/com/grkj/iscs/view/fragment/StepFragment.kt
  8. 3 4
      app/src/main/java/com/grkj/iscs/view/presenter/DeviceStatusPresenter.kt
  9. 10 0
      app/src/main/java/com/grkj/iscs/view/presenter/FaceConfigPresetner.kt
  10. 10 0
      app/src/main/java/com/grkj/iscs/view/presenter/FingerprintConfigPresenter.kt
  11. 0 22
      app/src/main/java/com/grkj/iscs/view/presenter/JobProgressPresenter.kt
  12. 31 0
      app/src/main/java/com/grkj/iscs/view/presenter/StepPresenter.kt
  13. 1 1
      app/src/main/java/com/grkj/iscs/view/presenter/WorkerPresenter.kt
  14. 5 0
      app/src/main/java/com/grkj/iscs/view/step_mode/IStepMode.kt
  15. 7 0
      app/src/main/java/com/grkj/iscs/view/step_mode/StepMode1.kt
  16. 7 0
      app/src/main/java/com/grkj/iscs/view/step_mode/StepMode2.kt
  17. 1 0
      app/src/main/res/layout/fragment_face_config.xml
  18. 1 0
      app/src/main/res/layout/fragment_fingerprint_config.xml
  19. 2 2
      app/src/main/res/values-en/strings.xml
  20. 2 2
      app/src/main/res/values-zh/strings.xml
  21. 2 2
      app/src/main/res/values/strings.xml

+ 27 - 27
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -33,8 +33,7 @@ import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_ELEC_LOCK_BOARD
 import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_KEY
 import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_LOCK
 import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
-import com.grkj.iscs.model.DictConstants
-import com.grkj.iscs.model.ISCSDomainData
+import com.grkj.iscs.model.DictAndSystemConstants
 import com.grkj.iscs.model.bo.DeviceTakeUpdateBO
 import com.grkj.iscs.model.bo.UpdateKeyReturnBO
 import com.grkj.iscs.model.bo.WorkTicketGetBO
@@ -79,7 +78,6 @@ import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.async
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.withContext
-import org.slf4j.LoggerFactory
 import kotlin.coroutines.resume
 
 /**
@@ -214,7 +212,7 @@ object BusinessManager {
 
                 MSG_EVENT_SWITCH_COLLECTION_UPDATE -> {
                     ThreadUtils.runOnIO {
-                        val switchStatus = NetApi.getDictData(DictConstants.KEY_SWITCH_STATUS)
+                        val switchStatus = NetApi.getDictData(DictAndSystemConstants.KEY_SWITCH_STATUS)
                         val switchListReqVOS = ModBusController.getSwitchData().map {
                             SwitchListReqVO(
                                 it.idx.toString(),
@@ -241,9 +239,9 @@ object BusinessManager {
 
             // —— 并行加载字典(或按需串行也行) ——
             val slotStatus =
-                async { fetchDict<CommonDictRespVO>(DictConstants.KEY_SLOT_STATUS) }
-            val keyStatus = async { fetchDict<CommonDictRespVO>(DictConstants.KEY_KEY_STATUS) }
-            val slotType = async { fetchDict<CommonDictRespVO>(DictConstants.KEY_SLOT_TYPE) }
+                async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_STATUS) }
+            val keyStatus = async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_KEY_STATUS) }
+            val slotType = async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_TYPE) }
 
             // 等待字典加载完成
             val slotStatusList = slotStatus.await()
@@ -366,13 +364,13 @@ object BusinessManager {
                                     .removeLeadingZeros()
                                 ThreadUtils.runOnIO {
                                     val slotStatus =
-                                        async { fetchDict<CommonDictRespVO>(DictConstants.KEY_SLOT_STATUS) }
+                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_STATUS) }
                                     val slotType =
-                                        async { fetchDict<CommonDictRespVO>(DictConstants.KEY_SLOT_TYPE) }
+                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_TYPE) }
                                     val slotsPageReq =
                                         async { getSlotsPage() }
                                     val keyStatusReq =
-                                        async { fetchDict<CommonDictRespVO>(DictConstants.KEY_KEY_STATUS) }
+                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_KEY_STATUS) }
                                     val keyPageReq =
                                         async { getKeyPage() }
                                     var keyStatus = keyStatusReq.await()
@@ -467,11 +465,11 @@ object BusinessManager {
                                 )
                                 ThreadUtils.runOnIO {
                                     val lockStatusReq =
-                                        async { fetchDict<CommonDictRespVO>(DictConstants.KEY_PAD_LOCK_STATUS) }
+                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_PAD_LOCK_STATUS) }
                                     val slotStatus =
-                                        async { fetchDict<CommonDictRespVO>(DictConstants.KEY_SLOT_STATUS) }
+                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_STATUS) }
                                     val slotType =
-                                        async { fetchDict<CommonDictRespVO>(DictConstants.KEY_SLOT_TYPE) }
+                                        async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_TYPE) }
                                     val slotsPageReq =
                                         async { getSlotsPage() }
                                     var lockStatus = lockStatusReq.await()
@@ -593,7 +591,7 @@ object BusinessManager {
                                         )
                                         ThreadUtils.runOnIO {
                                             val lockStatusReq =
-                                                async { fetchDict<CommonDictRespVO>(DictConstants.KEY_PAD_LOCK_STATUS) }
+                                                async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_PAD_LOCK_STATUS) }
                                             var lockStatus = lockStatusReq.await()
                                             NetApi.getIsLockPage { lockData ->
                                                 //锁rfid未异常正常请求锁数据,关锁
@@ -789,11 +787,11 @@ object BusinessManager {
 
                 // —— 并行加载字典(或按需串行也行) ——
                 val lockStatus =
-                    async { fetchDict<CommonDictRespVO>(DictConstants.KEY_PAD_LOCK_STATUS) }
+                    async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_PAD_LOCK_STATUS) }
                 val slotStatus =
-                    async { fetchDict<CommonDictRespVO>(DictConstants.KEY_SLOT_STATUS) }
-                val slotType = async { fetchDict<CommonDictRespVO>(DictConstants.KEY_SLOT_TYPE) }
-                val keyStatus = async { fetchDict<CommonDictRespVO>(DictConstants.KEY_KEY_STATUS) }
+                    async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_STATUS) }
+                val slotType = async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_SLOT_TYPE) }
+                val keyStatus = async { fetchDict<CommonDictRespVO>(DictAndSystemConstants.KEY_KEY_STATUS) }
 
                 // 等待字典加载完成
                 val lockStatusList = lockStatus.await()
@@ -1379,15 +1377,17 @@ object BusinessManager {
                     }
                 } else {
                     // 当前策略:作业票未完成禁止归还钥匙
-                    showKeyReturnDialog {
-                        sendLoadingEventMsg(null, false)
-                        ToastUtils.tip(R.string.continue_the_ticket)
-                        BleManager.getInstance().disconnect(bleDevice)
-                        // 打开卡扣,防止初始化的时候选择不处理钥匙导致无法使用
-                        val dock = ModBusController.getDockByKeyMac(bleDevice.mac)
-                        val keyBean = dock?.getKeyList()?.find { it.mac == bleDevice.mac }
-                        keyBean?.let {
-                            ModBusController.controlKeyBuckle(true, keyBean.isLeft, dock.addr)
+                    withContext(Dispatchers.Main) {
+                        showKeyReturnDialog {
+                            sendLoadingEventMsg(null, false)
+                            ToastUtils.tip(R.string.continue_the_ticket)
+                            BleManager.getInstance().disconnect(bleDevice)
+                            // 打开卡扣,防止初始化的时候选择不处理钥匙导致无法使用
+                            val dock = ModBusController.getDockByKeyMac(bleDevice.mac)
+                            val keyBean = dock?.getKeyList()?.find { it.mac == bleDevice.mac }
+                            keyBean?.let {
+                                ModBusController.controlKeyBuckle(true, keyBean.isLeft, dock.addr)
+                            }
                         }
                     }
                 }

+ 1 - 1
app/src/main/java/com/grkj/iscs/ble/BleConnectionManager.kt

@@ -542,7 +542,7 @@ object BleConnectionManager {
             suspendCoroutine<Unit> { unitCont ->
                 controlKeyCharge(false, mac) {
                     ThreadUtils.runOnIO {
-                        delay(300)
+                        delay(500)
                         controlKeyCharge(true, mac) {
                             unitCont.resume(Unit)
                         }

+ 11 - 1
app/src/main/java/com/grkj/iscs/model/DictConstants.kt → app/src/main/java/com/grkj/iscs/model/DictAndSystemConstants.kt

@@ -3,7 +3,7 @@ package com.grkj.iscs.model
 /**
  * 字典参数
  */
-object DictConstants {
+object DictAndSystemConstants {
     /**
      * 仓位状态
      */
@@ -48,4 +48,14 @@ object DictConstants {
      * 锁仓类型
      */
     const val KEY_SLOT_TYPE = "slot_type"
+
+    /**
+     * 指纹数量限制
+     */
+    const val KEY_SYS_FINGERPRINT_LIMIT = "sys.fingerprint.limit"
+
+    /**
+     * 人脸数量限制
+     */
+    const val KEY_SYS_FACE_LIMIT = "sys.face.limit"
 }

+ 7 - 2
app/src/main/java/com/grkj/iscs/view/fragment/FaceConfigFragment.kt

@@ -22,14 +22,15 @@ class FaceConfigFragment :
     private val mFaceList = mutableListOf<CharacteristicPageRespVO.Record>()
     private var mCaptureDialog: FaceCaptureDialog? = null
     private var mTipDialog: TipDialog? = null
+    private var mFaceLimit: Int = 5
 
     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)
+            if (mFaceList.size >= mFaceLimit) {
+                ToastUtils.tip(R.string.face_config_tip, mFaceLimit)
                 return@setOnClickListener
             }
             showCaptureDialog()
@@ -53,6 +54,10 @@ class FaceConfigFragment :
         }
 
         refreshFaceList()
+        presenter?.getFaceLimit {
+            mFaceLimit = it
+            mBinding?.faceLimitTv?.text = getString(R.string.face_config_tip,mFaceLimit)
+        }
     }
 
     private fun refreshFaceList() {

+ 18 - 5
app/src/main/java/com/grkj/iscs/view/fragment/FingerprintConfigFragment.kt

@@ -20,15 +20,16 @@ class FingerprintConfigFragment :
 
     private val mFingerList = mutableListOf<CharacteristicPageRespVO.Record>()
     private var mTipDialog: TipDialog? = null
-    private var mFingerDialog: FingerScanDialog?  = null
+    private var mFingerDialog: FingerScanDialog? = null
+    private var mFingerprintLimit: Int = 5
 
     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)
+            if (mFingerList.size >= mFingerprintLimit) {
+                ToastUtils.tip(R.string.fingerprint_config_tip, mFingerprintLimit)
                 return@setOnClickListener
             }
             showFingerScanDialog()
@@ -39,7 +40,11 @@ class FingerprintConfigFragment :
             R.layout.item_rv_finger,
             mFingerList
         ) {
-            override fun convert(holder: ViewHolder, record: CharacteristicPageRespVO.Record, position: Int) {
+            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(
@@ -53,6 +58,11 @@ class FingerprintConfigFragment :
         }
 
         refreshFingerList()
+        presenter?.getFingerprintLimit {
+            mFingerprintLimit = it
+            mBinding?.fingerprintLimitTv?.text =
+                getString(R.string.fingerprint_config_tip, mFingerprintLimit)
+        }
     }
 
     private fun refreshFingerList() {
@@ -90,7 +100,10 @@ class FingerprintConfigFragment :
                     presenter?.insertFinger(it) {
                         mFingerDialog?.dismiss()
                         if (it) {
-                            showTipDialog(getString(R.string.fingerprint_add_success_tip), isAdd = true)
+                            showTipDialog(
+                                getString(R.string.fingerprint_add_success_tip),
+                                isAdd = true
+                            )
                             refreshFingerList()
                         }
                     }

+ 0 - 1
app/src/main/java/com/grkj/iscs/view/fragment/JobProgressFragment.kt

@@ -215,7 +215,6 @@ class JobProgressFragment(val goBack: () -> Unit, val changePage: (PageChangeBO)
 
     override fun onResume() {
         super.onResume()
-        presenter?.preOpenKeyCharge()
         isVisible = true
     }
 

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

@@ -272,6 +272,7 @@ class StepFragment(val goBack: () -> Unit, val changePage: (PageChangeBO) -> Uni
             } else {
                 mBinding?.cbAction?.visibility = View.GONE
             }
+            presenter?.preOpenKeyCharge(requireContext(), mStep)
             handleBottomTip()
         }
 

+ 3 - 4
app/src/main/java/com/grkj/iscs/view/presenter/DeviceStatusPresenter.kt

@@ -11,12 +11,11 @@ import com.grkj.iscs.extentions.removeLeadingZeros
 import com.grkj.iscs.extentions.toHexStrings
 import com.grkj.iscs.modbus.ModBusController
 import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_LOCK
-import com.grkj.iscs.model.DictConstants
+import com.grkj.iscs.model.DictAndSystemConstants
 import com.grkj.iscs.model.bo.LoginUserBO
 import com.grkj.iscs.model.vo.dict.CommonDictRespVO
 import com.grkj.iscs.model.vo.hardware.CabinetSlotsRecord
 import com.grkj.iscs.model.vo.hardware.SlotExDTO
-import com.grkj.iscs.model.vo.user.UserInfoRespVO
 import com.grkj.iscs.util.Executor
 import com.grkj.iscs.util.NetApi
 import com.grkj.iscs.util.SPUtils
@@ -221,8 +220,8 @@ class DeviceStatusPresenter : BasePresenter<IDeviceStatusView>() {
      */
     fun getSlotData(done: () -> Unit) {
         ThreadUtils.runOnIO {
-            slotStatus = NetApi.getDictData(DictConstants.KEY_SLOT_STATUS)
-            slotType = NetApi.getDictData(DictConstants.KEY_SLOT_TYPE)
+            slotStatus = NetApi.getDictData(DictAndSystemConstants.KEY_SLOT_STATUS)
+            slotType = NetApi.getDictData(DictAndSystemConstants.KEY_SLOT_TYPE)
             done()
         }
     }

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

@@ -2,6 +2,7 @@ package com.grkj.iscs.view.presenter
 
 import android.graphics.Bitmap
 import com.grkj.iscs.MyApplication
+import com.grkj.iscs.model.DictAndSystemConstants
 import com.grkj.iscs.model.vo.FileStreamReqParam
 import com.grkj.iscs.model.vo.characteristic.CharacteristicPageRespVO
 import com.grkj.iscs.util.BitmapUtil
@@ -41,4 +42,13 @@ class FaceConfigPresenter : BasePresenter<IFaceConfigView>() {
             }
         }
     }
+
+    /**
+     * 获取人脸数量限制
+     */
+    fun getFaceLimit(callBack: (Int) -> Unit) {
+        NetApi.getIsSystemAttributeByKey(DictAndSystemConstants.KEY_SYS_FACE_LIMIT) {
+            callBack(it?.sysAttrValue?.toInt() ?: 5)
+        }
+    }
 }

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

@@ -2,6 +2,7 @@ package com.grkj.iscs.view.presenter
 
 import android.graphics.Bitmap
 import com.grkj.iscs.MyApplication
+import com.grkj.iscs.model.DictAndSystemConstants
 import com.grkj.iscs.model.vo.FileStreamReqParam
 import com.grkj.iscs.model.vo.characteristic.CharacteristicPageRespVO
 import com.grkj.iscs.util.BitmapUtil
@@ -41,4 +42,13 @@ class FingerprintConfigPresenter : BasePresenter<IFingerprintConfigView>() {
             }
         }
     }
+
+    /**
+     * 获取指纹数量限制
+     */
+    fun getFingerprintLimit(callBack: (Int) -> Unit) {
+        NetApi.getIsSystemAttributeByKey(DictAndSystemConstants.KEY_SYS_FINGERPRINT_LIMIT) {
+            callBack(it?.sysAttrValue?.toInt() ?: 5)
+        }
+    }
 }

+ 0 - 22
app/src/main/java/com/grkj/iscs/view/presenter/JobProgressPresenter.kt

@@ -417,26 +417,4 @@ class JobProgressPresenter : BasePresenter<IJobProgressView>() {
             }
         }
     }
-
-
-    /**
-     * 预打开钥匙的充电尝试激活
-     */
-    fun preOpenKeyCharge() {
-        ThreadUtils.runOnIO {
-            val keyDockList =
-                dockList.filter { it.type == DOCK_TYPE_KEY || it.type == DOCK_TYPE_PORTABLE }
-                    .sortedBy { it.addr }.onEach { it.deviceList.sortBy { dev -> dev.idx } }
-            keyDockList.forEach { dock ->
-                dock.deviceList.filter { it.isExist }.forEach { key ->
-                    ModBusController.controlKeyCharge(false, key.idx == 1, dock.addr) {
-                        ThreadUtils.runOnIO {
-                            delay(300)
-                            ModBusController.controlKeyCharge(true, key.idx == 1, dock.addr)
-                        }
-                    }
-                }
-            }
-        }
-    }
 }

+ 31 - 0
app/src/main/java/com/grkj/iscs/view/presenter/StepPresenter.kt

@@ -2,6 +2,10 @@ package com.grkj.iscs.view.presenter
 
 import android.content.Context
 import com.grkj.iscs.R
+import com.grkj.iscs.modbus.ModBusController
+import com.grkj.iscs.modbus.ModBusController.dockList
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_KEY
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
 import com.grkj.iscs.model.vo.machinery.MachineryDetailRespVO
 import com.grkj.iscs.model.vo.map.MapInfoRespVO
 import com.grkj.iscs.model.vo.ticket.LotoMapRespVO
@@ -13,6 +17,8 @@ import com.grkj.iscs.util.ToastUtils
 import com.grkj.iscs.view.base.BasePresenter
 import com.grkj.iscs.view.iview.IStepView
 import com.grkj.iscs.view.step_mode.IStepMode
+import com.sik.sikcore.thread.ThreadUtils
+import kotlinx.coroutines.delay
 
 class StepPresenter : BasePresenter<IStepView>() {
 
@@ -144,4 +150,29 @@ class StepPresenter : BasePresenter<IStepView>() {
             }
         }
     }
+
+    /**
+     * 预打开钥匙的充电尝试激活
+     */
+    fun preOpenKeyCharge(
+        context: Context,
+        step: Int
+    ) {
+        if (IStepMode.getStepMode(context)?.canPreOpenKeyCharge(step) == true) {
+            ThreadUtils.runOnIO {
+                val keyDockList =
+                    dockList.filter { it.type == DOCK_TYPE_KEY || it.type == DOCK_TYPE_PORTABLE }
+                keyDockList.forEach { dock ->
+                    dock.deviceList.filter { it.isExist }.forEach { key ->
+                        ModBusController.controlKeyCharge(false, key.idx == 1, dock.addr) {
+                            ThreadUtils.runOnIO {
+                                delay(500)
+                                ModBusController.controlKeyCharge(true, key.idx == 1, dock.addr)
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
 }

+ 1 - 1
app/src/main/java/com/grkj/iscs/view/presenter/WorkerPresenter.kt

@@ -140,7 +140,7 @@ class WorkerPresenter : BasePresenter<IWorkerView>() {
                 dock.deviceList.filter { it.isExist }.forEach { key ->
                     ModBusController.controlKeyCharge(false, key.idx == 1, dock.addr) {
                         ThreadUtils.runOnIO {
-                            delay(300)
+                            delay(500)
                             ModBusController.controlKeyCharge(true, key.idx == 1, dock.addr)
                         }
                     }

+ 5 - 0
app/src/main/java/com/grkj/iscs/view/step_mode/IStepMode.kt

@@ -111,6 +111,11 @@ interface IStepMode {
      */
     fun checkCrossJobUnlockData(mTicketDetailData: TicketDetailRespVO?): Boolean
 
+    /**
+     * 当前步骤是否可以打开充电
+     */
+    fun canPreOpenKeyCharge(step: Int): Boolean
+
     companion object {
         /**
          * 根据存储的模式获取模式

+ 7 - 0
app/src/main/java/com/grkj/iscs/view/step_mode/StepMode1.kt

@@ -90,4 +90,11 @@ class StepMode1 : IStepMode {
     override fun checkCrossJobUnlockData(mTicketDetailData: TicketDetailRespVO?): Boolean {
         return false
     }
+
+    override fun canPreOpenKeyCharge(step: Int): Boolean {
+        return when (step) {
+            4, 5, 7 -> true
+            else -> false
+        }
+    }
 }

+ 7 - 0
app/src/main/java/com/grkj/iscs/view/step_mode/StepMode2.kt

@@ -180,4 +180,11 @@ class StepMode2 : IStepMode {
                 ?: mutableListOf())
         } == true
     }
+
+    override fun canPreOpenKeyCharge(step: Int): Boolean {
+        return when(step){
+            4, 5, 7 -> true
+            else -> false
+        }
+    }
 }

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

@@ -32,6 +32,7 @@
             app:btn_text_color="@color/black" />
 
         <TextView
+            android:id="@+id/face_limit_tv"
             style="@style/CommonTextView"
             android:layout_marginLeft="@dimen/common_spacing"
             android:text="@string/face_config_tip" />

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

@@ -32,6 +32,7 @@
             app:btn_text_color="@color/black" />
 
         <TextView
+            android:id="@+id/fingerprint_limit_tv"
             style="@style/CommonTextView"
             android:layout_marginLeft="@dimen/common_spacing"
             android:text="@string/fingerprint_config_tip" />

+ 2 - 2
app/src/main/res/values-en/strings.xml

@@ -224,7 +224,7 @@
     <string name="fingerprint_config">Fingerprint Settings</string>
     <string name="face_config">Face Settings</string>
     <string name="add_fingerprint">Add Fingerprint</string>
-    <string name="fingerprint_config_tip">Up to 3 fingerprints can be added</string>
+    <string name="fingerprint_config_tip">Up to %1$d fingerprints can be added</string>
     <string name="fingerprint">Fingerprint</string>
     <string name="fingerprint_delete_confirm_tip">Confirm to delete %s?</string>
     <string name="fingerprint_scan_tip">Please press fingerprint sensor</string>
@@ -233,7 +233,7 @@
     <string name="exception_level_tip">Please select severity level</string>
     <string name="exception_submit_success_tip">Exception submitted successfully</string>
     <string name="add_face">Add face record</string>
-    <string name="face_config_tip">Up to 1 face can be registered</string>
+    <string name="face_config_tip">Up to %1$d face can be registered</string>
     <string name="recapture">Retake</string>
     <string name="capture_tip_title">Registration Tips</string>
     <string name="capture_tip_content">1. The system will automatically take photos. Please ensure:

+ 2 - 2
app/src/main/res/values-zh/strings.xml

@@ -224,7 +224,7 @@
     <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_config_tip">最多可以添加%1$d个指纹数据</string>
     <string name="fingerprint">指纹</string>
     <string name="fingerprint_delete_confirm_tip">确定要删除%s吗?</string>
     <string name="fingerprint_scan_tip">请按压指纹识别区</string>
@@ -233,7 +233,7 @@
     <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="face_config_tip">最多可以录入%1$d组人脸数据</string>
     <string name="recapture">重拍</string>
     <string name="capture_tip_title">录入提示</string>
     <string name="capture_tip_content">1. 系统将自动拍摄照片,在拍摄过程中请确保:

+ 2 - 2
app/src/main/res/values/strings.xml

@@ -224,7 +224,7 @@
     <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_config_tip">最多可以添加%1$d个指纹数据</string>
     <string name="fingerprint">指纹</string>
     <string name="fingerprint_delete_confirm_tip">确定要删除%s吗?</string>
     <string name="fingerprint_scan_tip">请按压指纹识别区</string>
@@ -233,7 +233,7 @@
     <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="face_config_tip">最多可以录入%1$d组人脸数据</string>
     <string name="recapture">重拍</string>
     <string name="capture_tip_title">录入提示</string>
     <string name="capture_tip_content">1. 系统将自动拍摄照片,在拍摄过程中请确保: