diff options
| author | 2024-01-18 08:34:49 +0000 | |
|---|---|---|
| committer | 2024-01-18 08:34:49 +0000 | |
| commit | c294bbc630d332e1b28c34909952e65d0d176b9a (patch) | |
| tree | 5bfa1dd721a2dab2df5605c63ecb1f44f7b0649b | |
| parent | 6c3fc758159dc587d57960200bc187576cc62825 (diff) | |
| parent | d1f726a95538f6e2511a638d15d5a5afed2afb0b (diff) | |
Merge changes from topic "device-effect-night" into main
* changes:
Use new UiModeManager APIs for toggling night mode
Adds UiModeManager APIs for Attention Modes
8 files changed, 284 insertions, 30 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 0d1d8d733139..a5c2af76479b 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -483,10 +483,15 @@ package android.app { } public class UiModeManager { + method @FlaggedApi("android.app.modes_api") @RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE) public int getAttentionModeThemeOverlay(); method public boolean isNightModeLocked(); method public boolean isUiModeLocked(); method @RequiresPermission(value=android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION, conditional=true) public boolean releaseProjection(int); method @RequiresPermission(value=android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION, conditional=true) public boolean requestProjection(int); + field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_DAY = 1002; // 0x3ea + field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_NIGHT = 1001; // 0x3e9 + field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_OFF = 1000; // 0x3e8 + field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_UNKNOWN = -1; // 0xffffffff field public static final int PROJECTION_TYPE_ALL = -1; // 0xffffffff field public static final int PROJECTION_TYPE_AUTOMOTIVE = 1; // 0x1 field public static final int PROJECTION_TYPE_NONE = 0; // 0x0 diff --git a/core/java/android/app/IUiModeManager.aidl b/core/java/android/app/IUiModeManager.aidl index 60b34cdc1b8a..3b83024d536b 100644 --- a/core/java/android/app/IUiModeManager.aidl +++ b/core/java/android/app/IUiModeManager.aidl @@ -95,6 +95,34 @@ interface IUiModeManager { int getNightModeCustomType(); /** + * Overlays current Night Mode value. + * {@code attentionModeThemeOverlayType}. + * + * @param attentionModeThemeOverlayType + * @hide + */ + @EnforcePermission("MODIFY_DAY_NIGHT_MODE") + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)") + void setAttentionModeThemeOverlay(int attentionModeThemeOverlayType); + + + /** + * Returns current Attention Mode overlay type. + * <p> + * returns + * <ul> + * <li>{@link #MODE_ATTENTION_OFF}</li> + * <li>{@link #MODE_ATTENTION_NIGHT}</li> + * <li>{@link #MODE_ATTENTION_DAY}</li> + * </ul> + * </p> + * @hide + */ + @EnforcePermission("MODIFY_DAY_NIGHT_MODE") + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)") + int getAttentionModeThemeOverlay(); + + /** * Sets the dark mode for the given application. This setting is persisted and will override the * system configuration for this application. * 1 - notnight mode diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java index 0ccb9cddf58d..a27132872521 100644 --- a/core/java/android/app/UiModeManager.java +++ b/core/java/android/app/UiModeManager.java @@ -17,6 +17,7 @@ package android.app; import android.annotation.CallbackExecutor; +import android.annotation.FlaggedApi; import android.annotation.FloatRange; import android.annotation.IntDef; import android.annotation.IntRange; @@ -265,6 +266,60 @@ public class UiModeManager { */ public static final int MODE_NIGHT_YES = 2; + /** @hide */ + @IntDef(prefix = { "MODE_ATTENTION_THEME_OVERLAY_" }, value = { + MODE_ATTENTION_THEME_OVERLAY_OFF, + MODE_ATTENTION_THEME_OVERLAY_NIGHT, + MODE_ATTENTION_THEME_OVERLAY_DAY + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AttentionModeThemeOverlayType {} + + /** @hide */ + @IntDef(prefix = { "MODE_ATTENTION_THEME_OVERLAY_" }, value = { + MODE_ATTENTION_THEME_OVERLAY_OFF, + MODE_ATTENTION_THEME_OVERLAY_NIGHT, + MODE_ATTENTION_THEME_OVERLAY_DAY, + MODE_ATTENTION_THEME_OVERLAY_UNKNOWN + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AttentionModeThemeOverlayReturnType {} + + /** + * Constant for {@link #setAttentionModeThemeOverlay(int)} (int)} and {@link + * #getAttentionModeThemeOverlay()}: Keeps night mode as set by {@link #setNightMode(int)}. + * @hide + */ + @FlaggedApi(Flags.FLAG_MODES_API) + @TestApi + public static final int MODE_ATTENTION_THEME_OVERLAY_OFF = 1000; + + /** + * Constant for {@link #setAttentionModeThemeOverlay(int)} (int)} and {@link + * #getAttentionModeThemeOverlay()}: Maintains night mode always on. + * @hide + */ + @FlaggedApi(Flags.FLAG_MODES_API) + @TestApi + public static final int MODE_ATTENTION_THEME_OVERLAY_NIGHT = 1001; + + /** + * Constant for {@link #setAttentionModeThemeOverlay(int)} (int)} and {@link + * #getAttentionModeThemeOverlay()}: Maintains night mode always off (Light). + * @hide + */ + @FlaggedApi(Flags.FLAG_MODES_API) + @TestApi + public static final int MODE_ATTENTION_THEME_OVERLAY_DAY = 1002; + + /** + * Constant for {@link #getAttentionModeThemeOverlay()}: Error communication with server. + * @hide + */ + @FlaggedApi(Flags.FLAG_MODES_API) + @TestApi + public static final int MODE_ATTENTION_THEME_OVERLAY_UNKNOWN = -1; + /** * Granular types for {@link #setNightModeCustomType(int)} * @hide @@ -733,6 +788,55 @@ public class UiModeManager { } /** + * Overlays current Attention mode Night Mode overlay. + * {@code attentionModeThemeOverlayType}. + * + * @throws IllegalArgumentException if passed an unsupported type to + * {@code AttentionModeThemeOverlayType}. + * @hide + */ + @FlaggedApi(Flags.FLAG_MODES_API) + @RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE) + public void setAttentionModeThemeOverlay( + @AttentionModeThemeOverlayType int attentionModeThemeOverlayType) { + if (sGlobals != null) { + try { + sGlobals.mService.setAttentionModeThemeOverlay(attentionModeThemeOverlayType); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * Returns the currently configured Attention Mode theme overlay. + * <p> + * May be one of: + * <ul> + * <li>{@link #MODE_ATTENTION_THEME_OVERLAY_OFF}</li> + * <li>{@link #MODE_ATTENTION_THEME_OVERLAY_NIGHT}</li> + * <li>{@link #MODE_ATTENTION_THEME_OVERLAY_DAY}</li> + * <li>{@link #MODE_ATTENTION_THEME_OVERLAY_UNKNOWN}</li> + * </ul> + * </p> + * + * @hide + */ + @FlaggedApi(Flags.FLAG_MODES_API) + @TestApi + @RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE) + public @AttentionModeThemeOverlayReturnType int getAttentionModeThemeOverlay() { + if (sGlobals != null) { + try { + return sGlobals.mService.getAttentionModeThemeOverlay(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + return MODE_ATTENTION_THEME_OVERLAY_UNKNOWN; + } + + /** * Sets and persist the night mode for this application. * <p> * The mode can be one of: diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index 66a10e4a3c11..cd8be338a031 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -16,8 +16,10 @@ package com.android.server; +import static android.app.Flags.modesApi; import static android.app.UiModeManager.ContrastUtils.CONTRAST_DEFAULT_VALUE; import static android.app.UiModeManager.DEFAULT_PRIORITY; +import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_OFF; import static android.app.UiModeManager.MODE_NIGHT_AUTO; import static android.app.UiModeManager.MODE_NIGHT_CUSTOM; import static android.app.UiModeManager.MODE_NIGHT_CUSTOM_TYPE_BEDTIME; @@ -50,6 +52,7 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.app.StatusBarManager; import android.app.UiModeManager; +import android.app.UiModeManager.AttentionModeThemeOverlayType; import android.app.UiModeManager.NightModeCustomReturnType; import android.app.UiModeManager.NightModeCustomType; import android.content.BroadcastReceiver; @@ -134,6 +137,7 @@ final class UiModeManagerService extends SystemService { private int mLastBroadcastState = Intent.EXTRA_DOCK_STATE_UNDOCKED; private int mNightMode = UiModeManager.MODE_NIGHT_NO; private int mNightModeCustomType = UiModeManager.MODE_NIGHT_CUSTOM_TYPE_UNKNOWN; + private int mAttentionModeThemeOverlay = UiModeManager.MODE_ATTENTION_THEME_OVERLAY_OFF; private final LocalTime DEFAULT_CUSTOM_NIGHT_START_TIME = LocalTime.of(22, 0); private final LocalTime DEFAULT_CUSTOM_NIGHT_END_TIME = LocalTime.of(6, 0); private LocalTime mCustomAutoNightModeStartMilliseconds = DEFAULT_CUSTOM_NIGHT_START_TIME; @@ -839,6 +843,8 @@ final class UiModeManagerService extends SystemService { ? customModeType : MODE_NIGHT_CUSTOM_TYPE_UNKNOWN; mNightMode = mode; + //deactivates AttentionMode if user toggles DarkTheme + mAttentionModeThemeOverlay = MODE_ATTENTION_THEME_OVERLAY_OFF; resetNightModeOverrideLocked(); persistNightMode(user); // on screen off will update configuration instead @@ -879,6 +885,29 @@ final class UiModeManagerService extends SystemService { } } + @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE) + @Override + public void setAttentionModeThemeOverlay( + @AttentionModeThemeOverlayType int attentionModeThemeOverlayType) { + setAttentionModeThemeOverlay_enforcePermission(); + + synchronized (mLock) { + if (mAttentionModeThemeOverlay != attentionModeThemeOverlayType) { + mAttentionModeThemeOverlay = attentionModeThemeOverlayType; + Binder.withCleanCallingIdentity(()-> updateLocked(0, 0)); + } + } + } + + @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE) + @Override + public @AttentionModeThemeOverlayType int getAttentionModeThemeOverlay() { + getAttentionModeThemeOverlay_enforcePermission(); + synchronized (mLock) { + return mAttentionModeThemeOverlay; + } + } + @Override public void setApplicationNightMode(@UiModeManager.NightMode int mode) { switch (mode) { @@ -1406,7 +1435,7 @@ final class UiModeManagerService extends SystemService { pw.print(Shell.nightModeToStr(mNightMode, mNightModeCustomType)); pw.print(") "); pw.print(" mOverrideOn/Off="); pw.print(mOverrideNightModeOn); pw.print("/"); pw.print(mOverrideNightModeOff); - + pw.print(" mAttentionModeThemeOverlay="); pw.print(mAttentionModeThemeOverlay); pw.print(" mNightModeLocked="); pw.println(mNightModeLocked); pw.print(" mCarModeEnabled="); pw.print(mCarModeEnabled); @@ -1685,7 +1714,7 @@ final class UiModeManagerService extends SystemService { } @UiModeManager.NightMode - private int getComputedUiModeConfiguration(@UiModeManager.NightMode int uiMode) { + private int getComputedUiModeConfiguration(int uiMode) { uiMode |= mComputedNightMode ? Configuration.UI_MODE_NIGHT_YES : Configuration.UI_MODE_NIGHT_NO; uiMode &= mComputedNightMode ? ~Configuration.UI_MODE_NIGHT_NO @@ -1980,18 +2009,26 @@ final class UiModeManagerService extends SystemService { } private void updateComputedNightModeLocked(boolean activate) { - mComputedNightMode = activate; - if (mNightMode == MODE_NIGHT_YES || mNightMode == UiModeManager.MODE_NIGHT_NO) { - return; - } - if (mOverrideNightModeOn && !mComputedNightMode) { - mComputedNightMode = true; - return; - } - if (mOverrideNightModeOff && mComputedNightMode) { - mComputedNightMode = false; - return; + boolean newComputedValue = activate; + if (mNightMode != MODE_NIGHT_YES && mNightMode != UiModeManager.MODE_NIGHT_NO) { + if (mOverrideNightModeOn && !newComputedValue) { + newComputedValue = true; + } else if (mOverrideNightModeOff && newComputedValue) { + newComputedValue = false; + } + } + + if (modesApi()) { + // Computes final night mode values based on Attention Mode. + mComputedNightMode = switch (mAttentionModeThemeOverlay) { + case (UiModeManager.MODE_ATTENTION_THEME_OVERLAY_NIGHT) -> true; + case (UiModeManager.MODE_ATTENTION_THEME_OVERLAY_DAY) -> false; + default -> newComputedValue; // case OFF + }; + } else { + mComputedNightMode = newComputedValue; } + if (mNightMode != MODE_NIGHT_AUTO || (mTwilightManager != null && mTwilightManager.getLastTwilightState() != null)) { resetNightModeOverrideLocked(); diff --git a/services/core/java/com/android/server/notification/DefaultDeviceEffectsApplier.java b/services/core/java/com/android/server/notification/DefaultDeviceEffectsApplier.java index 71a6b5ed0581..ab650afe68a7 100644 --- a/services/core/java/com/android/server/notification/DefaultDeviceEffectsApplier.java +++ b/services/core/java/com/android/server/notification/DefaultDeviceEffectsApplier.java @@ -16,7 +16,8 @@ package com.android.server.notification; -import static android.app.UiModeManager.MODE_NIGHT_CUSTOM_TYPE_BEDTIME; +import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_NIGHT; +import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_OFF; import android.app.UiModeManager; import android.app.WallpaperManager; @@ -128,10 +129,9 @@ class DefaultDeviceEffectsApplier implements DeviceEffectsApplier { private void updateNightModeImmediately(boolean useNightMode) { Binder.withCleanCallingIdentity(() -> { - // TODO: b/314285749 - Placeholder; use real APIs when available. - mUiModeManager.setNightModeCustomType(MODE_NIGHT_CUSTOM_TYPE_BEDTIME); - mUiModeManager.setNightModeActivatedForCustomMode(MODE_NIGHT_CUSTOM_TYPE_BEDTIME, - useNightMode); + mUiModeManager.setAttentionModeThemeOverlay( + useNightMode ? MODE_ATTENTION_THEME_OVERLAY_NIGHT + : MODE_ATTENTION_THEME_OVERLAY_OFF); }); } diff --git a/services/tests/uiservicestests/Android.bp b/services/tests/uiservicestests/Android.bp index 4e1c72af2727..2f29d10ec2f9 100644 --- a/services/tests/uiservicestests/Android.bp +++ b/services/tests/uiservicestests/Android.bp @@ -47,6 +47,7 @@ android_test { "flag-junit", "notification_flags_lib", "platform-test-rules", + "SettingsLib", ], libs: [ diff --git a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java index db4653208f62..839cf7ce4926 100644 --- a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java @@ -17,6 +17,9 @@ package com.android.server; import static android.Manifest.permission.MODIFY_DAY_NIGHT_MODE; +import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_DAY; +import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_NIGHT; +import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_OFF; import static android.app.UiModeManager.MODE_NIGHT_AUTO; import static android.app.UiModeManager.MODE_NIGHT_CUSTOM; import static android.app.UiModeManager.MODE_NIGHT_CUSTOM_TYPE_BEDTIME; @@ -32,6 +35,7 @@ import static com.android.server.UiModeManagerService.SUPPORTED_NIGHT_MODE_CUSTO import static com.google.common.truth.Truth.assertThat; +import static junit.framework.Assert.fail; import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertTrue; @@ -65,6 +69,7 @@ import static org.testng.Assert.assertThrows; import android.Manifest; import android.app.Activity; import android.app.AlarmManager; +import android.app.Flags; import android.app.IOnProjectionStateChangedListener; import android.app.IUiModeManager; import android.content.BroadcastReceiver; @@ -84,6 +89,8 @@ import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.os.test.FakePermissionEnforcer; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; import android.service.dreams.DreamManagerInternal; import android.test.mock.MockContentResolver; @@ -98,6 +105,7 @@ import com.android.server.wm.WindowManagerInternal; import org.junit.Before; import org.junit.Ignore; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -109,6 +117,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.util.List; +import java.util.Map; import java.util.function.Consumer; @RunWith(AndroidTestingRunner.class) @@ -159,6 +168,11 @@ public class UiModeManagerServiceTest extends UiServiceTestCase { private TwilightListener mTwilightListener; private FakePermissionEnforcer mPermissionEnforcer; + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule( + SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT); + + @Before public void setUp() { // The AIDL stub will use PermissionEnforcer to check permission from the caller. @@ -1437,6 +1451,51 @@ public class UiModeManagerServiceTest extends UiServiceTestCase { verify(mInjector).startDreamWhenDockedIfAppropriate(mContext); } + private void testAttentionModeThemeOverlay(boolean modeNight) throws RemoteException { + //setup + if (modeNight) { + mService.setNightMode(MODE_NIGHT_YES); + assertTrue(mUiManagerService.getConfiguration().isNightModeActive()); + } else { + mService.setNightMode(MODE_NIGHT_NO); + assertFalse(mUiManagerService.getConfiguration().isNightModeActive()); + } + + // attention modes with expected night modes + Map<Integer, Boolean> modes = Map.of( + MODE_ATTENTION_THEME_OVERLAY_OFF, modeNight, + MODE_ATTENTION_THEME_OVERLAY_DAY, false, + MODE_ATTENTION_THEME_OVERLAY_NIGHT, true + ); + + // test + for (int aMode : modes.keySet()) { + try { + mService.setAttentionModeThemeOverlay(aMode); + + int appliedAMode = mService.getAttentionModeThemeOverlay(); + boolean nMode = modes.get(aMode); + + assertEquals(aMode, appliedAMode); + assertEquals(isNightModeActivated(), nMode); + } catch (RemoteException e) { + fail("Error communicating with server: " + e.getMessage()); + } + } + } + + @Test + @EnableFlags(Flags.FLAG_MODES_API) + public void testAttentionModeThemeOverlay_nightModeDisabled() throws RemoteException { + testAttentionModeThemeOverlay(false); + } + + @Test + @EnableFlags(Flags.FLAG_MODES_API) + public void testAttentionModeThemeOverlay_nightModeEnabled() throws RemoteException { + testAttentionModeThemeOverlay(true); + } + private void triggerDockIntent() { final Intent dockedIntent = new Intent(Intent.ACTION_DOCK_EVENT) diff --git a/services/tests/uiservicestests/src/com/android/server/notification/DefaultDeviceEffectsApplierTest.java b/services/tests/uiservicestests/src/com/android/server/notification/DefaultDeviceEffectsApplierTest.java index 30843d222742..3797dbb97213 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/DefaultDeviceEffectsApplierTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/DefaultDeviceEffectsApplierTest.java @@ -16,7 +16,8 @@ package com.android.server.notification; -import static android.app.UiModeManager.MODE_NIGHT_CUSTOM_TYPE_BEDTIME; +import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_NIGHT; +import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_OFF; import static android.service.notification.ZenModeConfig.UPDATE_ORIGIN_APP; import static android.service.notification.ZenModeConfig.UPDATE_ORIGIN_USER; @@ -121,28 +122,49 @@ public class DefaultDeviceEffectsApplierTest { verify(mPowerManager).suppressAmbientDisplay(anyString(), eq(true)); verify(mColorDisplayManager).setSaturationLevel(eq(0)); verify(mWallpaperManager).setWallpaperDimAmount(eq(0.6f)); - verify(mUiModeManager).setNightModeActivatedForCustomMode( - eq(MODE_NIGHT_CUSTOM_TYPE_BEDTIME), eq(true)); + verify(mUiModeManager).setAttentionModeThemeOverlay(eq(MODE_ATTENTION_THEME_OVERLAY_NIGHT)); } @Test - public void apply_removesPreviouslyAppliedEffects() { + public void apply_removesEffects() { mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API); ZenDeviceEffects previousEffects = new ZenDeviceEffects.Builder() .setShouldSuppressAmbientDisplay(true) .setShouldDimWallpaper(true) + .setShouldDisplayGrayscale(true) + .setShouldUseNightMode(true) .build(); mApplier.apply(previousEffects, UPDATE_ORIGIN_USER); verify(mPowerManager).suppressAmbientDisplay(anyString(), eq(true)); + verify(mColorDisplayManager).setSaturationLevel(eq(0)); verify(mWallpaperManager).setWallpaperDimAmount(eq(0.6f)); + verify(mUiModeManager).setAttentionModeThemeOverlay(eq(MODE_ATTENTION_THEME_OVERLAY_NIGHT)); ZenDeviceEffects noEffects = new ZenDeviceEffects.Builder().build(); mApplier.apply(noEffects, UPDATE_ORIGIN_USER); verify(mPowerManager).suppressAmbientDisplay(anyString(), eq(false)); + verify(mColorDisplayManager).setSaturationLevel(eq(100)); verify(mWallpaperManager).setWallpaperDimAmount(eq(0.0f)); - verifyZeroInteractions(mColorDisplayManager, mUiModeManager); + verify(mUiModeManager).setAttentionModeThemeOverlay(eq(MODE_ATTENTION_THEME_OVERLAY_OFF)); + } + + @Test + public void apply_removesOnlyPreviouslyAppliedEffects() { + mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API); + + ZenDeviceEffects previousEffects = new ZenDeviceEffects.Builder() + .setShouldSuppressAmbientDisplay(true) + .build(); + mApplier.apply(previousEffects, UPDATE_ORIGIN_USER); + verify(mPowerManager).suppressAmbientDisplay(anyString(), eq(true)); + + ZenDeviceEffects noEffects = new ZenDeviceEffects.Builder().build(); + mApplier.apply(noEffects, UPDATE_ORIGIN_USER); + + verify(mPowerManager).suppressAmbientDisplay(anyString(), eq(false)); + verifyZeroInteractions(mColorDisplayManager, mWallpaperManager, mUiModeManager); } @Test @@ -150,6 +172,7 @@ public class DefaultDeviceEffectsApplierTest { mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API); mContext.addMockSystemService(ColorDisplayManager.class, null); mContext.addMockSystemService(WallpaperManager.class, null); + mApplier = new DefaultDeviceEffectsApplier(mContext); ZenDeviceEffects effects = new ZenDeviceEffects.Builder() .setShouldSuppressAmbientDisplay(true) @@ -177,7 +200,7 @@ public class DefaultDeviceEffectsApplierTest { verify(mWallpaperManager).setWallpaperDimAmount(eq(0.6f)); verify(mPowerManager, never()).suppressAmbientDisplay(anyString(), anyBoolean()); - verify(mUiModeManager, never()).setNightModeActivatedForCustomMode(anyInt(), anyBoolean()); + verify(mUiModeManager, never()).setAttentionModeThemeOverlay(anyInt()); } @Test @@ -223,8 +246,7 @@ public class DefaultDeviceEffectsApplierTest { screenOffReceiver.onReceive(mContext, new Intent(Intent.ACTION_SCREEN_OFF)); // So the effect is applied, and we stopped listening for this event. - verify(mUiModeManager).setNightModeActivatedForCustomMode( - eq(MODE_NIGHT_CUSTOM_TYPE_BEDTIME), eq(true)); + verify(mUiModeManager).setAttentionModeThemeOverlay(eq(MODE_ATTENTION_THEME_OVERLAY_NIGHT)); verify(mContext).unregisterReceiver(eq(screenOffReceiver)); } @@ -239,8 +261,7 @@ public class DefaultDeviceEffectsApplierTest { origin.value()); // Effect was applied, and no broadcast receiver was registered. - verify(mUiModeManager).setNightModeActivatedForCustomMode( - eq(MODE_NIGHT_CUSTOM_TYPE_BEDTIME), eq(true)); + verify(mUiModeManager).setAttentionModeThemeOverlay(eq(MODE_ATTENTION_THEME_OVERLAY_NIGHT)); verify(mContext, never()).registerReceiver(any(), any(), anyInt()); } @@ -256,8 +277,7 @@ public class DefaultDeviceEffectsApplierTest { origin.value()); // Effect was applied, and no broadcast receiver was registered. - verify(mUiModeManager).setNightModeActivatedForCustomMode( - eq(MODE_NIGHT_CUSTOM_TYPE_BEDTIME), eq(true)); + verify(mUiModeManager).setAttentionModeThemeOverlay(eq(MODE_ATTENTION_THEME_OVERLAY_NIGHT)); verify(mContext, never()).registerReceiver(any(), any(), anyInt()); } |