Ver Fonte

refactor(更新):
- 优化蓝牙连接队列调度,增加连接超时机制
- 调整部分弹窗和初始化设置页面样式及布局
- 密码输入框增加显示/隐藏密码功能
- 角色权限编辑全选逻辑优化
- 硬件管理列表刷新逻辑调整
- 更新卡信息时同步卡编号
- 关闭Debug模式
- 新增国际化文本

周文健 há 2 meses atrás
pai
commit
cd9db26e2d
51 ficheiros alterados com 270 adições e 177 exclusões
  1. 5 0
      app/src/main/assets/i18n/en-US.json
  2. 5 0
      app/src/main/assets/i18n/zh-CN.json
  3. 0 0
      app/src/main/assets/themes/Default/icons/icon_hide.png
  4. 0 0
      app/src/main/assets/themes/Default/icons/icon_show.png
  5. 1 6
      app/src/main/java/com/grkj/iscs/features/init/fragment/InitDeviceRegistrationKeyAndLockFragment.kt
  6. 29 0
      app/src/main/java/com/grkj/iscs/features/init/fragment/InitSetAdminAccountFragment.kt
  7. 3 1
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateRoleDialog.kt
  8. 2 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/SwitchLayoutFragment.kt
  9. 2 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/CardManageFragment.kt
  10. 2 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/LockManageFragment.kt
  11. 2 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/RfidTokenManageFragment.kt
  12. 5 4
      app/src/main/res/layout-land/dialog_colock_operation_tip.xml
  13. 3 2
      app/src/main/res/layout/dialog_add_card.xml
  14. 3 2
      app/src/main/res/layout/dialog_add_key.xml
  15. 2 1
      app/src/main/res/layout/dialog_add_lock.xml
  16. 1 0
      app/src/main/res/layout/dialog_add_point.xml
  17. 2 1
      app/src/main/res/layout/dialog_add_rfid_token.xml
  18. 1 0
      app/src/main/res/layout/dialog_add_role.xml
  19. 1 0
      app/src/main/res/layout/dialog_add_user.xml
  20. 2 0
      app/src/main/res/layout/dialog_add_workstation.xml
  21. 5 4
      app/src/main/res/layout/dialog_colock_operation_tip.xml
  22. 2 1
      app/src/main/res/layout/dialog_filter_card.xml
  23. 2 1
      app/src/main/res/layout/dialog_filter_key.xml
  24. 2 1
      app/src/main/res/layout/dialog_filter_lock.xml
  25. 1 0
      app/src/main/res/layout/dialog_filter_point.xml
  26. 2 1
      app/src/main/res/layout/dialog_filter_rfid_token.xml
  27. 2 1
      app/src/main/res/layout/dialog_filter_role.xml
  28. 2 1
      app/src/main/res/layout/dialog_filter_user.xml
  29. 2 1
      app/src/main/res/layout/dialog_update_card.xml
  30. 2 1
      app/src/main/res/layout/dialog_update_key.xml
  31. 2 1
      app/src/main/res/layout/dialog_update_lock.xml
  32. 1 0
      app/src/main/res/layout/dialog_update_point.xml
  33. 2 1
      app/src/main/res/layout/dialog_update_rfid_token.xml
  34. 1 0
      app/src/main/res/layout/dialog_update_role.xml
  35. 1 0
      app/src/main/res/layout/dialog_update_user.xml
  36. 8 8
      app/src/main/res/layout/fragment_init_card_registration.xml
  37. 7 7
      app/src/main/res/layout/fragment_init_device_registration_key_and_lock.xml
  38. 8 8
      app/src/main/res/layout/fragment_init_point_rfid_registration.xml
  39. 49 20
      app/src/main/res/layout/fragment_init_set_admin_account.xml
  40. 4 4
      app/src/main/res/layout/fragment_init_set_remote_server.xml
  41. 5 4
      app/src/main/res/layout/fragment_init_welcome.xml
  42. 3 3
      app/src/main/res/layout/item_device_registration_key.xml
  43. 2 2
      app/src/main/res/layout/item_device_registration_lock.xml
  44. 2 2
      app/src/main/res/layout/item_device_registration_protable_key.xml
  45. 1 1
      app/src/main/res/values/dimens.xml
  46. 2 0
      data/src/main/java/com/grkj/data/logic/impl/standard/HardwareLogic.kt
  47. 1 0
      data/src/main/java/com/grkj/data/logic/impl/standard/UserLogic.kt
  48. 1 1
      ui-base/src/main/java/com/grkj/ui_base/config/ISCSConfig.kt
  49. 66 76
      ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleQueueDispatcher.kt
  50. 10 0
      ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleReturnDispatcher.kt
  51. 1 0
      ui-base/src/main/res/values/dimens.xml

+ 5 - 0
app/src/main/assets/i18n/en-US.json

@@ -4102,5 +4102,10 @@
     "key": "exporting",
     "type": "text",
     "value": "Exporting……"
+  },
+  "data_in_backup": {
+    "key": "data_in_backup",
+    "type": "text",
+    "value": "Data backup in progress……"
   }
 }

+ 5 - 0
app/src/main/assets/i18n/zh-CN.json

@@ -4108,5 +4108,10 @@
     "key": "ticket_name",
     "type": "text",
     "value": "作业名称"
+  },
+  "data_in_backup": {
+    "key": "data_in_backup",
+    "type": "text",
+    "value": "数据备份中……"
   }
 }

+ 0 - 0
app/src/main/assets/themes/Default/icons/icon_switch_map_hide_point.png → app/src/main/assets/themes/Default/icons/icon_hide.png


+ 0 - 0
app/src/main/assets/themes/Default/icons/icon_switch_map_show_point.png → app/src/main/assets/themes/Default/icons/icon_show.png


+ 1 - 6
app/src/main/java/com/grkj/iscs/features/init/fragment/InitDeviceRegistrationKeyAndLockFragment.kt

