diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml index 6d731f8587b69..d4bb128120e9c 100644 --- a/packages/SystemUI/res/values/flags.xml +++ b/packages/SystemUI/res/values/flags.xml @@ -38,5 +38,8 @@ false + + false + false diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java index 7aa41e43be3cc..862c27907e0fe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java @@ -67,6 +67,10 @@ public class FeatureFlags { return mFlagReader.isEnabled(R.bool.flag_brightness_slider); } + public boolean useNewLockscreenAnimations() { + return mFlagReader.isEnabled(R.bool.flag_lockscreen_animations); + } + public boolean isPeopleTileEnabled() { return mFlagReader.isEnabled(R.bool.flag_conversations); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt index 2f0f90d318eb0..c1feacaba440f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt @@ -11,14 +11,10 @@ import android.graphics.PorterDuffColorFilter import android.graphics.PorterDuffXfermode import android.graphics.RadialGradient import android.graphics.Shader -import android.os.SystemProperties import android.util.AttributeSet import android.view.View import com.android.systemui.Interpolators -val enableLightReveal = - SystemProperties.getBoolean("persist.sysui.show_new_screen_on_transitions", false) - /** * Provides methods to modify the various properties of a [LightRevealScrim] to reveal between 0% to * 100% of the view(s) underneath the scrim. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index 8c2fa3349e4a8..85d8df8e60575 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -29,6 +29,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.doze.AlwaysOnDisplayPolicy; import com.android.systemui.doze.DozeScreenState; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.tuner.TunerService; @@ -54,6 +55,7 @@ public class DozeParameters implements TunerService.Tunable, private final AlwaysOnDisplayPolicy mAlwaysOnPolicy; private final Resources mResources; private final BatteryController mBatteryController; + private final FeatureFlags mFeatureFlags; private boolean mDozeAlwaysOn; private boolean mControlScreenOffAnimation; @@ -65,7 +67,8 @@ public class DozeParameters implements TunerService.Tunable, AlwaysOnDisplayPolicy alwaysOnDisplayPolicy, PowerManager powerManager, BatteryController batteryController, - TunerService tunerService) { + TunerService tunerService, + FeatureFlags featureFlags) { mResources = resources; mAmbientDisplayConfiguration = ambientDisplayConfiguration; mAlwaysOnPolicy = alwaysOnDisplayPolicy; @@ -74,6 +77,7 @@ public class DozeParameters implements TunerService.Tunable, mControlScreenOffAnimation = !getDisplayNeedsBlanking(); mPowerManager = powerManager; mPowerManager.setDozeAfterScreenOff(!mControlScreenOffAnimation); + mFeatureFlags = featureFlags; tunerService.addTunable( this, @@ -200,8 +204,7 @@ public class DozeParameters implements TunerService.Tunable, * then abruptly showing AOD. */ public boolean shouldControlUnlockedScreenOff() { - return getAlwaysOn() && SystemProperties.getBoolean( - "persist.sysui.show_new_screen_on_transitions", false); + return getAlwaysOn() && mFeatureFlags.useNewLockscreenAnimations(); } private boolean getBoolean(String propName, int resId) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index e63902f26a78f..041a97e1d4045 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -35,7 +35,6 @@ import static com.android.systemui.charging.WirelessChargingLayout.UNKNOWN_BATTE import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_AWAKE; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_WAKING; -import static com.android.systemui.statusbar.LightRevealScrimKt.getEnableLightReveal; import static com.android.systemui.statusbar.NotificationLockscreenUserManager.PERMISSION_SELF; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT; @@ -180,6 +179,7 @@ import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.BackDropView; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CrossFadeHelper; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.GestureRecorder; import com.android.systemui.statusbar.KeyboardShortcuts; import com.android.systemui.statusbar.KeyguardIndicationController; @@ -440,6 +440,7 @@ public class StatusBar extends SystemUI implements DemoMode, private final KeyguardViewMediator mKeyguardViewMediator; protected final NotificationInterruptStateProvider mNotificationInterruptStateProvider; private final BrightnessSlider.Factory mBrightnessSliderFactory; + private final FeatureFlags mFeatureFlags; private final List mExpansionChangedListeners; @@ -762,7 +763,8 @@ public class StatusBar extends SystemUI implements DemoMode, Lazy notificationShadeDepthControllerLazy, StatusBarTouchableRegionManager statusBarTouchableRegionManager, NotificationIconAreaController notificationIconAreaController, - BrightnessSlider.Factory brightnessSliderFactory) { + BrightnessSlider.Factory brightnessSliderFactory, + FeatureFlags featureFlags) { super(context); mNotificationsController = notificationsController; mLightBarController = lightBarController; @@ -840,6 +842,7 @@ public class StatusBar extends SystemUI implements DemoMode, mDemoModeController = demoModeController; mNotificationIconAreaController = notificationIconAreaController; mBrightnessSliderFactory = brightnessSliderFactory; + mFeatureFlags = featureFlags; mExpansionChangedListeners = new ArrayList<>(); @@ -1181,9 +1184,11 @@ public class StatusBar extends SystemUI implements DemoMode, mLightRevealScrim = mNotificationShadeWindowView.findViewById(R.id.light_reveal_scrim); - if (getEnableLightReveal()) { + if (mFeatureFlags.useNewLockscreenAnimations() && mDozeParameters.getAlwaysOn()) { mLightRevealScrim.setVisibility(View.VISIBLE); mLightRevealScrim.setRevealEffect(LiftReveal.INSTANCE); + } else { + mLightRevealScrim.setVisibility(View.GONE); } mNotificationPanelViewController.initDependencies( @@ -3614,7 +3619,7 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onDozeAmountChanged(float linear, float eased) { - if (getEnableLightReveal()) { + if (mFeatureFlags.useNewLockscreenAnimations()) { mLightRevealScrim.setRevealAmount(1f - linear); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java index 9e9533d0e1991..b572c57590ae5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java @@ -47,6 +47,7 @@ import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.settings.brightness.BrightnessSlider; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationMediaManager; @@ -200,7 +201,8 @@ public interface StatusBarPhoneModule { DismissCallbackRegistry dismissCallbackRegistry, StatusBarTouchableRegionManager statusBarTouchableRegionManager, NotificationIconAreaController notificationIconAreaController, - BrightnessSlider.Factory brightnessSliderFactory) { + BrightnessSlider.Factory brightnessSliderFactory, + FeatureFlags featureFlags) { return new StatusBar( context, notificationsController, @@ -279,6 +281,7 @@ public interface StatusBarPhoneModule { notificationShadeDepthController, statusBarTouchableRegionManager, notificationIconAreaController, - brightnessSliderFactory); + brightnessSliderFactory, + featureFlags); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java index 069699c271f75..6d8c372a061bc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java @@ -173,4 +173,30 @@ public class DozeUiTest extends SysuiTestCase { mDozeUi.transitionTo(UNINITIALIZED, DOZE); verify(mHost).setAnimateWakeup(eq(false)); } + + @Test + public void controlScreenOffTrueWhenKeyguardNotShowingAndControlUnlockedScreenOff() { + when(mDozeParameters.getAlwaysOn()).thenReturn(true); + when(mDozeParameters.shouldControlUnlockedScreenOff()).thenReturn(true); + + // Tell doze that keyguard is not visible. + mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(false /* showing */); + + // Since we're controlling the unlocked screen off animation, verify that we've asked to + // control the screen off animation despite being unlocked. + verify(mDozeParameters).setControlScreenOffAnimation(true); + } + + @Test + public void controlScreenOffFalseWhenKeyguardNotShowingAndControlUnlockedScreenOffFalse() { + when(mDozeParameters.getAlwaysOn()).thenReturn(true); + when(mDozeParameters.shouldControlUnlockedScreenOff()).thenReturn(false); + + // Tell doze that keyguard is not visible. + mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(false /* showing */); + + // Since we're not controlling the unlocked screen off animation, verify that we haven't + // asked to control the screen off animation since we're unlocked. + verify(mDozeParameters).setControlScreenOffAnimation(false); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index 00943bc53bfdd..b8c37fde2ce39 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -18,6 +18,8 @@ package com.android.systemui.keyguard; import static android.view.WindowManagerPolicyConstants.OFF_BECAUSE_OF_USER; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -27,13 +29,17 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.ActivityManager; +import android.app.ActivityTaskManager; import android.app.admin.DevicePolicyManager; import android.app.trust.TrustManager; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; +import android.view.View; +import com.android.systemui.R; import androidx.test.filters.SmallTest; import com.android.internal.widget.LockPatternUtils; @@ -45,6 +51,7 @@ import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.dump.DumpManager; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.statusbar.LightRevealScrim; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.util.DeviceConfigProxy; @@ -117,4 +124,20 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { mViewMediator.mViewMediatorCallback.keyguardGone(); verify(mStatusBarKeyguardViewManager).setKeyguardGoingAwayState(eq(false)); } + + @Test + public void testIsAnimatingScreenOff() { + when(mDozeParameters.shouldControlUnlockedScreenOff()).thenReturn(true); + + mViewMediator.onFinishedGoingToSleep(OFF_BECAUSE_OF_USER, false); + mViewMediator.setDozing(true); + + // Mid-doze, we should be animating the screen off animation. + mViewMediator.onDozeAmountChanged(0.5f, 0.5f); + assertTrue(mViewMediator.isAnimatingScreenOff()); + + // Once we're 100% dozed, the screen off animation should be completed. + mViewMediator.onDozeAmountChanged(1f, 1f); + assertFalse(mViewMediator.isAnimatingScreenOff()); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java index fa253e62ef0a8..421c6f4aab0b4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java @@ -18,6 +18,8 @@ package com.android.systemui.statusbar.phone; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.reset; @@ -35,6 +37,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; import com.android.systemui.doze.AlwaysOnDisplayPolicy; import com.android.systemui.doze.DozeScreenState; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.tuner.TunerService; @@ -57,6 +60,7 @@ public class DozeParametersTest extends SysuiTestCase { @Mock private PowerManager mPowerManager; @Mock private TunerService mTunerService; @Mock private BatteryController mBatteryController; + @Mock private FeatureFlags mFeatureFlags; @Before public void setup() { @@ -67,7 +71,8 @@ public class DozeParametersTest extends SysuiTestCase { mAlwaysOnDisplayPolicy, mPowerManager, mBatteryController, - mTunerService + mTunerService, + mFeatureFlags ); } @Test @@ -111,4 +116,37 @@ public class DozeParametersTest extends SysuiTestCase { assertThat(mDozeParameters.getAlwaysOn()).isFalse(); } + + @Test + public void testControlUnlockedScreenOffAnimation_dozeAfterScreenOff_false() { + when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true); + mDozeParameters.onTuningChanged(Settings.Secure.DOZE_ALWAYS_ON, "1"); + when(mFeatureFlags.useNewLockscreenAnimations()).thenReturn(true); + + assertTrue(mDozeParameters.shouldControlUnlockedScreenOff()); + + // Trigger the setter for the current value. + mDozeParameters.setControlScreenOffAnimation(mDozeParameters.shouldControlScreenOff()); + + // We should have asked power manager not to doze after screen off no matter what, since + // we're animating and controlling screen off. + verify(mPowerManager).setDozeAfterScreenOff(eq(false)); + } + + @Test + public void testControlUnlockedScreenOffAnimationDisabled_dozeAfterScreenOff() { + when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true); + mDozeParameters.onTuningChanged(Settings.Secure.DOZE_ALWAYS_ON, "1"); + when(mFeatureFlags.useNewLockscreenAnimations()).thenReturn(false); + + assertFalse(mDozeParameters.shouldControlUnlockedScreenOff()); + + // Trigger the setter for the current value. + mDozeParameters.setControlScreenOffAnimation(mDozeParameters.shouldControlScreenOff()); + + // We should have asked power manager to doze only if we're not controlling screen off + // normally. + verify(mPowerManager).setDozeAfterScreenOff( + eq(!mDozeParameters.shouldControlScreenOff())); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index cae488a561a20..253460db0d075 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -97,6 +97,7 @@ import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.settings.brightness.BrightnessSlider; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -258,6 +259,7 @@ public class StatusBarTest extends SysuiTestCase { @Mock private DemoModeController mDemoModeController; @Mock private Lazy mNotificationShadeDepthControllerLazy; @Mock private BrightnessSlider.Factory mBrightnessSliderFactory; + @Mock private FeatureFlags mFeatureFlags; private ShadeController mShadeController; private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock()); private InitController mInitController = new InitController(); @@ -418,7 +420,8 @@ public class StatusBarTest extends SysuiTestCase { mNotificationShadeDepthControllerLazy, mStatusBarTouchableRegionManager, mNotificationIconAreaController, - mBrightnessSliderFactory); + mBrightnessSliderFactory, + mFeatureFlags); when(mNotificationShadeWindowView.findViewById(R.id.lock_icon_container)).thenReturn( mLockIconContainer);