diff --git a/docs/task/22-保存当前使用的-android-设备.md b/docs/task/22-保存当前使用的-android-设备.md new file mode 100644 index 0000000..268aed2 --- /dev/null +++ b/docs/task/22-保存当前使用的-android-设备.md @@ -0,0 +1,70 @@ +# 22 保存当前使用的 Android 设备 + +- 类型:需求 +- 父级大工单:#1 +- 所属 MVP / 版本:#2 / MVP +- 状态:已实现,待验收 +- 日期:2026-08-07 +- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/22 + +## 背景与目标 + +Android 设备搜索结果原来只存在于界面内存中。此次补齐“保存”和“删除”行为,使 Client 重启后仍知道自动化应该使用哪台 Android 设备。 + +## 最终方案 + +- 只在现有 `app_settings` 表保存 `android.selected_serial`,不保存容易过期的搜索列表、在线状态、型号和 Android 版本。 +- 勾选设备只是临时选择;点击“保存”且写入成功后,才成为当前使用设备。 +- 页面启动时通过一次简单的索引查询恢复设备号;搜索后若设备在线则自动勾选,离线时保留配置并提示用户。 +- 保存和删除由 `QObject + moveToThread` Worker 在后台写入 SQLite,防止阻塞 Qt 主线程并避免重复提交。 +- 写入失败时保留原配置和当前临时选择;页面关闭后忽略迟到结果。 +- “删除”只清除本地设置,不执行 ADB 断开,也不删除手机或 PDD 数据。 +- 没有新增数据库迁移、Admin 接口和第三方依赖。 + +工单最初把所有 SQLite 读写都计划为后台任务。实现时按现有设置页启动方式,将一次少量、带索引的启动读取保留为同步操作;可能阻塞的保存和删除仍在后台执行。该调整减少了初级维护人员需要理解的线程状态,不改变用户功能。 + +本任务只补全现有设置页行为,没有调整布局,因此按 Windows UI/UX 规范跳过 HTML 原型。 + +## 改了哪些 + +- `client/src/selected_android_device_service.py`:设置键、设备号校验、读取、保存和删除。 +- `client/src/settings_ui_event.py`:启动恢复、后台写入、搜索后自动选择、离线提示及线程关闭保护。 +- `client/test/test_selected_android_device_service.py`:覆盖设置服务的正常、异常和删除边界。 +- `client/test/test_settings_ui_event.py`:覆盖保存、恢复、在线/离线搜索、失败保留、删除、重复提交和关闭安全。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 保存后 `android.selected_serial` 等于所选设备号 | 通过 | +| 重新创建页面后恢复已保存设备号 | 通过 | +| 已保存设备在线时搜索后自动勾选 | 通过 | +| 已保存设备离线时保留配置并明确提示 | 通过 | +| 搜索结果、状态、型号和版本不写入数据库 | 通过 | +| 未勾选设备时不能保存 | 通过 | +| 保存失败时原配置和临时选择不变 | 通过 | +| 删除只清除当前设备设置,不执行 ADB 操作 | 通过 | +| 保存和删除防止重复提交,主线程保持响应 | 通过 | +| 页面关闭后忽略迟到写入结果 | 通过 | +| 不新增迁移、Admin 接口和第三方依赖 | 通过 | +| 全量测试、语法检查和差异检查 | 通过 | + +## 测试 + +- 执行的命令: + +```powershell +C:/Python310/python.exe -m py_compile client/src/selected_android_device_service.py client/src/settings_ui_event.py client/test/test_selected_android_device_service.py client/test/test_settings_ui_event.py +$env:QT_QPA_PLATFORM="offscreen" +C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" +git diff --check +``` + +- 结果:Client 全量 74 项测试通过;语法检查和差异检查通过。 +- **没验证到的部分**:尚未在可见窗口中用真实在线/离线设备完成重启、自动勾选和删除的整套人工流程;未检查打包后的 exe;Narrator、高对比度和 200% 缩放未做人工检查;数据库失败场景使用测试替身模拟。 + +测试环境仍会输出现有 PyQt5 字体目录缺失和 SIP API 弃用警告,不影响测试结果。 + +## 相关提交 + +- `27a09e5` `feat: 保存当前使用的 Android 设备 (#22)`