@@ -143,12 +143,7 @@ class InitDeviceRegistrationKeyAndLockFragment :
         lockDock: DockData.LockDock,
     ) {
         val itemBinding = getBinding<ItemDeviceRegistrationLockLayoutBinding>()
-        itemBinding.rvLockLayout.layoutManager = FlexboxLayoutManager(context).apply {
-            flexDirection = FlexDirection.ROW               // 横向
-            justifyContent = JustifyContent.SPACE_EVENLY     // 等间距居中
-            alignItems = AlignItems.CENTER               // 垂直居中对齐
-        }
-        itemBinding.rvLockLayout.setup {
+        itemBinding.rvLockLayout.grid(10).dividerSpace(10, DividerOrientation.GRID).setup {
             addType<DockBean.LockBean>(R.layout.item_device_registration_lock)
             onBind {
                 val itemLockBinding = getBinding<ItemDeviceRegistrationLockBinding>()

+ 29 - 0
app/src/main/java/com/grkj/iscs/features/init/fragment/InitSetAdminAccountFragment.kt

@@ -1,5 +1,9 @@
 package com.grkj.iscs.features.init.fragment
 
+import android.text.InputType
+import android.text.method.PasswordTransformationMethod
+import android.widget.ImageView
+import androidx.appcompat.widget.AppCompatEditText
 import androidx.fragment.app.viewModels
 import com.grkj.data.data.CommonConstants
 import com.grkj.iscs.R
@@ -7,6 +11,7 @@ import com.grkj.iscs.databinding.FragmentInitSetAdminAccountBinding
 import com.grkj.iscs.features.init.viewmodel.InitViewModel
 import com.grkj.shared.utils.KeyboardUtils
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.skin.loadSkinIcon
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.extension.setDebouncedClickListener
@@ -41,6 +46,30 @@ class InitSetAdminAccountFragment : BaseFragment<FragmentInitSetAdminAccountBind
                 }
             }
         }
+        with(binding) {
+            setupPwToggle(passwordEt, passwordToggleIv)
+            setupPwToggle(repeatPasswordEt, repeatPasswordToggleIv)
+        }
+    }
+
+    private fun setupPwToggle(et: AppCompatEditText, iv: ImageView) {
+        var visible = false
+        fun apply() {
+            val tf = et.typeface
+            if (visible) {
+                et.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+                et.transformationMethod = null
+                iv.loadSkinIcon("icon_show.png")
+            } else {
+                et.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
+                et.transformationMethod = PasswordTransformationMethod.getInstance()
+                iv.loadSkinIcon("icon_hide.png")
+            }
+            et.typeface = tf
+            et.setSelection(et.text?.length ?: 0)
+        }
+        iv.setOnClickListener { visible = !visible; apply() }
+        apply()
     }
 
     private fun checkData(): Boolean {

+ 3 - 1
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateRoleDialog.kt

@@ -33,7 +33,7 @@ class UpdateRoleDialog(
     private lateinit var binding: DialogUpdateRoleBinding
     private val indentPx: Int by lazy { AutoSizeUtils.dp2px(binding.root.context, 20f) }
     private var selectedList = mutableListOf<String>()
-    private val roleData get() =  RoleManageFunctionalPermissionsEntity
+    private val roleData = RoleManageFunctionalPermissionsEntity
         .getFunctionalPermissions()
         .reversed()
         .toMutableList()
@@ -93,6 +93,8 @@ class UpdateRoleDialog(
             binding.allSelected.isChecked = roleData.all { it.allSelectedRecursively() }
             binding.roleListRv.models = expandData
         }
+        binding.allSelected.setOnCheckedChangeListener(null)
+        binding.allSelected.isChecked = roleData.all { it.allSelectedRecursively() }
         binding.allSelected.setOnCheckedChangeListener { _, selectAll ->
             syncAll(roleData, selectAll)
             binding.roleListRv.adapter?.notifyDataSetChanged()

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/SwitchLayoutFragment.kt

@@ -171,9 +171,9 @@ class SwitchLayoutFragment : BaseFragment<FragmentSwitchLayoutBinding>() {
             stationLayer?.selectPoint(item.entityId)
         }
         if (item.showInMap){
-            itemBinding.showInMap.loadSkinIcon("icon_switch_map_show_point.png")
+            itemBinding.showInMap.loadSkinIcon("icon_show.png")
         }else{
-            itemBinding.showInMap.loadSkinIcon("icon_switch_map_hide_point.png")
+            itemBinding.showInMap.loadSkinIcon("icon_hide.png")
         }
         itemBinding.showInMap.setDebouncedClickListener {
             if (item.x == null || item.y == null) {

+ 2 - 4
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/CardManageFragment.kt

@@ -53,7 +53,7 @@ class CardManageFragment : BaseFragment<FragmentCardManageBinding>() {
                             countDownTime = 10,
                             showCancel = false,
                             onConfirmClick = {
-                                loadCards(false)
+                                loadCards(reset = true)
                             },
                             onCancelClick = { loadCards(reset = true) }
                         )
@@ -123,9 +123,7 @@ class CardManageFragment : BaseFragment<FragmentCardManageBinding>() {
                         msg = CommonUtils.getStr(msgRes).toString(),
                         countDownTime = 10,
                         showCancel = false,
-                        onConfirmClick = {
-                            loadCards(false)
-                        },
+                        onConfirmClick = { loadCards(reset = true) },
                         onCancelClick = { loadCards(reset = true) }
                     )
                 }

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/LockManageFragment.kt

@@ -54,7 +54,7 @@ class LockManageFragment : BaseFragment<FragmentLockManageBinding>() {
                             countDownTime = 10,
                             showCancel = false,
                             onConfirmClick = {
-                                loadLocks(false)
+                                loadLocks(true)
                             },
                             onCancelClick = { loadLocks(reset = true) }
                         )
@@ -127,7 +127,7 @@ class LockManageFragment : BaseFragment<FragmentLockManageBinding>() {
                             countDownTime = 10,
                             showCancel = false,
                             onConfirmClick = {
-                                loadLocks(false)
+                                loadLocks(true)
                             },
                             onCancelClick = { loadLocks(reset = true) }
                         )

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/RfidTokenManageFragment.kt

@@ -51,7 +51,7 @@ class RfidTokenManageFragment : BaseFragment<FragmentRfidTokenManageBinding>() {
                             countDownTime = 10,
                             showCancel = false,
                             onConfirmClick = {
-                                loadTokens(false)
+                                loadTokens(true)
                             },
                             onCancelClick = {
                                 loadTokens(reset = true)
@@ -130,7 +130,7 @@ class RfidTokenManageFragment : BaseFragment<FragmentRfidTokenManageBinding>() {
                         countDownTime = 10,
                         showCancel = false,
                         onConfirmClick = {
-                            loadTokens(false)
+                            loadTokens(true)
                         },
                         onCancelClick = { loadTokens(reset = true) }
                     )

+ 5 - 4
app/src/main/res/layout-land/dialog_colock_operation_tip.xml

@@ -6,7 +6,7 @@
         android:layout_width="@dimen/login_dialog_width"
         android:layout_height="@dimen/login_dialog_height"
         android:gravity="center"
-        app:cardBackgroundColor="?attr/colorBlue80"
+        app:cardBackgroundColor="?attr/colorSecBg"
         app:strokeColor="?attr/colorTransparent">
 
         <LinearLayout
@@ -20,14 +20,15 @@
 
             <ImageView
                 android:id="@+id/iv_icon"
-                android:layout_width="@dimen/dialog_common_root_height_normal"
-                android:layout_height="@dimen/dialog_common_root_height_normal"
+                android:layout_width="@dimen/dialog_common_root_height_login_and_check"
+                android:layout_height="@dimen/dialog_common_root_height_login_and_check"
+                android:tint="?attr/colorPrimary"
                 android:layout_marginBottom="@dimen/iscs_space_1" />
 
             <TextView
                 android:id="@+id/tv_tip"
                 style="@style/CommonTextView"
-                android:textSize="@dimen/iscs_text_xl" />
+                android:textSize="@dimen/iscs_text_md" />
         </LinearLayout>
 
         <FrameLayout

+ 3 - 2
app/src/main/res/layout/dialog_add_card.xml

@@ -67,9 +67,10 @@
 
             <EditText
                 android:id="@+id/card_nfc_et"
-                android:layout_width="0dp"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"
@@ -124,6 +125,7 @@
                 android:id="@+id/status_rg"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/iscs_space_2"
                 android:orientation="horizontal"
                 app:formRole="field">
 
@@ -131,7 +133,6 @@
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginStart="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

+ 3 - 2
app/src/main/res/layout/dialog_add_key.xml

@@ -67,6 +67,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"
@@ -146,13 +147,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'
@@ -183,7 +184,7 @@
 
             <EditText
                 android:id="@+id/remark_et"
-                android:layout_width="0dp"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
                 android:background="@drawable/bg_common_input"

+ 2 - 1
app/src/main/res/layout/dialog_add_lock.xml

@@ -72,6 +72,7 @@
                 android:layout_marginLeft="@dimen/iscs_space_2"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:paddingHorizontal="@dimen/iscs_space_2"
                 android:paddingVertical="2dp"
                 android:singleLine="true"
@@ -124,13 +125,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginStart="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginStart="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

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

@@ -67,6 +67,7 @@
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
                 android:layout_marginRight="@dimen/dialog_content_normal_padding_horizontal"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"

+ 2 - 1
app/src/main/res/layout/dialog_add_rfid_token.xml

@@ -70,6 +70,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"
@@ -123,13 +124,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginStart="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginStart="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

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

@@ -67,6 +67,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:layout_marginRight="@dimen/dialog_content_normal_padding_horizontal"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"

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

@@ -67,6 +67,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"

+ 2 - 0
app/src/main/res/layout/dialog_add_workstation.xml

@@ -68,6 +68,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"
@@ -93,6 +94,7 @@
                 android:id="@+id/set_default"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 app:formRole="field" />
 
         </com.grkj.ui_base.widget.FormLayout>

+ 5 - 4
app/src/main/res/layout/dialog_colock_operation_tip.xml

@@ -6,7 +6,7 @@
         android:layout_width="@dimen/login_dialog_width"
         android:layout_height="@dimen/login_dialog_height"
         android:gravity="center"
-        app:cardBackgroundColor="?attr/colorBlue80"
+        app:cardBackgroundColor="?attr/colorSecBg"
         app:strokeColor="?attr/colorTransparent">
 
         <LinearLayout
@@ -20,14 +20,15 @@
 
             <ImageView
                 android:id="@+id/iv_icon"
-                android:layout_width="@dimen/dialog_common_root_height_normal"
-                android:layout_height="@dimen/dialog_common_root_height_normal"
+                android:layout_width="@dimen/dialog_common_root_height_login_and_check"
+                android:layout_height="@dimen/dialog_common_root_height_login_and_check"
+                android:tint="?attr/colorPrimary"
                 android:layout_marginBottom="@dimen/iscs_space_1" />
 
             <TextView
                 android:id="@+id/tv_tip"
                 style="@style/CommonTextView"
-                android:textSize="@dimen/iscs_text_xl" />
+                android:textSize="@dimen/iscs_text_md" />
         </LinearLayout>
 
         <FrameLayout

+ 2 - 1
app/src/main/res/layout/dialog_filter_card.xml

@@ -66,6 +66,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"
@@ -117,13 +118,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

+ 2 - 1
app/src/main/res/layout/dialog_filter_key.xml

@@ -65,6 +65,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"
@@ -138,13 +139,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

+ 2 - 1
app/src/main/res/layout/dialog_filter_lock.xml

@@ -71,6 +71,7 @@
                 android:paddingHorizontal="@dimen/iscs_space_2"
                 android:paddingVertical="2dp"
                 android:singleLine="true"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 app:formRole="field"
@@ -116,13 +117,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

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

@@ -67,6 +67,7 @@
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
                 android:layout_marginRight="@dimen/dialog_content_normal_padding_horizontal"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"

+ 2 - 1
app/src/main/res/layout/dialog_filter_rfid_token.xml

@@ -71,6 +71,7 @@
                 android:paddingHorizontal="@dimen/iscs_space_2"
                 android:paddingVertical="2dp"
                 android:singleLine="true"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 app:formRole="field"
@@ -116,13 +117,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

+ 2 - 1
app/src/main/res/layout/dialog_filter_role.xml

@@ -65,6 +65,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"
@@ -115,6 +116,7 @@
                 android:id="@+id/status_rg"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 android:orientation="horizontal"
                 app:formRole="field">
 
@@ -122,7 +124,6 @@
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"user_manage_filter_activate"}'

+ 2 - 1
app/src/main/res/layout/dialog_filter_user.xml

@@ -66,6 +66,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"
@@ -138,6 +139,7 @@
                 android:id="@+id/status_rg"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 android:orientation="horizontal"
                 app:formRole="field">
 
@@ -145,7 +147,6 @@
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"user_manage_filter_activate"}'

+ 2 - 1
app/src/main/res/layout/dialog_update_card.xml

@@ -72,6 +72,7 @@
                 android:layout_marginLeft="@dimen/iscs_space_2"
                 android:background="@drawable/bg_common_input"
                 android:paddingHorizontal="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:paddingVertical="2dp"
                 android:singleLine="true"
                 android:textColor="?attr/colorTextPrimary"
@@ -123,13 +124,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

+ 2 - 1
app/src/main/res/layout/dialog_update_key.xml

@@ -67,6 +67,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"
@@ -146,13 +147,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

+ 2 - 1
app/src/main/res/layout/dialog_update_lock.xml

@@ -70,6 +70,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:paddingHorizontal="@dimen/iscs_space_2"
                 android:paddingVertical="2dp"
@@ -122,13 +123,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

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

@@ -68,6 +68,7 @@
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
                 android:layout_marginRight="@dimen/dialog_content_normal_padding_horizontal"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"

+ 2 - 1
app/src/main/res/layout/dialog_update_rfid_token.xml

@@ -75,6 +75,7 @@
                 android:paddingHorizontal="@dimen/iscs_space_2"
                 android:paddingVertical="2dp"
                 android:singleLine="true"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 app:formRole="field"
@@ -123,13 +124,13 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
+                android:layout_marginLeft="@dimen/iscs_space_2"
                 app:formRole="field">
 
                 <com.google.android.material.radiobutton.MaterialRadioButton
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/iscs_space_2"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"normal"}'

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

@@ -69,6 +69,7 @@
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
                 android:layout_marginRight="@dimen/dialog_content_normal_padding_horizontal"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/normal_input_padding_horizontal"

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

@@ -65,6 +65,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:paddingHorizontal="@dimen/iscs_space_2"

+ 8 - 8
app/src/main/res/layout/fragment_init_card_registration.xml

@@ -18,8 +18,8 @@
             android:id="@+id/step_title_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="100dp"
-            android:layout_marginTop="100dp"
+            android:layout_marginLeft="50dp"
+            android:layout_marginTop="50dp"
             android:gravity="center_vertical"
             android:orientation="horizontal"
             app:layout_constraintStart_toStartOf="parent"
@@ -31,7 +31,7 @@
                 android:layout_height="40dp"
                 android:background="@drawable/init_step_circle"
                 android:gravity="center"
-                app:i18nKey='@{"init_card_registration_step"}'
+                android:text="3"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md" />
 
@@ -61,7 +61,7 @@
             android:id="@+id/rv_header_layout"
             android:layout_width="match_parent"
             android:layout_height="40dp"
-            android:layout_marginHorizontal="100dp"
+            android:layout_marginHorizontal="50dp"
             android:layout_marginTop="@dimen/iscs_space_2"
             android:background="@drawable/bg_card_color_container_bg_radius_md"
             android:divider="@drawable/divider_table"
@@ -92,7 +92,7 @@
             android:id="@+id/card_rv"
             android:layout_width="0dp"
             android:layout_height="0dp"
-            android:layout_marginHorizontal="100dp"
+            android:layout_marginHorizontal="50dp"
             android:layout_marginBottom="@dimen/iscs_space_2"
             app:layout_constraintBottom_toTopOf="@+id/previous_btn"
             app:layout_constraintEnd_toEndOf="parent"
@@ -105,7 +105,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"previous"}'
@@ -128,7 +128,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"next"}'
@@ -144,7 +144,7 @@
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
             android:layout_marginTop="@dimen/iscs_space_2"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"ski_step"}'
             android:textColor="?attr/colorTextPrimary"

+ 7 - 7
app/src/main/res/layout/fragment_init_device_registration_key_and_lock.xml

@@ -11,8 +11,8 @@
             android:id="@+id/step_title_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="100dp"
-            android:layout_marginTop="100dp"
+            android:layout_marginLeft="50dp"
+            android:layout_marginTop="50dp"
             android:gravity="center_vertical"
             android:orientation="horizontal"
             app:layout_constraintStart_toStartOf="parent"
@@ -24,7 +24,7 @@
                 android:layout_height="40dp"
                 android:background="@drawable/init_step_circle"
                 android:gravity="center"
-                app:i18nKey='@{"init_device_registration_key_and_lock_step"}'
+                android:text="2"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md" />
 
@@ -66,7 +66,7 @@
         <FrameLayout
             android:layout_width="match_parent"
             android:layout_height="0dp"
-            android:layout_marginHorizontal="100dp"
+            android:layout_marginHorizontal="50dp"
             android:layout_marginVertical="@dimen/iscs_space_2"
             app:layout_constraintBottom_toTopOf="@+id/previous_btn"
             app:layout_constraintEnd_toEndOf="parent"
@@ -86,7 +86,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"previous"}'
@@ -109,7 +109,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"next"}'
@@ -125,7 +125,7 @@
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
             android:layout_marginTop="@dimen/iscs_space_2"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"re_recognize"}'
             android:textColor="?attr/colorTextPrimary"

