dongliang and Claude Opus 4.6
bb489140f8
feat: 引入 Conscrypt 解决 Android 8.1 TLS 握手失败
...
设备系统 conscrypt 版本过旧,连阿里云 OSS 的 HTTPS 握手被 reset。
引入 org.conscrypt:conscrypt-android:2.5.2 作为首选安全提供者,
在 Application.onCreate 中注册,所有网络请求自动使用现代 TLS。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 13:04:55 +09:30
dongliang and Claude Opus 4.6
9f7a0a5c1e
feat: 电量变化时上报设备状态到服务端
...
之前 reportDeviceStatus 接口只定义未调用,手机端无法获取实时电量
现在电量变化 >=5% 时自动调用 setWatchStatusByImeiFormWatch 上报
去抖防止频繁请求
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 12:56:20 +09:30
dongliang and Claude Opus 4.6
9b0d44d8da
fix: 待打卡地点块移到备注/语音/图片上方
...
XML 中 blockGoWhere 和 blockNoScene 从底部移到 tvNote 前面
去掉已不用的 blockHowTo(蓝色指引块)
现在布局顺序:任务名→地点指引→备注→语音→图片
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 12:47:16 +09:30
dongliang and Claude Opus 4.6
39d7fc8b66
feat: 大图查看支持左右滑动切换图片
...
- 传入所有图片 URL 列表和起始索引
- 左滑下一张,右滑上一张
- 底部显示页码指示 1/3
- 单击关闭
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 12:40:30 +09:30
dongliang and Claude Opus 4.6
89602070ae
fix: 大图查看改用 decorView 顶层覆盖
...
dialog_container 可能被 NavHostFragment 遮挡导致不可见
改为直接添加到 Activity 的 decorView,确保在最顶层
背景改为纯黑(全屏查看更清晰)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 12:35:38 +09:30
dongliang and Claude Opus 4.6
43e61ffb70
feat: 任务推送增加语音提示(newMessage.mp3)
...
planId=2 新消息方案加上 audioResId = R.raw.new_message
和旧版一致,推送新任务时震动+播放语音提示
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 12:33:05 +09:30
dongliang and Claude Opus 4.6
caa38c53d8
fix: 图片点击放大修复(clickable + 关闭事件)
...
- 缩略图加 isClickable/isFocusable 防止被 ScrollView 拦截
- 全屏大图的 overlay 和 imageView 都设点击关闭
- 加日志确认 showFullImage 被触发
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 12:27:49 +09:30
dongliang and Claude Opus 4.6
cacbdb6aaa
fix: 图片和语音改用 HttpURLConnection 下载
...
OkHttp 在该设备连 OSS 的 HTTPS/HTTP 都被 reset。
改用系统 HttpURLConnection(走系统 TLS 栈,可能支持不同 cipher suite)。
图片和语音统一使用原始 HTTPS URL。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 12:23:54 +09:30
dongliang and Claude Opus 4.6
77619a5300
feat: 图片支持横向滚动显示所有+点击放大全屏
...
- 去掉3张限制,HorizontalScrollView 横向滚动展示所有图片
- 缩略图 80dp 正方形,超出可滑动查看
- 点击缩略图全屏放大查看(FIT_CENTER),点击关闭
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 12:14:01 +09:30
dongliang and Claude Opus 4.6
49732ac79a
feat: 用户上报任务显示图片附件
...
- 新建 PicItem 数据类,uploadPic 改为强类型
- 布局加 picContainer 横排展示区
- showPictures 方法:最多3张缩略图横排,HTTP 加载
- 三个状态页面都显示图片(和语音同级)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 12:04:26 +09:30
dongliang and Claude Opus 4.6
1b198e0941
fix: 语音下载改用 HTTP 绕过 OSS TLS 兼容问题
...
阿里云 OSS 的 HTTPS 在 Android 8.1 conscrypt 下 TLS 握手被 reset
OSS 同时支持 HTTP,降级为 HTTP 下载即可
使用独立的无拦截器 OkHttpClient 避免签名干扰
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 11:46:53 +09:30
dongliang and Claude Opus 4.6
18a1fc58a6
fix: 语音下载复用应用 OkHttpClient 解决 SSL 握手失败
...
新建的 OkHttpClient 没有 TLS 配置,在 Android 8.1 设备连阿里云
OSS 时 SSL handshake 被 reset。改为注入应用已配置的 OkHttpClient
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 11:42:35 +09:30
dongliang and Claude Opus 4.6
bf869b4643
fix: 待打卡布局优化,地点提到最前防超屏
...
- 去掉蓝色指引块(和按钮文字重复)
- 时间合入橙色地点块副文本
- 有场景时不单独显示 tvTimeInfo,省一行空间
- 备注和语音移到指引块后面(次要信息)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 11:31:50 +09:30
dongliang and Claude Opus 4.6
f22f7b7f0f
fix: 语音改用 OkHttp 下载后本地播放
...
MediaPlayer 内置 HTTP 在 Android 8.1 设备请求 HTTPS 失败
(NuCachedSource2 error -1)。改为 OkHttp 先下载到缓存再播放
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 11:18:09 +09:30
dongliang and Claude Opus 4.6
b9d50e3c31
fix: 语音播放修复(AudioAttributes + clickable + 日志)
...
- 设置 AudioAttributes(CONTENT_TYPE_SPEECH)确保音频输出正确
- 按钮加 clickable/focusable 防止被 ScrollView 手势拦截
- 添加播放日志便于排查
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 11:03:30 +09:30
dongliang and Claude Opus 4.6
9b39daf4ad
style: 返回按钮改用 iconfont 图标,和 NavBar 风格统一
...
用 \ue6bd 返回图标替代文字符号,白色 28sp,64×56dp 触摸区
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 10:26:13 +09:30
dongliang and Claude Opus 4.6
841bf87dc5
fix: 返回按钮加大触摸区域和视觉醒目度
...
- 高度从 match_parent 改为固定 56dp
- 字号 27sp→32sp 加粗,符号 ‹→< 更醒目
- 标题栏上内边距 16→8dp 节省空间
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 21:30:08 +09:30
dongliang and Claude Opus 4.6
1eb32409a8
fix: 时间只显示要求/截止一个,去掉派单时间和巡检时段
...
三个页面统一只显示一行时间:优先要求完成时间,没有则截止时间
删除 showInspectTime 方法
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 21:22:44 +09:30
dongliang and Claude Opus 4.6
7b3a3ae276
fix: 要求/截止时间只显示一个,优先要求完成时间
...
有 preFinishTime 显示"要求: 05.06 16:05",没有则显示"截止: xx"
去掉多余的"完成"后缀
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 21:17:23 +09:30
dongliang and Claude Opus 4.6
d5cdcc8186
style: 语音按钮视觉优化
...
- 背景改为橙色半透明+边框,和指引块风格统一
- 宽度 match_parent,内含声波图标+语音描述+时长
- 播放中切换背景高亮+停止图标,停止后恢复
- 新增 bg_btn_voice_playing.xml 播放状态背景
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 20:52:09 +09:30
dongliang and Claude Opus 4.6
2e7edc7e09
fix: 语音按钮圆角改用 radius 兼容 API 27+
...
topStartRadius 等属性需要 API 31,改为统一 radius=24dp
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 20:47:52 +09:30
dongliang and Claude Opus 4.6
75cbb831c5
feat: 任务页面布局优化(接单池防挑选+截止时间+巡检引导+语音播放)
...
1. 接单池改名"新任务"、隐藏积分和页码(防止用户挑肥拣瘦)
2. 待打卡/待完成页面增加截止时间显示
3. 巡检场景三层视觉:已打卡绿色+时间、下一个橙色高亮、后续灰色弱化
4. 巡检场景超屏自动滚动到当前进度
5. 用户上报任务支持语音播放(橙色药丸按钮)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 20:46:16 +09:30
dongliang and Claude Opus 4.6
2d83986150
fix: 巡检任务全部打完→按钮禁用 + 详情页重定向列表页
...
1. TaskListFragment: 巡检 status=4 检查 allChecked
- 全部完成 → 灰色"已全部打卡"(禁用)
- 未完成 → 橙色"开启打卡"
2. TaskDetailFragment: type=5 跳转 TaskListFragment
(列表页有完整场景清单支持)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 18:58:37 +09:30
dongliang and Claude Opus 4.6
9cde177bca
fix: 巡检场景清单字体放大 22→28sp
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 18:09:36 +09:30
dongliang and Claude Opus 4.6
a0c0e74dda
fix: 巡检时段拆为开始/结束两行,格式与派单/截止统一
...
巡检: 09:00~18:00 → 开始: 09:00
结束: 18:00
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 18:02:55 +09:30
dongliang and Claude Opus 4.6
777c867711
fix: 返回键区域最大化(左padding去掉+宽度48→64dp)
...
导航栏左侧 paddingStart 21→0dp,返回键宽度 48→64dp。
点击区域从屏幕最左边开始,高度撑满导航栏。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 17:56:55 +09:30
dongliang and Claude Opus 4.6
689a7c80aa
fix: 卡片图标改为统一文字标签(去掉emoji对齐问题)
...
emoji图标(📍 🕐 ⏰ 📋 🔍 ⭐ 📝 )宽度不一致导致文字不对齐。
统一改为"标签: 内容"格式:
- 📍 → 地点:
- 🕐 → 派单:
- ⏰ → 截止:
- 📋 → 要求:
- 🔍 → 巡检:
- ⭐ → 积分:
- 📝 → 去掉(备注块已有绿色背景区分)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 17:49:09 +09:30
dongliang and Claude Opus 4.6
d3bbf738f6
fix: 巡检时段去掉"巡检"二字防换行
...
🔍 巡检09:00~18:00 → 🔍 09:00~18:00
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 17:42:46 +09:30
dongliang and Claude Opus 4.6
0941138a9f
feat: 巡检任务显示巡检时段
...
taskType=5 时在所有状态(待抢单/待打卡/进行中)显示
🔍 巡检{executeTimeStart}~{executeTimeEnd}
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 17:36:26 +09:30
dongliang and Claude Opus 4.6
48b88eaa4b
fix: 导航栏和底部按钮缩减高度
...
导航栏:paddingTop 27→16dp,paddingBottom 8→4dp
底部按钮:padding 15→10dp,字号 34→28sp
两个页面统一,为内容区腾出更多空间
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 17:28:15 +09:30
dongliang and Claude Opus 4.6
d8f699a51f
fix: 导航栏恢复原始字号,返回键宽48dp高match_parent
...
导航栏标题/页码恢复 20sp(之前被批量放大到 24sp)。
返回键宽度 56→48dp,高度 match_parent 撑满导航栏,
点击区域最大化但不增加导航栏总高度。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 17:23:21 +09:30
dongliang and Claude Opus 4.6
746ca346ec
fix: 返回按钮点击区域放大 32→56dp,字号 27→36sp
...
老年用户手指粗,32dp 触摸区太小容易点不到。
TaskListFragment + TaskDetailFragment 统一放大。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 17:15:19 +09:30
dongliang and Claude Opus 4.6
1a6c2f2efc
feat: 任务卡片切换改为左右滑动
...
上下滑动留给内容滚动(长任务可下滑查看更多),
左右滑动切换任务卡片(左滑下一个,右滑上一个)。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 17:07:15 +09:30
dongliang and Claude Opus 4.6
7dd659358d
fix: 备注图标 ⚠ → 📝
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 16:33:09 +09:30
dongliang and Claude Opus 4.6
08bb5b268f
fix: 去掉派单/截止/要求时间的多余空格
...
🕐 2026-05-06 派单 → 🕐 2026-05-06派单
⏰ 截止 2026-05-07 → ⏰ 截止2026-05-07
📋 要求 2026-05-07 完成 → 📋 要求2026-05-07完成
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 16:30:41 +09:30
dongliang and Claude Opus 4.6
05f5d5e098
fix: 灰色文字提亮 + 备注加图标
...
1. text_secondary 颜色 #999999 → #CCCCCC(深色背景上更清晰)
2. 备注文字前加 ⚠ 图标,提醒用户注意
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 16:26:33 +09:30
dongliang and Claude Opus 4.6
1657ecd917
fix: 任务页面底部按钮字体放大 28/21→34sp
...
TaskListFragment 按钮 28→34sp,TaskDetailFragment 按钮 21→34sp。
统一加大加粗,老年用户更易识别。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 16:20:56 +09:30
dongliang and Claude Opus 4.6
f1fe041486
fix: 任务卡片文字全面放大(+4sp)
...
地点 24→28sp,时间 22→26→30sp,积分 26→30sp,
备注/指引描述 20→24sp,指引标题 24→28sp。
标题 34sp 不变。老年用户适配。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 16:17:50 +09:30
dongliang and Claude Opus 4.6
a7dd64f767
fix: NFC 打卡成功后恢复按钮 isEnabled=true
...
NFC 扫描前 btn.isEnabled=false,成功后刷新详情时按钮变为"完成任务"
但 isEnabled 仍为 false 导致点击无响应。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 16:03:55 +09:30
dongliang and Claude Opus 4.6
eb5fdd2d5f
fix: QuTipDialog 图标和字体继续放大
...
图标区域 110→140dp,图标字号 50→65sp,标题 28→36sp,描述 20→24sp。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 15:55:40 +09:30
dongliang and Claude Opus 4.6
3ab6a94676
refactor: 优化 QuTipDialog + 删除 ResultFlashView
...
QuTipDialog 优化:
- 图标区域放大 85→110dp,图标字号 38→50sp
- 加入淡入+缩放动画(OvershootInterpolator 回弹效果)
- 默认倒计时 3→2 秒
- 倒计时文字默认隐藏(showCountdown 参数控制)
- 简化调用:show(status, title) 即可,2秒后自动消失
NFC 打卡加回 QuTipDialog:
- 成功:绿色图标 + "打卡成功" + 2秒消失
- 失败:红色图标 + "打卡失败" + 错误信息
删除 ResultFlashView(方案不合适,统一用优化后的 QuTipDialog)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 15:40:07 +09:30
dongliang and Claude Opus 4.6
1ef6824c5e
fix: ResultFlashView 去掉内层 visibility=gone(双重隐藏导致不显示)
...
activity_main.xml 的 ResultFlashView 已设 gone,内层布局不需要再设。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 15:12:07 +09:30
dongliang and Claude Opus 4.6
7f6e9cf039
feat: ResultFlashView 操作结果指示器(Apple Watch 风格)
...
全屏深色遮罩 + 大圆圈图标,属性动画弹出+淡出,1.5秒自动消失。
- 成功:绿色圆圈 + ✓,OvershootInterpolator 回弹效果
- 失败:红色圆圈 + ✗
- 替代 QuTipDialog 用于 NFC 打卡和按钮操作的结果反馈
- 所有操作统一视觉风格
应用到:
- TaskDetailFragment NFC 打卡
- TaskListFragment NFC 打卡
- MainActivity 返回键主动打卡
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 14:25:57 +09:30
dongliang and Claude Opus 4.6
306af795a6
refactor: NFC 打卡去掉弹窗,改为轻量按钮状态反馈
...
手表小屏上音效+震动已足够反馈结果,全屏弹窗多余。
- 成功:按钮显示"打卡成功"(绿色)1秒 → 刷新/返回
- 失败/超时:按钮恢复"开启打卡"(可重试)
- 去掉 QuTipDialog 调用
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 13:19:45 +09:30
dongliang and Claude Opus 4.6
efac23f188
fix: 打卡失败弹窗 back=false→true,3秒后自动关闭
...
back=false 导致弹窗不自动消失。改为 back=true 与其他错误提示行为一致。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 13:10:27 +09:30
dongliang and Claude Opus 4.6
f2fcbd7c6a
fix: TaskListFragment NFC 打卡 TODO 填充
...
TaskListFragment 有两处"开启打卡"按钮留的 TODO(普通任务+巡检任务),
补充为调用 nfcTaskManager.startTaskPunch()。
打卡成功后刷新当前任务详情。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 12:57:20 +09:30
dongliang and Claude Opus 4.6
8009987920
fix: HomeFragment 监听 HomeRefresh 事件刷新统计
...
批量打卡成功后 emit HomeRefresh,但 HomeFragment 之前没有监听该事件,
导致首页统计数字不更新。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-06 12:52:25 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
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 and Claude Opus 4.6
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 and Claude Opus 4.6
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 and Claude Opus 4.6
70da49f650
fix: 补回被误删的 App 版本号显示
...
补充设备信息字段时,替换代码块时漏掉了 tvAppVersion 赋值行。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 22:14:45 +09:30
dongliang and Claude Opus 4.6
71eebe7b0c
feat(config): 设置页补全设备信息字段
...
对照旧版 hardInfo.vue 补全缺失的 4 个字段:
- 设备名称(bluetoothName,来自 DevicePrefs)
- 蓝牙MAC(bluetoothMac,来自 DevicePrefs)
- 蓝牙连接状态(动态,通过 EventBus BluetoothDevice 事件更新)
- 电池(动态,通过 EventBus BatteryChanged 事件 + 初始化获取)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 22:06:53 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
3ced3c74cf
fix: OTA 弹窗进度条修复
...
1. 进度条宽度用 post{} 延迟设置,确保容器已布局(width>0)
2. 进度回调限频 200ms,避免主线程过载
3. 用 runOnUiThread 替代 launch(Main),更简单可靠
4. 各状态切换加日志
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 21:42:06 +09:30
dongliang and Claude Opus 4.6
acd262a3a6
fix: OTA 弹窗继续放大(图标80sp 标题32sp 按钮24sp)
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 21:34:04 +09:30
dongliang and Claude Opus 4.6
0d94198743
fix: OTA 弹窗 UI 放大(适配手表小屏+老年用户)
...
图标 40→60sp,标题 18→24sp,描述 12→16sp,
按钮 14→18sp+加大内边距,进度条 8→12dp。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 21:32:19 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
76997f4830
chore: 清理加速度计调试日志
...
删除传感器列表打印和角度值 DEBUG 日志(功能已关闭,不再需要)。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 20:41:39 +09:30
dongliang and Claude Opus 4.6
9c36e28fd4
fix: VibrationDefaults Int→Float 字面量加 f 后缀
...
Kotlin 不做 Int→Float 隐式转换,shockTime/shockIntervalTime
改为 Float 后默认值需要加 f 后缀(1→1f, 0→0f)。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 20:34:23 +09:30
dongliang and Claude Opus 4.6
da74ca6d97
fix: shockTime/shockIntervalTime 改为 Float(服务端下发小数如 0.50)
...
实测服务端 type=7 下发的 shockTime=0.50、shockIntervalTime=0.50,
之前用 optInt 解析会截断为 0,导致振动时长 0ms。
- VibrationPattern: shockTime/shockIntervalTime Int → Float
- VibrationConfigManager: optInt → optDouble().toFloat()
- FiseVibrationController: 毫秒计算适配 Float
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 20:01:12 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
d6a8f4acf9
chore: 关闭加速度计抬手亮屏(硬件无陀螺仪,不可靠)
...
设备仅有基础加速度计(MTK),无陀螺仪/重力传感器/旋转向量。
经 v1~v5 五轮实测验证,"看表"与"不看表"的角度差仅~7°,
无法可靠区分抬手和小幅摆动。旧版uni-app也放弃了此功能。
代码保留但默认不启用(start/stop/pause/resume 全部注释),
待更换有陀螺仪的硬件后取消注释即可启用。
保留的文件:
- AccelerometerWakeController.kt(接口)
- FiseAccelerometerWake.kt(实现,含倾斜角度+低通滤波方案)
- DeviceModule.kt(DI绑定)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 19:01:17 +09:30
dongliang and Claude Opus 4.6
5f30611cc0
debug: 启动时打印设备所有可用传感器列表
...
检查是否有陀螺仪/旋转向量等传感器可用于改进抬手检测。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 18:50:08 +09:30
dongliang and Claude Opus 4.6
f35bbfc1e9
refactor: 加速度计改为倾斜角度检测(v5,成熟方案)
...
之前基于Z轴单值的方案(v1~v4)无法同时满足灵敏度和防误触,
因为原始Z值在运动中剧烈跳动(-2~18),滤波也难以完全消除。
v5改用倾斜角度(Android Wear/小米手环同类思路):
- tiltAngle = atan2(z, sqrt(x²+y²)) × 180/π
- 角度值天然比原始Z值稳定(atan2归一化消除加速度大小波动)
- 手臂下垂 ~15°,看表姿势 ~70°,小幅摆动 ~35°
- 低通滤波(α=0.8)进一步平滑 + 三态状态机
- DOWN(<30°) → TRIGGERED(>50°,亮屏) → DOWN(<30°)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 18:29:39 +09:30
dongliang and Claude Opus 4.6
3e80fba33d
refactor: 加速度计改为低通滤波+状态机方案(v4)
...
之前的最小值+连续高值方案在原始值剧烈跳动(-2~18)下无法同时
满足灵敏度和防误触发,阈值怎么调都有问题。
v4方案:
- 低通滤波(α=0.8)去除运动尖峰,只保留重力方向
- 三态状态机:UNKNOWN→DOWN(Z<4)→TRIGGERED(Z>7,亮屏)→DOWN
- 小幅摆动:滤波值收敛到振荡均值~6,不超过7,不误触发
- 快速抬手:~0.8秒触发;缓慢抬手:~2秒触发
- 代码从复杂的窗口/最小值/连续计数简化为滤波+状态机
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 18:20:12 +09:30
dongliang and Claude Opus 4.6
2f48ed9aef
fix: 加速度计高值阈值8→7.5(实测抬手波动到7.5断连续计数)
...
实测抬手时Z在7.5-9波动,阈值8导致偶尔7.5-7.7的值打断连续计数,
两次差一个采样就能触发但都断了。降到7.5配合连续3个的要求仍能防误触。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 18:06:56 +09:30
dongliang and Claude Opus 4.6
86a9c79681
fix: 加速度计要求连续3个高值才触发,防摆动尖峰误触发
...
实测小幅摆动时Z在-2~10间剧烈跳动,单个尖峰Z=10就触发了。
改为要求连续3个采样≥8(约0.6秒持续高值)才触发:
- 真正抬手:Z稳定在8-9多个采样 → 连续3个≥8 ✅
- 小幅摆动:尖峰后立即回落 → 连续不到3个 ❌
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 17:50:48 +09:30
dongliang and Claude Opus 4.6
a3d26fb11d
fix: 收紧加速度计阈值防误触发(min<3 cur>=8)
...
实测问题:小幅摆动和放下手也会亮屏。
- min阈值 5→3:小幅摆动Z≈5-6不触发,明确下垂Z≈1-3才算
- cur阈值 7→8:放下过程Z≈5-7不触发,明确抬起Z≈8-9才算
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 17:40:01 +09:30
dongliang and Claude Opus 4.6
61412cbd0f
fix: turnOn 加 ACQUIRE_CAUSES_WAKEUP 强制唤醒屏幕
...
FISE广播在屏幕休眠时无法唤醒屏幕硬件(实测验证)。
改为双重机制:
1. WakeLock(FULL+ACQUIRE_CAUSES_WAKEUP+ON_AFTER_RELEASE) 强制唤醒
2. FISE广播同步ROM状态
WakeLock持有3秒后自动释放,释放后由系统超时管理。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 17:30:54 +09:30
dongliang and Claude Opus 4.6
80cd6d121e
fix: 加速度计改为最小值跳变检测(v3),大幅提升灵敏度
...
v1/v2的滑动窗口均值方案需要连续3个低值采样才能触发,
实测抬手动作太快(<0.5秒)导致大量漏触发。
v3改为追踪近期5个采样的最小值:
- 近期有任一值<5(手臂曾下垂)且当前值>=7(手臂已抬起)→触发
- 只需1个低值采样即可,灵敏度大幅提升
- 触发后10个采样(~2秒)冷却期防连续触发
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 17:22:24 +09:30
dongliang and Claude Opus 4.6
918c53f701
fix: 加速度计阈值调优(实测数据:low<4 high>=5)
...
实测抬手过渡期Z轴均值4.5-6.5,原阈值high>=6太严格导致多次漏触发。
降低为high>=5,提高low为<4,提升灵敏度。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 17:12:46 +09:30
dongliang and Claude Opus 4.6
c9a34fbf8c
debug: 加速度计加详细日志用于调参
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 17:09:04 +09:30
dongliang and Claude Opus 4.6
e3f6ac3c97
feat(device-interaction): 加速度计抬手亮屏功能
...
REQ-20260430-0026
- 新增 AccelerometerWakeController 接口 + FiseAccelerometerWake 实现
- 双模式策略:方案D(WRIST_TILT)优先,不支持自动降级方案C(Z轴变化趋势)
- 方案C防误触发:检测Z轴从低(<3)到高(≥6)的变化趋势,非简单阈值
- NFC打卡时 pause/resume 暂停检测,防止贴卡姿势误触发
- 熄屏交系统SCREEN_OFF_TIMEOUT管理,加速度计只管亮屏
- DeviceModule 增加 DI 绑定
- MainActivity 增加 start/stop 生命周期管理
- PunchViewModel 增加 NFC 开关时 pause/resume 调用
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-30 16:54:05 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
602f0ccce6
fix: 去抖合并后更新横幅数字
...
问题:多条消息同时到达,第一条横幅显示1,后续被去抖暂存。
1s后合并处理emit NewTaskArrived(count=3),但MainActivity
只监听MqttMessageReceived更新横幅,不监听NewTaskArrived。
修复:MainActivity同时监听NewTaskArrived,去抖合并后更新横幅。
时序:消息1→横幅"1条" → 消息2,3暂存 → 1s后合并→横幅更新"3条"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 20:44:50 +09:30
dongliang and Claude Opus 4.6
31630b247f
fix: 补回recordCardIncrement,点红点后pendingCount正确扣减
...
问题:recordCardIncrement调用被之前简化代码时删掉了,
导致_cardIncrements为空→acknowledgedCount=0→pendingCount不减。
修复:在diffStats后对每个changed分类记录增量,
这样acknowledgeCard后pendingCount能正确扣减。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 20:31:32 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
aea8351990
fix: 去掉dotViews lazy缓存,直接操作当前View
...
问题:by lazy只初始化一次,view重建后dotViews缓存的是旧View,
renderDots操作的是已销毁的View→红点不显示。
修复:renderDots直接使用dotPool/dotPunch/dotComplete(始终指向当前View)。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 20:17:43 +09:30
dongliang and Claude Opus 4.6
20c8dc2fed
debug: 红点逻辑添加详细日志
...
添加 baseline/diffStats/activeDotCards 每步日志,
用于排查红点不显示的具体断点。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 20:14:30 +09:30
dongliang and Claude Opus 4.6
c754edd63b
fix: 先await统计基准再监听事件,消除竞态
...
根因:fetchStatistics(false)和fetchStatistics(checkDots=true)
是两个独立协程竞争,lastStats更新时机不可控。
修复:onViewCreated中用协程顺序执行:
1. 先 await safeApiCall → 设好 lastStats 基准
2. 再 observeEvents 开始监听通知
EventBus buffer=64 暂存期间的通知不丢失
这样当NewTaskArrived触发fetchStatistics(checkDots=true)时,
lastStats一定已有值,preNotificationStats也能正确保存。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 19:50:55 +09:30
dongliang and Claude Opus 4.6
459049fb16
fix: 红点用preNotificationStats精确对比+有通知时不更新lastStats
...
之前diffStats失败的根因:有通知时fetchStatistics也更新lastStats,
导致基准被污染。
修复:
- checkDots=true 时用 preNotificationStats(通知前快照)对比,
不更新 lastStats
- checkDots=false(正常刷新)时才更新 lastStats
- 这样 preNotificationStats 始终是通知前的干净基准
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 19:40:58 +09:30
dongliang and Claude Opus 4.6
5e5c44cacd
fix: 红点改为直接显示,不依赖diffStats
...
diffStats方案因lastStats竞态反复失败。
改为:有pending通知→所有未ack的卡片直接显示红点。
点了哪个消哪个,简单可靠无竞态。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 19:31:51 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
329ddc505e
fix: MainActivity多余大括号导致编译失败
...
第71行有多余的},导致类提前关闭,后续代码变成顶级声明。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 18:52:06 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
73af1cbfa9
fix: lastStats为null时红点兜底显示
...
问题:首次加载时fetchStatistics()异步未返回,lastStats为null。
此时收到通知→diffStats(null,data)→emptySet()→无红点。
修复:lastStats为null时,有pending通知则对所有有值的分类
显示红点(兜底策略,宁多勿漏)。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 18:02:32 +09:30
dongliang and Claude Opus 4.6
e6c218d830
refactor: 红点统一管理(activeDotCards+renderDots)+ 去掉提示条
...
按矩阵验证的19个场景统一重写通知逻辑:
核心改动:
- activeDotCards 集合累积管理红点,只增不减(除显式操作)
- renderDots() 统一渲染,不在各处单独设 visibility
- 去掉提示条(用户反馈不好看)
场景覆盖:
- 场景1-2: 首页连续收到不同分类通知 → activeDotCards累积 ✅
- 场景3: 点横幅 → consumeAll+activeDotCards清空 ✅
- 场景4-5: 点红点 → activeDotCards移除对应+renderDots ✅
- 场景7: 所有红点点完 → 自动consumeAll清理 ✅
- 场景11-16: 非首页 → preNotificationStats精确diffStats→补充activeDotCards ✅
- 场景18: 全部查看后新通知 → consumeAll已重置,新通知正常累积 ✅
- 场景19: 列表中又来通知 → 返回后onResume补充新红点,不覆盖已ack的 ✅
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 17:47:52 +09:30
dongliang and Claude Opus 4.6
f785be91a6
feat: 电池显示电量数值 + 充电闪电标识
...
1. 电池图标右侧显示"75%"电量百分比(白色60%透明度)
2. 充电中在电池壳内显示⚡ 闪电标识
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 17:20:56 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
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 and Claude Opus 4.6
6418c2f36f
feat: 新任务提示条 + 按taskIds直接加载
...
1. 首页新增"有N条新任务 点击查看"提示条
- pendingCount>0 时显示,点击/查看后消失
- 和红点共存:提示条=统一入口,红点=分类提示
2. TaskListFragment 通知模式
- 有 filterTaskIds 时跳过 queryTaskIds
- 直接按 taskId 构建列表,调 lookTaskDetail 加载详情
- 不受 status 筛选限制,跨状态任务都能显示
3. 横幅/提示条共用 navigateToNewTasks()
- 1个任务→跳详情,多个→跳列表
- 跳转后清除红点+提示条+pendingTaskIds
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 16:42:09 +09:30
dongliang and Claude Opus 4.6
463ff1373d
fix: onResume红点改为直接显示,不依赖diffStats
...
问题:onViewCreated先于onResume执行,fetchStatistics已将
lastStats更新为新值,onResume的diffStats对比不出差异→无红点。
修复:pendingCount>0时直接显示所有红点,不走diffStats对比。
已确定有新任务,不需要再对比哪个卡片变了。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 16:19:34 +09:30
dongliang and Claude Opus 4.6
2fd8b7f80d
fix: 返回首页时补显示红点
...
HomeFragment暂停时(在任务详情页等)收到的NewTaskArrived事件会丢失,
返回首页后红点不显示。onResume中检查pendingCount,补刷统计和红点。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 15:52:16 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
1ffdefc887
fix: 通知累积+点击跳转修复
...
Bug 1: setupBannerClick每次事件覆盖onClick,丢失之前累积的taskIds
修复: 点击时从notificationManager.pendingTaskIds取所有累积ID
Bug 2: 多任务点击跳到接单池全量列表,无法区分新旧
修复: TaskListFragment支持taskIds参数过滤,只显示通知中的任务
Bug 3: allIds.toLongArray()编译错误(List<String>无此方法)
修复: mapNotNull{toLongOrNull()}.toLongArray()
nav_main.xml: taskListFragment新增taskIds可选参数(long[]nullable)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 15:15:33 +09:30
dongliang and Claude Opus 4.6
47e8ed0776
test: 消息通知+考勤模块单元测试
...
NotificationManagerTest (15条):
- 去抖: 首条处理/1s内重复过滤/触发震动亮屏
- 解析: 直接id/taskArr数组/data数组/无id忽略/畸形json不崩溃
- 去重: 相同taskId不重复添加
- 消费: consumeAll清空/consumeByTaskId移除单条/不存在id不崩溃
- 红点: 全增/单增/无变化/减少/null旧值
AttendanceStatusTest (2条):
- 实际API返回JSON解析验证(设备验证数据)
- 字段缺失时默认值
PunchButtonMatrixTest (3条):
- 未打卡→上班按钮
- 已上班未下班→下班按钮
- 已上班已下班→撤销+下班
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 13:58:31 +09:30
dongliang and Claude Opus 4.6
881cfeb3b6
fix: 静态检查修复(访问权限+生命周期清理)
...
1. MainActivity.notificationBanner 改为非 private
(HomeFragment 需访问设置点击回调,原 private 编译报错)
2. HomeFragment.onDestroyView 补充清理 bannerView.onClick
(避免 Fragment 销毁后回调泄漏)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-29 13:54:48 +09:30
dongliang and Claude Opus 4.6
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 and Claude Opus 4.6
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