Soundprivacy
- 蓝牙通话设备切换控制
类名:HandsFreeProfileOutputPreferenceController 功能:
在通话状态下切换 HFP(Hands-Free Profile)和 HAP(Hearing Aid Profile)连接的蓝牙设备
关键方法:
onPreferenceChange():处理设备切换逻辑
findActiveDevice():查找当前激活的蓝牙设备(支持 Hearing Aid/LeAudio/Headset)
setActiveBluetoothDevice():设置活跃设备(通过 HearingAidProfile 或 HeadsetProfile)
- 媒体控件设置
核心类:
MediaControlsPreferenceController
控制媒体控件恢复功能的开关(通过 MEDIA_CONTROLS_RESUME 系统设置)
MediaControlsLockScreenPreferenceController
控制锁屏界面是否显示媒体控件(通过 MEDIA_CONTROLS_LOCK_SCREEN 系统设置)
MediaControlsRecommendationController
管理媒体控件的推荐功能开关(通过 MEDIA_CONTROLS_RECOMMENDATION 系统设置)
共同特性:
继承 TogglePreferenceController,实现开关逻辑
通过 Secure 系统设置存储状态(Settings.Secure.putInt/getInt)
- 媒体输出设备控制
类名:MediaOutputPreferenceController 功能:
管理媒体输出设备切换(如蓝牙音箱、耳机等)
关键逻辑:
updateState():根据当前连接的蓝牙设备(A2DP/Hearing Aid/LeAudio)更新摘要
handlePreferenceTreeClick():发送广播启动媒体输出对话框(ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
findActiveDevice():优先选择 Hearing Aid/LeAudio 设备,其次 A2DP 设备
- 设置界面整合
类名:MediaControlsSettings 功能:
作为媒体控制设置的入口界面(DashboardFragment)
加载布局 R.xml.media_controls_settings
提供搜索索引支持(@SearchIndexable)
- 父菜单摘要控制
类名:MediaControlsParentPreferenceController 功能:
显示媒体控件设置的父菜单摘要
根据 MEDIA_CONTROLS_RESUME 的值动态显示“显示播放器”或“隐藏播放器”
privacy
AccessibilityUsagePreferenceController管理 “无障碍服务使用情况” 设置项的控制器
updateState更新偏好项的显示状态
getAvailabilityStatus()决定设置项是否显示在设置界面
getSummary()动态生成摘要文本,显示已启用的无障碍服务数量。
AppDataSharingUpdatesPreferenceController控制 “应用数据共享更新” 设置项可见性
getAvailabilityStatus()决定该设置项是否可见
CameraToggleController摄像头开关控制模块
工作流程
- 初始化
- 设置界面通过 PreferenceFragment 加载此控制器,传入上下文(Context)和偏好项唯一键(preferenceKey)。
- 控制器通过 SensorPrivacyManagerHelper 监听摄像头传感器的隐私状态变化。
- 状态更新
- 当用户点击开关时,基类 SensorToggleController 调用 SensorPrivacyManagerHelper.setSensorBlocked() 修改摄像头状态。
- 若设备管理员启用 DISALLOW_CAMERA_TOGGLE 限制,开关会被禁用(灰色不可点击)。
- 与系统服务交互
- 最终通过 SensorPrivacyManager 系统服务修改全局状态:
EnableContentCapturePreferenceController 控制用户是否允许系统级内容捕获功能(如自动填充表单、文本识别等),并受设备管理员策略限制
**isChecked():获取当前开关状态**
setChecked(boolean isChecked):更新开关状态
可用性控制:getAvailabilityStatus()
getSliceHighlightMenuRes() 界面高亮标识
EnableContentCaptureWithServiceSettingsPreferenceController内容捕获功能的高级控制器
updateState 动态更新Preference的跳转目标
EnableContentCaptureWithServiceSettingsPreferenceController中负责内容捕获功能的增强型控制器
开关状态管理:isChecked、setChecked
动态更新设置项:updateState
可见性控制:getAvailabilityStatus
菜单分类定位getSliceHighlightMenuRes
点击事件处理handlePreferenceTreeClick
LocationToggleController管理位置服务全局开关的核心控制器
onLocationModeChanged 位置状态监听回调
displayPreference UI绑定与初始化
MicToggleController控制麦克风全局开关的核心控制器
getSensor 传感器类型定义
getDeviceConfigKey 设备配置键
PrivacyDashboardFragment隐私的主界面集中管理所有隐私相关设置
SensorToggleController,一个用于管理传感器开关的基类控制器。它处理传感器的隐私设置(如麦克风、摄像头等)的开启/关闭状态,并负责更新UI和响应状态变化。
1. 可用性状态 (getAvailabilityStatus)
2. 开关状态 (isChecked)
3. 设置开关状态 (setChecked)
4. 显示设置项 (displayPreference)
onStart在生命周期开始时,注册传感器阻止状态变化的监听器。
onStop在生命周期结束时,移除监听器。
当传感器状态改变时,更新UI设置项的状态。 (onSensorPrivacyChanged)
菜单高亮 (getSliceHighlightMenuRes)
ShowClipAccessNotificationPreferenceController 类,
它用于控制是否显示剪贴板访问通知的开关。
这个控制器继承自 TogglePreferenceController 并实现了 LifecycleObserver ,因此它可以感知生命周期事件
- 成员变量:
- mDeviceConfigListener:用于监听 DeviceConfig 中命名空间为 CLIPBOARD 的配置变化。
- mDefault:存储从 DeviceConfig 获取的默认值(布尔值)。
- mPreference:对应的 Preference 对象。
- 构造方法:
- 初始化时调用 updateConfig() 来获取当前的默认值。
- isChecked() 方法:
- 从 Settings.Secure 中读取 CLIPBOARD_SHOW_ACCESS_NOTIFICATIONS 的值。
- 如果设置中没有值,则使用从 DeviceConfig 获取的默认值 mDefault。
- 返回该设置是否开启(非0表示开启)。
- setChecked() 方法:
- 将用户的选择(开启或关闭)写入 Settings.Secure.CLIPBOARD_SHOW_ACCESS_NOTIFICATIONS。
- getAvailabilityStatus() 方法:
- 返回 AVAILABLE,表示此设置项可用。
- displayPreference() 方法:
- 从 PreferenceScreen 中根据键找到 Preference 并保存到 mPreference。
- getSliceHighlightMenuRes() 方法:
- 返回此设置项所属的菜单分类(隐私)。
- 生命周期方法:
- onStart():在生命周期开始时注册 DeviceConfig 的监听器。
- onStop():在生命周期结束时移除监听器。
- updateConfig() 方法:
- 从 DeviceConfig 中读取最新的配置,更新 mDefault 值。
- 然后更新 Preference 的状态(因为默认值可能改变,需要刷新显示)。
WorkPolicyInfoPreferenceController
控制一个显示工作政策信息的偏好设置项
主要功能:
- 根据条件判断是否显示该设置项(通过getAvailabilityStatus方法)。
- 当用户点击该设置项时,触发显示工作政策信息(通过handlePreferenceTreeClick方法)。
详细解释:
- 成员变量:
- mEnterpriseProvider:企业隐私特性提供者,用于获取企业相关的隐私信息。
- 构造函数:
- 初始化mEnterpriseProvider,通过FeatureFactory获取企业隐私特性提供者的实例。
- getAvailabilityStatus()方法:
- 判断该设置项是否可用(显示)。
- 条件:如果安全中心(SafetyCenter)未启用,并且设备上有工作政策信息(即设备被企业管理员管理,并且管理员设置了工作政策信息),则显示该设置项(返回AVAILABLE)。
- 否则,返回UNSUPPORTED_ON_DEVICE(不在设置中显示)。
- handlePreferenceTreeClick(Preference preference)方法:
- 当用户点击设置项时,系统会调用此方法。
- 首先判断点击的偏好设置项的key是否与本控制器的key一致。
- 如果一致,则调用mEnterpriseProvider.showWorkPolicyInfo()方法显示工作政策信息,并返回true(表示已处理点击事件)。
- 否则,返回false(表示未处理)。
system
- 系统设置仪表盘(SystemDashboardFragment)
作用:作为系统设置的主入口,聚合多个系统相关选项
关键逻辑:
使用 R.xml.system_dashboard_fragment 加载偏好设置布局
动态控制「高级」按钮显示:当隐藏项仅 1 个时自动展开 (getVisiblePreferenceCount)
条件性显示 Aware 功能禁用提示对话框 (showRestrictionDialog)
搜索索引:通过 SEARCH_INDEX_DATA_PROVIDER 实现搜索支持
- 重置选项模块(ResetDashboardFragment)
功能:整合系统级重置操作入口,包含:
网络重置 (NetworkResetPreferenceController)
恢复出厂设置 (FactoryResetPreferenceController)
重置应用偏好 (ResetAppPrefPreferenceController)
eSIM 数据擦除 (EraseEuiccDataController)
条件控制:
SIM 可见时显示 eSIM 擦除选项 (SubscriptionUtil.isSimHardwareVisible)
跳过初始设置向导 (shouldSkipForInitialSUW)
- 恢复出厂设置控制器(FactoryResetPreferenceController)
// 关键逻辑: @Override public boolean isAvailable() { return mUm.isAdminUser() || Utils.isDemoUser(mContext); // 仅管理员或演示用户可见 } @Override public boolean handlePreferenceTreeClick(Preference p) { startActivity(Settings.FactoryResetActivity.class); // 跳转重置页面 }
- 系统更新控制器(SystemUpdatePreferenceController)
动态状态显示:
switch (updateInfo.getInt(SystemUpdateManager.KEY_STATUS)) { case STATUS_WAITING_DOWNLOAD: // 不同状态显示不同摘要 return R.string.android_version_pending_update_summary; case STATUS_IDLE: return Build.VERSION.RELEASE_OR_PREVIEW_DISPLAY; }
运营商定制:通过 ciActionOnSysUpdate 处理运营商特定的系统更新行为
- 代码结构特点
分层架构:
Fragment 负责 UI 展示
PreferenceController 处理业务逻辑
通过 @SearchIndexable 实现统一搜索
条件可见性:
使用 isAdminUser() 控制管理员权限
通过资源布尔值(如 config_show_system_update_settings)控制功能开关