Android Q第一次打开settings下的hotspot,saver,inversion,work,night,cast等开关的时候会在下拉状态栏上自动添加一个Tile

操作步骤:

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值