feat(ui): complete ABox app experience redesign #10

Merged
KremeCN merged 40 commits from feat/ui-ux-redesign into main 2026-08-27 23:25:08 +08:00
3 changed files with 62 additions and 28 deletions
Showing only changes of commit 816606234b - Show all commits
+3 -3
View File
@@ -94,7 +94,7 @@ ABSDK 防腐层已在 `:absdk-bridge` 中完成同步阻塞调用的后台串行
Fake 只用于开发和测试,不能作为真实 ABox 或真实硬件验收证据。`:testing:fakes` 是测试专用模块,不得加入应用生产依赖。 Fake 只用于开发和测试,不能作为真实 ABox 或真实硬件验收证据。`:testing:fakes` 是测试专用模块,不得加入应用生产依赖。
一个例外是 `FakeDeviceCatalog`:ABSDK 不提供设备目录,而提供方作用域的生产 ABox 设备目录由设备目录模块负责,尚未落地。在该模块交付前,debug 构建的组合根暂时用 `FakeDeviceCatalog` 充当 ABox 目录占位。这是一个临时的目录所有权边界:不得把 ABox 目录请求路由到本地体验的模拟目录,release 构建在出现真实消费方之前不声明 `DeviceCatalog` 绑定。 ABSDK 不提供设备目录发现能力。生产 ABox 设备目录由 `:android:core:devicecatalog` 按当前 profile 持久化,来源是用户明确配置或导入的真实 `DeviceName`;它不从本地体验目录复制数据,也不把测试 Fake 绑定到生产组合根。Local profile 仍由 `SimulationDeviceCatalog` 提供独立的确定性目录。
## 7. 本地体验模拟运行时 ## 7. 本地体验模拟运行时
@@ -159,8 +159,8 @@ App 组合根已通过 Hilt 单例绑定该 Bridge,绑定处以 `@CleartextAbs
两个提供方在所有构建变体中始终可用,不存在按 debug/release 区分的可用性开关。 两个提供方在所有构建变体中始终可用,不存在按 debug/release 区分的可用性开关。
登录完成后进入 `authenticated` 协作路由。当前仅有占位页面,设备列表与主导航由 alZerNest 的设备导航模块接管。 登录完成后进入 `authenticated` 协作路由。设备中心、详情、红外、情景、自动化和活动记录由对应 Android 模块提供,并通过当前 profile 路由到真实或本地体验端口。
## 11. 后续边界 ## 11. 后续边界
Room 与设备业务 DataStore 的具体 schema/key 只在对应数据所有权明确后创建。生产 ABox 设备目录由设备目录模块交付后替换 debug 构建中的临时 `FakeDeviceCatalog` 占位。历史示例中的 AsyncTask、明文密码存储、全局明文网络和散落 SDK 调用不得进入正式架构。 Room 与设备业务 DataStore 的具体 schema/key 只在对应数据所有权明确后创建。生产 ABox 设备目录由设备目录模块维护,不能回退到 `FakeDeviceCatalog`。历史示例中的 AsyncTask、明文密码存储和散落 SDK 调用不得进入正式架构;ABSDK 厂商 JAR 的明文局域网传输风险已明确记录并由所有构建变体共同承担。
+21 -25
View File
@@ -2,39 +2,35 @@
## 1. 硬件环境与已知设备信息 / Hardware Environment ## 1. 硬件环境与已知设备信息 / Hardware Environment
本阶段用于真实验证的实体设备信息如下: 真实硬件验证只允许在获授权的隔离局域网中进行。文档不记录完整网关地址、IEEE 地址、凭据、令牌、红外码值或原始 SDK 响应;设备名称也应使用脱敏别名。
- **设备名称**: 红外控制器 (例如 `红外控制器` 或厂商平台绑定的 `irDevName`) - **设备名称**: 脱敏的红外控制器别名
- **IEEE 地址**: `1c1cfd001dba533c` (短地址: `d822`) - **设备类型**: 红外控制器
- **信号强度 (LQI/RSSI)**: `-4` - **网关/主机**: 获授权的 ABox 智能主机
- **电量**: `100%` - **被控实体**: 获授权的实体空调、电视或其他电器
- **设备类型**: 红外控制器 (Infrared Controller)
- **网关/主机**: ABox 智能主机
- **被控实体**: 实体空调 / 电视遥控器及对应电器
--- ---
## 2. 硬件测试记录表 / Hardware Validation Log ## 2. 硬件测试记录表 / Hardware Validation Log
| 日期 (Date) | App Commit | 运行模式 (Mode) | Profile ID | 设备名称 (Device Name) | SDK Key | 操作 (Operation) | 耗时 (ms) | ABSDK Code | 脱敏消息 (Message) | 物理响应 (Physical Response) | 结论 (Result) | | 日期 | App Commit | 运行模式 | 脱敏 Profile | 脱敏设备名 | 脱敏操作标识 | 操作 | 耗时区间 | 脱敏错误分类 | 物理响应 | 结论 |
|---|---|---|---|---|---|---|---|---|---|---|---| |---|---|---|---|---|---|---|---|---|---|
| 2026-08-24 | b27c67f | FAKE | abox:infrared-fake | ir-living | app_ir_power1 | Learn | 120 | 00000 | success | 模拟学习完成并入库 READY | PASS (Fake) | | 待填 | 待填 | 本地体验 | local-test | simulation-ir | test-1 | Learn/Send | 待填 | 无 | 模拟流程通过 | 仅软件验证 |
| 2026-08-24 | b27c67f | FAKE | abox:infrared-fake | ir-living | app_ir_power1 | Send | 45 | 00000 | success | 模拟发射成功 | PASS (Fake) | | 待填 | 待填 | ABox | profile-redacted | device-redacted | operation-redacted | Learn | 待填 | 待填 | 授权遥控器完成学习 | 待真机执行 |
| 2026-08-24 | 待填 | REAL_ABSDK | abox | 红外控制器 | app_ir_xxxx | Learn | - | - | - | 遥控器对准控制器按下目标按键 | 待真机执行 | | 待填 | 待填 | ABox | profile-redacted | device-redacted | operation-redacted | Send | 待填 | 待填 | 授权电器产生预期响应 | 待真机执行 |
| 2026-08-24 | 待填 | REAL_ABSDK | abox | 红外控制器 | app_ir_xxxx | Send | - | - | - | 实体电器执行开关/调节响应 | 待真机执行 |
--- ---
## 3. 标准真机测试流程 (12 项用例) / Standard 12-Step Test Procedure ## 3. 标准真机测试流程 (12 项用例) / Standard 12-Step Test Procedure
### 用例 1: 真实会话认证前置 (Authenticate Shared Bridge) ### 用例 1: 真实会话认证前置 (Authenticate Session)
- **前置**: 通过登录模块对进程单例 `AbsdkBridge` 进行登录认证。 - **前置**: 通过登录模块对进程单例 `AbsdkBridge` 进行登录认证。
- **步骤**: 检查进入红外控制页面前,会话 Token 是否有效。 - **步骤**: 检查进入红外控制页面前,会话是否有效。
- **预期**: 若未认证,进入 Real 模式操作时返回 `TokenInvalid` 并提示返回登录。 - **预期**: 若未认证,真实模式操作返回会话无效错误并提示返回登录。
### 用例 2: 输入并保存真实设备名 (Enter and Save irDevName) ### 用例 2: 输入并保存真实设备名 (Enter and Save irDevName)
- **步骤**: 在“红外设备名称”输入框中输入 `红外控制器` 或后台分配的真实设备名,点击“保存设备名”。 - **步骤**: 在“红外设备名称”输入框中输入获授权设备名,点击“保存设备名”。
- **预期**: 本地 Room 保存成功,页面显示“已保存设备:红外控制器”,启用“学习新按键”入口。 - **预期**: 本地 Room 保存成功,页面显示脱敏设备名并启用学习入口。
### 用例 3: 学习全新唯一按键 (Learn Unique Key) ### 用例 3: 学习全新唯一按键 (Learn Unique Key)
- **步骤**: 点击“学习新按键”,输入显示名称(如“空调开”),点击“开始学习”;将物理遥控器对准红外控制器按下按键。 - **步骤**: 点击“学习新按键”,输入显示名称(如“空调开”),点击“开始学习”;将物理遥控器对准红外控制器按下按键。
@@ -69,17 +65,17 @@
- **预期**: App 启动或重新进入页面时,`RecoverInterruptedInfraredLearning` 将遗留的 `LEARNING` 保守恢复为 `FAILED`,提示用户重新学习。 - **预期**: App 启动或重新进入页面时,`RecoverInterruptedInfraredLearning` 将遗留的 `LEARNING` 保守恢复为 `FAILED`,提示用户重新学习。
### 用例 11: Token 失效与重新登录 (Token Expiration) ### 用例 11: Token 失效与重新登录 (Token Expiration)
- **步骤**: 主机端使 Token 失效或超过 2 小时后发起红外操作。 - **步骤**: 使远端会话失效后发起红外操作。
- **预期**: 返回 `TokenInvalid`,本地会话被清除,页面提示登录失效并导航返回。 - **预期**: 返回会话无效错误,本地会话被清除,页面提示登录失效并导航返回。
### 用例 12: 检查未文档化响应字段 (Inspect Undocumented Fields) ### 用例 12: 检查未文档化响应字段 (Inspect Undocumented Fields)
- **步骤**: 在调试构建中检查 `ABRet.getDicDatas()` 是否包含未文档化字段。 - **步骤**: 仅在授权的隔离环境中确认响应是否包含已知字段;不得保存或传播原始响应。
- **安全约束**: 严禁将 Raw Payload、Token、密码或未脱敏数据打印至生产日志。 - **安全约束**: 严禁将原始响应、令牌、密码、红外码值或未脱敏网络标识打印至日志或写入测试记录。
--- ---
## 4. 协议与硬件事实确认记录 / Observed Facts ## 4. 协议与硬件事实确认记录 / Observed Facts
- **SDK 阻塞模式**: 同步阻塞 HTTP POST 调用,由 `AbsdkBridge` 调度至 `Dispatchers.IO` 并通过进程级 `Mutex` 串行执行。 - **SDK 阻塞模式**: 同步阻塞 HTTP POST 调用,由 `AbsdkBridge` 调度至 `Dispatchers.IO` 并通过进程级 `Mutex` 串行执行。
- **数据隔离**: `FAKE` 模式自动使用 `profileId:infrared-fake` 隔离数据,`REAL_ABSDK` 模式使用主会话数据。 - **数据隔离**: 本地体验使用独立的模拟 profile;ABox 模式使用当前已认证 profile,二者不共享设备、遥控器或会话数据。
- **安全门禁**: 真实 ABSDK 依赖明文传输,Release 构建中完全禁用硬件接口并由 `InfraredReleaseModule` 安全阻断。 - **传输事实**: 真实 ABSDK 使用厂商 JAR 中的明文 HTTP 传输。Debug 与 Release 暴露相同的提供方和硬件路由;项目通过显式传输标记和 manifest 的明文配置接受这一局域网集成风险。该配置不提供机密性或完整性。
@@ -0,0 +1,38 @@
# 发布版局域网硬件验证协议
## 目的与边界
本协议只用于获授权的隔离局域网。使用签名的 Release APK、已确认的测试账号和明确授权的实体设备;不得把测试扩展到未授权网络或设备。
协议验证真实产品路径,不把本地体验或测试 Fake 的结果当作 ABox 硬件证据。每条记录使用脱敏 profile、设备和操作标识。
## 执行前检查
- 确认 APK 签名、版本和提交号,记录到测试报告。
- 确认测试网络与设备均获授权,并记录网络的脱敏名称。
- 先使用已知无效凭据验证登录失败,再使用授权凭据登录。
- 检查当前 profile、会话状态和已配置设备目录;只验证用户明确配置的设备。
- 不在报告、截图、日志或缺陷单中保存密码、令牌、原始厂商响应、红外码值、完整网关地址或完整 IEEE 地址。
## 验证流程
1. 登录失败路径:确认无效凭据停留在登录页,并显示本地化错误。
2. 授权登录路径:确认授权凭据登录成功,进入认证后的设备中心。
3. 设备目录:配置一个已授权的真实设备名,确认只显示当前 profile 的设备,并可进行只读列表检查。
4. 插座操作:对一个已配置插座执行一次开或关命令,随后读取状态确认;记录结果分类,不记录原始响应。
5. 传感器读取:读取已配置的温湿度设备,验证有数据、部分数据和无数据状态的显示边界。
6. 红外学习:对已授权红外控制器学习一个测试按键,确认状态从学习中到完成或明确失败。
7. 红外取消:学习过程中离开页面或取消,确认不会留下可继续发送的半成品记录。
8. 红外发送:发送已完成的测试按键,确认授权电器产生预期响应。
9. 情景执行:执行一个只包含已配置设备的情景,观察实际步骤结果和终态。
10. 活动记录:确认上述真实终态写入当前 profile 的活动时间线,失败、等待确认和取消保持不同分类。
11. 会话失效:使远端会话失效后重试一次设备操作,确认本地会话清理并返回登录流程。
12. Local 隔离复核:切换到本地体验后,确认 ABox 设备、遥控器、活动和会话数据不出现;该步骤不作为真实硬件通过证据。
## 结果记录
每个步骤只记录:日期、Release 版本或提交号、脱敏 profile、脱敏设备名、操作类别、成功/失败/取消/不可用分类、粗粒度耗时和物理响应摘要。错误只记录已脱敏的领域错误分类;不要复制堆栈或原始 SDK 文本。
## 风险说明
真实 ABSDK 使用厂商 JAR 中的明文 HTTP 传输。Release 与 Debug 使用相同的提供方和硬件路由;明文传输不提供机密性或完整性,因此只能在隔离且获授权的局域网执行本协议。