Android 11 (MTK)状态栏图标反色
//StatusBar.java
public void start() {
.............
onSystemBarAppearanceChanged(mDisplayId, result.mAppearance, result.mAppearanceRegions,
result.mNavbarColorManagedByIme);
mAppFullscreen = result.mAppFullscreen;
mAppImmersive = result.mAppImmersive;
............
}
@Override
public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
if (displayId != mDisplayId) {
return;
}
........
//状态栏图标跟随barMode改变
mLightBarController.onStatusBarAppearanceChanged(appearanceRegions, barModeChanged,
mStatusBarMode, navbarColorManagedByIme);
updateBubblesVisibility();
}
//LightBarController.java
private void updateStatus() {
final int numStacks = mAppearanceRegions.length;
int numLightStacks = 0;
// We can only have maximum one light stack.
int indexLightStack = -1;
for (int i = 0; i < numStacks; i++) {
if (isLight(mAppearanceRegions[i].getAppearance(), mStatusBarMode,
APPEARANCE_LIGHT_STATUS_BARS)) {
numLightStacks++;
indexLightStack = i;
}
}
// If all stacks are light, all icons get dark.
if (numLightStacks == numStacks) {
mStatusBarIconController.setIconsDarkArea(null);
mStatusBarIconController.getTransitionsController().setIconsDark(true, animateChange());
}
// If no one is light, all icons become white.
else if (numLightStacks == 0) {
mStatusBarIconController.getTransitionsController().setIconsDark(
false, animateChange());
}
// Not the same for every stack, magic!
else {
mStatusBarIconController.setIconsDarkArea(
mAppearanceRegions[indexLightStack].getBounds());
mStatusBarIconController.getTransitionsController().setIconsDark(true, animateChange());
}
}
参考_1
参考_2
重点文章
Android 13 深色主题切换流程解析
Android 13 深色主题切换流程解析_
frameworks/base/services/core/java/com/android/server/UiModeManagerService.java
@Override
public boolean setNightModeActivated(boolean active) {
return setNightModeActivatedForModeInternal(mNightModeCustomType, active);
}
private boolean setNightModeActivatedForModeInternal(int modeCustomType, boolean active) {
// 省略部分代码......
synchronized (mLock) {
final long ident = Binder.clearCallingIdentity();
try {
// 自动、自定义的主题切换
if (mNightMode == MODE_NIGHT_AUTO || mNightMode == MODE_NIGHT_CUSTOM) {
unregisterScreenOffEventLocked();
mOverrideNightModeOff = !active;
mOverrideNightModeOn = active;
mOverrideNightModeUser = mCurrentUser;
persistNightModeOverrides(mCurrentUser);
} else if (mNightMode == UiModeManager.MODE_NIGHT_NO
&& active) {
// 夜间模式
mNightMode = UiModeManager.MODE_NIGHT_YES;
} else if (mNightMode == UiModeManager.MODE_NIGHT_YES
&& !active) {
// 日间模式
mNightMode = UiModeManager.MODE_NIGHT_NO;
}
// 更新 Configuration
updateConfigurationLocked();
// 应用 Configuration
applyConfigurationExternallyLocked();
// 为当前用户 Secure.putIntForUser 配置
persistNightMode(mCurrentUser);
return true;
} finally {
Binder.restoreCallingIdentity(ident);
}
}
}
默认深色模式
adb shell settings put secure ui_night_mode 2 //深色
adb shell settings put secure ui_night_mode 1 //还原
+++ b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
@@ -327,5 +327,8 @@
+ <!--Default set ui night mode-->
+ <integer name="def_ui_night_mode">2</integer>
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+ //add text
+ loadIntegerSetting(stmt, Settings.Secure.UI_NIGHT_MODE,
+ R.integer.def_ui_night_mode);
+ //add text