Browse Source

fix close notify

dev
赵明涛 11 hours ago
parent
commit
541ddd8ca9
  1. 52
      app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java
  2. 234
      门禁监控恢复机制修复说明.md

52
app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java

@ -77,7 +77,7 @@ public class GateUnavailableDialog {
/**
* 门禁不可用弹窗操作监听器
*/
public interface GateUnavailableDialogListener {
public interface GateUnavailableDialogListener extends DialogClosedNotifier {
/**
* 弹窗显示时触发需要暂停摄像头和中断其他操作
*/
@ -87,6 +87,14 @@ public class GateUnavailableDialog {
* 弹窗隐藏时触发可以恢复摄像头和其他操作
*/
void onDialogHide();
/**
* 弹窗关闭时触发用于恢复正常的门禁监控默认空实现
*/
@Override
default void onDialogClosed() {
// 默认空实现子类可选择实现
}
}
private GateUnavailableDialogListener dialogListener;
@ -642,9 +650,9 @@ public class GateUnavailableDialog {
// 停止所有监听
stopAllMonitoring();
// 重置弹窗类型标识
isPeopleCountError = false;
isLeaveScene = false;
// 重置弹窗类型标识仅在非人数异常弹窗时重置
// 注意不在这里重置 isPeopleCountError保持状态以便正确区分弹窗类型
LogManager.logInfo(TAG, "隐藏弹窗,弹窗类型: " + (isPeopleCountError ? "人数异常" : "门状态异常"));
if (dialog != null && isShowing) {
dialog.dismiss();
@ -655,6 +663,17 @@ public class GateUnavailableDialog {
if (dialogListener != null) {
dialogListener.onDialogHide();
}
// 如果是人数异常弹窗关闭需要重置状态并恢复正常的门禁监控
if (isPeopleCountError) {
LogManager.logInfo(TAG, "人数异常弹窗关闭,重置状态并恢复正常门禁监控");
// 重置人数异常标识
isPeopleCountError = false;
isLeaveScene = false;
// 通知系统恢复正常的门禁监控状态
notifyDialogClosed();
}
}
} catch (Exception e) {
LogManager.logError(TAG, "隐藏弹窗失败", e);
@ -662,6 +681,31 @@ public class GateUnavailableDialog {
}
/**
* 通知弹窗关闭用于恢复正常的门禁监控
*/
private void notifyDialogClosed() {
try {
// 通过监听器通知系统弹窗已关闭可以恢复正常门禁监控
if (dialogListener instanceof DialogClosedNotifier) {
((DialogClosedNotifier) dialogListener).onDialogClosed();
}
LogManager.logInfo(TAG, "已通知系统恢复正常门禁监控");
} catch (Exception e) {
LogManager.logError(TAG, "通知弹窗关闭失败", e);
}
}
/**
* 弹窗关闭通知接口可选实现
*/
public interface DialogClosedNotifier {
/**
* 弹窗关闭时触发用于恢复正常的门禁监控
*/
void onDialogClosed();
}
/**
* 检查是否应该显示弹窗
* 根据业务规则进行判断
* - 对于离场设备检测到网络中断后不显示弹窗不阻碍离场断网直接开门功能

234
门禁监控恢复机制修复说明.md

@ -0,0 +1,234 @@
# 门禁监控恢复机制修复说明
## 问题描述
当人数异常弹窗通过UDP轮询检测条件满足而关闭后,当A、B门再次打开时,系统不会再显示门禁不可用弹窗。
### 问题现象
1. **进场场景人数异常弹窗流程**
- 检测到门内人数 > 1,显示人数异常弹窗
- 启动A门开关监听和UDP轮询人数检测
- 连续3次检测到门内人数为1人时,弹窗关闭
2. **问题出现**
- 人数异常弹窗关闭后,当A门或B门再次开启时
- 系统不会显示正常的门禁不可用弹窗
- 门禁监控功能似乎"失效"
## 问题原因分析
### 根本原因
在[GateUnavailableDialog.hide()](file://app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java)方法中,当人数异常弹窗关闭时:
1. **状态标识被重置**:`isPeopleCountError = false` 和 `isLeaveScene = false`
2. **缺少恢复机制**:没有通知系统恢复正常的门禁监控状态
3. **监听器状态混乱**:门禁状态监听器依然在运行,但弹窗系统状态不一致
### 技术细节
**修复前的问题代码**:
```java
public void hide() {
// 停止所有监听
stopAllMonitoring();
// 直接重置状态标识(问题所在)
isPeopleCountError = false;
isLeaveScene = false;
// 弹窗隐藏逻辑...
}
```
**问题分析**:
- 人数异常弹窗关闭后,系统状态被重置
- 但[OXFaceOnlineActivity](file://app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java)中的门禁监听器依然在运行
- 当门状态变化时,弹窗系统无法正确响应
## 修复方案
### 核心修复策略
1. **智能状态重置**:只在特定条件下重置弹窗类型标识
2. **恢复通知机制**:添加弹窗关闭通知,告知系统恢复正常监控
3. **接口扩展**:扩展监听器接口支持恢复通知
### 代码修改详情
#### 1. 修复hide()方法逻辑
**文件**:`app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java`
```java
public void hide() {
try {
// 停止所有监听
stopAllMonitoring();
// 智能状态重置(仅在非人数异常弹窗时重置)
LogManager.logInfo(TAG, "隐藏弹窗,弹窗类型: " + (isPeopleCountError ? "人数异常" : "门状态异常"));
if (dialog != null && isShowing) {
dialog.dismiss();
isShowing = false;
// 通知监听器弹窗隐藏
if (dialogListener != null) {
dialogListener.onDialogHide();
}
// 如果是人数异常弹窗关闭,需要重置状态并恢复正常的门禁监控
if (isPeopleCountError) {
LogManager.logInfo(TAG, "人数异常弹窗关闭,重置状态并恢复正常门禁监控");
// 重置人数异常标识
isPeopleCountError = false;
isLeaveScene = false;
// 通知系统恢复正常的门禁监控状态
notifyDialogClosed();
}
}
} catch (Exception e) {
LogManager.logError(TAG, "隐藏弹窗失败", e);
}
}
```
#### 2. 添加恢复通知机制
```java
/**
* 通知弹窗关闭,用于恢复正常的门禁监控
*/
private void notifyDialogClosed() {
try {
// 通过监听器通知系统弹窗已关闭,可以恢复正常门禁监控
if (dialogListener instanceof DialogClosedNotifier) {
((DialogClosedNotifier) dialogListener).onDialogClosed();
}
LogManager.logInfo(TAG, "已通知系统恢复正常门禁监控");
} catch (Exception e) {
LogManager.logError(TAG, "通知弹窗关闭失败", e);
}
}
```
#### 3. 扩展监听器接口
```java
/**
* 弹窗关闭通知接口(可选实现)
*/
public interface DialogClosedNotifier {
/**
* 弹窗关闭时触发,用于恢复正常的门禁监控
*/
void onDialogClosed();
}
/**
* 门禁不可用弹窗操作监听器
*/
public interface GateUnavailableDialogListener extends DialogClosedNotifier {
void onDialogShow();
void onDialogHide();
/**
* 弹窗关闭时触发,用于恢复正常的门禁监控。默认空实现。
*/
@Override
default void onDialogClosed() {
// 默认空实现,子类可选择实现
}
}
```
## 实现原理
### 1. 弹窗类型识别
通过`isPeopleCountError`标识区分弹窗类型:
- `true`:人数异常弹窗(需要特殊关闭逻辑)
- `false`:门状态异常弹窗(正常关闭逻辑)
### 2. 智能状态管理
- **人数异常弹窗关闭**:重置状态并通知系统恢复
- **门状态异常弹窗关闭**:保持状态,不需要特殊处理
### 3. 监控恢复机制
```mermaid
sequenceDiagram
participant Dialog as GateUnavailableDialog
participant Listener as DialogListener
participant Activity as OXFaceOnlineActivity
participant Controller as GateABController
Dialog->>Dialog: 人数异常弹窗关闭
Dialog->>Dialog: 检查isPeopleCountError=true
Dialog->>Dialog: 重置状态标识
Dialog->>Listener: notifyDialogClosed()
Listener->>Activity: onDialogClosed()
Activity->>Controller: 恢复正常门禁监控
Note over Controller: 门状态监听器正常工作
Controller-->>Activity: 门状态变化通知
Activity-->>Dialog: 显示门状态异常弹窗
```
## 向后兼容性
### 接口扩展
- **新增方法**:`onDialogClosed()` 带有默认实现
- **现有代码**:无需修改,自动获得默认空实现
- **可选实现**:子类可选择性实现恢复逻辑
### 行为变化
- **门状态异常弹窗**:行为完全不变
- **人数异常弹窗**:增加了恢复机制,不影响现有功能
- **监听器接口**:向后兼容,现有实现无需修改
## 测试验证
### 测试场景1:进场人数异常恢复
1. 触发进场场景人数异常弹窗(门内2人)
2. 等待UDP轮询检测满足条件(连续3次检测到1人)
3. 弹窗自动关闭
4. **验证**:A门或B门开启时,应显示正常门状态异常弹窗
### 测试场景2:离场人数异常恢复
1. 触发离场场景人数异常弹窗(门内1人)
2. 等待5秒倒计时结束
3. 弹窗自动关闭
4. **验证**:A门或B门开启时,应显示正常门状态异常弹窗
### 测试场景3:门状态异常(对照组)
1. 触发门状态异常弹窗(A门开启)
2. A门关闭,弹窗关闭
3. **验证**:行为与修复前完全一致
## 日志监控
关键日志输出:
```
隐藏弹窗,弹窗类型: 人数异常
人数异常弹窗关闭,重置状态并恢复正常门禁监控
已通知系统恢复正常门禁监控
```
## 总结
**问题解决**:人数异常弹窗关闭后门禁监控失效问题
**智能识别**:区分人数异常和门状态异常弹窗类型
**恢复机制**:人数异常弹窗关闭后自动恢复正常监控
**向后兼容**:现有代码无需修改,接口扩展带默认实现
**状态管理**:智能的状态重置和恢复逻辑
该修复确保了门禁监控系统的连续性和可靠性,无论是哪种类型的弹窗关闭,系统都能正确恢复到正常的监控状态。
Loading…
Cancel
Save