Преглед на файлове

添加翻译;优化loading的入参类型;蓝牙改长连接

Frankensteinly преди 10 месеца
родител
ревизия
c165528a77

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

@@ -338,18 +338,20 @@ object BusinessManager {
     fun prepareBle(
         mac: String,
         activity: AppCompatActivity,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
-        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?,
+        prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?
     ) {
-        CommonUtils.checkBlePermission(activity) {
-            doScanBle(mac, loadingCallBack, prepareDoneCallBack)
+        Executor.runOnMain {
+            CommonUtils.checkBlePermission(activity) {
+                doScanBle(mac, loadingCallBack, prepareDoneCallBack)
+            }
         }
     }
 
     @AfterPermissionGranted(PERMISSION_REQUEST_CODE)
-    fun doScanBle(mac: String, loadingCallBack: (Boolean, String?, Boolean?) -> Unit, prepareDoneCallBack: (Boolean, BleBean?) -> Unit) {
+    fun doScanBle(mac: String, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?, prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?) {
         LogUtil.d("扫描开始:$mac")
-        loadingCallBack(true, "正在扫描设备...", null)
+        loadingCallBack?.invoke(true, MyApplication.instance?.getString(R.string.start_scanning_for_devices), null)
         BleUtil.instance?.scan(object : CustomBleScanCallback() {
             override fun onPrompt(promptStr: String?) {
                 BleManager.getInstance().enableBluetooth()
@@ -357,7 +359,7 @@ object BusinessManager {
 
             override fun onScanStarted(success: Boolean) {
                 LogUtil.d("扫描开始:${success}")
-                BleUtil.instance?.deviceList?.clear()
+//                BleUtil.instance?.deviceList?.clear()
             }
 
             override fun onScanning(bleDevice: BleDevice?) {
@@ -376,10 +378,10 @@ object BusinessManager {
             }
 
             override fun onScanFinished(scanResultList: MutableList<BleDevice>?) {
-                loadingCallBack.invoke(false, null, null)
+                loadingCallBack?.invoke(false, null, null)
                 if (BleUtil.instance?.deviceList?.isEmpty() == true) {
                     ToastUtils.tip(R.string.ble_no_device_found)
-                    loadingCallBack.invoke(false, null, false)
+                    loadingCallBack?.invoke(false, null, false)
                     return
                 }
                 BleUtil.instance?.getBleDeviceByMac(mac)?.bleDevice?.let {
@@ -394,30 +396,30 @@ object BusinessManager {
      */
     fun doConnect(
         bleDevice: BleDevice,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
-        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?,
+        prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?
     ) {
-        loadingCallBack.invoke(true, CommonUtils.getStr(R.string.ble_connecting), null)
+        loadingCallBack?.invoke(true, CommonUtils.getStr(R.string.ble_connecting), null)
         BleManager.getInstance().disconnect(bleDevice)
         BleUtil.instance?.connectBySelect(bleDevice,
             object : CustomBleGattCallback() {
                 override fun onPrompt(promptStr: String?) {
-                    loadingCallBack.invoke(false, promptStr, false)
+                    loadingCallBack?.invoke(false, promptStr, false)
                 }
 
                 override fun onStartConnect() {}
 
                 override fun onConnectFail(bleDevice: BleDevice?, exception: BleException?) {
-                    loadingCallBack.invoke(false, CommonUtils.getStr(R.string.ble_connect_fail), false)
-                    prepareDoneCallBack.invoke(false, null)
+                    loadingCallBack?.invoke(false, CommonUtils.getStr(R.string.ble_connect_fail), false)
+                    prepareDoneCallBack?.invoke(false, null)
                 }
 
                 override fun onConnectSuccess(bleDevice: BleDevice?, gatt: BluetoothGatt?, status: Int) {
-                    loadingCallBack.invoke(false, null, null)
+                    loadingCallBack?.invoke(false, null, null)
                     LogUtil.i("onConnectSuccess : $bleDevice")
                     bleDevice?.let {
                         val bleBean = BleBean(it)
-                        ToastUtils.tip("连接成功")
+                        ToastUtils.tip(R.string.connect_success)
                         BleUtil.instance?.deviceList?.add(bleBean)
                         // 设置MTU
                         Executor.delayOnMain(200) {
@@ -431,7 +433,7 @@ object BusinessManager {
                 }
 
                 override fun onDisConnected(isActiveDisConnected: Boolean, device: BleDevice?, gatt: BluetoothGatt?, status: Int) {
-                    loadingCallBack.invoke(false, null, false)
+                    loadingCallBack?.invoke(false, null, false)
                     ToastUtils.tip(CommonUtils.getStr(R.string.ble_disconnect))
                     BleUtil.instance?.getBleDeviceByMac(device?.mac)?.let {
                         BleUtil.instance?.deviceList?.remove(it)
@@ -445,10 +447,10 @@ object BusinessManager {
      */
     private fun indicate(
         bleBean: BleBean?,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
-        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?,
+        prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?
     ) {
-        loadingCallBack.invoke(true, "开始监听...", null)
+        loadingCallBack?.invoke(true, MyApplication.instance?.getString(R.string.start_indicating), null)
         bleBean?.let {
             BleUtil.instance?.indicate(it.bleDevice, indicateCallback = object : CustomBleIndicateCallback() {
                 override fun onPrompt(promptStr: String?) {
@@ -471,10 +473,10 @@ object BusinessManager {
                 }
 
                 override fun onIndicateFailure(exception: BleException?) {
-                    loadingCallBack.invoke(false, null, false)
-                    ToastUtils.tip("监听失败")
+                    loadingCallBack?.invoke(false, null, false)
+                    ToastUtils.tip(MyApplication.instance?.getString(R.string.indicate_fail))
                     LogUtil.i("监听失败")
-                    prepareDoneCallBack.invoke(false, null)
+                    prepareDoneCallBack?.invoke(false, null)
                 }
 
                 override fun onCharacteristicChanged(data: ByteArray?) {
@@ -492,22 +494,22 @@ object BusinessManager {
      */
     private fun getToken(
         bleBean: BleBean?,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
-        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?,
+        prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?
     ) {
-        loadingCallBack.invoke(true, "开始获取token...", null)
+        loadingCallBack?.invoke(true, MyApplication.instance?.getString(R.string.start_getting_token), null)
         bleBean?.let {
             BleCmdManager.getToken(it.bleDevice.mac, object : CustomBleWriteCallback() {
                 override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
-                    loadingCallBack.invoke(false, "token获取成功", null)
+                    loadingCallBack?.invoke(false, MyApplication.instance?.getString(R.string.get_token_success), null)
                     LogUtil.i("getToken success : ${bleBean.bleDevice.mac}")
-                    prepareDoneCallBack.invoke(true, bleBean)
+                    prepareDoneCallBack?.invoke(true, bleBean)
                 }
 
                 override fun onWriteFailure(exception: BleException?) {
-                    loadingCallBack.invoke(false, "token获取失败", false)
+                    loadingCallBack?.invoke(false, MyApplication.instance?.getString(R.string.get_token_fail), false)
                     LogUtil.e("getToken fail : ${bleBean.bleDevice.mac}")
-                    prepareDoneCallBack.invoke(false, null)
+                    prepareDoneCallBack?.invoke(false, null)
                 }
             })
         }
@@ -523,27 +525,27 @@ object BusinessManager {
     fun sendTicketBusiness(
         mac: String,
         activity: AppCompatActivity,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?
     ) {
-        prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
-            if (done) {
-                Executor.delayOnMain(500) {
+//        prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
+//            if (done) {
+//                Executor.delayOnMain(500) {
                     // TODO 蓝牙准备操作
-//                    val bleBean = BleUtil.instance?.getBleDeviceByMac(mac)
-//                    if (bleBean == null) {
-//                        ToastUtils.tip(R.string.simple_key_is_not_connected)
-//                        return@delayOnMain
-//                    }
+                    val bleBean = BleUtil.instance?.getBleDeviceByMac(mac)
+                    if (bleBean == null) {
+                        ToastUtils.tip(R.string.simple_key_is_not_connected)
+                        return
+                    }
                     // 单bleBean json赋值
                     bleBean?.ticketSend = PresentationManager.getSimpleTicketJson()
                     bleBean?.ticketSend?.let { itJson ->
                         sendTicket(itJson, bleBean.bleDevice, loadingCallBack)
                     }
-                }
-            } else {
-                loadingCallBack.invoke(false, null, false)
-            }
-        }
+//                }
+//            } else {
+//                loadingCallBack?.invoke(false, null, false)
+//            }
+//        }
     }
 
     /**
@@ -553,7 +555,7 @@ object BusinessManager {
         mac: String,
         ticketDetail: TicketDetailRespVO,
         activity: AppCompatActivity,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?,
     ) {
         prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
             if (done) {
@@ -565,7 +567,7 @@ object BusinessManager {
                     }
                 }
             } else {
-                loadingCallBack.invoke(false, null, false)
+                loadingCallBack?.invoke(false, null, false)
             }
         }
     }
@@ -573,36 +575,36 @@ object BusinessManager {
     /**
      * 读取工作票完成情况
      */
-    fun getTicketStatusBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    fun getTicketStatusBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
             if (done) {
                 Executor.delayOnMain(500) {
-                    // TODO 蓝牙准备操作
+//                    // TODO 蓝牙准备操作
 //                    val bleBean = BleUtil.instance?.getBleDeviceByMac(mac)
 //                    if (bleBean == null) {
 //                        ToastUtils.tip(R.string.simple_key_is_not_connected)
-//                        return@delayOnMain
+//                        return
 //                    }
                     getTicketStatus(bleBean!!.bleDevice, loadingCallBack)
                 }
             } else {
-                loadingCallBack.invoke(false, null, false)
+                loadingCallBack?.invoke(false, null, false)
             }
         }
     }
 
-    private fun sendTicket(jsonStr: String, bleDevice: BleDevice, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    private fun sendTicket(jsonStr: String, bleDevice: BleDevice, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         val ctx = MyApplication.instance!!
-        loadingCallBack.invoke(true, ctx.getString(R.string.simple_start_send_ticket), null)
+        loadingCallBack?.invoke(true, ctx.getString(R.string.simple_start_send_ticket), null)
         BleCmdManager.sendWorkTicket(jsonStr, bleDevice = bleDevice, callback = object : CustomBleWriteCallback() {
             override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
                 println("sendTicket success")
-                loadingCallBack.invoke(true, ctx.getString(R.string.simple_sending_ticket), null)
+                loadingCallBack?.invoke(true, ctx.getString(R.string.simple_sending_ticket), null)
             }
 
             override fun onWriteFailure(exception: BleException?) {
                 LogUtil.e("sendTicket fail : ${bleDevice.mac}")
-                loadingCallBack.invoke(false, ctx.getString(R.string.simple_send_ticket_fail), null)
+                loadingCallBack?.invoke(false, ctx.getString(R.string.simple_send_ticket_fail), null)
             }
         })
     }
@@ -655,7 +657,7 @@ object BusinessManager {
         return jsonStr
     }
 
-    fun handleRsp(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    fun handleRsp(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         // TODO Token校验
 //        val len = byteArray[2].toInt()
 //        val token = byteArray.copyOfRange(len + 7, len + 11)
@@ -694,29 +696,29 @@ object BusinessManager {
      * job : 0x01:工作模式 0x02:待机模式
      * res : 0x01:成功 0x02:失败
      */
-    private fun handleSwitchModeResult(byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    private fun handleSwitchModeResult(byteArray: ByteArray, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         LogUtil.i("handleSwitchModeResult : ${byteArray.toHexStrings()}")
         val ctx = MyApplication.instance!!
         val job = byteArray[4]
         val res = byteArray[5]
-        loadingCallBack.invoke(false, null, null)
+        loadingCallBack?.invoke(false, null, null)
         if (res == 0x01.toByte() && job == 0x01.toByte()) {
-            loadingCallBack.invoke(false, ctx.getString(R.string.simple_switch_work_mode_success), null)
+            loadingCallBack?.invoke(false, ctx.getString(R.string.simple_switch_work_mode_success), null)
+            // TODO 切成工作模式断开,待机模式不断开
+            BleManager.getInstance().disconnectAllDevice()
         } else if (res == 0x02.toByte() && job == 0x01.toByte()) {
-            loadingCallBack.invoke(false, ctx.getString(R.string.simple_switch_standby_mode_success), null)
+            loadingCallBack?.invoke(false, ctx.getString(R.string.simple_switch_standby_mode_success), null)
         }
-        // TODO 切换完不断开
-        BleManager.getInstance().disconnectAllDevice()
     }
 
     /**
      * 工作票下发结果
      * res:0x00:成功 0x01:失败 0x02:传输超时 0x0D:当前IDX超出范围 0x0E:当前数据CRC校验失败 0x14:JSON结构错误 0x63:未知错误
      */
-    private fun handleWorkTicketResult(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    private fun handleWorkTicketResult(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         val ctx = MyApplication.instance!!
         LogUtil.i("handleWorkTicketResult : ${byteArray.toHexStrings()}")
-        loadingCallBack.invoke(false, null, null)
+        loadingCallBack?.invoke(false, null, null)
         val idx = byteArray[4] + byteArray[5]
         val total = byteArray[6] + byteArray[7]
         val res = byteArray[8]
@@ -737,7 +739,7 @@ object BusinessManager {
         } else {
             LogUtil.i("Work ticket is done")
             // 下发完毕,切换工作模式
-            loadingCallBack.invoke(true, ctx.getString(R.string.simple_switch_work_mode), null)
+            loadingCallBack?.invoke(true, ctx.getString(R.string.simple_switch_work_mode), null)
             BleCmdManager.switchMode(STATUS_WORK, bleBean.bleDevice, object : CustomBleWriteCallback() {
                 override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
                     println("switch mode 1 success")}
@@ -747,10 +749,10 @@ object BusinessManager {
             // 打开钥匙卡扣
             val keyBean = ModBusController.getKeyByMac(bleBean.bleDevice.mac)
             if (keyBean == null) {
-                loadingCallBack.invoke(false, ctx.getString(R.string.simple_key_not_found), false)
+                loadingCallBack?.invoke(false, ctx.getString(R.string.simple_key_not_found), false)
                 ToastUtils.tip(R.string.simple_key_not_exists)
             } else {
-                loadingCallBack.invoke(false, null, true)
+                loadingCallBack?.invoke(false, null, true)
                 val dock = ModBusController.getDockByKeyMac(bleBean.bleDevice.mac)
                 ModBusController.controlKeyBuckle(true, keyBean.isLeft, dock?.addr!!.toInt() - 1)
             }
@@ -760,7 +762,7 @@ object BusinessManager {
     /**
      * 处理工作票完成情况
      */
-    private fun handleTicketStatus(bleDevice: BleDevice, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    private fun handleTicketStatus(bleDevice: BleDevice, byteArray: ByteArray, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         // TODO 需要有超时重传机制
         LogUtil.i("handleTicketStatus : ${byteArray.toHexStrings()}")
         val ctx = MyApplication.instance!!
@@ -776,7 +778,7 @@ object BusinessManager {
         }
         // TODO 缺少res处理
         if (idx != total - 1) {
-            loadingCallBack.invoke(true, ctx.getString(R.string.simple_get_ticket_part), null)
+            loadingCallBack?.invoke(true, ctx.getString(R.string.simple_get_ticket_part), null)
             getTicketStatusPart((idx + 1).toByteArray(), total.toByteArray(), byteArrayOf(0x01.toByte()), bleDevice, object : CustomBleWriteCallback() {
                 override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
                     println("getTicketStatusPart success")
@@ -787,11 +789,11 @@ object BusinessManager {
                 }
             })
         } else {
-            loadingCallBack.invoke(false, ctx.getString(R.string.simple_get_ticket_status_done), null)
+            loadingCallBack?.invoke(false, ctx.getString(R.string.simple_get_ticket_status_done), null)
             BleUtil.instance?.getBleDeviceByMac(bleDevice.mac)?.let {
                 println("工作票完成接收 : ${String(it.ticketStatus)}")
                 // TD:Ticket Done
-                loadingCallBack.invoke(false, "TD${String(it.ticketStatus)}", true)
+                loadingCallBack?.invoke(false, "TD${String(it.ticketStatus)}", true)
                 // TODO 清空ticket
                 it.ticketStatus = byteArrayOf()
                 // TODO 根据工作票完成情况,切换为待机模式
@@ -851,14 +853,14 @@ object BusinessManager {
     /**
      * 获取工作票完成情况
      */
-    private fun getTicketStatus(bleDevice: BleDevice, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
-        loadingCallBack.invoke(true, "开始获取工作票", null)
+    private fun getTicketStatus(bleDevice: BleDevice, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
+        loadingCallBack?.invoke(true, MyApplication.instance?.getString(R.string.start_getting_ticket), null)
         BleCmdManager.getTicketStatus(bleDevice, object : CustomBleWriteCallback() {
             override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
-                loadingCallBack.invoke(false, "工作票获取成功", null)
+                loadingCallBack?.invoke(false, MyApplication.instance?.getString(R.string.get_ticket_success), null)
                 println("getTicketStatus success")}
             override fun onWriteFailure(exception: BleException?) {
-                loadingCallBack.invoke(false, "工作票获取失败", false)
+                loadingCallBack?.invoke(false, MyApplication.instance?.getString(R.string.get_ticket_fail), false)
                 println("getTicketStatus fail")}
         })
     }

+ 1 - 2
app/src/main/java/com/grkj/iscs/presentation/PresentationManager.kt

@@ -237,7 +237,7 @@ object PresentationManager {
                 }
                 it.isAllLocksReturned = dockLockRfidList.containsAll(ticketLockRfidList)
                 if (it.isAllLocksReturned && it.status == 5) {
-                    ToastUtils.tip("工作票已完成")
+                    ToastUtils.tip(R.string.ticket_is_done)
                     it.status = 6
                 }
             }
@@ -445,7 +445,6 @@ object PresentationManager {
                 }
             }
             // TODO 待修改
-            println("lala1 : ${mSimpleTicket?.status} - ${mSimpleTicket?.locker?.status}")
             if (mSimpleTicket?.locker?.status == 0) {
                 mSimpleTicket?.status = 2
             } else if (mSimpleTicket?.locker?.status == 1) {

+ 0 - 1
app/src/main/java/com/grkj/iscs/presentation/simple/SimpleProcessActivity.kt

@@ -113,7 +113,6 @@ class SimpleProcessActivity : BaseActivity<ActivitySimpleProcessBinding>() {
                                         val ticketStatusBean = Gson().fromJson(ticket, WorkTicketStatusBean::class.java)
                                         PresentationManager.updateSimpleTicket(ticketStatusBean)
                                         // TODO 更新mStep
-                                        println("lala : ${PresentationManager.mSimpleTicket?.status} - ${PresentationManager.mSimpleTicket?.locker?.status} - ${PresentationManager.mSimpleTicket?.isAllLocksReturned}")
                                         if (PresentationManager.mSimpleTicket!!.status!! < 3) {
                                             PresentationManager.updateStep(3)
                                         } else {

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

@@ -174,4 +174,15 @@
     <string name="simple_colocker_robin">罗宾(%s)</string>
     <string name="simple_lock_shared">已共锁</string>
     <string name="simple_lock_unlocked">已解锁</string>
+    <string name="start_scanning_for_devices">正在扫描设备...</string>
+    <string name="connect_success">连接成功</string>
+    <string name="start_indicating">开始监听...</string>
+    <string name="indicate_fail">监听失败</string>
+    <string name="start_getting_token">开始获取token...</string>
+    <string name="get_token_success">token获取成功</string>
+    <string name="get_token_fail">token获取失败</string>
+    <string name="start_getting_ticket">开始获取工作票</string>
+    <string name="get_ticket_success">工作票获取成功</string>
+    <string name="get_ticket_fail">工作票获取失败</string>
+    <string name="ticket_is_done">工作票已完成</string>
 </resources>

+ 136 - 125
app/src/main/res/values/strings.xml

@@ -1,153 +1,153 @@
 <resources>
     <string name="app_name">ISCS</string>
 
-    <string name="common_net_dis">请确认网络状态正常后重试!</string>
-    <string name="common_net_download">请确认网络状态正常且下载地址无误后重试!</string>
-    <string name="common_download_erro_notag">下载失败!请确认文件存储位置后重试</string>
+    <string name="common_net_dis">Please ensure the network status is normal before retrying!</string>
+    <string name="common_net_download">Please ensure the network status is normal and the download address is correct before retrying!</string>
+    <string name="common_download_erro_notag">Download failed! Please check the file storage location and try again.</string>
 
-    <string name="title_bar_current_work_ticket_num">当前作业数:%d</string>
-    <string name="home_page">主页</string>
+    <string name="title_bar_current_work_ticket_num">Current work permit: %d</string>
+    <string name="home_page">Home Page</string>
 
-    <string name="enter_system">进入系统</string>
+    <string name="enter_system">Enter System</string>
 
-    <string name="swipe_card_on_machine">请在机器上刷卡</string>
-    <string name="auth_success">认证通过!</string>
-    <string name="auth_fail">认证失败,请重试!</string>
+    <string name="swipe_card_on_machine">Please swipe your card on the machine</string>
+    <string name="auth_success">Authentication successful!</string>
+    <string name="auth_fail">Authentication successful!</string>
 
     <string name="selectable_input_prefix">*</string>
 
-    <string name="sop_number">作业编号</string>
-    <string name="sop_name">作业名称</string>
-    <string name="sop_type">作业类型</string>
-    <string name="start_time">开始时间</string>
-    <string name="end_time">结束时间</string>
-    <string name="current_time">当前时间</string>
-    <string name="current_sop_number">当前作业票数量</string>
-
-    <string name="ble_no_device_found">没有扫描到设备</string>
-    <string name="ble_connecting">连接中,请稍后...</string>
-    <string name="ble_connect_fail">连接失败,请重试!</string>
-    <string name="ble_disconnect">连接断开了,请重试!</string>
-
-    <string name="ticket_code_is_null">请填写作业票编号</string>
-    <string name="ticket_name_is_null">请填写作业票名称</string>
-    <string name="work_shop_is_null">请选择所属车间</string>
-    <string name="work_area_is_null">请选择所属区域</string>
-    <string name="sop_is_null">请选择SOP</string>
-    <string name="ticket_type_is_null">请选择作业票类型</string>
-
-    <string name="login_tip">请输入用户名和密码或者刷卡进行登录</string>
-    <string name="please_input_account">请输入账户</string>
-    <string name="please_input_password">请输入密码</string>
-    <string name="account_or_password_error">账号或密码错误</string>
-    <string name="confirm">确定</string>
-    <string name="device_is_initializing">正在初始化设备……</string>
-    <string name="create_ticket">开作业票</string>
-    <string name="current_tickets">当前作业票</string>
-    <string name="history_tickets">历史作业票</string>
-    <string name="please_login">请登录</string>
-
-    <string name="exit">退出</string>
-
-    <string name="not_started">未开始</string>
-    <string name="ready_to_lock">待上锁</string>
-    <string name="on_process">进行中</string>
-    <string name="ready_to_unlock">待解锁</string>
-    <string name="unlocked">已解锁</string>
-    <string name="finished">已结束</string>
-    <string name="key_return_confirm_tip">工作票尚未完成,是否确认归还钥匙?</string>
-    <string name="cancel">取消</string>
-    <string name="ticket_id_is_null">作业票编号不能为空</string>
-    <string name="lock_is_not_enough">锁具数量不足</string>
-    <string name="key_is_not_enough">钥匙数量不足</string>
-    <string name="get_key_info_fail">获取钥匙信息失败</string>
-
-    <string name="ticket_is_finished">工作票已完成</string>
-    <string name="ticket_is_locker_part_finished">工作票上锁人部分已完成</string>
-    <string name="ticket_is_colocker_part_finished">工作票共锁人部分已完成</string>
-
-    <string name="key_not_exists">钥匙不存在</string>
-
-    <string name="make_sure_to_colock">确定要共锁吗?</string>
-    <string name="make_sure_to_unlock">确定要解锁吗?</string>
-    <string name="key_return_tip">将读取工作票完成情况</string>
+    <string name="sop_number">Work Permit Number</string>
+    <string name="sop_name">Work Permit Number</string>
+    <string name="sop_type">Work Permit Type</string>
+    <string name="start_time">Start Time</string>
+    <string name="end_time">End Time</string>
+    <string name="current_time">Current Time</string>
+    <string name="current_sop_number">Current Work Permit Count</string>
+
+    <string name="ble_no_device_found">No devices found</string>
+    <string name="ble_connecting">Connecting, please wait...</string>
+    <string name="ble_connect_fail">Connection failed, please try again!</string>
+    <string name="ble_disconnect">Connection lost, please try again!</string>
+
+    <string name="ticket_code_is_null">Please enter the work permit number</string>
+    <string name="ticket_name_is_null">Please enter the work permit name</string>
+    <string name="work_shop_is_null">Please select the workshop</string>
+    <string name="work_area_is_null">Please select the area</string>
+    <string name="sop_is_null">Please select SOP</string>
+    <string name="ticket_type_is_null">Please select the work permit type</string>
+
+    <string name="login_tip">Please enter your username and password or swipe your card to log in</string>
+    <string name="please_input_account">Please enter your username and password or swipe your card to log in</string>
+    <string name="please_input_password">Please enter your password</string>
+    <string name="account_or_password_error">Incorrect account or password</string>
+    <string name="confirm">Confirm</string>
+    <string name="device_is_initializing">Initializing device...</string>
+    <string name="create_ticket">Create Work Permit</string>
+    <string name="current_tickets">Current Work Permit</string>
+    <string name="history_tickets">Historical Work Permit</string>
+    <string name="please_login">Please log in</string>
+
+    <string name="exit">Exit</string>
+
+    <string name="not_started">Exit</string>
+    <string name="ready_to_lock">Ready to Lock</string>
+    <string name="on_process">In Progress</string>
+    <string name="ready_to_unlock">Ready to Unlock</string>
+    <string name="unlocked">Unlocked</string>
+    <string name="finished">Finished</string>
+    <string name="key_return_confirm_tip">The work permit is not yet completed. Do you confirm the return of the key?</string>
+    <string name="cancel">Cancel</string>
+    <string name="ticket_id_is_null">The work permit number cannot be empty</string>
+    <string name="lock_is_not_enough">Insufficient number of locks</string>
+    <string name="key_is_not_enough">Insufficient number of keys</string>
+    <string name="get_key_info_fail">Failed to retrieve key information</string>
+
+    <string name="ticket_is_finished">The work permit is completed</string>
+    <string name="ticket_is_locker_part_finished">The locker portion of the work permit is completed</string>
+    <string name="ticket_is_colocker_part_finished">The co-locker portion of the work permit is completed</string>
+
+    <string name="key_not_exists">The key does not exist</string>
+
+    <string name="make_sure_to_colock">Are you sure you want to co-lock?</string>
+    <string name="make_sure_to_unlock">Are you sure you want to unlock?</string>
+    <string name="key_return_tip">Key completion status will be read</string>
 
     <!--  演示页  -->
-    <string name="presentation_select_sop">选择SOP</string>
-    <string name="presentation_select_workshop">选择车间</string>
-    <string name="presentation_select_line">选择产线</string>
-    <string name="presentation_ticket_name">作业票名称</string>
-    <string name="presentation_ticket_number">作业票编号</string>
-    <string name="presentation_ticket_type">作业票类型</string>
-    <string name="presentation_segregation_point">隔离点</string>
-    <string name="presentation_person_lock">上锁人</string>
-    <string name="presentation_person_lock_together">共锁人</string>
-    <string name="presentation_person_safety">安全员</string>
-    <string name="presentation_ticket_content">作业内容</string>
-
-    <string name="presentation_hint_workshop">请选择车间</string>
-    <string name="presentation_hint_line">请选择产线</string>
-    <string name="presentation_hint_sop">请选择...</string>
-    <string name="presentation_hint_name">请选择</string>
-    <string name="presentation_hint_number">请输入作业编号</string>
-    <string name="presentation_hint_type">请选择作业类型</string>
-    <string name="presentation_hint_point">请输入隔离点</string>
-    <string name="presentation_hint_locker">请选择上锁人</string>
-    <string name="presentation_hint_together">请输入共锁人</string>
-    <string name="presentation_hint_safety">请选择安全员</string>
-    <string name="presentation_hint_content">请输入作业内容</string>
-
-    <string name="presentation_login_tip">请刷卡登录</string>
+    <string name="presentation_select_sop">Select SOP</string>
+    <string name="presentation_select_workshop">Select Workshop</string>
+    <string name="presentation_select_line">Select Production Line</string>
+    <string name="presentation_ticket_name">Work Permit Name</string>
+    <string name="presentation_ticket_number">Work Permit Number</string>
+    <string name="presentation_ticket_type">Work Permit Type</string>
+    <string name="presentation_segregation_point">Isolation Point</string>
+    <string name="presentation_person_lock">Locker</string>
+    <string name="presentation_person_lock_together">Co-locker</string>
+    <string name="presentation_person_safety">Safety Officer</string>
+    <string name="presentation_ticket_content">Work Content</string>
+
+    <string name="presentation_hint_workshop">Please select a workshop</string>
+    <string name="presentation_hint_line">Please select a production line</string>
+    <string name="presentation_hint_sop">Please select...</string>
+    <string name="presentation_hint_name">Please select</string>
+    <string name="presentation_hint_number">Please enter the work permit number</string>
+    <string name="presentation_hint_type">Please select the work type</string>
+    <string name="presentation_hint_point">Please enter the isolation point</string>
+    <string name="presentation_hint_locker">Please select the locker</string>
+    <string name="presentation_hint_together">Please enter the co-locker</string>
+    <string name="presentation_hint_safety">Please select the safety officer</string>
+    <string name="presentation_hint_content">Please enter the work content</string>
+
+    <string name="presentation_login_tip">Please swipe your card to log in</string>
 
     <!--  简易版单机演示Demo  -->
-    <string name="simple_config_file_tip">未找到 presentation.txt 文件,请先在手机Download目录创建 presentation 文件夹,并将 presentation.txt 文件放入</string>
+    <string name="simple_config_file_tip">presentation.txt file not found. Please create a "presentation" folder in the phone's Download directory and place the presentation.txt file inside.</string>
     <string name="simple_please_swipe_card">Card Swipe Login</string>
-    <string name="simple_device_is_initializing">正在初始化设备...</string>
-    <string name="simple_login_success_welcome">登录成功,欢迎 %s</string>
+    <string name="simple_device_is_initializing">Initializing device...</string>
+    <string name="simple_login_success_welcome">Login successful, welcome %s</string>
     <string name="simple_setting">Settings</string>
     <string name="simple_return_home">Home</string>
     <string name="simple_start_ticket">Execute Work Permit</string>
     <string name="simple_ticket_content">Work Permit Content</string>
-    <string name="simple_ticket_tip">流程提⽰\n1、主锁⼈去挂锁,钥匙去隔离点上锁\n2、通知维修⼯,维修⼯去 现场确认是否已锁定并能源隔离\n3、维修⼯确认共锁\n4、维修⼯进场维修\n5、维修结束,维修⼯解除共锁\n6、主锁⼈解锁,并归还钥匙与挂锁</string>
+    <string name="simple_ticket_tip">Process Instructions: \n1. The primary lock owner takes the key and locks, confirms the isolation points, and locks them.\n2. The primary lock owner returns the key, and the locks status are updated.\n3. The maintenance workers confirm the on-site lock and energy isolation, then clock in to share lock.\n4. The maintenance workers perform their work.\n5. After work finished, the maintenance workers remove the shared lock.\n6. The primary lock owner unlocks and returns the key and locks.</string>
     <string name="simple_confirm">Confirm</string>
     <string name="simple_locking">Locking in progress</string>
     <string name="simple_wait_for_key_return">Waiting for key return.</string>
-    <string name="simple_wait_for_colockers_confirm">Waiting for maintenance workers to confrm and share lock</string>
-    <string name="simple_colocker_tip">作业票已开始执⾏,请维修⼯确认现场是否已锁定,并能源是否已隔离\n确认后请打卡共锁</string>
-    <string name="simple_wait_for_colockers_action">等待维修工共锁</string>
-    <string name="simple_colocker">共锁人</string>
-    <string name="simple_locker">上锁人</string>
+    <string name="simple_wait_for_colockers_confirm">Waiting for maintenance workers to confirm and share lock.</string>
+    <string name="simple_colocker_tip">The work permit execution has started. Maintenance workers must confirm on-site locking and energy isolation. After confirmation, swipe to share lock.</string>
+    <string name="simple_wait_for_colockers_action">Waiting for maintenance workers to share lock</string>
+    <string name="simple_colocker">Co-locker</string>
+    <string name="simple_locker">Locker</string>
     <string name="simple_in_maintenance">Maintenance in progress</string>
-    <string name="simple_maintenance_tip">请维修⼈员,维修作业结束后,打卡解除共锁</string>
+    <string name="simple_maintenance_tip">Maintenance workers, please swipe to unlock the co-lock after completing the maintenance.</string>
     <string name="simple_maintenance_finished">Maintenance Completed</string>
     <string name="simple_reset_ticket">Reset Work Permit</string>
-    <string name="simple_close_all_lock_buckles">Lock storage close</string>
-    <string name="simple_open_all_lock_buckles">Lock storage close</string>
-    <string name="simple_close_all_key_buckles">Key storage close</string>
-    <string name="simple_open_all_key_buckles">Key storage open</string>
+    <string name="simple_close_all_lock_buckles">Lock storage closed</string>
+    <string name="simple_open_all_lock_buckles">Lock storage opened</string>
+    <string name="simple_close_all_key_buckles">Key storage closed</string>
+    <string name="simple_open_all_key_buckles">Key storage opened</string>
     <string name="simple_setting_tip">Settings Page, Authorized Personnel Only</string>
-    <string name="simple_step_error">步骤异常</string>
-    <string name="simple_lock_no_ticket_to_handle">暂无可处理的工作票</string>
-    <string name="simple_workshop_assemble">组装车间</string>
-    <string name="simple_sop_type">保养</string>
-    <string name="simple_line">打包线</string>
-
-    <string name="simple_no_lock_dock">没有找到挂锁底座</string>
-    <string name="simple_lock_count_not_enough">挂锁数量不够</string>
-    <string name="simple_key_count_not_enough">钥匙数量不够</string>
-    <string name="simple_key_rfid_is_null">没有找到钥匙的RFID</string>
-    <string name="simple_locker_finished">解锁已完成</string>
-    <string name="simple_start_send_ticket">开始下发工作票...</string>
-    <string name="simple_sending_ticket">工作票下发中...</string>
-    <string name="simple_send_ticket_fail">工作票下发失败</string>
-    <string name="simple_switch_work_mode">切换钥匙为工作模式</string>
-    <string name="simple_key_not_found">未找到钥匙</string>
-    <string name="simple_key_not_exists">钥匙不存在</string>
-    <string name="simple_switch_work_mode_success">切换工作模式成功</string>
-    <string name="simple_switch_standby_mode_success">切换待机模式成功</string>
-    <string name="simple_get_ticket_part">获取工作票分包</string>
-    <string name="simple_get_ticket_status_done">工作票完成状态读取完成</string>
-    <string name="simple_no_key_ticket_data">钥匙无工作票数据</string>
+    <string name="simple_step_error">Step error</string>
+    <string name="simple_lock_no_ticket_to_handle">No work permit available for processing</string>
+    <string name="simple_workshop_assemble">Assembly Workshop</string>
+    <string name="simple_sop_type">Maintenance</string>
+    <string name="simple_line">Packing Line</string>
+
+    <string name="simple_no_lock_dock">No lock dock found</string>
+    <string name="simple_lock_count_not_enough">Insufficient number of locks</string>
+    <string name="simple_key_count_not_enough">Insufficient number of keys</string>
+    <string name="simple_key_rfid_is_null">No RFID found for the key</string>
+    <string name="simple_locker_finished">Unlocking completed</string>
+    <string name="simple_start_send_ticket">Starting to issue work permit...</string>
+    <string name="simple_sending_ticket">Work permit issuing in progress...</string>
+    <string name="simple_send_ticket_fail">Failed to issue work permit</string>
+    <string name="simple_switch_work_mode">Switch key to work mode</string>
+    <string name="simple_key_not_found">Key not found</string>
+    <string name="simple_key_not_exists">Key does not exist</string>
+    <string name="simple_switch_work_mode_success">Work mode switched successfully</string>
+    <string name="simple_switch_standby_mode_success">Standby mode switched successfully</string>
+    <string name="simple_get_ticket_part">Fetching work permit section</string>
+    <string name="simple_get_ticket_status_done">Work permit completion status retrieved successfully</string>
+    <string name="simple_no_key_ticket_data">No work permit data found on the key</string>
     <string name="simple_ticket_is_done">Work Permit Completed</string>
 
     <string name="simple_title">Intelligent LOTO System</string>
@@ -174,4 +174,15 @@
     <string name="simple_colocker_robin">Robin</string>
     <string name="simple_lock_shared">Lock shared</string>
     <string name="simple_lock_unlocked">Unlocked</string>
+    <string name="start_scanning_for_devices">Scanning for devices...</string>
+    <string name="connect_success">Connection success</string>
+    <string name="start_indicating">Start indicating...</string>
+    <string name="indicate_fail">Indicate fail</string>
+    <string name="start_getting_token">Start getting token...</string>
+    <string name="get_token_success">Token obtained successfully</string>
+    <string name="get_token_fail">Failed to obtain token</string>
+    <string name="start_getting_ticket">Start getting work permit</string>
+    <string name="get_ticket_success">Work permit obtained successfully</string>
+    <string name="get_ticket_fail">Failed to obtain work permit</string>
+    <string name="ticket_is_done">Work permit completed</string>
 </resources>