01 · 代码结构与子系统
一、入口 Fragment
VehicleControlSettingsFragment(settingsPage/VehicleBodyControl/.../vehicle/VehicleControlSettingsFragment.java)
@VoiceSearchProvider(priority = 2)
@RouterProvider(path = VEHICLE_CONTROL_URI_PATH)
@Module(SettingsConstant.TAG_VEHICLECONTROL)
public class VehicleControlSettingsFragment extends TopLevelSettingsFragment
implements IPageRouteHandler {
@Override public String getPageAlias() { return PageAlias.PAGE_QUICK_CONTROL; } // ← "快控"叫法源头
@Override public int getPreferenceScreenResId() {
return R.xml.miauto_vehicle_body_ctrl_settings_fragment; // 单页
}
@Override public BaseRightFragment getRightFragment() {
if (mRightFragment == null) mRightFragment = new VehicleControlRightFragment();
return mRightFragment;
}
@Override public List<Integer> getPreferenceKeyResIdsToRemove() { /* 按配置字裁剪 */ }
}
结构特点:
- 单页 + 多
MiCarPreferenceCategory 分组,无二级 Tab。二级交互靠 Dialog-style Activity/Fragment 弹窗。
- Fragment 本身只做减法(
getPreferenceKeyResIdsToRemove 按车型/配置字移除不支持项),不动态生成。
- 右栏
VehicleControlRightFragment(仅 15 行)只显示静态车模图 micar_car_model_vehicle_control_main,无交互。
- 副驾座椅跳转 RC10 起废弃(注释 “Seat adjust no more exist!“),交给舒控 app。
二、Controller 继承体系(4 基类对应 4 种 UI)
所有车控 Controller 继承自 CarPropertyMgrPreferenceController<V>(持有 SettingsCarPropertyManager)。按 UI 形态分 4 个基类(均在 base/settingsVehicleLib/.../vehicle/):
| 基类 | Preference 类型 | UI 形态 | 典型用途 |
|---|
BaseVehicleNewSwitchPrefController | MiCarNewSwitchPreference | 单开关 | 锁车折叠、防眩目、NFC、无线充电 |
BaseVehicleTabPreferenceController | NewTabPreference | 多档位 Tab | 倒车下翻、雨刮、侧翼、踏板自动 |
BaseVehicleButtonToggleGroupPropController | ButtonTogglePreference | 单按钮开关态 | 前挡清洁、踏板单次 |
BaseVehicleButtonIconToggleGroupPropController | ButtonIconTogglePreference | 双按钮带 icon | 后视镜调节、手套箱 |
另有非车控基类 BaseTabPreferenceController(纯 UI,如后视镜左右选择)、PreferenceController<BasicPreference>(纯跳转入口,如方向盘/PUI/中控键入口)、FragmentVehicleController(Dialog 内部控制器,如调节弹窗)。
三、12 个子系统逐一详解
3.1 mirror 后视镜(8 类,最完整子系统)
| Controller | 基类 | 信号 | 功能 |
|---|
MirrorSettingController | ButtonIconToggleGroup | REAR_VIEW_MIRROR_FOLD | 主入口”后视镜调节”双按钮(折叠+调节) |
MirrorAutoDownController | Tab | TURN_DOWN_CONFIG | 倒车自动下翻 4 档(关/主驾/副驾/两侧) |
MirrorFoldWhenLockController | Switch | LockCtrl.MIRROR_FOLD_WHEN_LOCK | 锁车自动折叠(⚠️ 信号在 LockCtrl 域) |
MirrorAntiDazzleController | Switch | AUTO_ANTIDAZZLE | 自动防眩目(标题随配置字切”内”/“内外”) |
MirrorAutoHeatController | Switch | MIRROR_AUTO_HEAT | 外后视镜自动加热 |
MirrorSelectController | BaseTab(UI 基类,非车控) | — | 调节弹窗内左/右镜选择(持久化到 MiCarSettings) |
MirrorAdjustControllerNew | FragmentVehicleController | STEERWHEEL_MIRROR_HUD_ADJUST | 调节弹窗逻辑:进入下发 EXTR_MIRR_ADJUST_PUP_UP + 心跳,退出回 IDLE |
MirrorAdjustDialog | DialogSettingsFragment | — | 调节弹窗(加载 micar_mirror_adjust_fragment.xml) |
注意:micar_mirror_adjust_fragment.xml 现是空壳(只剩 MirrorSelectController),其余设置项已迁回主页。
3.2 steeringwheel 方向盘(3 类)
| Controller | 角色 | 功能 |
|---|
SteeringWheelEntryController | 跳转入口 | 点击发 POSITION_ADJUST_ACTION 启动 SteeringWheelDialog |
SteeringWheelAdjustControllerNew | Dialog 内部 | 进入/退出下发 STEERWHEEL_MIRROR_HUD_ADJUST + 心跳;通过 active_window 与后视镜调节互斥(共用同一信号) |
SteeringWheelDialog | DialogSettingsFragment | 按 W-HUD 可选车型(MS11/MS11P/Kepler/KunLun)加载不同 layout |
3.3 consolekey 中控键(多类协作)
XML:pk_settings_vehicle_console_key_3 / _4。
| 类 | 功能 |
|---|
ConsoleKeyCustomController(⚠️文件名小写 k) | 键 3 入口,读 Settings.Global[custom_console_key_1] |
ConsoleKey4CustomController | 键 4 入口,缓存键 _2 |
ConsoleKeyCustomDialogActivity | 自定义弹窗(Tab 切键3/4 + 3列 Grid + HyperTask) |
ConsoleKeyCustomDialogController | 弹窗逻辑,监听 MIS HYPERTASK_SELECTED/CHANGED,did=DID_PUI_CONSOLE_3/4 |
ConsoleKeyConfig3/4 | 功能列表(无功能/AVM/除雾/尾翼/悬架/能量回收/扩散器)+ HyperTask |
功能 ID:0=无功能, 2=AVM, 3=APA, 4=对讲, 5=行车拍照, …, 101=HyperTask动作, 102=任务。
3.4 wiper 雨刮(3 类,⚠️ 在 service 包不在 wiper)
| Controller | 基类 | 信号 | 功能 |
|---|
WiperAdjustTabLayPrefController | Tab | Service.WIPER_SPEED_MODE | 雨刮 6 档(关/1/2/3/4/自动),areaId=WINDOW_FRONT_WINDSHIELD |
WiperRainSensorTabLayPrefController | Tab | Service.WIPER_RAIN_SENSOR_DETECT_LEVEL | 自动灵敏度 4 档(dependKey 指向上面) |
FrontWindshieldDeepCleaningController | ButtonToggle | Body.DEEP_CLEANING_STATUS | 前挡深度清洁(AI(deepseek) 2026-02 生成,不可用时 5 类原因 toast) |
3.5 seat 座椅(3 类,⚠️ 位置调节 RC10 起移除)
| Controller | 基类 | 信号 | 功能 |
|---|
DriverSeatBolsterController | Tab | ACTIVE_BOLSTER_STATE | 主驾主动侧翼 3 档(关/标准/运动),areaId=SEAT_ROW_1_LEFT |
DriverSideBolsterSeatBeltController | Switch | SIDE_BOLSTER_RELATED_SEAT_BELT_STATUS | 侧翼随安全带(AI(deepseek) 2025-12 生成) |
HvacAppSeatEntranceController | 跳转 | — | “查看更多”跳舒控 app(comfort://homepage/) |
座椅位置调节(BACK/HORIZONTAL/HEIGHT_ADJUST)UI 已移除,但信号仍定义在 SeatAdjustControl 域。
3.6 pedal 电动踏板(2 类)
| Controller | 基类 | 信号 | 功能 |
|---|
SingleOpenPreferenceController | ButtonToggle | ELECTRIC_PEDAL_TEMPORARY_SWITCH_STATUS | 单次开启(越野/便利进入时二次确认) |
ElectricPedalModeController | Tab | ELECTRIC_PEDAL_AUTO_MODE_STATUS | 自动模式 4 档(关/左/右/两侧) |
3.7 glovebox 手套箱(最复杂,带密码 + MIS)
| 类 | 角色 |
|---|
GloveBoxController | ButtonIconToggle 主入口(开关+密码设置),监听 DrivingCtrl.GLOVE_BOX + CAR_MODE_STATUS |
GloveBoxPasswordFragment | 继承 BasePinPasswordFragment,密码输入 |
GloveBoxPasswordDialog / GloveBoxSettingsDialogActivity | 密码宿主/管理页(singleInstance) |
GloveBoxNavigationHandler | compartment SDK,接收 MIS 语音/远程开箱(返回码 1001成功/1002需密码/1003不支持/1004需车主验证) |
GloveBoxModulePublishService | 向 MIS 发布手套箱能力 |
3.8 pui 方控热键自定义(多类)
| Controller | 功能 |
|---|
PUIHotKeyCustomEntryController | 标准滚轮入口(非 kunlun) |
PUILeftHotKeyCustomEntryController | kunlun 左键(不支持 HyperTask) |
PUIRightHotKeyCustomEntryController | kunlun 右键 |
CustomPUIDialog + CustomPUIDialogController | 自定义弹窗(3列 Grid + HyperTask,did=DID_PUI) |
3.9 hood 前机盖(信号驱动弹窗)
FrontHoodCloseRemindDialogFragment(继承 BaseTipsDialogFragment):监听 POWER_FRUNK_HOOD_CLOSE_REMIND 信号弹出(非 Preference 点击触发),onResume 播警告音,正向按钮下发 HOOD_CLOSE_USER_CONFIRMATION_RESPONSE=DRIVER_CONFIRM_IGNORED。
3.10 childseat 童锁座椅(IoT + 信号)
| 类 | 功能 |
|---|
ChildSeatEntryController | 入口,通过 IotClientManager 按 model 含 carseat 识别米家儿童座椅,有设备时显示”去智能设备设置” |
ChildSeatInstallPositionDialogActivity | 安装位置弹窗(5/6/7 座适配,SeatConfigFactory) |
ChildSeatDataStore/ChildSeatSignalSync | FR 信号同步、Settings.Global 读写 |
3.11 NFC / 无线充电 / EasyEntry
| Controller | 基类 | 信号 | 功能 |
|---|
NfcDetectStatusPreferenceController | Switch | BodyCtrl.NFC_DETECT_STATUS | 卡片钥匙检测(关闭时二次确认) |
WirelessChargePreferenceController | Switch | EnergyManagement.WIRELESS_CHARGE / RIGHT_WIRELESS_POWER_CHARGE | 主/副驾无线充电(按 position 区分) |
EasyEntrySwitchPrefController | Switch | DrivingCtrl.EASY_IN_OUT_MODE | 便利进出(CUSTOM/OFF),EventBus 接 QuickControlCmd 跳转 |
EasyEntryResetPrefController | 跳转 | OUT_POSITION_AVAILABLE | ”设置离车位置”(不可用时按 EASY_IN_OUT_NOT_AVI_RSN 显示原因) |
四、主 XML 完整结构(36 项)
miauto_vehicle_body_ctrl_settings_fragment.xml,根 key = psk_settings_vehicle_quickctrl_entry。按 Category 分组:
| Category | 包含项(key/controller) |
|---|
| 后视镜调节 | mirror_adjust(MirrorSetting) · mirror_fold_when_reversing(MirrorAutoDown) · lock_mirror_fold_when_lock(MirrorFoldWhenLock) · mirror_anti_dazzle(MirrorAntiDazzle) · mirror_auto_heat(MirrorAutoHeat) |
| 方向盘 | steering_wheel_adjust(SteeringWheelEntry) · pui_hotkey_custom(PUIHotKey) · pui_hotkey_left(PUILeftHotKey) · pui_kunlun_right(PUIRightHotKey) |
| 中央扶手按键 | console_key_3(ConsoleKeyCustom) · console_key_4(ConsoleKey4) |
| 雨刮 | wiper_entry(WiperAdjust) · wiper_sensor(WiperRainSensor, dependKey=wiper_entry) · front_windshield_deep_cleaning(FrontWindshieldDeepCleaning) |
| 座椅 | lock_easy_entry(EasyEntrySwitch) · lock_easy_reset_entry(EasyEntryReset, dependKey=easy_entry) · child_seat_position(ChildSeatEntry) · seat_driver_bolster(DriverSeatBolster) · driver_side_bolster_seat_belt(DriverSideBolsterSeatBelt) · seat_adjust_guide_to_hvac(HvacAppSeat) |
| 手套箱 | glove_box_toggle(GloveBox) |
| 电动踏板 | electric_pedal_single_open(SingleOpen) · electric_pedal_voluntarily_open(ElectricPedalMode) |
| 无线充电板 | wireless_charge_entry · right_wireless_charge_entry · voice_suggest(手机遗忘) · nfc_detect_status |
| 更多 | nfc_detect_status_more(无充电板时 NFC 落此) |
| 内链建议(hiddenFeatures=lemans_ece) | sun_roof(调光天幕跳转) |
dependKey 实现父子联动:wiper_sensor 依赖 wiper_entry(自动雨刮灵敏度仅在雨刮=自动时显示);easy_reset 依赖 easy_entry。
五、特殊类与已知问题
| 项 | 说明 |
|---|
VehicleControlRightFragment | 全模块最简单(15 行),只返回车模图 |
VehicleAdjustHeartBeat | 调节类功能心跳(详见 03 文档) |
compartment SDK | 仅手套箱用;ConsoleKey/PUI 用更底层 mis-device SDK |
| 重复逻辑 | ConsoleKeyCustomDialogController 与 CustomPUIDialogController 几乎对称(HyperTask 查询/事件订阅各写一遍),可抽象为基类 |
ConsoleKeyCustomController 与 ConsoleKey4CustomController | 仅缓存键/did 不同,可合并 |
| AI 生成代码 | PUI 左右键、侧翼随安全带、前挡深度清洁等多为 AI 生成(带 BEGIN/END 标记) |