Commit Graph
31 Commits
Author SHA1 Message Date
KremeCN 876acd1e7b feat: replace device shortcuts with device center 2026-08-26 19:23:04 +08:00
KremeCN e14b4cee27 feat: add profile scoped device catalog 2026-08-26 19:11:36 +08:00
KremeCN 6e78b71d31 feat: redesign account and provider dialog 2026-08-26 19:04:57 +08:00
KremeCN 05d44578b9 fix: stabilize adaptive navigation state 2026-08-26 15:29:41 +08:00
KremeCN 54eef78a46 feat: add adaptive authenticated navigation 2026-08-26 15:29:41 +08:00
KremeCN c1c21551fb feat: separate session and credential actions 2026-08-26 12:57:44 +08:00
KremeCN 283f56a3b6 feat: add persistent interface settings 2026-08-26 12:19:38 +08:00
KremeCN b24ca98e14 fix: correct ABox switch semantics and motion 2026-08-26 11:38:32 +08:00
KremeCN 063a3f8dab feat: add semantic ABox UI components 2026-08-26 11:38:32 +08:00
KremeCN cae2ea9ce0 fix: contain Material renderer adapter 2026-08-26 09:56:58 +08:00
KremeCN 4055c53362 feat: add dual-renderer design tokens 2026-08-26 09:56:58 +08:00
KremeCN 686176b148 fix: rethrow UI preference transform IO failures 2026-08-26 07:42:55 +08:00
KremeCN 79b47fc354 feat: persist global UI preferences 2026-08-26 07:42:55 +08:00
KremeCN b39b3f95c7 test: add Compose screenshot baseline 2026-08-26 07:10:34 +08:00
KremeCN 94e3e394af build: modernize Android Compose toolchain 2026-08-26 06:38:26 +08:00
KremeCN ed98c2be98 feat(app): add authenticated app shell with top bar and bottom navigation (#6)
### 概述 / Summary
实现认证后的主应用壳层(`MainAppShell`),包含胶囊顶栏(`ABoxTopPillBar`)与 Material 3 底部导航栏(`ABoxNavigationBar`),并为团队其他成员预留标准 Composable 插槽。

### 核心变更 / Changes
1. **设计系统 (`:android:core:designsystem`)**:
   - 新增 `ABoxTopPillBar`:展示提供方/空间信息、快捷 `+` 操作与用户头像徽标。
   - 新增 `ABoxUserAvatar`:支持用户名首字符与主题强调轮廓。
   - 新增 `ABoxNavigationBar` & `ABoxNavigationBarItem`:M3 胶囊指示器底部导航栏封装。
2. **应用壳层 (`:android:app`)**:
   - 新增 `MainTab`(`DEVICES`, `SCENES`, `ACTIVITY`),严格对齐需求与分工术语。
   - 新增 `MainAppShell`:承载顶栏、底栏、Tab 平滑切换,并开放 `devicesSlot`、`scenesSlot`、`activitySlot`。
   - 新增 `AccountProviderBottomSheet`:点击头像展示当前会话/提供方信息、支持切换提供方与退出登录。
3. **多语言与测试**:
   - 补充 `values` 与 `values-zh-rCN` 双语资源。
   - 新增 `MainTabTest` 单元测试并通过全量 `check` 与 `test`。

### 分工保护 / Boundaries
- 仅提供顶栏、底栏与主页面容器骨架;
- 设备列表、情景编排与设备控制详情的具体 UI 保持为插槽,供 alZerNest、tzh 和 Aurum 后续无缝填充。

Reviewed-on: #6
Co-authored-by: KremeCN <3265494849@qq.com>
2026-08-25 10:49:59 +08:00
KremeCN 06ccfdf952 feat: add provider login flow (#4)
## Summary

- replace the former three-provider model with two pre-login choices:
  - **ABox**: authenticate through the vendor ABSDK on the current local network
  - **Local experience**: establish a production simulation session without credentials, network access, or ABSDK calls
- remove the compatible-backend product/server scope and safely ignore legacy persisted compatible-provider values
- bind one process-wide `AbsdkBridge` for ABox session, socket, temperature/humidity, and infrared operations
- add production `:runtime:simulation` implementations and route device operations by the active provider
- retain provider-scoped username preferences, Keystore-encrypted automatic-login credentials, token recovery, logout, and session isolation
- add regression coverage for authentication gating, profile/session alignment, provider switching cleanup, routing, and simulation behavior
- align requirement, plan, architecture, and protocol documentation with LAN ABSDK access

## Verification

```text
./gradlew check testDebugUnitTest test
BUILD SUCCESSFUL (220 actionable tasks)

./gradlew :android:app:assembleDebug :android:app:assembleRelease
BUILD SUCCESSFUL (217 actionable tasks)

./gradlew :android:app:compileDebugAndroidTestKotlin
BUILD SUCCESSFUL

git diff --check
passed
```

Emulator smoke validation:

- provider selection displays ABox and Local experience only
- Local experience enters the authenticated route without credentials
- Local experience also enters while emulator Wi-Fi/data are disabled
- Local Sign out and Switch provider return to provider selection
- ABox opens the credential form; empty submission stays on login with the required-fields error

## Known constraints and accepted risks

- The vendor JAR uses cleartext HTTP and hardcodes `a-box.com.cn`; Debug and Release intentionally share the same ABox capability under the approved no-Release-exception decision. `@CleartextAbsdkTransport`, `usesCleartextTraffic`, and the architecture/protocol documents explicitly record this risk. This does not provide confidentiality or integrity.
- Real authenticated ABox and read-only hardware smoke validation is deferred because the gateway is currently unavailable locally. This PR does not claim that current-environment validation completed.
- The mapping from the vendor JAR's hardcoded hostname to the LAN gateway remains an external network/deployment prerequisite. The ABSDK JAR and bridge path remain identical to the previously hardware-validated `feat/moler-infrared-control` branch.
- `FakeDeviceCatalog` remains a temporary debug-only placeholder until the device-catalog module provides the production ABox catalog. ABox catalog requests are not routed to Local experience simulation.

Reviewed-on: #4
Co-authored-by: KremeCN <3265494849@qq.com>
2026-08-25 01:59:00 +08:00
KremeCN 6f7d3248b0 feat: add ABSDK 0630 bridge (#3)
## Summary

- add a pure Kotlin/JVM anti-corruption layer for ABSDK 0630
- serialize blocking SDK calls and enforce one provider-scoped session
- map `ABRet`, raw maps, SDK exceptions, and error codes into typed domain results
- implement session, socket, temperature/humidity, and infrared gateways
- document bytecode-confirmed protocol facts, SDK limitations, and unresolved behavior
- align JVM module bytecode with the Android Java 17 target

## Scope boundaries

- the bridge is not wired into the Android app in this PR; debug continues using Fakes
- `setHostInfo` is intentionally not called or implemented as a provider flow
- logout clears only the bridge-local session because the JAR exposes no logout or token setter
- no real credentials, network calls, or hardware were used in tests
- `docs/requirement_spec.md` and `docs/project_plan.md` are unchanged

## Verification

```text
gradlew.bat --stop
gradlew.bat clean :absdk-bridge:test :domain:test :testing:fakes:test :android:app:lintDebug :android:app:assembleDebug :android:app:assembleRelease build
```

Result: `BUILD SUCCESSFUL`

The public JAR API was also rechecked with `javap`, including the actual `getThStatus(String)` method, absence of a public logout API, `ABRet.getDicDatas()`, `IrInfo.getStatus()`, and `downloadIrCodes(List<IrInfo>)`.
Reviewed-on: #3
Co-authored-by: KremeCN <3265494849@qq.com>
2026-08-23 07:19:05 +08:00
KremeCN e45de7fefe docs: define ABSDK device name identity 2026-08-22 22:29:25 +08:00
KremeCN ca0703a9a3 fix: make infrared downloads provider scoped 2026-08-22 22:21:34 +08:00
KremeCN cbc2dc7ec5 fix: redact passwords from credential strings 2026-08-22 22:14:47 +08:00
KremeCN 117f87f735 feat: establish Android project foundation 2026-08-22 22:06:50 +08:00
KremeCN 0b8c54bd21 docs: update package name to com.flagship.abox.manager 2026-08-22 17:12:49 +08:00
KremeCN 66334cf18e docs: add ABox Manager project plan 2026-08-22 16:04:45 +08:00
KremeCN 6f6f3755b5 docs: archive ABSDK Android sample 2026-08-22 15:48:16 +08:00
KremeCN 3c7c6002df docs: add LoginAsyncTaskDemo layout example 2026-08-22 14:19:11 +08:00
KremeCN 2954b56193 docs: document protected main branch workflow 2026-08-22 14:15:09 +08:00
KremeCN 519e865726 chore: add .gitignore 2026-08-22 14:03:57 +08:00
KremeCN 091103586a chore: add AGENTS.md rule hub with CLAUDE.md and .trae/rules/all.md entrypoints 2026-08-22 13:56:18 +08:00
KremeCN 4ba2508778 docs: add AsyncTask demo for ABSDK login 2026-08-22 12:13:24 +08:00
KremeCN 48f26e8ef8 chore: initial commit 2026-08-22 12:02:45 +08:00