SystemUI 下拉状态栏快捷开关是 QSPanel,qs_panel.xml,@+id/quick_settings_panel,本篇文章就来看看这些快捷开关是如何呈现的以及如何新增一个快捷开关?基于 AOSP 9.0 分析。
SystemUI 下拉状态栏快捷开关
QSPanel 创建是从 StatusBar#makeStatusBarView 开始的。
StatusBar#makeStatusBarView
|
|
先看 SystemUIFactory#createQSTileHost。
SystemUIFactory#createQSTileHost
|
|
这里进行 QSTileHost 初始化。
QSTileHost#构造函数
|
|
这里进行了 TunerService 注册,在 TunerServiceImpl#addTunable 重写。
TunerServiceImpl#addTunable
|
|
tunable.onTuningChanged
回调 QSTileHost#onTuningChanged。
QSTileHost#onTuningChanged
|
|
看下 QSTileHost#loadTileSpecs,是获得 config 里字符串信息。
QSTileHost#loadTileSpecs
|
|
其中 quick_settings_tiles_default 值在 AOSP/frameworks/base/packages/SystemUI/res/values/config.xml 里:
这里就是我们所看到的快捷开关的文本描述。
再看 QSTileHost#onTuningChanged 中的调用 QSTileHost#createTile 方法。
QSTileHost#createTile
|
|
调用 QSFactory#createTile,由 QSFactoryImpl#createTile 实现了。
QSFactoryImpl#createTile
|
|
看到这里通过对应的字符串分别实例化 Tile。
以上涉及资源文件加载及对应实例化,接下来看看代码如何加载的,看 QSPanel#onAttachedToWindow 方法。
QSPanel#onAttachedToWindow
|
|
mTileLayout.addTile(r);由 PagedTileLayout#addTile 实现。
PagedTileLayout#addTile
PagedTileLayout 是 ViewPager,重点看 setAdapter,看数据源如何 add 的。
至此,SystemUI 下拉状态栏快捷开关模块代码流程分析完毕。
新增一个快捷开关
0、国际惯例,先上效果图,新增一个Camera,随便用了蓝牙的图标:
1、首先在 AOSP/frameworks/base/packages/SystemUI/res/values/config.xml 里面添加截屏 Camera 的选项
|
|
2、在 AOSP/frameworks/base/packages/SystemUI/res/values/strings.xml 里面还要加一个字符串
3、在 AOSP/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/ 目录下创建 CameraTile.java,实现 QSTileImpl:
4、在 AOSP/frameworks/base/proto/src/metrics_constants.proto,增加常量:
5、在 AOSP/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java,增加:
6、整编代码,运行模拟器,有效果,棒棒哒。