操作步骤:
1.设置—network&internet—data saver,开启data saver
2.设置—network&internet—wifi热点,开启热点
实际结果:
下拉状态栏本来只有一页,开启后第2页会多出图标。重置下拉状态栏,再次开启关闭 data saver/wifi 热点,第2页中不会多出图标
修改方法:
研究代码之后发现 SystemUI 里面本身就有这个机制 AutoAddTracker,第一次打开一些开关的时候会把已经添加过的 Tile 放到 Secure.QS_AUTO_ADDED_TILES 数据库中,并添加一个 Tile 到下拉状态栏中。
添加 Tile 的方法在 AutoTileManager.java 中
以 DataSaver 为例
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
private final DataSaverController.Listener mDataSaverListener = new Listener() {
@Override
public void onDataSaverChanged(boolean isDataSaving) {
if (mAutoTracker.isAdded(SAVER)) return;
if (isDataSaving) {
mHost.addTile(SAVER);
mAutoTracker.setTileAdded(SAVER);
mHandler.post(() -> mDataSaverController.removeCallback(mDataSaverListener));
}
}
};
frameworks/base/packages/SystemUI/src/com/android/systemui/qs/AutoAddTracker.java
public boolean isAdded(String tile) {
return mAutoAdded.contains(tile);
}
mAutoAdded 添加的地方一,这个方法会在 AutoTileManager 中监听到 onDataSaverChanged 的时候调用
public void setTileAdded(String tile) {
if (mAutoAdded.add(tile)) {
saveTiles();
}
}
mAutoAdded 添加的地方二:监听 Secure.QS_AUTO_ADDED_TILES 数据库的变化
mContext.getContentResolver().registerContentObserver(Secure.getUriFor(Secure.QS_AUTO_ADDED_TILES), false, mObserver);
@VisibleForTesting
protected final ContentObserver mObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
mAutoAdded.addAll(getAdded());
}
};
最终是从 Secure.QS_AUTO_ADDED_TILES 数据库中取出所有添加过的 Tile
private Collection<String> getAdded() {
String current = Secure.getString(mContext.getContentResolver(), Secure.QS_AUTO_ADDED_TILES);
if (current == null) {
return Collections.emptyList();
}
return Arrays.asList(current.split(","));
}
修改方法就是让系统认为我们已经添加过这几个Tile了,有两种修改方法
1.在 DatabaseHelper.java 中加载 Secure.QS_AUTO_ADDED_TILES 的默认值
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
private void loadSecureSettings(SQLiteDatabase db) {
SQLiteStatement stmt = null;
try {
stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)" + " VALUES(?,?);");
......
loadStringSetting(stmt, Settings.Secure.QS_AUTO_ADDED_TILES, R.string.def_auto_added_tiles);
......
}
}
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<string name="def_auto_added_tiles" translatable="false">hotspot,saver,inversion,work,night,cast</string>
2.修改 isAdded() 方法始终返回 true
frameworks/base/packages/SystemUI/src/com/android/systemui/qs/AutoAddTracker.java
public boolean isAdded(String tile) {
// modified begin
return true || mAutoAdded.contains(tile);
// modified end
}