From e724cc75ee916142849d5a40a28e5422c4f66586 Mon Sep 17 00:00:00 2001 From: MT <3075067877@qq.com> Date: Sun, 14 Sep 2025 19:04:31 +0800 Subject: [PATCH] fix 7.1 --- .../com/ouxuan/oxface/OXFaceOnlineActivity.java | 44 +++++++++++++++- .../oxface/abgate/GateUnavailableDialog.java | 61 ++++++++++++++++++++-- .../com/ouxuan/oxface/device/GateABController.java | 29 ++++++++++ 3 files changed, 129 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java index 91bd366..9ede2af 100644 --- a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java @@ -702,8 +702,13 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi // 检查是否应该显示弹窗 boolean shouldShow = gateUnavailableDialog.checkShow(OXFaceOnlineActivity.this, isNetworkAvailable()); if (shouldShow) { - // 如果已有弹窗存在,更新内容;如果没有,显示新弹窗 - gateUnavailableDialog.updateGateStateError(reason); + // 获取当前门状态信息 + GateABController.GateABState currentState = gateABController.getCurrentGateState(); + // 如果已有弹窗存在,更新内容(带门状态信息);如果没有,显示新弹窗 + gateUnavailableDialog.updateGateStateError(reason, + currentState.gateAOpen, + currentState.gateBOpen, + currentState.udpConnected); LogManager.logInfo(TAG, "已更新门禁不可用弹窗内容: " + reason); } else { LogManager.logInfo(TAG, "根据业务规则,不显示门禁不可用弹窗"); @@ -722,6 +727,29 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi // 恢复摄像头预览(与弹窗的onDialogHide回调保持一致) resumeCamera(); } + + @Override + public void onGateStatusUpdate(boolean gateAOpen, boolean gateBOpen, boolean udpConnected) { + // 实时更新弹窗中的门状态显示 + if (gateUnavailableDialog != null && gateUnavailableDialog.isShowing()) { + LogManager.logInfo(TAG, "更新弹窗中的门状态显示: A门-" + + (gateAOpen ? "开启" : "关闭") + ", B门-" + + (gateBOpen ? "开启" : "关闭") + ", UDP-" + + (udpConnected ? "正常" : "异常")); + + // 更新弹窗中的门状态显示(保持原有消息不变) + String currentReason = getCurrentDialogReason(); + gateUnavailableDialog.updateGateStateError(currentReason, gateAOpen, gateBOpen, udpConnected); + } + + // 特别处理:如果A门和B门都关闭且UDP正常,且有弹窗正在显示,应该关闭弹窗 + if (!gateAOpen && !gateBOpen && udpConnected && + gateUnavailableDialog != null && gateUnavailableDialog.isShowing()) { + LogManager.logInfo(TAG, "A门和B门都关闭且UDP正常,关闭门禁不可用弹窗"); + gateUnavailableDialog.hide(); + resumeCamera(); + } + } }); // 初始化门禁不可用弹窗 @@ -775,6 +803,18 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi } /** + * 获取当前弹窗的原因消息(用于状态更新时保持原有消息) + * @return 当前弹窗的原因消息 + */ + private String getCurrentDialogReason() { + if (gateABController != null) { + GateABController.GateABState currentState = gateABController.getCurrentGateState(); + return currentState.getUnavailableReason(); + } + return "门禁状态异常"; // 默认消息 + } + + /** * 显示新的人数异常弹窗 * @param isLeaveScene 是否为离场场景 * @param peopleNum 门内人数 diff --git a/app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java b/app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java index 5931686..03e4f95 100644 --- a/app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java +++ b/app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java @@ -101,9 +101,18 @@ public class GateUnavailableDialog { tvMessage.setGravity(Gravity.CENTER); tvMessage.setLineSpacing(5, 1.2f); + // 门状态显示 + tvGateStatus = new TextView(context); + tvGateStatus.setTextSize(14); + tvGateStatus.setTextColor(Color.parseColor("#666666")); + tvGateStatus.setGravity(Gravity.CENTER); + tvGateStatus.setPadding(0, 10, 0, 0); + tvGateStatus.setText("门状态:A门-未知, B门-未知"); // 默认状态 + // 添加视图到容器 contentLayout.addView(tvTitle); contentLayout.addView(tvMessage); + contentLayout.addView(tvGateStatus); // 添加门状态显示 // 设置内容布局参数 LinearLayout.LayoutParams contentParams = new LinearLayout.LayoutParams( @@ -137,8 +146,51 @@ public class GateUnavailableDialog { } /** - * 更新弹窗内容 - * 如果弹窗正在显示,直接更新内容;如果没有显示,则显示弹窗 + * 更新门状态显示 + * @param gateAOpen A门是否开启 + * @param gateBOpen B门是否开启 + * @param udpConnected UDP连接状态 + */ + private void updateGateStatusDisplay(boolean gateAOpen, boolean gateBOpen, boolean udpConnected) { + String gateAStatus = gateAOpen ? "开启" : "关闭"; + String gateBStatus = gateBOpen ? "开启" : "关闭"; + String udpStatus = udpConnected ? "正常" : "异常"; + + String statusText = "门状态:A门-" + gateAStatus + ", B门-" + gateBStatus + " | UDP-" + udpStatus; + tvGateStatus.setText(statusText); + + LogManager.logInfo(TAG, "更新门状态显示: " + statusText); + } + + /** + * 更新门状态异常弹窗内容(带门状态信息) + * @param reason 新的不可用原因 + * @param gateAOpen A门是否开启 + * @param gateBOpen B门是否开启 + * @param udpConnected UDP连接状态 + */ + public void updateGateStateError(String reason, boolean gateAOpen, boolean gateBOpen, boolean udpConnected) { + LogManager.logInfo(TAG, "更新门状态异常弹窗内容: " + reason + + ", A门: " + (gateAOpen ? "开启" : "关闭") + + ", B门: " + (gateBOpen ? "开启" : "关闭") + + ", UDP: " + (udpConnected ? "正常" : "异常")); + + tvTitle.setText("门禁不可用"); + tvMessage.setText(reason); + + // 更新门状态显示 + updateGateStatusDisplay(gateAOpen, gateBOpen, udpConnected); + + // 如果弹窗未显示,则显示弹窗 + if (!isShowing) { + show(); + } else { + LogManager.logInfo(TAG, "弹窗已显示,仅更新内容"); + } + } + + /** + * 更新门状态异常弹窗内容(简化版,不显示门状态) * @param reason 新的不可用原因 */ public void updateGateStateError(String reason) { @@ -147,6 +199,8 @@ public class GateUnavailableDialog { tvTitle.setText("门禁不可用"); tvMessage.setText(reason); + // 不更新门状态显示,保持之前的状态 + // 如果弹窗未显示,则显示弹窗 if (!isShowing) { show(); @@ -157,7 +211,6 @@ public class GateUnavailableDialog { /** * 更新人数异常弹窗内容 - * 如果弹窗正在显示,直接更新内容;如果没有显示,则显示弹窗 * @param isLeaveScene 是否为离场场景 * @param peopleCount 门内人数 */ @@ -176,6 +229,8 @@ public class GateUnavailableDialog { tvTitle.setText("门禁不可用"); tvMessage.setText(message); + // 不更新门状态显示,保持之前的状态 + // 如果弹窗未显示,则显示弹窗 if (!isShowing) { show(); diff --git a/app/src/main/java/com/ouxuan/oxface/device/GateABController.java b/app/src/main/java/com/ouxuan/oxface/device/GateABController.java index 6370f0c..dd4fb31 100644 --- a/app/src/main/java/com/ouxuan/oxface/device/GateABController.java +++ b/app/src/main/java/com/ouxuan/oxface/device/GateABController.java @@ -1005,6 +1005,11 @@ public class GateABController { if (gateStateListener instanceof GateUnavailableListener) { GateUnavailableListener unavailableListener = (GateUnavailableListener) gateStateListener; + // 先触发门状态实时更新回调(用于更新弹窗中的门状态显示) + unavailableListener.onGateStatusUpdate(currentGateState.gateAOpen, + currentGateState.gateBOpen, + currentGateState.udpConnected); + // 如果需要显示弹窗,触发不可用回调 if (finalShouldShowDialog) { unavailableListener.onGateUnavailable(currentGateState.getUnavailableReason()); @@ -1014,9 +1019,23 @@ public class GateABController { LogManager.logInfo(TAG, "触发门禁恢复可用回调,隐藏弹窗并恢复摄像头"); unavailableListener.onGateAvailable(); } + // 特别处理:如果A门和B门都关闭,且有弹窗正在显示,应该关闭弹窗 + else if (!currentGateState.gateAOpen && !currentGateState.gateBOpen && currentGateState.udpConnected) { + LogManager.logInfo(TAG, "A门和B门都关闭,触发门禁恢复可用回调"); + unavailableListener.onGateAvailable(); + } } }); } + // 即使状态没有变化,也要触发实时状态更新(用于更新弹窗显示) + else if (gateStateListener instanceof GateUnavailableListener) { + GateUnavailableListener unavailableListener = (GateUnavailableListener) gateStateListener; + syncHandler.post(() -> { + unavailableListener.onGateStatusUpdate(currentGateState.gateAOpen, + currentGateState.gateBOpen, + currentGateState.udpConnected); + }); + } } /** @@ -1034,6 +1053,16 @@ public class GateABController { * 门禁恢复可用状态时触发 */ void onGateAvailable(); + + /** + * 门状态实时更新时触发(用于更新弹窗中的门状态显示) + * @param gateAOpen A门是否开启 + * @param gateBOpen B门是否开启 + * @param udpConnected UDP连接状态 + */ + default void onGateStatusUpdate(boolean gateAOpen, boolean gateBOpen, boolean udpConnected) { + // 默认空实现,子类可选择实现 + } } }