Files

4.7 KiB
Raw Permalink Blame History

AtomUI.Mobile.Controls 平台 Adapter

状态:预实现架构。本文定义已批准的目标契约,不表示当前仓库已经包含或发布 AtomUI.Mobile.Controls。

Mobile 使用一个内部 capability contract,由 Headless、iOS 和 Android adapter 分别实现。Control 和 Runtime scope 只消费 统一 snapshot、事件与 hook,不读取 OS 名称,也不在具体 Control 中散布条件编译。

Capability Contract

能力 统一输出/入口 Owner
Safe Area 与 system bars Insets、available bounds 和变化通知 Adapter 读取平台;MobileViewportContext 合并状态
Input pane / IME Occlusion、可用性和变化通知 Adapter 投递;Viewport/输入 Control 协调消费
Back 与 navigation gesture 单次可仲裁的系统输入 Adapter 投递;Overlay/Navigation 决定 owner
Haptic 可用性与受约束调用入口 Adapter 执行;Control policy 决定是否请求
Touch profile 已解析的最小触控目标和 interaction profile Adapter/profile 提供;Theme/Control 消费值
Foreground/background Host 状态、恢复和 detach/recreation 通知 Host/adapter 投递;Runtime scope 统一清理或恢复
Reduce Motion 与 font scale 一致 snapshot 字段 Adapter 投递;Viewport 发布
Accessibility environment 平台环境和能力状态 Adapter 投递;Control 仍拥有 AutomationPeer 语义

平台 adapter 提供事实与 hook,不决定 Control 视觉、Token、导航结果、Overlay 关闭原因或默认产品行为。

实现角色

Adapter 目标用途 不能证明
Headless 注入确定 snapshot、模拟能力缺失、验证状态机和 acquire/release iOS/Android 触摸、IME、系统返回或无障碍体验
iOS 投射 iOS Host 生命周期、viewport、输入、返回手势、haptic 和 accessibility 环境 Android 行为或发布状态
Android 投射 Android Host 生命周期、system back、viewport、输入、haptic 和 accessibility 环境 iOS 行为或发布状态

iOS 是首个实现平台,但三个 adapter 从 Foundation 使用相同 contract。iOS 适配不能把平台 SDK 类型、pt 特例或 Host 生命周期 泄漏到 Public Control API;Android 适配不能在后续通过修改公共契约追补基本能力。

Owner 生命周期

  1. Host 在 AtomUI 组合根提供 adapter。
  2. 每个 TopLevel attach 时,Mobile Runtime scope acquire 与 adapter 建立 owner-scoped subscription。
  3. Adapter 在 UI thread 边界投递原始变化;Runtime 合并为一致 snapshot。
  4. TopLevel detach、Host recreation 或应用终止时取消 pending work,并释放 subscription、hook 和 owner 引用。
  5. 新 Host/TopLevel 创建新的 scope;旧 adapter 不通过 static cache 保留 Visual、Control 或 session。

如果 native hook 需要跨线程回调,adapter 必须在进入 Runtime 前完成线程和 lifetime 归一化,不能让 Control 直接处理原生回调。

能力缺失

缺失能力 退化行为
Safe Area/system bar 来源 使用零 inset 并保留可诊断状态
Input pane bounds 保持最近一致 viewport,不猜测键盘高度
Haptic 跳过反馈,不改变逻辑终态和事件顺序
系统返回/gesture 显式导航命令继续使用同一事务
Reduce Motion 移除非必要动效,保持提交、焦点和 cleanup
Host detach 以统一原因终止 session、pointer chain 和订阅

必需 adapter 缺失或重复属于启动/acquire 配置错误,不使用静默 fallback。可选 capability 缺失则按上表退化,Control 不通过 OS 名称猜测值。

Native 边界

Adapter 优先使用 Avalonia 公共 API。只有能力涉及 P/Invoke、native handle、原生结构体、协议对象或可释放 hook,且 Avalonia 公共 API 无法表达时,才调用 AtomUI.Native。Native 负责参数/handle 校验、底层调用、错误转换和确定释放;Mobile adapter 负责 owner、订阅、状态归一化和产品侧调用时机。

验证

  • Contract/Headless:snapshot 合并、能力缺失、重复 adapter、detach、取消和无残留引用。
  • iOS:Simulator 与真机分别验证 Safe Area、IME、返回手势、旋转、前后台、VoiceOver 和 haptic 降级。
  • Android:Emulator 与真机分别验证 system bars、IME、system back、multi-window、Activity recreation、TalkBack 和 haptic 降级。
  • Release:两个平台分别验证 trim/AOT 后 adapter、Theme、Localization 和 DataTemplate 可发现,产物可安装启动。

测试层级与证据要求见 Mobile 验证架构。当前没有 adapter 源码或平台通过证据。