+ 8 - 8
app/src/main/res/layout/fragment_init_point_rfid_registration.xml

@@ -18,8 +18,8 @@
             android:id="@+id/step_title_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="100dp"
-            android:layout_marginTop="100dp"
+            android:layout_marginLeft="50dp"
+            android:layout_marginTop="50dp"
             android:gravity="center_vertical"
             android:orientation="horizontal"
             app:layout_constraintStart_toStartOf="parent"
@@ -31,7 +31,7 @@
                 android:layout_height="40dp"
                 android:background="@drawable/init_step_circle"
                 android:gravity="center"
-                app:i18nKey='@{"init_point_rfid_registration_step"}'
+                android:text="4"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md" />
 
@@ -61,7 +61,7 @@
             android:id="@+id/rv_header_layout"
             android:layout_width="match_parent"
             android:layout_height="40dp"
-            android:layout_marginHorizontal="100dp"
+            android:layout_marginHorizontal="50dp"
             android:layout_marginTop="@dimen/iscs_space_2"
             android:background="@drawable/bg_card_color_container_bg_radius_md"
             android:divider="@drawable/divider_table"
@@ -92,7 +92,7 @@
             android:id="@+id/point_rfid_rv"
             android:layout_width="0dp"
             android:layout_height="0dp"
-            android:layout_marginHorizontal="100dp"
+            android:layout_marginHorizontal="50dp"
             android:layout_marginBottom="@dimen/iscs_space_2"
             app:layout_constraintBottom_toTopOf="@+id/previous_btn"
             app:layout_constraintEnd_toEndOf="parent"
