[bc25] Do not make the scrim opaque when Dual Shade is open.
Flag: com.android.systemui.dual_shade
Fix: 344854041
Test: Manually by opening and closing the dual shade, and doing the same
in legacy mode to ensure existing behavior didn't break.
Test: Unit tests pass.
Change-Id: I7b71bf4e805f2f1426a28c71009e181439966f2e
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 9cece76..e4edfa4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -76,6 +76,7 @@
import com.android.systemui.scene.shared.model.Scenes;
import com.android.systemui.scrim.ScrimView;
import com.android.systemui.shade.ShadeViewController;
+import com.android.systemui.shade.shared.flag.DualShade;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
import com.android.systemui.statusbar.notification.stack.ViewState;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -87,6 +88,7 @@
import com.android.systemui.wallpapers.data.repository.WallpaperRepository;
import kotlinx.coroutines.CoroutineDispatcher;
+import kotlinx.coroutines.ExperimentalCoroutinesApi;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
@@ -101,6 +103,7 @@
* security method gets shown).
*/
@SysUISingleton
+@ExperimentalCoroutinesApi
public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dumpable,
CoreStartable {
@@ -999,7 +1002,7 @@
if (!mScreenOffAnimationController.shouldExpandNotifications()
&& !mAnimatingPanelExpansionOnUnlock
&& !occluding) {
- if (mTransparentScrimBackground) {
+ if (mTransparentScrimBackground || DualShade.isEnabled()) {
mBehindAlpha = 0;
mNotificationsAlpha = 0;
} else if (mClipsQsScrim) {
@@ -1051,7 +1054,12 @@
behindAlpha = 0f;
}
mInFrontAlpha = mState.getFrontAlpha();
- if (mClipsQsScrim) {
+ if (DualShade.isEnabled() && mState == ScrimState.SHADE_LOCKED) {
+ mBehindAlpha = 0;
+ mNotificationsTint = Color.TRANSPARENT;
+ mNotificationsAlpha = 0;
+ mBehindTint = Color.TRANSPARENT;
+ } else if (mClipsQsScrim) {
mNotificationsAlpha = behindAlpha;
mNotificationsTint = behindTint;
mBehindAlpha = 1;
@@ -1105,8 +1113,7 @@
}
private Pair<Integer, Float> calculateBackStateForState(ScrimState state) {
- // Either darken of make the scrim transparent when you
- // pull down the shade
+ // Either darken or make the scrim transparent when pulling down the shade.
float interpolatedFract = getInterpolatedFraction();
float stateBehind = mClipsQsScrim ? state.getNotifAlpha() : state.getBehindAlpha();
@@ -1201,11 +1208,7 @@
return true;
}
- if (mState == ScrimState.PULSING) {
- return true;
- }
-
- return false;
+ return mState == ScrimState.PULSING;
}
/**
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 4590071..73e3bf4 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
@@ -49,6 +49,8 @@
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Color;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;
import android.testing.ViewUtils;
import android.util.MathUtils;
@@ -65,6 +67,7 @@
import com.android.systemui.animation.ShadeInterpolation;
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants;
import com.android.systemui.dock.DockManager;
+import com.android.systemui.flags.EnableSceneContainer;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
@@ -75,7 +78,9 @@
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToGoneTransitionViewModel;
import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel;
import com.android.systemui.kosmos.KosmosJavaAdapter;
+import com.android.systemui.scene.shared.flag.SceneContainerFlag;
import com.android.systemui.scrim.ScrimView;
+import com.android.systemui.shade.shared.flag.DualShade;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
import com.android.systemui.shade.transition.LinearLargeScreenShadeInterpolator;
import com.android.systemui.statusbar.policy.FakeConfigurationController;
@@ -309,7 +314,11 @@
mWallpaperRepository.getWallpaperSupportsAmbientMode().setValue(false);
mTestScope.getTestScheduler().runCurrent();
- mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
+ if (SceneContainerFlag.isEnabled()) {
+ mScrimController.transitionTo(ScrimState.KEYGUARD);
+ } else {
+ mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
+ }
finishAnimationsImmediately();
}
@@ -358,6 +367,47 @@
}
@Test
+ @EnableSceneContainer
+ @DisableFlags(DualShade.FLAG_NAME)
+ public void transitionToShadeLocked_sceneContainer_dualShadeOff() {
+ mScrimController.transitionTo(SHADE_LOCKED);
+ mScrimController.setQsPosition(1f, 0);
+ finishAnimationsImmediately();
+
+ assertScrimAlpha(Map.of(
+ mNotificationsScrim, OPAQUE,
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, OPAQUE
+ ));
+
+ assertScrimTinted(Map.of(
+ mScrimInFront, false,
+ mScrimBehind, true
+ ));
+ }
+
+ @Test
+ @EnableSceneContainer
+ @EnableFlags(DualShade.FLAG_NAME)
+ public void transitionToShadeLocked_sceneContainer_dualShadeOn() {
+ mScrimController.transitionTo(SHADE_LOCKED);
+ mScrimController.setQsPosition(1f, 0);
+ finishAnimationsImmediately();
+
+ assertScrimAlpha(Map.of(
+ mNotificationsScrim, TRANSPARENT,
+ mScrimInFront, TRANSPARENT,
+ mScrimBehind, TRANSPARENT
+ ));
+
+ assertScrimTinted(Map.of(
+ mScrimInFront, false,
+ mNotificationsScrim, false,
+ mScrimBehind, false
+ ));
+ }
+
+ @Test
public void transitionToShadeLocked_clippingQs() {
mScrimController.setClipsQsScrim(true);
mScrimController.legacyTransitionTo(SHADE_LOCKED);
@@ -997,6 +1047,64 @@
}
@Test
+ @EnableSceneContainer
+ @DisableFlags(DualShade.FLAG_NAME)
+ public void transitionToUnlocked_sceneContainer_dualShadeOff() {
+ mScrimController.setRawPanelExpansionFraction(0f);
+ mScrimController.transitionTo(ScrimState.UNLOCKED);
+ finishAnimationsImmediately();
+
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mNotificationsScrim, TRANSPARENT,
+ mScrimBehind, TRANSPARENT
+ ));
+
+ mScrimController.setRawPanelExpansionFraction(0.5f);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mNotificationsScrim, SEMI_TRANSPARENT,
+ mScrimBehind, SEMI_TRANSPARENT
+ ));
+
+ mScrimController.setRawPanelExpansionFraction(1f);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mNotificationsScrim, OPAQUE,
+ mScrimBehind, OPAQUE
+ ));
+ }
+
+ @Test
+ @EnableSceneContainer
+ @EnableFlags(DualShade.FLAG_NAME)
+ public void transitionToUnlocked_sceneContainer_dualShadeOn() {
+ mScrimController.setRawPanelExpansionFraction(0f);
+ mScrimController.transitionTo(ScrimState.UNLOCKED);
+ finishAnimationsImmediately();
+
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mNotificationsScrim, TRANSPARENT,
+ mScrimBehind, TRANSPARENT
+ ));
+
+ mScrimController.setRawPanelExpansionFraction(0.5f);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mNotificationsScrim, TRANSPARENT,
+ mScrimBehind, TRANSPARENT
+ ));
+
+ mScrimController.setRawPanelExpansionFraction(1f);
+ assertScrimAlpha(Map.of(
+ mScrimInFront, TRANSPARENT,
+ mNotificationsScrim, TRANSPARENT,
+ mScrimBehind, TRANSPARENT
+ ));
+ }
+
+ @Test
public void transitionToUnlocked_nonClippedQs_followsLargeScreensInterpolator() {
mScrimController.setClipsQsScrim(false);
mScrimController.setRawPanelExpansionFraction(0f);
@@ -2086,7 +2194,7 @@
}
private void assertScrimTinted(Map<ScrimView, Boolean> scrimToTint) {
- scrimToTint.forEach((scrim, hasTint) -> assertScrimTint(scrim, hasTint));
+ scrimToTint.forEach(this::assertScrimTint);
}
private void assertScrimTint(ScrimView scrim, boolean hasTint) {
@@ -2123,7 +2231,7 @@
if (!scrimToAlpha.containsKey(mNotificationsScrim)) {
assertScrimAlpha(mNotificationsScrim, TRANSPARENT);
}
- scrimToAlpha.forEach((scrimView, alpha) -> assertScrimAlpha(scrimView, alpha));
+ scrimToAlpha.forEach(this::assertScrimAlpha);
// When clipping, QS scrim should not affect combined visibility.
if (mScrimController.getClipQsScrim() && scrimToAlpha.get(mScrimBehind) == OPAQUE) {