dongliang
|
ae899b3474
|
feat: NFC 打卡成功后 EventBus 通知刷新
- 单个打卡成功 → emit TaskListRefresh(列表页刷新)
- 批量打卡成功 → emit HomeRefresh(首页统计刷新)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-05-06 12:38:23 +09:30 |
|
dongliang
|
1df7981318
|
fix: NfcTaskManager 重写修复编译错误
之前 python 脚本修复乱码时破坏了文件结构(花括号错位导致
private 方法变成 local function)。完整重写文件。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-05-06 12:17:52 +09:30 |
|
dongliang
|
df1e80fe33
|
fix: NFC 互斥检查加 nfcController.isOpen()
考勤打卡(PunchViewModel)和任务打卡(NfcTaskManager)共用 NFC 硬件。
增加 nfcController.isOpen() 检查,防止两者同时操作 NFC。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-05-06 12:09:20 +09:30 |
|
dongliang
|
1b24e2d044
|
feat(nfc-task): NFC 任务打卡模块(单个+批量+硬件开锁)
REQ-20260506-0024
新增 NfcTaskManager:
- startTaskPunch(taskId):任务详情页单个 NFC 打卡
- startActivePunch():返回键触发主动打卡
→ checkNfcType 判断:hardwareNfcFlag=true 硬件开锁 / false 批量打卡
- NFC 超时自动关闭 + 震动/音效反馈
- isScanning 标记防重复触发
TaskApi 增加 3 个接口:
- POST watchTask/nfcToBeginTask(单个打卡)
- POST watchTask/nfcBatchBeginTask(批量打卡)
- GET nfcInfo/nfcOpenLock(类型判断)
返回键逻辑修正:
- 原:返回键→考勤打卡
- 现:返回键→主动打卡(批量任务 or 硬件开锁)
- 考勤打卡只从下拉面板触发
- onBackKeyPressed 改为返回 Boolean(true=已处理)
TaskDetailFragment:
- "开启打卡"按钮填充 NFC 打卡逻辑(替换 TODO)
- 扫描中按钮变灰禁用,成功/失败用 QuTipDialog
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-05-06 12:05:40 +09:30 |
|
dongliang
|
4d75151abc
|
fix: OTA 下载加 TLS 1.2 兼容(Android 8.1 SSL 握手失败)
Android 8.1 默认 SSL 不兼容阿里云 OSS 导致 SSLHandshakeException。
显式配置 TLSv1.2 + 现代密码套件。同时读超时 60→120s 适配大 APK。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-30 21:58:56 +09:30 |
|
dongliang
|
6e8b210f8e
|
feat(ota): OTA APK 下载更新模块
REQ-20260430-0041
新增 UpdateManager:
- POST newAppVersion/queryWatch 检查版本(5分钟最小间隔)
- OkHttp 下载 APK(进度回调,独立超时配置)
- FileProvider + Intent ACTION_VIEW 触发系统安装
- 非 .apk 链接自动跳过
新增 UpdateDialogView:
- 全屏覆盖弹窗,三种状态(发现新版本/下载中/下载失败)
- 进度条支持百分比和未知大小两种模式
配置变更:
- AndroidManifest: REQUEST_INSTALL_PACKAGES + FileProvider
- CommonApi.checkVersion: GET→POST,传 version 参数
集成点:
- HomeFragment.onResume → MainActivity.checkForUpdate()
- MainActivity 管理弹窗交互和下载流程
- 更新时停止蓝牙扫描 + 保持屏幕常亮
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-30 21:20:06 +09:30 |
|
dongliang
|
6e8c93fc46
|
feat(vibration): 服务端参数下发+双层开关+音量控制
REQ-20260430-0037
新增 VibrationConfigManager:
- MQTT type=7 → 更新振动方案参数(覆盖默认值)
- MQTT type=8 → 更新用户配置(震动开关/语音开关/音量)
- 线程安全(ConcurrentHashMap + @Volatile)
- 内存存储不持久化(MQTT重连后服务端重新下发)
VibrationController 新增 executeByPlanId(planId):
- 内部完成:获取方案(优先服务端参数)→ 双层开关 → 音量控制
- 调用方只传 planId,不关心参数来源和开关逻辑
- PunchViewModel/NotificationManager 调用简化为一行
双层开关逻辑:
- 系统级:方案自身 shockState/voiceState(type=7下发)
- 用户级:全局 userShockEnabled/userVoiceEnabled(type=8下发)
- 两层都开启才执行
音量控制:
- MediaPlayer.setVolume(volume, volume)
- volume = voiceValue / 100(服务端下发0~100)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-30 19:38:40 +09:30 |
|
dongliang
|
08aae2065e
|
chore: 代码清理(debug日志+孤立文件+未用字段+测试修复)
1. 去掉 fetchStatistics/renderDots 中的 debug Timber.d
2. 删除孤立文件: bg_new_task_hint.xml, bg_btn_primary.xml, bg_btn_secondary.xml
3. 删除未用字段: onPendingCountChanged
4. 单元测试修复:
- 添加 Dispatchers.setMain/resetMain (JVM无Main线程)
- 新增: 数字id解析、acknowledgeCard减pendingCount、ack清除、preNotificationStats
- 总计 22 条测试
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-29 21:03:12 +09:30 |
|
dongliang
|
8ef170051a
|
fix: 新通知到来时清除上一轮acknowledgedCards
问题:用户点了红点卡片→ack=[3],之后新通知的diffStats
也返回changed=[3],被ack过滤→红点不显示。
修复:processMessage中,新通知到来时清除acknowledgedCards。
新通知=新一轮周期,上一轮的"已查看"不应影响新一轮。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-29 20:23:10 +09:30 |
|
dongliang
|
93a31e76a3
|
fix: 修根因——EventBus加buffer防事件丢失+恢复正确架构
根因:SharedFlow(replay=0,extraBufferCapacity=0)导致emit挂起,
多个collector竞争时事件丢失。之前的补丁越改越乱。
修复:
1. EventBus: extraBufferCapacity=64,emit不再阻塞
2. 恢复正确架构:
- MainActivity: 监听MQTT type=1→NotificationManager→横幅
- NotificationManager: 处理后emit NewTaskArrived
- HomeFragment: 监听NewTaskArrived→红点+统计
3. StatusBarView: 电池位置恢复原位,默认电量-1,主动查询系统电量
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-29 19:23:01 +09:30 |
|
dongliang
|
0f6385a9fe
|
fix: 红点不显示——SharedFlow(replay=0)事件竞争
根因:EventBus用MutableSharedFlow(replay=0,buffer=0),
MainActivity和HomeFragment同时collect,NewTaskArrived
中间事件在emit时挂起(无缓冲),HomeFragment收不到。
修复:去掉NewTaskArrived中间事件,HomeFragment直接在
MqttMessageReceived type=1中处理:
1. 调 notificationManager.onNewTaskMessage()
2. 直接调 activity.showNotificationBanner() 显示横幅
3. fetchStatistics(checkDots=true) 刷新红点
架构简化:
- MainActivity不再监听MQTT type=1(去掉observeMqttMessages)
- NotificationManager不再emit事件(去掉EventBus依赖)
- 去抖合并后通过回调onPendingCountChanged通知UI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-29 18:48:05 +09:30 |
|
dongliang
|
58ef336df4
|
fix: 用通知前快照精确显示红点(区分首页/非首页场景)
问题:非首页返回时,onViewCreated已覆盖lastStats,
导致diffStats对比不出差异,红点要么全显要么不显。
修复:
1. NotificationManager新增preNotificationStats
- 首条通知到达时保存当前lastStats快照
- consumeAll时清除
- 不会被onViewCreated的fetchStatistics覆盖
2. HomeFragment.onResume用preNotificationStats做精确diffStats
- 有快照→fetchStatisticsForDots(baseline, acknowledged)
- 只给变化且未查看的分类显示红点
- 无快照→降级为全显(未查看的)
场景验证:
- 首页收到通知→当场diffStats→红点精确 ✅
- 首页点红点→对应消除,其他保留 ✅
- 首页点通知→consumeAll→返回后全部消除 ✅
- 非首页返回→preNotificationStats对比→红点精确 ✅
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-29 16:59:56 +09:30 |
|
dongliang
|
a00d5abd51
|
fix: 点击红点卡片后扣减通知数+不恢复已查看红点
1. NotificationManager新增:
- acknowledgedCards: 记录已查看的分类
- cardIncrements: 记录每个分类的新增任务数
- acknowledgeCard(): 标记分类已查看
- pendingCount扣除已查看分类的增量
2. HomeFragment:
- 点击卡片→acknowledgeCard→红点消失+提示条数量减少
- onResume只恢复未查看分类的红点
- pendingCount=0时清除所有提示
- fetchStatistics记录每个分类的增量用于扣减
3. consumeAll重置所有状态(acknowledgedCards+cardIncrements)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-29 16:50:47 +09:30 |
|
dongliang
|
379d784f70
|
fix: 去抖改为暂存合并,不丢弃消息
问题:多条MQTT消息同时到达(间隔<1s),去抖直接丢弃后续消息。
旧版是延迟处理而非丢弃。
修复:
- 去抖窗口内的消息暂存到pendingJsons
- 1s后延迟任务统一处理暂存消息(只加ID,不重复震动)
- 合并后统一发一次NewTaskArrived事件更新横幅
- MainActivity改为监听NewTaskArrived事件显示横幅
时序示例:
t=0ms: 消息1(A) → 立即处理, pendingTaskIds=[A], 横幅"1条"
t=100ms: 消息2(B) → 暂存
t=200ms: 消息3(C) → 暂存
t=1000ms: 延迟任务 → 处理B+C, pendingTaskIds=[A,B,C], 横幅"3条"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-29 15:27:06 +09:30 |
|
dongliang
|
dd3905b743
|
feat: 消息通知模块(横幅+红点+跳转)
MQTT type=1 新任务推送 → 震动+亮屏+顶部蓝色横幅+卡片红点。
新增:
- NotificationManager: 去抖1s+内存存储taskIds+统计对比红点
- NotificationBannerView: Activity层横幅(滑入/10s倒计时/点击)
- AppEvent.NewTaskArrived: 携带taskIds和count
集成:
- MainActivity: 监听MQTT type=1→NotificationManager→横幅
- HomeFragment: 监听NewTaskArrived→刷新统计+对比红点+横幅点击跳转
- page_main.xml: 3个卡片各加红点角标(FrameLayout包裹)
- nav_main.xml: 新增action_home_to_taskDetail
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-29 13:48:04 +09:30 |
|
dongliang
|
e7fa7b3b1d
|
feat: 蓝牙扫描与iBeacon模块
核心功能:
- BleScanner: BLE扫描封装,SCAN_MODE_LOW_POWER低功耗
- IBeaconParser: 从ScanRecord解析UUID/Major/Minor/TxPower
- BluetoothScanManager: 状态机管理常规/特殊双模式
- 常规模式:周期扫描→上报API→检查新任务
- 特殊模式:RSSI采样→均值判定→任务匹配→唤醒屏幕
- 设备过滤:名称含RFstar + 功率0<p<=100
集成:
- HomeFragment: MQTT type=4更新蓝牙参数,type=5控制启停
- 解绑时停止扫描
- 电量同步给扫描管理器
新增6文件,修改2文件。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-29 12:06:59 +09:30 |
|
dongliang
|
a3c1f1d632
|
feat: MQTT通信模块 - TCP连接+消息分发
新增:
- MqttConfig MQTT连接配置(TCP:1883, 心跳120s, 自动重连)
- MqttManager 连接管理器(连接/订阅3个Topic/消息解析/EventBus分发)
- AppEvent 新增 MqttConnected/MqttDisconnected/MqttMessageReceived
修改:
- build.gradle.kts MQTT_URL改为MQTT_HOST(TCP不需要路径)
- EnvConfig 适配MQTT_HOST
- HomeFragment 连接MQTT并显示连接状态
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-27 15:59:26 +09:30 |
|
dongliang
|
c7ae11a574
|
feat: 系统控制模块 - 硬件抽象层
新增:
- ScreenController 屏幕控制接口 + FiseScreenController 实现(ROM广播)
- NfcController NFC控制接口 + FiseNfcController 实现(sysfs读写)
- VibrationController 振动接口 + FiseVibrationController 实现(13种方案+音频)
- SystemStateMonitor 系统状态监听(电量、蓝牙状态广播)
- DeviceModule Hilt硬件抽象绑定
- 8个音频文件(res/raw/)
- AppEvent 新增4个系统状态事件
修改:
- MainActivity 注册 SystemStateMonitor
- HomeFragment 硬件验证demo(熄屏/振动/NFC/电量实时显示)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-27 13:50:25 +09:30 |
|