Commit Graph

153 Commits

Author SHA1 Message Date
dongliang
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
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
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
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
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
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
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
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
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
1a6c2f2efc feat: 任务卡片切换改为左右滑动
上下滑动留给内容滚动(长任务可下滑查看更多),
左右滑动切换任务卡片(左滑下一个,右滑上一个)。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-06 17:07:15 +09:30
dongliang
7dd659358d fix: 备注图标 ⚠ → 📝
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-06 16:33:09 +09:30
dongliang
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
76997f4830 chore: 清理加速度计调试日志
删除传感器列表打印和角度值 DEBUG 日志(功能已关闭,不再需要)。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-30 20:41:39 +09:30
dongliang
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
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
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
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
5f30611cc0 debug: 启动时打印设备所有可用传感器列表
检查是否有陀螺仪/旋转向量等传感器可用于改进抬手检测。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-30 18:50:08 +09:30
dongliang
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
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
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
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
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
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
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
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
c9a34fbf8c debug: 加速度计加详细日志用于调参
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-30 17:09:04 +09:30