后屏投影:整体架构

本篇是知识库的顶层视图:后屏投影功能的分层架构、类职责划分、模块关系

一、分层架构

后屏投影功能横跨四个层次,严格遵循「信号 → 业务 → UI」的单向依赖:

flowchart TB
    subgraph L4["UI 层 (settingsBaseUi)"]
        direction LR
        ITAB["ImageTabPreference<br/>BaseImageTabPreference"]
        TAB["CarUiTabLayout.Tab"]
        TIV["ThemeItemView"]
        SWITCH["MiCarNewSwitchPreference"]
    end
    subgraph L3["业务层"]
        direction LR
        BASE["BaseVehicleImageTabPreferenceController<br/>(模板骨架)"]
        MODE["RearProjectionModeTabController<br/>(模式Tab)"]
        LOCK["RearProjectionChildLockController<br/>(童锁)"]
        CPP["CarPropertyMgrPreferenceController<br/>(信号管理基类)"]
    end
    subgraph L2["信号层 (settingsBaseLib)"]
        direction LR
        SCPM["SettingsCarPropertyManager<br/>过滤/缓存/超时"]
        CPCM["CarPropertyCacheManager<br/>全局缓存+分发"]
        VCM["VehicleControlManager"]
        UTIL["VehiclePropertyUtil"]
        IDS["MiCarPropertyIds / Peripheral"]
    end
    subgraph L1["系统层"]
        AOSP["AOSP CarPropertyManager"]
        CAR["车端 CAN 总线"]
    end

    MODE --> BASE
    BASE --> CPP
    LOCK --> CPP
    CPP --> SCPM
    SCPM --> VCM --> CPCM --> AOSP --> CAR
    MODE -.驱动.-> ITAB
    ITAB --> TIV
    LOCK -.驱动.-> SWITCH
    BASE --> TAB

二、类职责一览

职责详见
业务RearProjectionModeTabController模式 Tab:信号↔Tab 翻译、异常处理05-核心类拆解/01
业务RearProjectionChildLockController童锁开关05-核心类拆解/02
业务BaseVehicleImageTabPreferenceControllerTab 信号驱动模板骨架05-核心类拆解/03
业务CarPropertyMgrPreferenceController信号管理、回弹忽略、回退05-核心类拆解/04
信号SettingsCarPropertyManager过滤/缓存/超时监控04-全链路 + docs/SettingsCarPropertyManager源码解析
信号CarPropertyCacheManager全局回调分发+缓存(启动耗时点)同上
信号VehiclePropertyUtilisPropertyAvailable/getIntPropertyValue/toHexId07-异常态
信号MiCarPropertyIds / Peripheral信号 ID + 枚举常量03-信号体系
UIImageTabPreference / BaseImageTabPreferenceTab 数组渲染06-UI与Tab体系
UICarUiTabLayout.TabTab 数据结构(三态+视觉资源)06-UI与Tab体系
UIThemeItemView单个 Tab 项 View(灰/亮/转圈)06-UI与Tab体系

三、后排投影分组的两个并列 Controller

后屏投影在 XML 里是一个 MiCarPreferenceCategory,下面挂两个并列 Controller:

flowchart LR
    CAT["MiCarPreferenceCategory<br/>后排投影"] --> MODE["ImageTabPreference<br/>投影模式 Tab"]
    CAT --> LOCK["MiCarNewSwitchPreference<br/>童锁开关"]
    MODE -.controller.-> CMODE["RearProjectionModeTabController"]
    LOCK -.controller.-> CLOCK["RearProjectionChildLockController"]
  • 模式 Tab(RearProjectionModeTabController):本知识库主线,「收起/投影/屏风模式」三态切换。
  • 童锁(RearProjectionChildLockController):开关型,锁定后排投影控制。它和模式 Tab 共享信号层基础设施(CarPropertyMgrPreferenceController/SettingsCarPropertyManager),但业务上相对独立。

整个分组受 MiCarSettings.isProjectorEnable() 控制,非投影车型不显示(见 08-页面入口与资源)。

四、核心设计模式

4.1 模板方法(Template Method)

BaseVehicleImageTabPreferenceController 定义骨架,RearProjectionModeTabController 填空 4 个抽象方法 + 若干钩子。这是整个车控设置项的通用范式,详见 docs/02-核心架构-PreferenceController范式.md

4.2 上下行信号分离(本功能特色)

读取状态用 PROJECTION_SCREEN_STATUS(8 值),下发命令用 SCREEN_CONTROL_COMMAND(3 值),不共用一个信号。详见 05-核心类拆解/01 §3。

4.3 数据驱动 UI(Tab 三态)

UI 不自己维护状态,完全由 Tab 的三个布尔字段(isAvailable/mIsSelected/isProcessing)驱动渲染。Controller 只改数据 + notifyDataChanged(),View 自动刷新。详见 06-UI与Tab体系

4.4 全局缓存 + 多实例分发

CarPropertyCacheManager 是全局单例,一份车端回调可分发到多个 SettingsCarPropertyManager 实例(多个 Controller 共享同一信号),并缓存最新值供即时读取。详见 docs/SettingsCarPropertyManager源码解析

五、与 docs 既有文档的关系

flowchart LR
    A["本知识库:后屏投影<br/>(业务专题)"] --> B["docs/02-PreferenceController范式<br/>(通用范式)"]
    A --> C["docs/05-车辆接口层与IPC<br/>(信号层)"]
    A --> D["docs/SettingsCarPropertyManager源码解析<br/>(信号管理深度)"]
    A --> E["docs/座舱车门知识库<br/>(同类业务参考)"]

本知识库是业务专题(后排投影),聚焦本功能的信号体系与交互;通用的 Controller 范式、信号层 IPC 机制请参考 docs 顶层编号文档。