summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jay Aliomer <aaliomer@google.com> 2020-05-08 17:44:38 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-05-08 17:44:38 +0000
commit1d555b86cb24d7c00593ff5f0f42d25f149cf02c (patch)
tree49331c5641f6ad587d691401457be0f4184572c2
parent5c8dd641bae6ca09a61ba9b6dae76789d9b8e399 (diff)
parent3a3cc4a20f2c1d5d4711db1a202cb98dfb09b700 (diff)
Merge "Revert "Allow SUW to change dark theme"" into rvc-dev
-rw-r--r--services/core/java/com/android/server/UiModeManagerService.java84
-rw-r--r--services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java4
2 files changed, 71 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 26cb208a3d47..dd3de359a01e 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -122,6 +122,7 @@ final class UiModeManagerService extends SystemService {
private boolean mVrHeadset;
private boolean mComputedNightMode;
private int mCarModeEnableFlags;
+ private boolean mSetupWizardComplete;
// flag set by resource, whether to enable Car dock launch when starting car mode.
private boolean mEnableCarDockLaunch = true;
@@ -163,6 +164,12 @@ final class UiModeManagerService extends SystemService {
mConfiguration.setToDefaults();
}
+ @VisibleForTesting
+ protected UiModeManagerService(Context context, boolean setupWizardComplete) {
+ this(context);
+ mSetupWizardComplete = setupWizardComplete;
+ }
+
private static Intent buildHomeIntent(String category) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(category);
@@ -276,6 +283,25 @@ final class UiModeManagerService extends SystemService {
}
};
+ private final ContentObserver mSetupWizardObserver = new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ synchronized (mLock) {
+ // setup wizard is done now so we can unblock
+ if (setupWizardCompleteForCurrentUser() && !selfChange) {
+ mSetupWizardComplete = true;
+ getContext().getContentResolver()
+ .unregisterContentObserver(mSetupWizardObserver);
+ // update night mode
+ Context context = getContext();
+ updateNightModeFromSettingsLocked(context, context.getResources(),
+ UserHandle.getCallingUserId());
+ updateLocked(0, 0);
+ }
+ }
+ }
+ };
+
private final ContentObserver mDarkThemeObserver = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange, Uri uri) {
@@ -293,6 +319,13 @@ final class UiModeManagerService extends SystemService {
}
@Override
+ public void onSwitchUser(int userHandle) {
+ super.onSwitchUser(userHandle);
+ getContext().getContentResolver().unregisterContentObserver(mSetupWizardObserver);
+ verifySetupWizardCompleted();
+ }
+
+ @Override
public void onBootPhase(int phase) {
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
synchronized (mLock) {
@@ -330,8 +363,13 @@ final class UiModeManagerService extends SystemService {
@Override
public void onStart() {
final Context context = getContext();
+ // If setup isn't complete for this user listen for completion so we can unblock
+ // being able to send a night mode configuration change event
+ verifySetupWizardCompleted();
final Resources res = context.getResources();
+ mNightMode = res.getInteger(
+ com.android.internal.R.integer.config_defaultNightMode);
mDefaultUiModeType = res.getInteger(
com.android.internal.R.integer.config_defaultUiModeType);
mCarModeKeepsScreenOn = (res.getInteger(
@@ -404,6 +442,20 @@ final class UiModeManagerService extends SystemService {
return mConfiguration;
}
+ // Records whether setup wizard has happened or not and adds an observer for this user if not.
+ private void verifySetupWizardCompleted() {
+ final Context context = getContext();
+ final int userId = UserHandle.getCallingUserId();
+ if (!setupWizardCompleteForCurrentUser()) {
+ mSetupWizardComplete = false;
+ context.getContentResolver().registerContentObserver(
+ Secure.getUriFor(
+ Secure.USER_SETUP_COMPLETE), false, mSetupWizardObserver, userId);
+ } else {
+ mSetupWizardComplete = true;
+ }
+ }
+
private boolean setupWizardCompleteForCurrentUser() {
return Secure.getIntForUser(getContext().getContentResolver(),
Secure.USER_SETUP_COMPLETE, 0, UserHandle.getCallingUserId()) == 1;
@@ -429,23 +481,23 @@ final class UiModeManagerService extends SystemService {
* @return True if the new value is different from the old value. False otherwise.
*/
private boolean updateNightModeFromSettingsLocked(Context context, Resources res, int userId) {
- final int defaultNightMode = res.getInteger(
- com.android.internal.R.integer.config_defaultNightMode);
int oldNightMode = mNightMode;
- mNightMode = Secure.getIntForUser(context.getContentResolver(),
- Secure.UI_NIGHT_MODE, defaultNightMode, userId);
- mOverrideNightModeOn = Secure.getIntForUser(context.getContentResolver(),
- Secure.UI_NIGHT_MODE_OVERRIDE_ON, 0, userId) != 0;
- mOverrideNightModeOff = Secure.getIntForUser(context.getContentResolver(),
- Secure.UI_NIGHT_MODE_OVERRIDE_OFF, 0, userId) != 0;
- mCustomAutoNightModeStartMilliseconds = LocalTime.ofNanoOfDay(
- Secure.getLongForUser(context.getContentResolver(),
- Secure.DARK_THEME_CUSTOM_START_TIME,
- DEFAULT_CUSTOM_NIGHT_START_TIME.toNanoOfDay() / 1000L, userId) * 1000);
- mCustomAutoNightModeEndMilliseconds = LocalTime.ofNanoOfDay(
- Secure.getLongForUser(context.getContentResolver(),
- Secure.DARK_THEME_CUSTOM_END_TIME,
- DEFAULT_CUSTOM_NIGHT_END_TIME.toNanoOfDay() / 1000L, userId) * 1000);
+ if (mSetupWizardComplete) {
+ mNightMode = Secure.getIntForUser(context.getContentResolver(),
+ Secure.UI_NIGHT_MODE, mNightMode, userId);
+ mOverrideNightModeOn = Secure.getIntForUser(context.getContentResolver(),
+ Secure.UI_NIGHT_MODE_OVERRIDE_ON, 0, userId) != 0;
+ mOverrideNightModeOff = Secure.getIntForUser(context.getContentResolver(),
+ Secure.UI_NIGHT_MODE_OVERRIDE_OFF, 0, userId) != 0;
+ mCustomAutoNightModeStartMilliseconds = LocalTime.ofNanoOfDay(
+ Secure.getLongForUser(context.getContentResolver(),
+ Secure.DARK_THEME_CUSTOM_START_TIME,
+ DEFAULT_CUSTOM_NIGHT_START_TIME.toNanoOfDay() / 1000L, userId) * 1000);
+ mCustomAutoNightModeEndMilliseconds = LocalTime.ofNanoOfDay(
+ Secure.getLongForUser(context.getContentResolver(),
+ Secure.DARK_THEME_CUSTOM_END_TIME,
+ DEFAULT_CUSTOM_NIGHT_END_TIME.toNanoOfDay() / 1000L, userId) * 1000);
+ }
return oldNightMode != mNightMode;
}
diff --git a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
index df92b6ed95e8..69ef499749a9 100644
--- a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
@@ -31,6 +31,7 @@ import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.os.PowerSaveState;
import android.os.RemoteException;
+import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import com.android.server.twilight.TwilightManager;
@@ -54,6 +55,7 @@ import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
@@ -144,7 +146,7 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
addLocalService(PowerManagerInternal.class, mLocalPowerManager);
addLocalService(TwilightManager.class, mTwilightManager);
- mUiManagerService = new UiModeManagerService(mContext);
+ mUiManagerService = new UiModeManagerService(mContext, true);
try {
mUiManagerService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
} catch (SecurityException e) {/* ignore for permission denial */}