Loading services/core/java/com/android/server/UiModeManagerService.java +68 −16 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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) { Loading @@ -292,6 +318,13 @@ final class UiModeManagerService extends SystemService { SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, Integer.toString(mode)); } @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) { Loading Loading @@ -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( Loading Loading @@ -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; Loading @@ -429,11 +481,10 @@ 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; if (mSetupWizardComplete) { mNightMode = Secure.getIntForUser(context.getContentResolver(), Secure.UI_NIGHT_MODE, defaultNightMode, userId); 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(), Loading @@ -446,6 +497,7 @@ final class UiModeManagerService extends SystemService { Secure.getLongForUser(context.getContentResolver(), Secure.DARK_THEME_CUSTOM_END_TIME, DEFAULT_CUSTOM_NIGHT_END_TIME.toNanoOfDay() / 1000L, userId) * 1000); } return oldNightMode != mNightMode; } Loading services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 */} Loading Loading
services/core/java/com/android/server/UiModeManagerService.java +68 −16 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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) { Loading @@ -292,6 +318,13 @@ final class UiModeManagerService extends SystemService { SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, Integer.toString(mode)); } @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) { Loading Loading @@ -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( Loading Loading @@ -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; Loading @@ -429,11 +481,10 @@ 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; if (mSetupWizardComplete) { mNightMode = Secure.getIntForUser(context.getContentResolver(), Secure.UI_NIGHT_MODE, defaultNightMode, userId); 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(), Loading @@ -446,6 +497,7 @@ final class UiModeManagerService extends SystemService { Secure.getLongForUser(context.getContentResolver(), Secure.DARK_THEME_CUSTOM_END_TIME, DEFAULT_CUSTOM_NIGHT_END_TIME.toNanoOfDay() / 1000L, userId) * 1000); } return oldNightMode != mNightMode; } Loading
services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 */} Loading