后屏投影:页面入口与资源

本篇梳理「后排投影」功能在设置 App 中的进入路径、Controller 绑定方式、相关字符串与图片资源。 调研来源:页面入口与资源 Agent + 对抗审查修正。

一、页面入口

1.1 从哪进入

用户路径:设置主页 → 显示与氛围 → 后排投影

flowchart TD
    A["设置主页<br/>miauto_top_level_menu_fragment.xml"] -->|点击「显示」| B["DisplayAtmosphereSettingsFragment<br/>显示与氛围页"]
    B -->|getPreferenceScreenResId| C["miauto_display_atmosphere_settings_fragment.xml"]
    C --> D["MiCarPreferenceCategory<br/>后排投影分组"]
    D --> E["ImageTabPreference<br/>投影模式 Tab"]
    D --> F["MiCarNewSwitchPreference<br/>童锁开关"]
    E -->|settings:controller| G["RearProjectionModeTabController"]
    F -->|settings:controller| H["RearProjectionChildLockController"]

上层菜单入口(app/src/region/global/res/xml/miauto_top_level_menu_fragment.xml:89-94):

<!-- 显示 -->
<com.android.car.settings.miauto.preferences.VoiceAssistMenuPreference
    android:fragment="...DisplayAtmosphereSettingsFragment"
    android:key="@string/psk_settings_display_atmosphere_entry"
    android:title="@string/top_level_menu_display_atmosphere"
    settings:controller="...DefaultRestrictionsPreferenceController"
    settings:menuIcon="@drawable/micarx_icon_brightness_3_fill" />

1.2 Fragment 类型

DisplayAtmosphereSettingsFragment(settingsPage/micarDisplaySettings/.../miauto/display/DisplayAtmosphereSettingsFragment.java:53)继承 TopLevelSettingsFragment(一级页面,支持锚点定位)。

  • 通过 getPreferenceScreenResId()(:65-68)返回 R.xml.miauto_display_atmosphere_settings_fragment 加载布局。
  • 路由注解 @RouterProvider(path = DISPLAY_ATMOSPHERE_URI_PATH)(:51),支持深链跳转。路由常量定义在 base/settingsBaseUi/.../pageroute/CarSettingsJump.kt:230-231

1.3 条件显示(重要)

后排投影分组并非所有车型都显示,受配置开关控制(DisplayAtmosphereSettingsFragment.java:159-162):

// 是否包含后排投影
if (!MiCarSettings.isProjectorEnable()) {
    ids.add(R.string.pk_settings_display_rear_projection_category);  // 加入"需隐藏"列表
}

即:MiCarSettings.isProjectorEnable() 为 false 时,整个「后排投影」分组被隐藏。这解释了为何该功能是车型相关的。

二、Controller 绑定方式

2.1 XML 节点(miauto_display_atmosphere_settings_fragment.xml:247-264)

<!-- 后排投影 -->
<com.android.car.settings.miauto.preferences.MiCarPreferenceCategory
    android:key="@string/pk_settings_display_rear_projection_category"
    android:title="@string/settings_display_rear_projection_category">
    <!-- 投影模式 -->
    <com.android.car.settings.miauto.preferences.ImageTabPreference
        android:key="@string/pk_settings_display_rear_projection_mode_tab"
        android:title="@string/settings_display_rear_projection_mode_title"
        settings:selectable="false"
        settings:controller="...RearProjectionModeTabController" />
    <!-- 童锁 -->
    <com.android.car.settings.miauto.preferences.MiCarNewSwitchPreference
        android:key="@string/pk_settings_display_rear_projection_child_lock"
        android:title="@string/settings_display_rear_projection_child_lock"
        android:summary="@string/settings_display_rear_projection_child_lock_summary"
        settings:controller="...RearProjectionChildLockController" />
    <com.android.car.settings.miauto.preferences.MiCarSpaceDividerPreference/>
</com.android.car.settings.miauto.preferences.MiCarPreferenceCategory>

2.2 绑定机制

Settings 框架标准方式:

  1. 根据 settings:controller 属性值反射创建 Controller 实例。
  2. 根据 android:key(getString(R.string.pk_*))匹配 XML 中的 Preference。
  3. 建立 Controller ↔ Preference 绑定,Controller 的 preference 字段即指向该 Preference。

注意模式 Tab 的 settings:selectable="false"——整个 Preference 不可整体选中(点击不进入二级页),交互完全交给内部 Tab。

三、preference_key 定义

均在 settingsPage/micarDisplaySettings/src/main/res/values/micar_preference_keys.xml,translatable="false":

Key name行号用途
pk_settings_display_rear_projection_category:35分组
pk_settings_display_rear_projection_mode_tab:36模式 Tab
pk_settings_display_rear_projection_child_lock:37童锁开关

四、strings 清单(以 values-zh-rCN/strings.xml 直抄为准)

⚠️ 重要:三个模式 Tab 的 UI 文案是「收起 / 投影模式 / 屏风模式」(英文 Retract / Project / Partition,枚举 CLOSE/PROJECTION/SCREEN)。不要按枚举名或源码类注释(类注释写的是过时的”关闭/投影/投屏”)误解。

本表在对抗审查后发现早期 Agent 转述的文案多处不准,故全部以 strings.xml 真实值为准。

name(settings_display_rear_projection_*)中文真实文案(values-zh-rCN)行号
category后排投影142
mode_title投影模式143
mode_close收起144
mode_projection投影模式145
mode_screen屏风模式146
child_lock后排投影童锁147
child_lock_summary开启后,后排投影控制将被锁定148
dialog_title后排投影模式149
dialog_description投影模式:展开后排投影幕布并开启投影,提供后排娱乐与影音内容。\n\n屏风模式:展开幕布但关闭投影,形成前后排隔断以保障后排隐私。150
disable_reason_system_failure投影系统故障,请联系线上服务中心151
disable_reason_bed_board_fold二层床板已升起,请放下床板后再使用152
disable_reason_space_not_enough空间不足,暂时无法使用153
adjusting正在调节后排投影幕布154
anti_collision_or_anti_pinch幕布运动受阻,请检查是否有障碍物后再试155
seat_linkage_failed座椅调整失败,请稍后再试156

「投影模式」与「屏风模式」的区别(来自 dialog 描述):投影模式=展开幕布+开启投影(后排娱乐与影音);屏风模式=展开幕布但关闭投影(形成前后排隔断,保障后排隐私)。

多语言已覆盖:values/(默认英 Retract/Project/Partition)、values-de/values-en-rGB/values-es/values-fr/values-it/values-nl/values-sv/values-nb/values-zh-rCN/

五、资源清单

5.1 Drawable

资源路径用途
micar_rear_projection_closesettingsPage/micarDisplaySettings/.../drawable/收起模式图
micar_rear_projection_mode同上投影模式图
micar_rear_projection_screen同上屏风模式图
micar_rear_projection_bgdrawable/ + drawable-night/Tab 背景(分日/夜)
micar_ic_exclamation_pointbase/settingsBaseUi/.../drawable/标题说明图标

5.2 Dimen

资源路径
micar_basic_dp_156156dpbase/settingsBaseUi/.../values/dimens_basic.xml

用于 RearProjectionModeTabController.kt:34 设置 Tab 图片高度。