diff options
| -rw-r--r-- | services/core/java/com/android/server/UiModeManagerService.java | 84 | ||||
| -rw-r--r-- | services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java | 4 |
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 */} |