保存当前使用的 Android 设备 #22

Closed
opened 2026-08-07 14:06:53 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:3. Admin Mock/Gateway 闭环
  • 依赖:#7、#21
  • 当前状态:验收通过

要解决什么

Android 设备搜索结果目前只存在于界面内存中。用户勾选设备后,“保存”和“删除”按钮原来只发出信号,没有持久化行为;Client 重启后不知道自动化应使用哪台 Android 设备。

本任务只保存用户明确选择的设备号,不保存会过期的搜索列表、在线状态、型号或 Android 版本。

做什么 / 不做什么

  • 做:
    • 使用现有 app_settings 表保存 android.selected_serial;
    • 点击“保存”后持久化当前勾选且状态正常的设备;
    • 点击“删除”后清除已保存设备配置,不删除 ADB 设备或手机数据;
    • 页面启动时恢复已保存设备号并显示“等待搜索确认连接”;
    • 搜索后若已保存设备在线则自动勾选;
    • 搜索后若已保存设备不在线则保留配置并明确提示;
    • SQLite 访问使用独立应用服务;启动时同步读取一次少量索引设置,保存和删除由 QObject + moveToThread Worker 执行;
    • 保存/删除期间禁止重复操作,失败时保留原配置和当前勾选;
    • 页面关闭后忽略迟到结果;
    • 补充服务和离屏 Qt 测试。
  • 不做:
    • 不保存整份 ADB 搜索结果、在线状态、型号和 Android 版本;
    • 不修改数据库结构或新增迁移;
    • 不执行 adb connect/disconnect;
    • 不删除 Android 设备、手机文件或 PDD 数据;
    • 不登记 Admin、不修改 Admin 接口;
    • 不增加第三方依赖。

最终实现

  1. 新增当前 Android 设备设置服务,统一设置键、设备号校验、读取、保存和删除。
  2. 复用 SettingsRepository 的 get/set/delete,不新增表和迁移。
  3. 新增后台设置 Worker,使用明确的 save/delete 动作处理 SQLite 写入。
  4. 勾选只代表“准备保存的临时选择”;只有点击“保存”成功后才更新“当前使用设备”。
  5. 删除是可恢复的本地配置清除,不使用模态确认;清除后仍可重新搜索和保存。
  6. 搜索结果继续使用稳定序列号与已保存配置匹配;离线配置不因搜索结果缺失而自动删除。
  7. 复用页面状态区反馈“保存中、已保存、删除中、已删除、失败、当前未连接”。
  8. 这是现有页面的局部行为补全,不调整布局,因此不制作 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

实现说明:工单最初计划把所有 SQLite 读写都放入 Worker。最终沿用设置页现有的启动恢复方式,只同步执行一次简单的索引读取;可能阻塞的保存和删除仍在后台执行。这样线程状态更少,也更便于初级程序员维护,不改变用户功能。

验收标准

  • 保存正常设备后,SQLite 的 android.selected_serial 等于设备号;
  • 重启页面后能恢复已保存设备号;
  • 已保存设备在线时,搜索成功后自动勾选;
  • 已保存设备不在线时不删除配置,并提示“已保存设备当前未连接”;
  • 搜索列表、在线状态、型号和 Android 版本不写入数据库;
  • 未勾选正常设备时不能保存;
  • 保存失败时原配置和界面选择保持不变,并能重试;
  • 删除只清除 android.selected_serial,不执行 ADB 删除或断开;
  • 保存和删除期间防止重复提交,Qt 主线程保持响应;
  • 页面关闭后的迟到结果不会访问已销毁控件;
  • 不新增数据库迁移、Admin 接口和第三方依赖;
  • 全量 unittest、语法检查和 git diff --check 通过。

怎么验证

Run from the client/ directory:

C:/Python310/python.exe -m py_compile src/selected_android_device_service.py src/settings_ui_event.py test/test_selected_android_device_service.py test/test_settings_ui_event.py
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"
Remove-Item Env:QT_QPA_PLATFORM

人工验收:

  1. 搜索并勾选一台在线 Android 设备,点击 Android 设备区域的“保存”;
  2. 重启 Client 并确认状态区恢复该设备号;
  3. 再次搜索,确认在线设备自动勾选;
  4. 断开设备后搜索,确认配置仍存在并显示未连接;
  5. 点击“删除”,重启后确认不再恢复该设备。