@@ -105,7 +105,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"previous"}'
@@ -128,7 +128,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"next"}'
@@ -144,7 +144,7 @@
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
             android:layout_marginTop="@dimen/iscs_space_2"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"skip_and_complete"}'
             android:textColor="?attr/colorTextPrimary"

+ 49 - 20
app/src/main/res/layout/fragment_init_set_admin_account.xml

@@ -12,8 +12,8 @@
             android:id="@+id/step_title_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="100dp"
-            android:layout_marginTop="100dp"
+            android:layout_marginLeft="50dp"
+            android:layout_marginTop="50dp"
             android:gravity="center_vertical"
             android:orientation="horizontal"
             app:layout_constraintStart_toStartOf="parent"
@@ -25,7 +25,7 @@
                 android:layout_height="40dp"
                 android:background="@drawable/init_step_circle"
                 android:gravity="center"
-                app:i18nKey='@{"init_set_admin_account_step"}'
+                android:text="1"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md" />
 
@@ -93,36 +93,50 @@
             app:layout_constraintStart_toStartOf="@+id/admin_username_tv"
             app:layout_constraintTop_toBottomOf="@+id/admin_username_et" />
 
-        <com.google.android.material.textfield.TextInputLayout
+        <androidx.constraintlayout.widget.ConstraintLayout
             android:id="@+id/container_password"
             android:layout_width="0dp"
             android:layout_height="@dimen/init_set_admin_account_et_height"
             android:layout_marginLeft="@dimen/iscs_space_2"
             android:layout_marginTop="@dimen/iscs_space_2"
             android:layout_marginRight="@dimen/common_spacing_7x"
