Merge "Apply Dark theme changes when screen off only" into qt-qpr1-dev

This commit is contained in:
Jay Aliomer
2019-12-12 20:32:00 +00:00
committed by Android (Google) Code Review
3 changed files with 69 additions and 39 deletions

View File

@@ -660,6 +660,22 @@ public final class Settings {
public static final String ACTION_NIGHT_DISPLAY_SETTINGS = public static final String ACTION_NIGHT_DISPLAY_SETTINGS =
"android.settings.NIGHT_DISPLAY_SETTINGS"; "android.settings.NIGHT_DISPLAY_SETTINGS";
/**
* Activity Action: Show settings to allow configuration of Dark theme.
* <p>
* In some cases, a matching Activity may not exist, so ensure you
* safeguard against this.
* <p>
* Input: Nothing.
* <p>
* Output: Nothing.
*
* @hide
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_DARK_THEME_SETTINGS =
"android.settings.DARK_THEME_SETTINGS";
/** /**
* Activity Action: Show settings to allow configuration of locale. * Activity Action: Show settings to allow configuration of locale.
* <p> * <p>

View File

@@ -91,7 +91,7 @@ public class UiModeNightTile extends QSTileImpl<QSTile.BooleanState> implements
boolean nightMode = (mContext.getResources().getConfiguration().uiMode boolean nightMode = (mContext.getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
if (isAuto) { if (isAuto && !powerSave) {
state.secondaryLabel = mContext.getResources().getString(nightMode state.secondaryLabel = mContext.getResources().getString(nightMode
? R.string.quick_settings_dark_mode_secondary_label_until_sunrise ? R.string.quick_settings_dark_mode_secondary_label_until_sunrise
: R.string.quick_settings_dark_mode_secondary_label_on_at_sunset); : R.string.quick_settings_dark_mode_secondary_label_on_at_sunset);
@@ -121,7 +121,7 @@ public class UiModeNightTile extends QSTileImpl<QSTile.BooleanState> implements
@Override @Override
public Intent getLongClickIntent() { public Intent getLongClickIntent() {
return new Intent(Settings.ACTION_DISPLAY_SETTINGS); return new Intent(Settings.ACTION_DARK_THEME_SETTINGS);
} }
@Override @Override

View File

@@ -16,8 +16,6 @@
package com.android.server; package com.android.server;
import static android.content.Intent.ACTION_SCREEN_OFF;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityManager; import android.app.ActivityManager;
@@ -91,6 +89,10 @@ final class UiModeManagerService extends SystemService {
private boolean mCarModeEnabled = false; private boolean mCarModeEnabled = false;
private boolean mCharging = false; private boolean mCharging = false;
private boolean mPowerSave = false; private boolean mPowerSave = false;
// Do not change configuration now. wait until screen turns off.
// This prevents jank and activity restart when the user
// is actively using the device
private boolean mWaitForScreenOff = false;
private int mDefaultUiModeType; private int mDefaultUiModeType;
private boolean mCarModeKeepsScreenOn; private boolean mCarModeKeepsScreenOn;
private boolean mDeskModeKeepsScreenOn; private boolean mDeskModeKeepsScreenOn;
@@ -206,25 +208,24 @@ final class UiModeManagerService extends SystemService {
if (mCar) { if (mCar) {
updateLocked(0, 0); updateLocked(0, 0);
} else { } else {
final IntentFilter intentFilter = registerScreenOffEvent();
new IntentFilter(ACTION_SCREEN_OFF);
getContext().registerReceiver(mOnScreenOffHandler, intentFilter);
} }
} }
} }
} }
}; };
/**
* DO NOT USE DIRECTLY
* see register registerScreenOffEvent and unregisterScreenOffEvent
*/
private final BroadcastReceiver mOnScreenOffHandler = new BroadcastReceiver() { private final BroadcastReceiver mOnScreenOffHandler = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
synchronized (mLock) { synchronized (mLock) {
// must unregister first before updating
unregisterScreenOffEvent();
updateLocked(0, 0); updateLocked(0, 0);
try {
getContext().unregisterReceiver(mOnScreenOffHandler);
} catch (IllegalArgumentException e) {
// we ignore this exception if the receiver is unregistered already.
}
} }
} }
}; };
@@ -263,7 +264,7 @@ final class UiModeManagerService extends SystemService {
int mode = Secure.getIntForUser(getContext().getContentResolver(), Secure.UI_NIGHT_MODE, int mode = Secure.getIntForUser(getContext().getContentResolver(), Secure.UI_NIGHT_MODE,
mNightMode, 0); mNightMode, 0);
mode = mode == UiModeManager.MODE_NIGHT_AUTO mode = mode == UiModeManager.MODE_NIGHT_AUTO
? UiModeManager.MODE_NIGHT_YES : UiModeManager.MODE_NIGHT_NO; ? UiModeManager.MODE_NIGHT_YES : mode;
SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, Integer.toString(mode)); SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, Integer.toString(mode));
} }
}; };
@@ -335,7 +336,7 @@ final class UiModeManagerService extends SystemService {
SystemServerInitThreadPool.get().submit(() -> { SystemServerInitThreadPool.get().submit(() -> {
synchronized (mLock) { synchronized (mLock) {
updateConfigurationLocked(); updateConfigurationLocked();
sendConfigurationLocked(); applyConfigurationExternallyLocked();
} }
}, TAG + ".onStart"); }, TAG + ".onStart");
@@ -404,6 +405,22 @@ final class UiModeManagerService extends SystemService {
return oldNightMode != mNightMode; return oldNightMode != mNightMode;
} }
private void registerScreenOffEvent() {
mWaitForScreenOff = true;
final IntentFilter intentFilter =
new IntentFilter(Intent.ACTION_SCREEN_OFF);
getContext().registerReceiver(mOnScreenOffHandler, intentFilter);
}
private void unregisterScreenOffEvent() {
mWaitForScreenOff = false;
try {
getContext().unregisterReceiver(mOnScreenOffHandler);
} catch (IllegalArgumentException e) {
// we ignore this exception if the receiver is unregistered already.
}
}
private final IUiModeManager.Stub mService = new IUiModeManager.Stub() { private final IUiModeManager.Stub mService = new IUiModeManager.Stub() {
@Override @Override
public void enableCarMode(int flags) { public void enableCarMode(int flags) {
@@ -482,28 +499,21 @@ final class UiModeManagerService extends SystemService {
synchronized (mLock) { synchronized (mLock) {
if (mNightMode != mode) { if (mNightMode != mode) {
if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) { if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) {
try { unregisterScreenOffEvent();
getContext().unregisterReceiver(mOnScreenOffHandler);
} catch (IllegalArgumentException e) {
// we ignore this exception if the receiver is unregistered already.
}
}
// Only persist setting if not in car mode
if (!mCarModeEnabled) {
Secure.putIntForUser(getContext().getContentResolver(),
Secure.UI_NIGHT_MODE, mode, user);
Secure.putIntForUser(getContext().getContentResolver(),
OVERRIDE_NIGHT_MODE, mNightModeOverride, user);
} }
mNightMode = mode; mNightMode = mode;
mNightModeOverride = mode; mNightModeOverride = mode;
// Only persist setting if not in car mode
if (!mCarModeEnabled) {
persistNightMode(user);
}
// on screen off will update configuration instead // on screen off will update configuration instead
if (mNightMode != UiModeManager.MODE_NIGHT_AUTO || mCar) { if (mNightMode != UiModeManager.MODE_NIGHT_AUTO || mCar) {
updateLocked(0, 0); updateLocked(0, 0);
} else { } else {
getContext().registerReceiver( registerScreenOffEvent();
mOnScreenOffHandler, new IntentFilter(ACTION_SCREEN_OFF));
} }
} }
} }
@@ -548,13 +558,11 @@ final class UiModeManagerService extends SystemService {
@Override @Override
public boolean setNightModeActivated(boolean active) { public boolean setNightModeActivated(boolean active) {
synchronized (mLock) { synchronized (mLock) {
final int user = UserHandle.getCallingUserId();
final long ident = Binder.clearCallingIdentity(); final long ident = Binder.clearCallingIdentity();
try { try {
if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) { if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) {
try { unregisterScreenOffEvent();
getContext().unregisterReceiver(mOnScreenOffHandler);
} catch (IllegalArgumentException e) {
}
mNightModeOverride = active mNightModeOverride = active
? UiModeManager.MODE_NIGHT_YES : UiModeManager.MODE_NIGHT_NO; ? UiModeManager.MODE_NIGHT_YES : UiModeManager.MODE_NIGHT_NO;
} else if (mNightMode == UiModeManager.MODE_NIGHT_NO } else if (mNightMode == UiModeManager.MODE_NIGHT_NO
@@ -565,7 +573,8 @@ final class UiModeManagerService extends SystemService {
mNightMode = UiModeManager.MODE_NIGHT_NO; mNightMode = UiModeManager.MODE_NIGHT_NO;
} }
updateConfigurationLocked(); updateConfigurationLocked();
sendConfigurationLocked(); applyConfigurationExternallyLocked();
persistNightMode(user);
return true; return true;
} finally { } finally {
Binder.restoreCallingIdentity(ident); Binder.restoreCallingIdentity(ident);
@@ -651,6 +660,13 @@ final class UiModeManagerService extends SystemService {
} }
} }
private void persistNightMode(int user) {
Secure.putIntForUser(getContext().getContentResolver(),
Secure.UI_NIGHT_MODE, mNightMode, user);
Secure.putIntForUser(getContext().getContentResolver(),
OVERRIDE_NIGHT_MODE, mNightModeOverride, user);
}
private void updateConfigurationLocked() { private void updateConfigurationLocked() {
int uiMode = mDefaultUiModeType; int uiMode = mDefaultUiModeType;
if (mUiModeLocked) { if (mUiModeLocked) {
@@ -696,15 +712,14 @@ final class UiModeManagerService extends SystemService {
} }
mCurUiMode = uiMode; mCurUiMode = uiMode;
if (!mHoldingConfiguration) { if (!mHoldingConfiguration || !mWaitForScreenOff) {
mConfiguration.uiMode = uiMode; mConfiguration.uiMode = uiMode;
} }
} }
private void sendConfigurationLocked() { private void applyConfigurationExternallyLocked() {
if (mSetUiMode != mConfiguration.uiMode) { if (mSetUiMode != mConfiguration.uiMode) {
mSetUiMode = mConfiguration.uiMode; mSetUiMode = mConfiguration.uiMode;
try { try {
ActivityTaskManager.getService().updateConfiguration(mConfiguration); ActivityTaskManager.getService().updateConfiguration(mConfiguration);
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -884,7 +899,7 @@ final class UiModeManagerService extends SystemService {
} }
// Send the new configuration. // Send the new configuration.
sendConfigurationLocked(); applyConfigurationExternallyLocked();
// If we did not start a dock app, then start dreaming if supported. // If we did not start a dock app, then start dreaming if supported.
if (category != null && !dockAppStarted) { if (category != null && !dockAppStarted) {
@@ -962,7 +977,6 @@ final class UiModeManagerService extends SystemService {
final int user = UserHandle.getCallingUserId(); final int user = UserHandle.getCallingUserId();
Secure.putIntForUser(getContext().getContentResolver(), Secure.putIntForUser(getContext().getContentResolver(),
OVERRIDE_NIGHT_MODE, mNightModeOverride, user); OVERRIDE_NIGHT_MODE, mNightModeOverride, user);
} }
} }