diff options
-rw-r--r-- | services/core/java/com/android/server/UiModeManagerService.java | 13 | ||||
-rw-r--r-- | services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java | 41 |
2 files changed, 43 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index 35936babf3cb..be080e5cce62 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -233,7 +233,7 @@ final class UiModeManagerService extends SystemService { public void onTwilightStateChanged(@Nullable TwilightState state) { synchronized (mLock) { if (mNightMode == UiModeManager.MODE_NIGHT_AUTO && mSystemReady) { - if (mCar) { + if (shouldApplyAutomaticChangesImmediately()) { updateLocked(0, 0); } else { registerScreenOffEventLocked(); @@ -1155,7 +1155,6 @@ final class UiModeManagerService extends SystemService { void updateLocked(int enableFlags, int disableFlags) { String action = null; String oldAction = null; - boolean originalComputedNightMode = mComputedNightMode; if (mLastBroadcastState == Intent.EXTRA_DOCK_STATE_CAR) { adjustStatusBarCarModeLocked(); oldAction = UiModeManager.ACTION_EXIT_CAR_MODE; @@ -1236,16 +1235,11 @@ final class UiModeManagerService extends SystemService { sendConfigurationAndStartDreamOrDockAppLocked(category); } - // reset overrides if mComputedNightMode changes - if (originalComputedNightMode != mComputedNightMode) { - resetNightModeOverrideLocked(); - } - // keep screen on when charging and in car mode boolean keepScreenOn = mCharging && ((mCarModeEnabled && mCarModeKeepsScreenOn && - (mCarModeEnableFlags & UiModeManager.ENABLE_CAR_MODE_ALLOW_SLEEP) == 0) || - (mCurUiMode == Configuration.UI_MODE_TYPE_DESK && mDeskModeKeepsScreenOn)); + (mCarModeEnableFlags & UiModeManager.ENABLE_CAR_MODE_ALLOW_SLEEP) == 0) || + (mCurUiMode == Configuration.UI_MODE_TYPE_DESK && mDeskModeKeepsScreenOn)); if (keepScreenOn != mWakeLock.isHeld()) { if (keepScreenOn) { mWakeLock.acquire(); @@ -1403,6 +1397,7 @@ final class UiModeManagerService extends SystemService { mComputedNightMode = false; return; } + resetNightModeOverrideLocked(); } private boolean resetNightModeOverrideLocked() { diff --git a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java index 389a03868d80..1d75967756c3 100644 --- a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java @@ -31,9 +31,10 @@ 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.TwilightListener; import com.android.server.twilight.TwilightManager; import com.android.server.twilight.TwilightState; import com.android.server.wm.WindowManagerInternal; @@ -56,7 +57,6 @@ 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; @@ -66,6 +66,7 @@ import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -101,6 +102,7 @@ public class UiModeManagerServiceTest extends UiServiceTestCase { private BroadcastReceiver mTimeChangedCallback; private AlarmManager.OnAlarmListener mCustomListener; private Consumer<PowerSaveState> mPowerSaveConsumer; + private TwilightListener mTwilightListener; @Before public void setUp() { @@ -108,6 +110,10 @@ public class UiModeManagerServiceTest extends UiServiceTestCase { when(mContext.checkCallingOrSelfPermission(anyString())) .thenReturn(PackageManager.PERMISSION_GRANTED); doAnswer(inv -> { + mTwilightListener = (TwilightListener) inv.getArgument(0); + return null; + }).when(mTwilightManager).registerListener(any(), any()); + doAnswer(inv -> { mPowerSaveConsumer = (Consumer<PowerSaveState>) inv.getArgument(1); return null; }).when(mLocalPowerManager).registerLowPowerModeObserver(anyInt(), any()); @@ -162,6 +168,37 @@ public class UiModeManagerServiceTest extends UiServiceTestCase { @Ignore // b/152719290 - Fails on stage-aosp-master @Test + public void setNightMoveActivated_overridesFunctionCorrectly() throws RemoteException { + // set up + when(mPowerManager.isInteractive()).thenReturn(false); + mService.setNightMode(MODE_NIGHT_NO); + assertFalse(mUiManagerService.getConfiguration().isNightModeActive()); + + // assume it is day time + doReturn(false).when(mTwilightState).isNight(); + + // set mode to auto + mService.setNightMode(MODE_NIGHT_AUTO); + + // set night mode on overriding current config + mService.setNightModeActivated(true); + + assertTrue(mUiManagerService.getConfiguration().isNightModeActive()); + + // now it is night time + doReturn(true).when(mTwilightState).isNight(); + mTwilightListener.onTwilightStateChanged(mTwilightState); + + assertTrue(mUiManagerService.getConfiguration().isNightModeActive()); + + // now it is next day mid day + doReturn(false).when(mTwilightState).isNight(); + mTwilightListener.onTwilightStateChanged(mTwilightState); + + assertFalse(mUiManagerService.getConfiguration().isNightModeActive()); + } + + @Test public void setAutoMode_screenOffRegistered() throws RemoteException { try { mService.setNightMode(MODE_NIGHT_NO); |