feat(ui): complete ABox app experience redesign (#10)
## Summary - rebuild the authenticated shell, device dashboard, device detail pages, scenes, activity timeline, account sheet, and settings experience - redesign infrared remote management and controls, including custom remotes, learn-state handling, slot isolation, and safe default content - add persisted theme controls with internal accent, color-style, and color-standard resolution while keeping dynamic color authoritative - add ABox profile defaults for the three exact gateway device names, editable starter scenes, and custom infrared remotes - persist real activity events for device commands, infrared actions, and scene execution - stabilize navigation and back behavior, including duplicate top-back protection and removal of the unfinished predictive-back option - update launcher icons and bilingual application name ## Verification - `:android:app:assembleDebug` - installed the debug APK on `emulator-5554` - manually exercised device detail navigation, settings/theme navigation, infrared management, activity records, and repeated back actions ## Notes - no automated test suite was run during the visual iteration cycle - `docs/superpowers/**` and local reference repositories are excluded from this PR Reviewed-on: #10 Co-authored-by: KremeCN <3265494849@qq.com>
This commit was merged in pull request #10.
This commit is contained in:
@@ -94,7 +94,7 @@ ABSDK 防腐层已在 `:absdk-bridge` 中完成同步阻塞调用的后台串行
|
||||
|
||||
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. 本地体验模拟运行时
|
||||
|
||||
@@ -159,8 +159,8 @@ App 组合根已通过 Hilt 单例绑定该 Bridge,绑定处以 `@CleartextAbs
|
||||
|
||||
两个提供方在所有构建变体中始终可用,不存在按 debug/release 区分的可用性开关。
|
||||
|
||||
登录完成后进入 `authenticated` 协作路由。当前仅有占位页面,设备列表与主导航由 alZerNest 的设备导航模块接管。
|
||||
登录完成后进入 `authenticated` 协作路由。设备中心、详情、红外、情景、自动化和活动记录由对应 Android 模块提供,并通过当前 profile 路由到真实或本地体验端口。
|
||||
|
||||
## 11. 后续边界
|
||||
|
||||
Room 与设备业务 DataStore 的具体 schema/key 只在对应数据所有权明确后创建。生产 ABox 设备目录由设备目录模块交付后替换 debug 构建中的临时 `FakeDeviceCatalog` 占位。历史示例中的 AsyncTask、明文密码存储、全局明文网络和散落 SDK 调用不得进入正式架构。
|
||||
Room 与设备业务 DataStore 的具体 schema/key 只在对应数据所有权明确后创建。生产 ABox 设备目录由设备目录模块维护,不能回退到 `FakeDeviceCatalog`。历史示例中的 AsyncTask、明文密码存储和散落 SDK 调用不得进入正式架构;ABSDK 厂商 JAR 的明文局域网传输风险已明确记录并由所有构建变体共同承担。
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# 设备数据能力矩阵
|
||||
|
||||
本文只记录当前代码中有领域端口、实现和测试支撑的设备数据能力。未列出的数据不应在界面中以固定值、随机值、`--` 或伪造图表呈现。
|
||||
|
||||
| 能力 | ABox | 本地体验 | 依据 | 界面策略 |
|
||||
|---|---|---|---|---|
|
||||
| 插座开关状态读取 | 支持 | 支持 | `SocketGateway.getStatus` | 展示已确认状态 |
|
||||
| 插座开关控制 | 支持 | 支持 | `SocketGateway.commandPower` / `setPower` | 命令完成后回读;回读失败显示等待确认 |
|
||||
| 温度当前读数 | 支持,字段可能缺失 | 支持 | `TemperatureHumidityGateway.getReading` | 仅字段存在时展示 |
|
||||
| 湿度当前读数 | 支持,字段可能缺失 | 支持 | `TemperatureHumidityGateway.getReading` | 仅字段存在时展示 |
|
||||
| 红外按键发送 | 支持 | 支持 | `InfraredGateway.sendKey` | 展示真实操作结果 |
|
||||
| 红外按键学习 | 支持 | 支持 | `InfraredGateway.learnKey` | 展示学习状态和结果 |
|
||||
| 红外码下载 | 支持 | 支持 | `InfraredGateway.downloadCodes` | 仅用于真实下载流程 |
|
||||
| 插座电压/电流/功率/电量 | 不可用 | 不可用 | 没有对应领域端口 | 不渲染 |
|
||||
| 插座倒计时 | 不可用 | 不可用 | 没有对应领域端口 | 不渲染 |
|
||||
| 插座历史趋势 | 不可用 | 不可用 | 没有历史数据端口 | 不渲染 |
|
||||
| 温湿度历史趋势 | 不可用 | 不可用 | 没有历史数据端口 | 不渲染 |
|
||||
| 网关诊断延迟 | 不可用 | 不适用 | 没有诊断端口 | 不渲染 |
|
||||
| Token 有效期展示 | 不可用 | 不适用 | SDK 未提供可安全展示的有效期端口 | 不渲染 |
|
||||
|
||||
## Provider 边界
|
||||
|
||||
- ABox 设备目录只包含用户明确配置的 `DeviceName` 和 `DeviceType`。
|
||||
- 本地体验设备来自确定性的模拟目录。
|
||||
- 两个 Provider 的设备描述、状态和历史记录不可互换。
|
||||
- “不可用”表示没有对应能力,不表示设备故障;界面不添加禁用的伪功能控件。
|
||||
|
||||
## 数据处理
|
||||
|
||||
- ABSDK 原始 Map、响应文本、Token、密码和红外原始码值不进入 UI 活动记录。
|
||||
- 错误记录最多保留经过领域层确认的外部错误码。
|
||||
- 温湿度单个字段缺失时保留另一个有效字段;两个字段均缺失时进入无数据状态。
|
||||
@@ -2,39 +2,35 @@
|
||||
|
||||
## 1. 硬件环境与已知设备信息 / Hardware Environment
|
||||
|
||||
本阶段用于真实验证的实体设备信息如下:
|
||||
真实硬件验证只允许在获授权的隔离局域网中进行。文档不记录完整网关地址、IEEE 地址、凭据、令牌、红外码值或原始 SDK 响应;设备名称也应使用脱敏别名。
|
||||
|
||||
- **设备名称**: 红外控制器 (例如 `红外控制器` 或厂商平台绑定的 `irDevName`)
|
||||
- **IEEE 地址**: `1c1cfd001dba533c` (短地址: `d822`)
|
||||
- **信号强度 (LQI/RSSI)**: `-4`
|
||||
- **电量**: `100%`
|
||||
- **设备类型**: 红外控制器 (Infrared Controller)
|
||||
- **网关/主机**: ABox 智能主机
|
||||
- **被控实体**: 实体空调 / 电视遥控器及对应电器
|
||||
- **设备名称**: 脱敏的红外控制器别名
|
||||
- **设备类型**: 红外控制器
|
||||
- **网关/主机**: 获授权的 ABox 智能主机
|
||||
- **被控实体**: 获授权的实体空调、电视或其他电器
|
||||
|
||||
---
|
||||
|
||||
## 2. 硬件测试记录表 / Hardware Validation Log
|
||||
|
||||
| 日期 (Date) | App Commit | 运行模式 (Mode) | Profile ID | 设备名称 (Device Name) | SDK Key | 操作 (Operation) | 耗时 (ms) | ABSDK Code | 脱敏消息 (Message) | 物理响应 (Physical Response) | 结论 (Result) |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| 2026-08-24 | b27c67f | FAKE | abox:infrared-fake | ir-living | app_ir_power1 | Learn | 120 | 00000 | success | 模拟学习完成并入库 READY | PASS (Fake) |
|
||||
| 2026-08-24 | b27c67f | FAKE | abox:infrared-fake | ir-living | app_ir_power1 | Send | 45 | 00000 | success | 模拟发射成功 | PASS (Fake) |
|
||||
| 2026-08-24 | 待填 | REAL_ABSDK | abox | 红外控制器 | app_ir_xxxx | Learn | - | - | - | 遥控器对准控制器按下目标按键 | 待真机执行 |
|
||||
| 2026-08-24 | 待填 | REAL_ABSDK | abox | 红外控制器 | app_ir_xxxx | Send | - | - | - | 实体电器执行开关/调节响应 | 待真机执行 |
|
||||
| 日期 | App Commit | 运行模式 | 脱敏 Profile | 脱敏设备名 | 脱敏操作标识 | 操作 | 耗时区间 | 脱敏错误分类 | 物理响应 | 结论 |
|
||||
|---|---|---|---|---|---|---|---|---|---|
|
||||
| 待填 | 待填 | 本地体验 | local-test | simulation-ir | test-1 | Learn/Send | 待填 | 无 | 模拟流程通过 | 仅软件验证 |
|
||||
| 待填 | 待填 | ABox | profile-redacted | device-redacted | operation-redacted | Learn | 待填 | 待填 | 授权遥控器完成学习 | 待真机执行 |
|
||||
| 待填 | 待填 | ABox | profile-redacted | device-redacted | operation-redacted | Send | 待填 | 待填 | 授权电器产生预期响应 | 待真机执行 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 标准真机测试流程 (12 项用例) / Standard 12-Step Test Procedure
|
||||
|
||||
### 用例 1: 真实会话认证前置 (Authenticate Shared Bridge)
|
||||
### 用例 1: 真实会话认证前置 (Authenticate Session)
|
||||
- **前置**: 通过登录模块对进程单例 `AbsdkBridge` 进行登录认证。
|
||||
- **步骤**: 检查进入红外控制页面前,会话 Token 是否有效。
|
||||
- **预期**: 若未认证,进入 Real 模式操作时返回 `TokenInvalid` 并提示返回登录。
|
||||
- **步骤**: 检查进入红外控制页面前,会话是否有效。
|
||||
- **预期**: 若未认证,真实模式操作返回会话无效错误并提示返回登录。
|
||||
|
||||
### 用例 2: 输入并保存真实设备名 (Enter and Save irDevName)
|
||||
- **步骤**: 在“红外设备名称”输入框中输入 `红外控制器` 或后台分配的真实设备名,点击“保存设备名”。
|
||||
- **预期**: 本地 Room 保存成功,页面显示“已保存设备:红外控制器”,启用“学习新按键”入口。
|
||||
- **步骤**: 在“红外设备名称”输入框中输入获授权设备名,点击“保存设备名”。
|
||||
- **预期**: 本地 Room 保存成功,页面显示脱敏设备名并启用学习入口。
|
||||
|
||||
### 用例 3: 学习全新唯一按键 (Learn Unique Key)
|
||||
- **步骤**: 点击“学习新按键”,输入显示名称(如“空调开”),点击“开始学习”;将物理遥控器对准红外控制器按下按键。
|
||||
@@ -69,17 +65,17 @@
|
||||
- **预期**: App 启动或重新进入页面时,`RecoverInterruptedInfraredLearning` 将遗留的 `LEARNING` 保守恢复为 `FAILED`,提示用户重新学习。
|
||||
|
||||
### 用例 11: Token 失效与重新登录 (Token Expiration)
|
||||
- **步骤**: 主机端使 Token 失效或超过 2 小时后发起红外操作。
|
||||
- **预期**: 返回 `TokenInvalid`,本地会话被清除,页面提示登录失效并导航返回。
|
||||
- **步骤**: 使远端会话失效后发起红外操作。
|
||||
- **预期**: 返回会话无效错误,本地会话被清除,页面提示登录失效并导航返回。
|
||||
|
||||
### 用例 12: 检查未文档化响应字段 (Inspect Undocumented Fields)
|
||||
- **步骤**: 在调试构建中检查 `ABRet.getDicDatas()` 是否包含未文档化字段。
|
||||
- **安全约束**: 严禁将 Raw Payload、Token、密码或未脱敏数据打印至生产日志。
|
||||
- **步骤**: 仅在授权的隔离环境中确认响应是否包含已知字段;不得保存或传播原始响应。
|
||||
- **安全约束**: 严禁将原始响应、令牌、密码、红外码值或未脱敏网络标识打印至日志或写入测试记录。
|
||||
|
||||
---
|
||||
|
||||
## 4. 协议与硬件事实确认记录 / Observed Facts
|
||||
|
||||
- **SDK 阻塞模式**: 同步阻塞 HTTP POST 调用,由 `AbsdkBridge` 调度至 `Dispatchers.IO` 并通过进程级 `Mutex` 串行执行。
|
||||
- **数据隔离**: `FAKE` 模式自动使用 `profileId:infrared-fake` 隔离数据,`REAL_ABSDK` 模式使用主会话数据。
|
||||
- **安全门禁**: 真实 ABSDK 依赖明文传输,Release 构建中完全禁用硬件接口并由 `InfraredReleaseModule` 安全阻断。
|
||||
- **数据隔离**: 本地体验使用独立的模拟 profile;ABox 模式使用当前已认证 profile,二者不共享设备、遥控器或会话数据。
|
||||
- **传输事实**: 真实 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 使用相同的提供方和硬件路由;明文传输不提供机密性或完整性,因此只能在隔离且获授权的局域网执行本协议。
|
||||
Reference in New Issue
Block a user