-            app:boxBackgroundMode="none"
-            app:endIconMode="password_toggle"
-            app:hintEnabled="false"
+            android:background="@drawable/bg_common_input"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="@+id/password_tv"
             app:layout_constraintTop_toBottomOf="@+id/password_tv">
 
             <androidx.appcompat.widget.AppCompatEditText
                 android:id="@+id/password_et"
-                android:layout_width="match_parent"
+                android:layout_width="0dp"
                 android:layout_height="wrap_content"
-                android:background="@drawable/bg_common_input"
                 app:i18nHint='@{"please_input_password"}'
                 android:inputType="textPassword"
                 android:maxLength="20"
+                android:background="@null"
                 android:maxLines="1"
                 android:minHeight="0dp"
                 android:paddingHorizontal="@dimen/iscs_space_2"
                 android:paddingVertical="2dp"
                 android:singleLine="true"
                 android:textColor="?attr/colorTextPrimary"
-                android:textSize="@dimen/iscs_text_md" />
-        </com.google.android.material.textfield.TextInputLayout>
+                android:textSize="@dimen/iscs_text_md"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintEnd_toStartOf="@id/password_toggle_iv"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent" />
+
+            <ImageView
+                android:id="@+id/password_toggle_iv"
+                android:layout_width="40dp"
+                android:layout_height="match_parent"
+                android:padding="8dp"
+                android:tint="?attr/colorPrimary"
+                android:contentDescription="@string/app_name"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintTop_toTopOf="@id/password_et"
+                app:layout_constraintBottom_toBottomOf="@id/password_et" />
+        </androidx.constraintlayout.widget.ConstraintLayout>
+        <!-- ================== /替换结束 ================== -->
 
         <TextView
             android:id="@+id/repeat_password_tv"
@@ -135,35 +149,50 @@
             app:layout_constraintStart_toStartOf="@+id/password_tv"
             app:layout_constraintTop_toBottomOf="@+id/container_password" />
 
-        <com.google.android.material.textfield.TextInputLayout
+        <!-- ================= 替换:重复密码输入(非 Material) ================= -->
+        <androidx.constraintlayout.widget.ConstraintLayout
             android:id="@+id/container_repeat_password"
             android:layout_width="0dp"
             android:layout_height="@dimen/init_set_admin_account_et_height"
             android:layout_marginLeft="@dimen/iscs_space_2"
             android:layout_marginTop="@dimen/iscs_space_2"
             android:layout_marginRight="@dimen/common_spacing_7x"
