Merge "Fixing notifications background in split shade mode" into sc-dev am: d319fb0081 am: 7f6a36527e

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14389531

Change-Id: Ia0c6614006ce3d44e5ff9dadebe05b28a7244dd0
This commit is contained in:
Michał Brzeziński
2021-05-04 18:34:03 +00:00
committed by Automerger Merge Worker
2 changed files with 67 additions and 27 deletions

View File

@@ -163,7 +163,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
private final float mDefaultScrimAlpha; private final float mDefaultScrimAlpha;
// Assuming the shade is expanded during initialization // Assuming the shade is expanded during initialization
private float mExpansionFraction = 1f; private float mPanelExpansion = 1f;
private float mQsExpansion; private float mQsExpansion;
private boolean mQsBottomVisible; private boolean mQsBottomVisible;
@@ -487,8 +487,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
if (isNaN(fraction)) { if (isNaN(fraction)) {
throw new IllegalArgumentException("Fraction should not be NaN"); throw new IllegalArgumentException("Fraction should not be NaN");
} }
if (mExpansionFraction != fraction) { if (mPanelExpansion != fraction) {
mExpansionFraction = fraction; mPanelExpansion = fraction;
boolean relevantState = (mState == ScrimState.UNLOCKED boolean relevantState = (mState == ScrimState.UNLOCKED
|| mState == ScrimState.KEYGUARD || mState == ScrimState.KEYGUARD
@@ -641,7 +641,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
mBehindTint = Color.BLACK; mBehindTint = Color.BLACK;
} else { } else {
mBehindAlpha = backAlpha; mBehindAlpha = backAlpha;
if (mState == ScrimState.SHADE_LOCKED) {
// going from KEYGUARD to SHADE_LOCKED state
mNotificationsAlpha = getInterpolatedFraction();
} else {
mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion); mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion);
}
mBehindTint = backTint; mBehindTint = backTint;
} }
} }
@@ -805,7 +810,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
} }
private float getInterpolatedFraction() { private float getInterpolatedFraction() {
float frac = mExpansionFraction; float frac = mPanelExpansion;
// let's start this 20% of the way down the screen // let's start this 20% of the way down the screen
frac = frac * 1.2f - 0.2f; frac = frac * 1.2f - 0.2f;
if (frac <= 0) { if (frac <= 0) {
@@ -1165,7 +1170,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
pw.print(" mDefaultScrimAlpha="); pw.print(" mDefaultScrimAlpha=");
pw.println(mDefaultScrimAlpha); pw.println(mDefaultScrimAlpha);
pw.print(" mExpansionFraction="); pw.print(" mExpansionFraction=");
pw.println(mExpansionFraction); pw.println(mPanelExpansion);
} }
public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) { public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) {

View File

@@ -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.SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.ScrimController.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.any;
import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
@@ -165,7 +166,7 @@ public class ScrimControllerTest extends SysuiTestCase {
endAnimation(mScrimInFront); endAnimation(mScrimInFront);
endAnimation(mScrimForBubble); endAnimation(mScrimForBubble);
Assert.assertEquals("Animators did not finish", assertEquals("Animators did not finish",
mAnimatorListener.getNumStarts(), mAnimatorListener.getNumEnds()); mAnimatorListener.getNumStarts(), mAnimatorListener.getNumEnds());
} }
@@ -422,7 +423,7 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.transitionTo(ScrimState.AOD); mScrimController.transitionTo(ScrimState.AOD);
finishAnimationsImmediately(); finishAnimationsImmediately();
mScrimController.setAodFrontScrimAlpha(0.3f); 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); Assert.assertNotEquals(0.3f, mScrimInFront.getViewAlpha(), 0.001f);
} }
@@ -601,13 +602,13 @@ public class ScrimControllerTest extends SysuiTestCase {
)); ));
// Front scrim should be transparent // Front scrim should be transparent
Assert.assertEquals(ScrimController.TRANSPARENT, assertEquals(ScrimController.TRANSPARENT,
mScrimInFront.getViewAlpha(), 0.0f); mScrimInFront.getViewAlpha(), 0.0f);
// Back scrim should be visible // Back scrim should be visible
Assert.assertEquals(ScrimController.BUSY_SCRIM_ALPHA, assertEquals(ScrimController.BUSY_SCRIM_ALPHA,
mScrimBehind.getViewAlpha(), 0.0f); mScrimBehind.getViewAlpha(), 0.0f);
// Bubble scrim should be visible // Bubble scrim should be visible
Assert.assertEquals(ScrimController.BUBBLE_SCRIM_ALPHA, assertEquals(ScrimController.BUBBLE_SCRIM_ALPHA,
mScrimForBubble.getViewAlpha(), 0.0f); mScrimForBubble.getViewAlpha(), 0.0f);
} }
@@ -615,15 +616,15 @@ public class ScrimControllerTest extends SysuiTestCase {
public void scrimStateCallback() { public void scrimStateCallback() {
mScrimController.transitionTo(ScrimState.UNLOCKED); mScrimController.transitionTo(ScrimState.UNLOCKED);
finishAnimationsImmediately(); finishAnimationsImmediately();
Assert.assertEquals(mScrimState, ScrimState.UNLOCKED); assertEquals(mScrimState, ScrimState.UNLOCKED);
mScrimController.transitionTo(ScrimState.BOUNCER); mScrimController.transitionTo(ScrimState.BOUNCER);
finishAnimationsImmediately(); finishAnimationsImmediately();
Assert.assertEquals(mScrimState, ScrimState.BOUNCER); assertEquals(mScrimState, ScrimState.BOUNCER);
mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED); mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED);
finishAnimationsImmediately(); finishAnimationsImmediately();
Assert.assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED); assertEquals(mScrimState, ScrimState.BOUNCER_SCRIMMED);
} }
@Test @Test
@@ -638,13 +639,13 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.setPanelExpansion(1.0f); mScrimController.setPanelExpansion(1.0f);
finishAnimationsImmediately(); finishAnimationsImmediately();
Assert.assertEquals("Scrim alpha should change after setPanelExpansion", assertEquals("Scrim alpha should change after setPanelExpansion",
mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f); mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
mScrimController.setPanelExpansion(0f); mScrimController.setPanelExpansion(0f);
finishAnimationsImmediately(); finishAnimationsImmediately();
Assert.assertEquals("Scrim alpha should change after setPanelExpansion", assertEquals("Scrim alpha should change after setPanelExpansion",
mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f); mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
} }
@@ -698,7 +699,7 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.setExpansionAffectsAlpha(false); mScrimController.setExpansionAffectsAlpha(false);
mScrimController.setPanelExpansion(0.8f); mScrimController.setPanelExpansion(0.8f);
verifyZeroInteractions(mScrimBehind); 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); + "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f);
mScrimController.setExpansionAffectsAlpha(true); mScrimController.setExpansionAffectsAlpha(true);
@@ -801,9 +802,9 @@ public class ScrimControllerTest extends SysuiTestCase {
} }
}); });
finishAnimationsImmediately(); finishAnimationsImmediately();
Assert.assertEquals("onStart called in wrong order", 1, callOrder[0]); assertEquals("onStart called in wrong order", 1, callOrder[0]);
Assert.assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]); assertEquals("onDisplayBlanked called in wrong order", 2, callOrder[1]);
Assert.assertEquals("onFinished called in wrong order", 3, callOrder[2]); assertEquals("onFinished called in wrong order", 3, callOrder[2]);
} }
@Test @Test
@@ -911,7 +912,7 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.transitionTo(ScrimState.UNLOCKED); mScrimController.transitionTo(ScrimState.UNLOCKED);
finishAnimationsImmediately(); 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); expandedAlpha, mScrimBehind.getViewAlpha(), 0.01f);
} }
@@ -981,7 +982,7 @@ public class ScrimControllerTest extends SysuiTestCase {
} }
mScrimController.transitionTo(state); mScrimController.transitionTo(state);
finishAnimationsImmediately(); 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.getViewAlpha() != 0 && !eatsTouches.contains(state),
mScrimBehind.isClickable()); mScrimBehind.isClickable());
} }
@@ -1035,9 +1036,9 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.setQsPosition(0, 300); mScrimController.setQsPosition(0, 300);
finishAnimationsImmediately(); finishAnimationsImmediately();
Assert.assertEquals("Behind scrim should be opaque", assertEquals("Behind scrim should be opaque",
mScrimBehind.getViewAlpha(), 1, 0.0); mScrimBehind.getViewAlpha(), 1, 0.0);
Assert.assertEquals("Notifications scrim should be opaque", assertEquals("Notifications scrim should be opaque",
mNotificationsScrim.getViewAlpha(), 1, 0.0); mNotificationsScrim.getViewAlpha(), 1, 0.0);
} }
@@ -1093,6 +1094,40 @@ public class ScrimControllerTest extends SysuiTestCase {
mNotificationsScrim, TRANSPARENT)); 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<ScrimView, Boolean> scrimToTint) { private void assertScrimTinted(Map<ScrimView, Boolean> scrimToTint) {
scrimToTint.forEach((scrim, hasTint) -> assertScrimTint(scrim, hasTint)); 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() String message = "Tint test failed at state " + mScrimController.getState()
+ " with scrim: " + getScrimName(scrim) + " and tint: " + " with scrim: " + getScrimName(scrim) + " and tint: "
+ Integer.toHexString(scrim.getTint()); + Integer.toHexString(scrim.getTint());
Assert.assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT); assertEquals(message, hasTint, scrim.getTint() != Color.TRANSPARENT);
} }
private String getScrimName(ScrimView scrim) { private String getScrimName(ScrimView scrim) {
@@ -1146,13 +1181,13 @@ public class ScrimControllerTest extends SysuiTestCase {
} else { } else {
visibility = TRANSPARENT; visibility = TRANSPARENT;
} }
Assert.assertEquals("Invalid visibility.", assertEquals("Invalid visibility.",
visibility /* expected */, visibility /* expected */,
mScrimVisibility); mScrimVisibility);
} }
private void assertScrimAlpha(ScrimView scrim, int expectedAlpha) { private void assertScrimAlpha(ScrimView scrim, int expectedAlpha) {
Assert.assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: " assertEquals("Unexpected " + getScrimName(scrim) + " scrim alpha: "
+ scrim.getViewAlpha(), + scrim.getViewAlpha(),
expectedAlpha != TRANSPARENT /* expected */, expectedAlpha != TRANSPARENT /* expected */,
scrim.getViewAlpha() > TRANSPARENT /* actual */); scrim.getViewAlpha() > TRANSPARENT /* actual */);