From aaf780263a258cf013e22d268c309a3603c1d52f Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Fri, 30 Apr 2021 18:15:40 +0000 Subject: [PATCH] Fixing notifications background in split shade mode Notification background was not showing up when going from lockscreen to shade directly with swipe down. ScrimState is changed then and only in SHADE_LOCKED notification scrim alpha should depend on interpolated fraction Fixes: 186864180 Test: manual Change-Id: I75468a92a6d0dd27c32b2eb5c5b0f90e48a4ff67 --- .../statusbar/phone/ScrimController.java | 17 ++-- .../statusbar/phone/ScrimControllerTest.java | 77 ++++++++++++++----- 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index c09293115492c..a952db2a60733 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -163,7 +163,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private final float mDefaultScrimAlpha; // Assuming the shade is expanded during initialization - private float mExpansionFraction = 1f; + private float mPanelExpansion = 1f; private float mQsExpansion; private boolean mQsBottomVisible; @@ -487,8 +487,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (isNaN(fraction)) { throw new IllegalArgumentException("Fraction should not be NaN"); } - if (mExpansionFraction != fraction) { - mExpansionFraction = fraction; + if (mPanelExpansion != fraction) { + mPanelExpansion = fraction; boolean relevantState = (mState == ScrimState.UNLOCKED || mState == ScrimState.KEYGUARD @@ -641,7 +641,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mBehindTint = Color.BLACK; } else { mBehindAlpha = backAlpha; - mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion); + if (mState == ScrimState.SHADE_LOCKED) { + // going from KEYGUARD to SHADE_LOCKED state + mNotificationsAlpha = getInterpolatedFraction(); + } else { + mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion); + } mBehindTint = backTint; } } @@ -805,7 +810,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } private float getInterpolatedFraction() { - float frac = mExpansionFraction; + float frac = mPanelExpansion; // let's start this 20% of the way down the screen frac = frac * 1.2f - 0.2f; if (frac <= 0) { @@ -1165,7 +1170,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump pw.print(" mDefaultScrimAlpha="); pw.println(mDefaultScrimAlpha); pw.print(" mExpansionFraction="); - pw.println(mExpansionFraction); + pw.println(mPanelExpansion); } public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index b6eb4923ee4ab..f98f00cd91879 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -20,6 +20,7 @@ import static com.android.systemui.statusbar.phone.ScrimController.OPAQUE; import static com.android.systemui.statusbar.phone.ScrimController.SEMI_TRANSPARENT; import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT; +import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; @@ -165,7 +166,7 @@ public class ScrimControllerTest extends SysuiTestCase { endAnimation(mScrimInFront); endAnimation(mScrimForBubble); - Assert.assertEquals("Animators did not finish", + assertEquals("Animators did not finish", mAnimatorListener.getNumStarts(), mAnimatorListener.getNumEnds()); } @@ -422,7 +423,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.transitionTo(ScrimState.AOD); finishAnimationsImmediately(); mScrimController.setAodFrontScrimAlpha(0.3f); - Assert.assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f); + assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f); Assert.assertNotEquals(0.3f, mScrimInFront.getViewAlpha(), 0.001f); } @@ -601,13 +602,13 @@ public class ScrimControllerTest extends SysuiTestCase { )); // Front scrim should be transparent - Assert.assertEquals(ScrimController.TRANSPARENT, + assertEquals(ScrimController.TRANSPARENT, mScrimInFront.getViewAlpha(), 0.0f); // Back scrim should be visible - Assert.assertEquals(ScrimController.BUSY_SCRIM_ALPHA, + assertEquals(ScrimController.BUSY_SCRIM_ALPHA, mScrimBehind.getViewAlpha(), 0.0f); // Bubble scrim should be visible - Assert.assertEquals(ScrimController.BUBBLE_SCRIM_ALPHA, + assertEquals(ScrimController.BUBBLE_SCRIM_ALPHA, mScrimForBubble.getViewAlpha(), 0.0f); } @@ -615,15 +616,15 @@ public class ScrimControllerTest extends SysuiTestCase { public void scrimStateCallback() { mScrimController.transitionTo(ScrimState.UNLOCKED); finishAnimationsImmediately(); - Assert.assertEquals(mScrimState, ScrimState.UNLOCKED); + assertEquals(mScrimState, ScrimState.UNLOCKED); mScrimController.transitionTo(ScrimState.BOUNCER); finishAnimationsImmediately(); - Assert.assertEquals(mScrimState, ScrimState.BOUNCER); + assertEquals(mScrimState, ScrimState.BOUNCER); mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED); finishAnimationsImmediately(); - Assert.assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED); + assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED); } @Test @@ -638,13 +639,13 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setPanelExpansion(1.0f); finishAnimationsImmediately(); - Assert.assertEquals("Scrim alpha should change after setPanelExpansion", + assertEquals("Scrim alpha should change after setPanelExpansion", mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f); mScrimController.setPanelExpansion(0f); finishAnimationsImmediately(); - Assert.assertEquals("Scrim alpha should change after setPanelExpansion", + assertEquals("Scrim alpha should change after setPanelExpansion", mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f); } @@ -698,7 +699,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setExpansionAffectsAlpha(false); mScrimController.setPanelExpansion(0.8f); verifyZeroInteractions(mScrimBehind); - Assert.assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha " + assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha " + "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f); mScrimController.setExpansionAffectsAlpha(true); @@ -801,9 +802,9 @@ public class ScrimControllerTest extends SysuiTestCase { } }); finishAnimationsImmediately(); - Assert.assertEquals("onStart called in wrong order", 1, callOrder[0]); - Assert.assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]); - Assert.assertEquals("onFinished called in wrong order", 3, callOrder[2]); + assertEquals("onStart called in wrong order", 1, callOrder[0]); + assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]); + assertEquals("onFinished called in wrong order", 3, callOrder[2]); } @Test @@ -911,7 +912,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.transitionTo(ScrimState.UNLOCKED); finishAnimationsImmediately(); - Assert.assertEquals("Scrim expansion opacity wasn't conserved when transitioning back", + assertEquals("Scrim expansion opacity wasn't conserved when transitioning back", expandedAlpha, mScrimBehind.getViewAlpha(), 0.01f); } @@ -981,7 +982,7 @@ public class ScrimControllerTest extends SysuiTestCase { } mScrimController.transitionTo(state); finishAnimationsImmediately(); - Assert.assertEquals("Should be clickable unless AOD or PULSING, was: " + state, + assertEquals("Should be clickable unless AOD or PULSING, was: " + state, mScrimBehind.getViewAlpha() != 0 && !eatsTouches.contains(state), mScrimBehind.isClickable()); } @@ -1035,9 +1036,9 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setQsPosition(0, 300); finishAnimationsImmediately(); - Assert.assertEquals("Behind scrim should be opaque", + assertEquals("Behind scrim should be opaque", mScrimBehind.getViewAlpha(), 1, 0.0); - Assert.assertEquals("Notifications scrim should be opaque", + assertEquals("Notifications scrim should be opaque", mNotificationsScrim.getViewAlpha(), 1, 0.0); } @@ -1093,6 +1094,40 @@ public class ScrimControllerTest extends SysuiTestCase { mNotificationsScrim, TRANSPARENT)); } + @Test + public void testNotificationScrimVisible_afterOpeningShadeFromLockscreen() { + mScrimController.setPanelExpansion(1); + mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + finishAnimationsImmediately(); + + assertScrimAlpha(Map.of( + mScrimBehind, OPAQUE, + mNotificationsScrim, OPAQUE)); + } + + @Test + public void testNotificationTransparency_followsPanelExpansionInShadeLockedState() { + mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.8f, /* expansion */ 0.8f); + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.2f); + } + + @Test + public void testNotificationTransparency_inKeyguardState() { + mScrimController.transitionTo(ScrimState.KEYGUARD); + + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.8f); + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.8f, /* expansion */ 0.2f); + } + + private void assertAlphaAfterExpansion(ScrimView scrim, float expectedAlpha, float expansion) { + mScrimController.setPanelExpansion(expansion); + finishAnimationsImmediately(); + // alpha is not changing linearly thus 0.2 of leeway when asserting + assertEquals(expectedAlpha, mNotificationsScrim.getViewAlpha(), 0.2); + } + private void assertScrimTinted(Map scrimToTint) { scrimToTint.forEach((scrim, hasTint) -> assertScrimTint(scrim, hasTint)); } @@ -1101,7 +1136,7 @@ public class ScrimControllerTest extends SysuiTestCase { String message = "Tint test failed at state " + mScrimController.getState() + " with scrim: " + getScrimName(scrim) + " and tint: " + Integer.toHexString(scrim.getTint()); - Assert.assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT); + assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT); } private String getScrimName(ScrimView scrim) { @@ -1146,13 +1181,13 @@ public class ScrimControllerTest extends SysuiTestCase { } else { visibility = TRANSPARENT; } - Assert.assertEquals("Invalid visibility.", + assertEquals("Invalid visibility.", visibility /* expected */, mScrimVisibility); } private void assertScrimAlpha(ScrimView scrim, int expectedAlpha) { - Assert.assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: " + assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: " + scrim.getViewAlpha(), expectedAlpha != TRANSPARENT /* expected */, scrim.getViewAlpha() > TRANSPARENT /* actual */);