-            app:endIconMode="password_toggle"
-            app:hintEnabled="false"
+            android:background="@drawable/bg_common_input"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="@+id/repeat_password_tv"
             app:layout_constraintTop_toBottomOf="@+id/repeat_password_tv">
 
             <androidx.appcompat.widget.AppCompatEditText
                 android:id="@+id/repeat_password_et"
-                android:layout_width="match_parent"
+                android:layout_width="0dp"
                 android:layout_height="wrap_content"
-                android:background="@drawable/bg_common_input"
                 app:i18nHint='@{"please_input_repeat_password"}'
                 android:inputType="textPassword"
                 android:maxLength="20"
                 android:maxLines="1"
+                android:background="@null"
                 android:minHeight="0dp"
                 android:paddingHorizontal="@dimen/iscs_space_2"
                 android:paddingVertical="2dp"
                 android:singleLine="true"
                 android:textColor="?attr/colorTextPrimary"
-                android:textSize="@dimen/iscs_text_md" />
-        </com.google.android.material.textfield.TextInputLayout>
+                android:textSize="@dimen/iscs_text_md"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintEnd_toStartOf="@id/repeat_password_toggle_iv"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent" />
+
+            <ImageView
+                android:id="@+id/repeat_password_toggle_iv"
+                android:layout_width="40dp"
+                android:layout_height="match_parent"
+                android:padding="8dp"
+                android:tint="?attr/colorPrimary"
+                android:contentDescription="@string/app_name"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintTop_toTopOf="@id/repeat_password_et"
+                app:layout_constraintBottom_toBottomOf="@id/repeat_password_et" />
+        </androidx.constraintlayout.widget.ConstraintLayout>
 
         <TextView
             android:id="@+id/previous_btn"
@@ -171,7 +200,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"previous"}'
@@ -194,7 +223,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"next"}'

+ 4 - 4
app/src/main/res/layout/fragment_init_set_remote_server.xml

@@ -11,8 +11,8 @@
             android:id="@+id/step_title_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="100dp"
-            android:layout_marginTop="100dp"
+            android:layout_marginLeft="50dp"
+            android:layout_marginTop="50dp"
             android:gravity="center_vertical"
             android:orientation="horizontal"
             app:layout_constraintStart_toStartOf="parent"
@@ -98,7 +98,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"confirm"}'
@@ -122,7 +122,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"change_to_standard"}'

+ 5 - 4
app/src/main/res/layout/fragment_init_welcome.xml

@@ -15,7 +15,7 @@
             android:layout_marginTop="@dimen/init_margin_space"
             app:i18nKey='@{"welcome_tip"}'
             android:textColor="?attr/colorTextPrimary"
-            android:textSize="@dimen/iscs_text_h1"
+            android:textSize="@dimen/iscs_text_h2"
             android:textStyle="bold" />
 
         <TextView
@@ -28,7 +28,7 @@
             android:layout_marginTop="@dimen/common_margin_spacing_big"
             app:i18nKey='@{"loto"}'
             android:textColor="?attr/colorTextPrimary"
-            android:textSize="@dimen/iscs_text_h1"
+            android:textSize="@dimen/iscs_text_h3"
             android:textStyle="bold" />
 
         <TextView
@@ -41,7 +41,7 @@
             android:layout_marginTop="@dimen/login_sub_title_margin_top"
             app:i18nKey='@{"loto_en"}'
             android:textColor="?attr/colorTextPrimary"
-            android:textSize="@dimen/iscs_text_h2"
+            android:textSize="@dimen/iscs_text_h4"
             android:textStyle="bold" />
 
 
@@ -53,6 +53,7 @@
             android:layout_centerHorizontal="true"
             android:layout_marginBottom="@dimen/iscs_space_4"
             android:textSize="@dimen/iscs_text_md"
+            android:textColor="?attr/colorTextPrimary"
             app:i18nKey='@{"start_tip"}' />
 
         <TextView
@@ -61,7 +62,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             android:background="@drawable/common_btn_secondary"
             android:paddingHorizontal="@dimen/iscs_space_4"
             app:i18nKey='@{"start"}'

+ 3 - 3
app/src/main/res/layout/item_device_registration_key.xml

@@ -4,14 +4,14 @@
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <RelativeLayout
-        android:layout_width="match_parent"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:gravity="center">
 
         <ImageView
             android:id="@+id/iv_key"
-            android:layout_width="@dimen/init_key_iv_width"
-            android:layout_height="@dimen/init_key_iv_height"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
             android:layout_centerHorizontal="true"
             android:background="@drawable/dock_key_selector" />
 

+ 2 - 2
app/src/main/res/layout/item_device_registration_lock.xml

@@ -11,8 +11,8 @@
 
         <FrameLayout
             android:id="@+id/root"
-            android:layout_width="@dimen/init_lock_iv_width"
-            android:layout_height="@dimen/init_lock_iv_height"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
             android:background="@drawable/dock_lock_selector" />
 
         <TextView

+ 2 - 2
app/src/main/res/layout/item_device_registration_protable_key.xml

@@ -10,8 +10,8 @@
 
         <ImageView
             android:id="@+id/iv_key"
-            android:layout_width="@dimen/init_key_iv_width"
-            android:layout_height="@dimen/init_key_iv_height"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
             android:layout_centerHorizontal="true"
             android:background="@drawable/dock_key_selector" />
 

+ 1 - 1
app/src/main/res/values/dimens.xml

@@ -30,7 +30,7 @@
     <dimen name="common_margin_spacing_big">40dp</dimen>
     <dimen name="common_spacing_7x">70dp</dimen>
     <dimen name="common_spacing_1_5x">15dp</dimen>
