Don't blend front scrim on AOD

The scrim tint is always blended with the main color, as determined by
color extraction and the theme. For AOD, it should always fade to dark
and never be blended with a light color. This is most noticeable in
low light environments when the front scrim is animated and then
blended with white.

Fixes: 223592183
Test: atest ScrimControllerTest + manual (phone in low light,
transition to AOD)

Change-Id: I6b7b78b26bcbf63989580d2f46981d79bcc9a99b
This commit is contained in:
Matt Pietal
2022-05-13 08:43:11 -04:00
parent 1298166190
commit c60ff20ecb
4 changed files with 41 additions and 3 deletions

View File

@@ -58,6 +58,7 @@ public class ScrimView extends View {
private Drawable mDrawable;
private PorterDuffColorFilter mColorFilter;
private int mTintColor;
private boolean mBlendWithMainColor = true;
private Runnable mChangeRunnable;
private Executor mChangeRunnableExecutor;
private Executor mExecutor;
@@ -191,6 +192,19 @@ public class ScrimView extends View {
setTint(color, false);
}
/**
* The call to {@link #setTint} will blend with the main color, with the amount
* determined by the alpha of the tint. Set to false to avoid this blend.
*/
public void setBlendWithMainColor(boolean blend) {
mBlendWithMainColor = blend;
}
/** @return true if blending tint color with main color */
public boolean shouldBlendWithMainColor() {
return mBlendWithMainColor;
}
/**
* Tints this view, optionally animating it.
* @param color The color.
@@ -211,8 +225,11 @@ public class ScrimView extends View {
// Optimization to blend colors and avoid a color filter
ScrimDrawable drawable = (ScrimDrawable) mDrawable;
float tintAmount = Color.alpha(mTintColor) / 255f;
int mainTinted = ColorUtils.blendARGB(mColors.getMainColor(), mTintColor,
tintAmount);
int mainTinted = mTintColor;
if (mBlendWithMainColor) {
mainTinted = ColorUtils.blendARGB(mColors.getMainColor(), mTintColor, tintAmount);
}
drawable.setColor(mainTinted, animated);
} else {
boolean hasAlpha = Color.alpha(mTintColor) != 0;

View File

@@ -402,6 +402,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
mScrimBehind.setFocusable(!state.isLowPowerState());
mNotificationsScrim.setFocusable(!state.isLowPowerState());
mScrimInFront.setBlendWithMainColor(state.shouldBlendWithMainColor());
// Cancel blanking transitions that were pending before we requested a new state
if (mPendingFrameCallback != null) {
mScrimBehind.removeCallbacks(mPendingFrameCallback);

View File

@@ -203,6 +203,11 @@ public enum ScrimState {
public boolean isLowPowerState() {
return true;
}
@Override
public boolean shouldBlendWithMainColor() {
return false;
}
},
/**
@@ -325,6 +330,13 @@ public enum ScrimState {
public void prepare(ScrimState previousState) {
}
/**
* Whether a particular state should enable blending with extracted theme colors.
*/
public boolean shouldBlendWithMainColor() {
return true;
}
public float getFrontAlpha() {
return mFrontAlpha;
}
@@ -422,4 +434,4 @@ public enum ScrimState {
public void setClipQsScrim(boolean clipsQsScrim) {
mClipQsScrim = clipsQsScrim;
}
}
}

View File

@@ -1490,6 +1490,13 @@ public class ScrimControllerTest extends SysuiTestCase {
assertAlphaAfterExpansion(mNotificationsScrim, 0f, expansion);
}
@Test
public void aodStateSetsFrontScrimToNotBlend() {
mScrimController.transitionTo(ScrimState.AOD);
Assert.assertFalse("Front scrim should not blend with main color",
mScrimInFront.shouldBlendWithMainColor());
}
private void assertAlphaAfterExpansion(ScrimView scrim, float expectedAlpha, float expansion) {
mScrimController.setRawPanelExpansionFraction(expansion);
finishAnimationsImmediately();