private UiModeManager mUiModeManager;
mUiModeManager = mContext.getSystemService(UiModeManager.class);
mUiModeManager.setNightModeActivated(true);
frameworks/base/core/java/android/app/UiModeManager.java
/**
* Activating night mode for the current user
*
* @return {@code true} if the change is successful
* @hide
*/
public boolean setNightModeActivated(boolean active) {
if (mService != null) {
try {
return mService.setNightModeActivated(active);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
return false;
}
frameworks/base/services/core/java/com/android/server/UiModeManagerService.java
@Override
public boolean setNightModeActivated(boolean active) {
if (isNightModeLocked() && (getContext().checkCallingOrSelfPermission(
android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
!= PackageManager.PERMISSION_GRANTED)) {
Slog.e(TAG, "Night mode locked, requires MODIFY_DAY_NIGHT_MODE permission");
return false;
}
final int user = Binder.getCallingUserHandle().getIdentifier();
if (user != mCurrentUser && getContext().checkCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS)
!= PackageManager.PERMISSION_GRANTED) {
Slog.e(TAG, "Target user is not current user,"
+ " INTERACT_ACROSS_USERS permission is required");
return false;
}
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;
}
updateConfigurationLocked();
applyConfigurationExternallyLocked();
persistNightMode(mCurrentUser);
return true;
} finally {
Binder.restoreCallingIdentity(ident);
}
}
}
监听省电模式变化
private final BroadcastReceiver mBatterySaverReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mCallback.run();
}
};
final IntentFilter batteryFilter = new IntentFilter();
batteryFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
mContext.registerReceiver(
mBatterySaverReceiver, batteryFilter);
监听暗黑UI模式变化
public DarkModeObserver(Context context) {
mContext = context;
mContentObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
final String setting = uri == null ? null : uri.getLastPathSegment();
if (setting != null && mCallback != null) {
mCallback.run();
}
}
};
}
final Uri uri = Settings.Secure.getUriFor(Settings.Secure.UI_NIGHT_MODE);
final Uri customStart =
Settings.Secure.getUriFor(Settings.Secure.DARK_THEME_CUSTOM_START_TIME);
final Uri customEnd =
Settings.Secure.getUriFor(Settings.Secure.DARK_THEME_CUSTOM_END_TIME);
mContext.getContentResolver()
.registerContentObserver(uri, false, mContentObserver);
mContext.getContentResolver()
.registerContentObserver(customStart, false, mContentObserver);
mContext.getContentResolver()
.registerContentObserver(customEnd, false, mContentObserver);