-    <dimen name="init_margin_space">120dp</dimen>
+    <dimen name="init_margin_space">60dp</dimen>
     <dimen name="init_set_admin_account_et_height">30dp</dimen>
     <dimen name="init_key_iv_width">50dp</dimen>
     <dimen name="init_key_iv_height">35dp</dimen>

+ 2 - 0
data/src/main/java/com/grkj/data/logic/impl/standard/HardwareLogic.kt

@@ -382,6 +382,8 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun updateCardInfo(isJobCard: IsJobCard) {
+        val localCardData = hardwareDao.getCardDataByRfid(isJobCard.cardNfc)
+        isJobCard.cardCode = localCardData?.cardCode ?: ""
         hardwareDao.updateCardInfo(isJobCard)
     }
 

+ 1 - 0
data/src/main/java/com/grkj/data/logic/impl/standard/UserLogic.kt

@@ -451,6 +451,7 @@ class UserLogic @Inject constructor(
         sysUserDo.status = "0"
         val userId = userRepository.insert(sysUserDo)
         val roleId = roleDao.getRoleDataByRoleKey(RoleEnum.ADMIN.roleKey)
+        logger.info("超管角色id:$roleId")
         val userRole = SysUserRole()
         userRole.userId = userId
         userRole.roleId = roleId ?: 0

+ 1 - 1
ui-base/src/main/java/com/grkj/ui_base/config/ISCSConfig.kt

@@ -15,7 +15,7 @@ object ISCSConfig {
     /**
      * Debug模式
      */
-    const val DEBUG: Boolean = true
+    const val DEBUG: Boolean = false
 
     /**
      * 是否在注册设备

+ 66 - 76
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleQueueDispatcher.kt

@@ -7,35 +7,35 @@ import com.grkj.ui_base.utils.ble.BleConnectionManager.deviceList
 import com.huyuhui.fastble.BleManager
 import com.sik.sikcore.extension.toJson
 import com.sik.sikcore.thread.ThreadUtils
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
+import kotlinx.coroutines.*
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
-import kotlin.math.log
 
 /**
- * 蓝牙队列调度器
+ * 蓝牙队列调度器:
+ * - 支持任务排队、最大连接数限制
+ * - 支持延迟断连
+ * - 增加连接超时机制:默认10秒,超时回调false并清理
  */
 abstract class BleQueueDispatcher {
     private val logger: Logger = LoggerFactory.getLogger(BleQueueDispatcher::class.java)
 
     /**
      * 任务队列
+     * 存储:MAC地址 + 回调列表
      */
     private val taskQueue =
-        ArrayDeque<Pair<String, MutableList<(Boolean) -> Unit>>>() // mac + callback
+        ArrayDeque<Pair<String, MutableList<(Boolean) -> Unit>>>()
 
     /**
-     * 正在连接的设备
+     * 正在连接的设备:
+     * key = mac,value = 回调列表
      */
     private val activeMacs = mutableMapOf<String, MutableList<(Boolean) -> Unit>>()
 
     /**
-     * 繁忙设备
+     * 繁忙设备:
+     * 用于标记设备处于使用状态,避免被清理
      */
     private val busyMacs = mutableSetOf<String>()
 
@@ -45,7 +45,8 @@ abstract class BleQueueDispatcher {
     private val connectedMacs = mutableSetOf<String>()
 
     /**
-     * 断连计划
+     * 断连计划:
+     * key = mac,value = 延迟断连任务
      */
     private val pendingDisconnectJobs = mutableMapOf<String, Job>()
 
@@ -55,67 +56,89 @@ abstract class BleQueueDispatcher {
     open val maxConnections: Int = 1
 
     /**
-     * 调度器
+     * 默认连接超时(毫秒)
+     */
+    open val connectTimeout: Long = 10_000
+
+    /**
+     * 调度器协程域
      */
     private val dispatcherScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
 
     /**
-     * 检查钥匙状态
+     * 提交连接任务
      */
     @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
     @Synchronized
     fun submit(mac: String, onResult: (Boolean) -> Unit) {
-        logger.info("开始检查钥匙状态:${mac},连接中的:${activeMacs.toJson()},已连接的:${connectedMacs.toJson()}")
-        if (activeMacs.containsKey(mac) || taskQueue.any { it.first == mac } || connectedMacs.contains(
-                mac
-            )) {
+        logger.info("开始检查钥匙状态:$mac, 连接中:${activeMacs.toJson()}, 已连接:${connectedMacs.toJson()}")
+        if (activeMacs.containsKey(mac) || taskQueue.any { it.first == mac } || connectedMacs.contains(mac)) {
+            // 已连接
             if (connectedMacs.contains(mac)) {
                 logger.info("${this::class.java} 检查到钥匙已连接")
                 onResult(true)
-            } else if (activeMacs.containsKey(mac)) {
+            }
+            // 正在连接中
+            else if (activeMacs.containsKey(mac)) {
                 logger.info("${this::class.java} 检查到钥匙连接中添加回调")
                 activeMacs[mac]?.add(onResult)
-            } else if (taskQueue.find { it.first == mac } != null) {
+            }
+            // 队列中
+            else {
                 logger.info("${this::class.java} 检查到钥匙队列中添加回调")
                 taskQueue.find { it.first == mac }?.second?.add(onResult)
             }
-            // 如果已存在断连计划,取消它
+            // 取消断连计划
             pendingDisconnectJobs.remove(mac)?.cancel()
             return
         }
+        // 添加到任务队列
         taskQueue.add(mac to mutableListOf(onResult))
         tryStartNext()
     }
 
     /**
-     * 开始连接
+     * 开始执行下一个连接任务
      */
     @Synchronized
     private fun tryStartNext() {
         if ((activeMacs.size + connectedMacs.size) >= maxConnections || taskQueue.isEmpty()) return
         val (mac, callbacks) = taskQueue.removeFirst()
         activeMacs[mac] = callbacks
+
+        // 启动超时任务
+        val timeoutJob = dispatcherScope.launch {
+            delay(connectTimeout)
+            synchronized(this@BleQueueDispatcher) {
+                if (activeMacs.containsKey(mac)) {
+                    logger.warn("连接超时: $mac")
+                    activeMacs.remove(mac)
+                    callbacks.forEach { it(false) }
+                    clear(mac)
+                    tryStartNext()
+                }
+            }
+        }
+
+        // 真正开始连接
         doConnect(mac) { success ->
+            timeoutJob.cancel() // 连接回调后取消超时任务
             synchronized(this) {
                 activeMacs.remove(mac)
-                if (success) {
-                    connectedMacs.add(mac)
-                }
-                callbacks.forEach {
-                    it.invoke(success)
-                }
+                if (success) connectedMacs.add(mac)
+                callbacks.forEach { it(success) }
                 tryStartNext()
             }
         }
     }
 
     /**
-     * 连接
+     * 子类实现具体连接逻辑
      */
     protected abstract fun doConnect(mac: String, callback: (Boolean) -> Unit)
 
     /**
-     * 移除设备
+     * 移除设备(取消所有状态)
      */
     @Synchronized
     fun clear(mac: String) {
@@ -126,7 +149,7 @@ abstract class BleQueueDispatcher {
     }
 
     /**
-     * 计划断连
+     * 计划延迟断连
      */
     @SuppressLint("MissingPermission")
     @Synchronized
@@ -134,7 +157,7 @@ abstract class BleQueueDispatcher {
         if (!connectedMacs.contains(mac)) return
         pendingDisconnectJobs[mac]?.cancel()
         val job = dispatcherScope.launch {
-            logger.info("计划移除硬件:${mac}")
+            logger.info("计划移除硬件:$mac")
             delay(delayMillis)
             synchronized(this@BleQueueDispatcher) {
                 if (connectedMacs.remove(mac)) {
@@ -158,7 +181,7 @@ abstract class BleQueueDispatcher {
     }
 
     /**
-     * 断开设备连接
+     * 立即断开指定设备
      */
     @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
     private fun disconnectDeviceByMac(mac: String) {
@@ -175,62 +198,29 @@ abstract class BleQueueDispatcher {
     @Synchronized
     fun disconnectAll(delayMillis: Long = 0) {
         val allMacs = connectedMacs.toList()
-        for (mac in allMacs) {
-            scheduleDisconnect(mac, delayMillis)
-        }
+        for (mac in allMacs) scheduleDisconnect(mac, delayMillis)
     }
 
     /**
-     * 是否连接中
+     * 工具方法
      */
     fun isConnecting(mac: String): Boolean = activeMacs.containsKey(mac)
-
-    /**
-     * 获取已连接的设备
-     */
-    fun getConnectedAndConnecting(): List<String> = activeMacs.map { it.key } + connectedMacs
-
-    /**
-     * 是否队列中
-     */
+    fun getConnectedAndConnecting(): List<String> = (activeMacs.keys + connectedMacs) as List<String>
     fun isQueued(mac: String): Boolean = taskQueue.any { it.first == mac }
-
-    /**
-     * 是否已连接
-     */
     fun isConnected(mac: String): Boolean = connectedMacs.contains(mac)
-
-    /**
-     * 是否可以连接
-     */
     fun canConnect(): Boolean = (activeMacs.size + connectedMacs.size) <= maxConnections
+    fun shouldDisconnect(mac: String): Boolean = isConnecting(mac) || isQueued(mac) || isConnected(mac)
 
     /**
-     * 是否可以断连
+     * 繁忙标记
      */
-    fun shouldDisconnect(mac: String): Boolean =
-        isConnecting(mac) || isQueued(mac) || isConnected(mac)
+    fun busy(mac: String) { busyMacs.add(mac) }
+    fun removeBusy(mac: String) { busyMacs.remove(mac) }
 
     /**
-     * mac加入工作状态
-     */
-    fun busy(mac: String) {
-        busyMacs.add(mac)
-    }
-
-    /**
-     * mac移除工作状态
-     */
-    fun removeBusy(mac: String) {
-        busyMacs.remove(mac)
-    }
-
-    /**
-     * 清除不繁忙的连接设备
+     * 清除非繁忙设备
      */
     fun clearNotInBusyConnectedDevice() {
-        connectedMacs.filter { it in busyMacs }.forEach {
-            scheduleDisconnect(it)
-        }
+        connectedMacs.filter { it !in busyMacs }.forEach { scheduleDisconnect(it) }
     }
-}
+}

+ 10 - 0
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleReturnDispatcher.kt

@@ -5,8 +5,17 @@ import com.grkj.data.utils.event.LoadingEvent
 import com.sik.sikcore.thread.ThreadUtils
 
 object BleReturnDispatcher : BleQueueDispatcher() {
+    /** 限制只允许1个连接 */
     override val maxConnections = 1
 
+    /** 连接超时:8秒 */
+    override val connectTimeout = 28_000L
+
+    /**
+     * 执行具体连接逻辑:
+     * - 切主线程提示Loading
+     * - IO线程执行连接
+     */
     override fun doConnect(mac: String, callback: (Boolean) -> Unit) {
         ThreadUtils.runOnMain {
             LoadingEvent.sendLoadingEvent(CommonUtils.getStr("loading_msg_return_key_start"))
@@ -17,3 +26,4 @@ object BleReturnDispatcher : BleQueueDispatcher() {
         }
     }
 }
+

+ 1 - 0
ui-base/src/main/res/values/dimens.xml

@@ -47,6 +47,7 @@
     <dimen name="iscs_text_h1">60sp</dimen>
     <dimen name="iscs_text_h2">50sp</dimen>
     <dimen name="iscs_text_h3">40sp</dimen>
+    <dimen name="iscs_text_h4">30sp</dimen>
     <dimen name="iscs_icon_btn_size">40dp</dimen>
     <!-- 线宽/海拔 -->
     <dimen name="iscs_stroke_sm">1dp</dimen>