下拉菜单增加一个自定义磁贴
1、新建Tile.java。
在\frameworks\base\packages\SystemUI\src\com\android\systemui\qs\tile路径下创建一个类

2、添加操作类-controller类。
这边以我复刻的便捷式热点为例,定义了带有QSHost和磁贴的操作类(具体需要的操作看客户需求,自己可以先实现简单的操作,例如长按和单击之后的操作),接口和接口的实现,然后我们的Tile类中即可使用
private final HotspotController mHotspotController;//检索热点和相关信息
private final DataSaverController mDataSaverController;//数据控制

HotspotController——HotspotControllerImpl


DataSaverController——DataSaverControllerImpl

3、实现QSTileImpl的抽象方法。
QSTileImpl——快速设置Tile基类,继承它以创建一个新Tile。状态管理在主机提供的 Looper 上完成。QS模块应该在 handleUpdateState 中更新状态。影响状态的回调应该使用 refreshState 来触发 tile looper 上的另一个状态更新传递。
a.如果磁贴(Tile)不支持长按,则需要设置()中的参数为false,(),支持长按的话可以去实现对应长按的抽象方法
public abstract Intent getLongClickIntent();

b.若tile改变状态时(无论从控制器还是用户点击),模块在handleUpdateState ()方法中更新状态,需要执行刷新状态方法refreshState()触发tile looper上另一个状态更新传递。其中还有状态监听和状态更改可详细查看源码。




c.若只是用handleUpdateState修改state,这个方法可以通过polling控制器或者通过修改arg参数实现


d.如果控制器不是一个CallbackController,从控制器通过attaching/dettaching响应handleSetListening


e.实现isAvailable()方法,当Tile不需要被创建的时候设置为false


4、QSFactoryImpl中的实现。
a.需要注入对应类型的提供器Provider


b.为Tile添加唯一字符串

5、配置属性。
在文件Z:\k630_64\frameworks\base\packages\SystemUI\res\values中的文件中进行一些配置属性的修改,quick_settings_tiles_stock和quick_settings_tiles_default。前者包含所有Tile字符串标签,系统所有和创建的,后者只包含用户定制和所需要的,重置后能得到的。但是这两个配置属性都被overlay中的文件属性覆盖了,我们的手机会先使用overlay中的属性,再去找apk中的配置属性。(属性被覆盖了)

所以我们找到如下overlay的文件夹进行属性的增删
/vendor/tinno/k630_64/trunk/overlay/vendor/partner_gms/overlay/gms_overlay/frameworks/base/packages/SystemUI/res/values/

PS:ADB测试方法。
还有一种测试方法就是通过ADB的方式put进去属性,查看是否添加成功。如果java代码中的config文件夹已修改,但是不生效,可以通过ADB看看属性。其实我们也可以很清楚的看到磁贴的顺序和java代码中的config文件有所不同,overlay中的属性能够一一对应,这下就明朗了。
ADB命令:(通过以下命令查看效果)
adb shell settings get secure sysui_qs_tiles //获取tile字符
adb shell settings put secure sysui_qs_tiles wifi,singlehand,bt,dnd,lte1,lte2,flashlight,rotation,battery,cell,airplane,cast,screenrecord,dataswitch //put写入tile字符