验收关闭

  • 用户于 2026-08-07 确认验收通过。
  • 本地归档状态已更新为“已完成”。
  • 验收归档提交:a6e3fe0。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:3. Admin Mock/Gateway 闭环 - 依赖:#7、#21 - 当前状态:验收通过 ## 要解决什么 Android 设备搜索结果目前只存在于界面内存中。用户勾选设备后,“保存”和“删除”按钮原来只发出信号,没有持久化行为;Client 重启后不知道自动化应使用哪台 Android 设备。 本任务只保存用户明确选择的设备号,不保存会过期的搜索列表、在线状态、型号或 Android 版本。 ## 做什么 / 不做什么 - 做: - 使用现有 `app_settings` 表保存 `android.selected_serial`; - 点击“保存”后持久化当前勾选且状态正常的设备; - 点击“删除”后清除已保存设备配置,不删除 ADB 设备或手机数据; - 页面启动时恢复已保存设备号并显示“等待搜索确认连接”; - 搜索后若已保存设备在线则自动勾选; - 搜索后若已保存设备不在线则保留配置并明确提示; - SQLite 访问使用独立应用服务;启动时同步读取一次少量索引设置,保存和删除由 `QObject + moveToThread` Worker 执行; - 保存/删除期间禁止重复操作,失败时保留原配置和当前勾选; - 页面关闭后忽略迟到结果; - 补充服务和离屏 Qt 测试。 - 不做: - 不保存整份 ADB 搜索结果、在线状态、型号和 Android 版本; - 不修改数据库结构或新增迁移; - 不执行 `adb connect/disconnect`; - 不删除 Android 设备、手机文件或 PDD 数据; - 不登记 Admin、不修改 Admin 接口; - 不增加第三方依赖。 ## 最终实现 1. 新增当前 Android 设备设置服务,统一设置键、设备号校验、读取、保存和删除。 2. 复用 `SettingsRepository` 的 `get/set/delete`,不新增表和迁移。 3. 新增后台设置 Worker,使用明确的 `save/delete` 动作处理 SQLite 写入。 4. 勾选只代表“准备保存的临时选择”;只有点击“保存”成功后才更新“当前使用设备”。 5. 删除是可恢复的本地配置清除,不使用模态确认;清除后仍可重新搜索和保存。 6. 搜索结果继续使用稳定序列号与已保存配置匹配;离线配置不因搜索结果缺失而自动删除。 7. 复用页面状态区反馈“保存中、已保存、删除中、已删除、失败、当前未连接”。 8. 这是现有页面的局部行为补全,不调整布局,因此不制作 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` 实现说明:工单最初计划把所有 SQLite 读写都放入 Worker。最终沿用设置页现有的启动恢复方式,只同步执行一次简单的索引读取;可能阻塞的保存和删除仍在后台执行。这样线程状态更少,也更便于初级程序员维护,不改变用户功能。 ## 验收标准 - [x] 保存正常设备后,SQLite 的 `android.selected_serial` 等于设备号; - [x] 重启页面后能恢复已保存设备号; - [x] 已保存设备在线时,搜索成功后自动勾选; - [x] 已保存设备不在线时不删除配置,并提示“已保存设备当前未连接”; - [x] 搜索列表、在线状态、型号和 Android 版本不写入数据库; - [x] 未勾选正常设备时不能保存; - [x] 保存失败时原配置和界面选择保持不变,并能重试; - [x] 删除只清除 `android.selected_serial`,不执行 ADB 删除或断开; - [x] 保存和删除期间防止重复提交,Qt 主线程保持响应; - [x] 页面关闭后的迟到结果不会访问已销毁控件; - [x] 不新增数据库迁移、Admin 接口和第三方依赖; - [x] 全量 unittest、语法检查和 `git diff --check` 通过。 ## 怎么验证 Run from the `client/` directory: ```powershell C:/Python310/python.exe -m py_compile src/selected_android_device_service.py src/settings_ui_event.py test/test_selected_android_device_service.py test/test_settings_ui_event.py $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" Remove-Item Env:QT_QPA_PLATFORM ``` 人工验收: 1. 搜索并勾选一台在线 Android 设备,点击 Android 设备区域的“保存”; 2. 重启 Client 并确认状态区恢复该设备号; 3. 再次搜索,确认在线设备自动勾选; 4. 断开设备后搜索,确认配置仍存在并显示未连接; 5. 点击“删除”,重启后确认不再恢复该设备。 ## 验收关闭 - 用户于 2026-08-07 确认验收通过。 - 本地归档状态已更新为“已完成”。 - 验收归档提交:`a6e3fe0`。
Author
Owner

工单已创建并同步到 #1、#2,现开始实施。现有 pdd_ui.py、ui_main.py 和未跟踪文件属于用户改动,不纳入本工单提交。

工单已创建并同步到 #1、#2,现开始实施。现有 `pdd_ui.py`、`ui_main.py` 和未跟踪文件属于用户改动,不纳入本工单提交。
Author
Owner

#22 已实现,等待人工验收。

  • 代码提交:27a09e5 feat: 保存当前使用的 Android 设备 (#22)
  • 文档提交:c96228f docs: 归档任务 #22
  • 本地归档:docs/task/22-保存当前使用的-android-设备.md
  • 自动验证:Client 全量 74 项 unittest 通过;4 个相关文件语法检查通过;git diff --check 通过。
  • 说明:启动恢复仅做一次简单的索引读取;保存和删除仍通过后台 Worker 写入 SQLite。
  • 未纳入提交:工作区中现有的 Admin 页面、PDD UI 和其他未跟踪文件修改。

请按工单“人工验收”步骤检查真实设备的保存、重启恢复、在线自动勾选、离线保留和删除。验收前工单保持打开。

#22 已实现,等待人工验收。 - 代码提交:`27a09e5 feat: 保存当前使用的 Android 设备 (#22)` - 文档提交:`c96228f docs: 归档任务 #22` - 本地归档:`docs/task/22-保存当前使用的-android-设备.md` - 自动验证:Client 全量 74 项 unittest 通过;4 个相关文件语法检查通过;`git diff --check` 通过。 - 说明:启动恢复仅做一次简单的索引读取;保存和删除仍通过后台 Worker 写入 SQLite。 - 未纳入提交:工作区中现有的 Admin 页面、PDD UI 和其他未跟踪文件修改。 请按工单“人工验收”步骤检查真实设备的保存、重启恢复、在线自动勾选、离线保留和删除。验收前工单保持打开。
ila closed this issue 2026-08-07 15:21:03 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#22