dongliang
8009a1a513
fix: MQTT心跳间隔从120s改为60s,修复息屏后收不到通知
...
旧版mqtt.js默认keepalive=60s,新版误设为120s,超过4G NAT超时(60~90s),
导致息屏后连接被运营商静默断开,消息无法送达。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-12 19:29:03 +09:30
dongliang
9e3616d1a0
fix: MQTT连接时序竞争导致扫码绑定失败
...
- MqttManager: 防止重复创建client实例,加connecting标记和client存在检查
- SplashFragment: MQTT连接和API检查并行,等MQTT就绪后再导航
- BindFragment: 等待MqttConnected事件再显示状态,不立即检查
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 17:05:50 +09:30
dongliang
c84af9dfb4
debug: 绑定页显示MQTT连接状态,未连接时自动重连
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 15:05:41 +09:30
dongliang
6d8e73c8da
fix: 解绑时重置bindHandled标记 + 绑定加Toast调试
...
解绑后bindHandled没重置导致再次绑定时消息被跳过。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 14:26:18 +09:30
dongliang
83894670d3
debug: 解绑加Toast调试,确认消息是否收到和导航是否成功
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 14:11:14 +09:30
dongliang
f116b4e188
fix: 绑定消息移到MainActivity处理,彻底解决配对失败
...
与解绑一样,BindFragment的collect可能在MQTT消息到达时还未注册,
导致消息丢失。改为Activity级别统一处理type=2绑定消息。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 13:58:45 +09:30
dongliang
939d402d8c
fix: 解绑导航改用NavHostFragment方式获取NavController
...
FragmentContainerView上findNavController(viewId)有兼容性问题,
改为通过supportFragmentManager获取NavHostFragment再取navController。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 13:20:46 +09:30
dongliang
4024f2519e
fix: 添加缺失的R import,修复编译错误
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 12:19:03 +09:30
dongliang
4de0b04cd2
fix: 息屏时停止电量/蓝牙/信号监听,亮屏时恢复
...
监听SCREEN_OFF/SCREEN_ON,息屏后注销所有广播接收器和信号监听,
亮屏后重新注册。息屏后只剩MQTT心跳,与旧版耗电一致。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 12:11:00 +09:30
dongliang
ccfa30daa6
fix: 信号改为Toast提示有/无信号,电量广播加去抖,减少无效事件
...
1. 信号监听:不再实时更新状态栏,只在有/无信号翻转时Toast提示
2. 电量广播:百分比和充电状态没变就不发事件(原来每秒都触发)
3. 状态栏:移除信号条绘制
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 12:05:48 +09:30
dongliang
20a0389b07
fix: 移除前台服务/电池白名单/AlarmManager,恢复旧版MQTT直连方案
...
定制ROM+Launcher应用不会被系统杀死,保活机制是多余的耗电源头。
回到和旧版一样的方案:SplashFragment直连MQTT + Paho自动重连。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 11:40:15 +09:30
dongliang
1214ca92a4
fix: 解绑处理移到MainActivity,用全局action从任何页面跳转
...
HomeFragment在子页面时viewLifecycleOwner被销毁,collect停止,
收不到解绑消息。改为Activity级别处理+全局导航action,彻底解决。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-11 10:26:29 +09:30
dongliang
72705d6267
fix: 解绑不跳转+绑定偶尔失败
...
1. 事件监听提前到onViewCreated,不等API返回,避免解绑消息丢失
2. 解绑导航加防护:子页面时先popBack再跳转,防止导航异常
3. 绑定加防重复标记,防止MQTT重发导致多次处理
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-09 22:29:07 +09:30
dongliang
fc9a42b84b
fix: 临时禁用蓝牙扫描排查耗电(enabled=false)
...
添加蓝牙扫描总开关,默认关闭。确认耗电改善后可重新开启。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-09 21:46:53 +09:30
dongliang
4071d9733e
fix: 降低耗电 - 时钟改每分钟更新+息屏暂停,健康检查改15分钟+不唤醒
...
1. 时钟从每秒更新改为每分钟,用 repeatOnLifecycle 息屏自动暂停
2. MQTT 健康检查从5分钟改为15分钟,用 ELAPSED_REALTIME 不强制唤醒设备
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-09 21:45:31 +09:30
dongliang
ee33cf7ca1
fix: 首次绑定后不跳转首页,导航不再等待API返回
...
将导航提到协程外部立即执行,API确认异步进行,
避免网络异常导致协程取消而跳不到首页。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-09 21:39:58 +09:30
dongliang
24250ef7a6
fix: 首次绑定后统计数字显示0,onResume始终刷新统计数据
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-09 21:37:44 +09:30
dongliang
583ce9b841
fix: 移除永久WakeLock避免耗电,依赖前台服务+电池白名单保活
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-09 13:11:56 +09:30
dongliang
b867c33015
fix: 息屏后MQTT断连导致无法收到通知
...
添加前台服务+WakeLock保活MQTT连接,请求电池优化白名单绕过Doze限制,
AlarmManager每5分钟健康检查断连自动重连。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-09 13:10:04 +09:30
dongliang
966c9f9c0d
style: TTS按钮放大到64dp,图标更醒目
...
56dp → 64dp,padding 不变,图标从 36dp 增大到 44dp。
安装后请重启手表。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 17:09:05 +09:30
dongliang
25ba315e63
fix: 一次性优化(时钟去秒+备注修复+按钮放大+切换取消)
...
1. 首页时钟 HH:mm:ss → HH:mm
2. TTS 备注优先读 taskRequire(和页面显示一致)
3. TTS 按钮 48dp → 56dp,背景透明度 50% → 30%
4. 切换任务时取消进行中的 TTS 合成请求
安装后请重启手表。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 16:49:29 +09:30
dongliang
c42d50f2d6
fix: TTS按钮放大到48dp + 首页时钟显示秒
...
1. TTS悬浮按钮从36dp放大到48dp,老年人更容易点击
2. 首页时钟从 HH:mm 改为 HH:mm:ss,显示秒
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 13:41:21 +09:30
dongliang
26589f0197
fix: TTS时间朗读优化 + 补充要求完成/截止时间
...
1. 时间格式转中文朗读:"04.28 09:10" → "4月28日9点10分"
2. 补充要求完成时间(preFinishTime)和截止时间(expireTime)
3. 积分读"X分"而非"+X"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 13:29:07 +09:30
dongliang
032657fb60
fix: EdgeTTS 强制 TLS 1.2 兼容 Android 8.1
...
Android 8.1 默认 TLS 配置可能不支持服务器要求的密码套件,
强制启用 TLS 1.2 + MODERN_TLS + COMPATIBLE_TLS 回退。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 13:22:11 +09:30
dongliang
02f84e6c04
fix: EdgeTTS 用独立 OkHttpClient,去掉业务拦截器干扰
...
WebSocket 连接经过了 SignatureInterceptor/UnbindInterceptor 导致连接被重置。
改为独立的 OkHttpClient,不带任何业务拦截器。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 13:17:39 +09:30
dongliang
bd6aa270c5
fix: TTS播放按钮加到正确的页面(TaskListFragment)
...
TaskDetailFragment 未被使用,实际任务页面是 TaskListFragment。
- 在 TaskListFragment 布局加悬浮播放按钮
- 在 TaskListFragment 加 TTS 播放/停止逻辑
- 切换任务(左右滑动)时自动停止播报
- 离开页面自动停止播报
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 13:12:17 +09:30
dongliang
aafae56826
fix: TTS悬浮按钮不可见,提高对比度
...
背景从30%白透明改为50%,图标从白色改为黑色,黑底上更清晰。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 13:03:56 +09:30
dongliang
cf4458526b
feat: 任务详情页语音播报功能 (REQ-20260508-0006)
...
- 详情页右侧悬浮播放按钮(36dp半透明圆形)
- 播报内容:任务名+地点+时间+积分(>0)+备注,空字段跳过
- 播放中按钮高亮+图标切换,再点停止
- 离开页面自动停止播放
- TTS播放期间抑制提示音,避免叠加
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 12:57:51 +09:30
dongliang
f01b1e3311
fix: EdgeTtsManager val 赋值编译错误
...
apply 块内 isPlaying 赋值改为外部引用,避免 val 重新赋值。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 12:36:18 +09:30
dongliang
5a386a6060
feat: 接入 Edge TTS 免费中文语音合成
...
设备不支持内置中文 TTS,改用微软 Edge TTS(WebSocket 协议)。
- 新增 EdgeTtsManager:WebSocket 调用、MP3 缓存、MediaPlayer 播放
- 调试模式(设置页点头像6次)触发 TTS 测试
- 缓存机制:相同文本不重复请求,上限50条自动清理
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 12:33:59 +09:30
dongliang
557363c80d
feat: 添加 TTS 中文语音测试(调试模式触发)
...
设置页快速点击头像6次触发 TTS 测试,验证设备是否支持中文语音合成。
测试结果通过 Toast 和 Logcat 反馈,为后续任务语音播报功能做可行性验证。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 12:07:18 +09:30
dongliang
fec1e80cf1
chore: 应用名称改为小趣智清洁,APK文件名包含版本号
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-08 11:33:56 +09:30
dongliang
7c631025ba
fix: 通知模式完成最后任务后跳到新任务页而非首页
...
原因:filterTaskIds 过滤为空数组后 isNotEmpty()=false
跳过了通知模式分支,走了正常 status=2 查询显示了新任务
修复:ids != null 就进通知分支,空数组+hasActioned 直接回首页
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 21:41:33 +09:30
dongliang
d38060e9b3
fix: 操作成功弹窗不消失问题 + 统一弹窗交互
...
问题:back=false 导致弹窗永远不消失
修复:所有弹窗统一 back=true + countdown=2 自动消失
用 onBack 回调替代 postDelayed,弹窗消失后再执行刷新/返回
弹窗梳理:
- 操作成功(抢单/打卡/完成):2秒消失 → onBack 刷新列表
- 全部完成:2秒消失 → onBack 返回首页
- NFC打卡成功:2秒消失 → postDelayed 刷新详情
- 失败/网络异常:3秒消失 → 无回调
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 21:36:09 +09:30
dongliang
646f780a1f
fix: 任务操作后的交互优化(消除黑屏闪烁)
...
1. 操作成功后先显示弹窗 2 秒,弹窗消失后再刷新(不再立即刷新导致黑屏)
2. 刷新时不显示 loading(保持当前内容,静默更新)
3. 列表全部完成后显示"全部完成"弹窗 1.5 秒,再返回首页
之前:完成→黑屏loading→突然跳到下一个/回首页
现在:完成→弹窗"任务已完成"→平滑切到下一个/弹窗"全部完成"→回首页
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 21:31:44 +09:30
dongliang
ac483b5f89
fix: 统计数字持久化到 SharedPreferences,重启后不显示 0
...
之前 lastStats 是内存缓存,重启后为 null,首页短暂显示默认值 0
现在每次 API 返回都持久化到 stats_cache SP
启动时优先读 SP 缓存 → 立即显示上次数字 → API 静默更新
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 21:14:19 +09:30
dongliang
f4e9410211
fix: 通知模式下标题/页码/完成任务移除的问题
...
1. 标题根据任务实际 status 显示(通知模式下不再固定"新任务")
2. 页码:通知模式始终显示,正常模式接单池隐藏
3. 完成任务后从 filterTaskIds 中移除,避免已完成任务仍在列表
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 21:08:01 +09:30
dongliang
e383ad190a
feat: 用 productFlavors 区分调试和发布包名
...
dev: com.xiaoqu.watch(调试用,和旧版不冲突,可直接装到手表)
prod: com.witClean.watch(正式发布,用旧签名打包走 OTA 升级)
日常开发选 devDebug,发布时选 prodRelease + witcleaning2.keystore
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 20:46:57 +09:30
dongliang
72f07f18f4
fix: 单个任务通知也跳转到统一的任务列表页
...
之前1个任务跳 TaskDetail,多个跳 TaskList,体验不一致
统一都跳 TaskListFragment(单任务时就是全屏展示一个)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 20:23:51 +09:30
dongliang
0682c7e5c5
chore: 打包前清理(Timber release关闭 + 删除内网TODO注释)
...
1. Timber.DebugTree 只在 DEBUG 模式植入,release 不输出日志
2. 删除 build.gradle.kts 中的内网 IP 注释
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 19:00:34 +09:30
dongliang
7e30cf88c4
fix: 禁用 ExpiredTargetSdkVersion lint 检查
...
手表设备不上 Google Play,targetSdk=27 是设备要求,跳过此检查
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 18:57:24 +09:30
dongliang
5220bb98e5
feat: 包名改为 com.witClean.watch 实现旧版无缝升级
...
applicationId 从 com.xiaoqu.watch 改为 com.witClean.watch(和旧版一致)
versionCode 从 1 改为 183(旧版是 182),系统识别为升级
代码内部 package 保持 com.xiaoqu.watch 不变
使用旧版同一签名证书 witcleaning2.keystore 打包
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 18:46:49 +09:30
dongliang
7b5ad64fea
feat: 任务切换加滑动动画 + 严格手势防误触
...
1. 手势判断从 dx>dy 改为 dx>dy*2 且 dx>80px,斜滑不再误触
2. 切换任务时内容滑出+滑入动画(120ms出+150ms入),有明确感知
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 17:42:00 +09:30
dongliang
3d991c0169
fix: 首页用缓存数据填充卡片数字,消除刷新闪烁
...
之前流程:inflate(数字=0) → API请求 → 数字跳到真实值,产生闪烁
现在流程:inflate → 立即用 lastStats 缓存填充 → API静默更新
首次启动无缓存时仍显示 XML 默认值 0,之后都是无感刷新
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 17:12:42 +09:30
dongliang
e67100ba83
fix: 首页卡片数字只在值变化时更新,减少刷新闪烁
...
之前每次 fetchStatistics 都重新赋值 text,即使值没变也触发重绘
改为先比较再赋值,值相同时不操作
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 17:07:51 +09:30
dongliang
ea72c2aab0
fix: 返回按钮恢复64dp宽居中,高度48dp增加上下点击区
...
宽度回到64dp不影响标题居中,高度48dp比文字高增加纵向点击面积
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 17:03:20 +09:30
dongliang
1cafb74f04
fix: 标题栏恢复 LinearLayout,返回按钮100dp宽+左padding
...
FrameLayout 覆盖层方案导致页面内容消失
改回 LinearLayout,按钮宽度 100dp 图标靠左(paddingStart=21dp)
右侧空白区域都是可点击范围
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 16:58:28 +09:30
dongliang
1dc34de35a
fix: 返回按钮改用透明覆盖层方案
...
标题栏改为 FrameLayout,图标保持原样
上层叠一个 120dp 宽的透明 View 覆盖左半边
点击左半边任意位置都触发返回,不影响视觉
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 16:52:34 +09:30
dongliang
0c5d9076a8
fix: 返回按钮改为整个标题栏左半边可点击
...
去掉 TouchDelegate,改用 FrameLayout 占标题栏左半边(weight=1)
图标靠左显示,但整个左半边 48dp 高的区域都能触发返回
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 16:45:17 +09:30
dongliang
7d1172f20d
fix: 返回按钮点击区域向右扩展 10dp→40dp
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-05-07 16:38:47 +09:30