Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +12 −9 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag; 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; Loading @@ -87,6 +88,7 @@ import com.android.systemui.util.wakelock.WakeLock; 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; Loading @@ -101,6 +103,7 @@ import javax.inject.Inject; * security method gets shown). */ @SysUISingleton @ExperimentalCoroutinesApi public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dumpable, CoreStartable { Loading Loading @@ -999,7 +1002,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (!mScreenOffAnimationController.shouldExpandNotifications() && !mAnimatingPanelExpansionOnUnlock && !occluding) { if (mTransparentScrimBackground) { if (mTransparentScrimBackground || DualShade.isEnabled()) { mBehindAlpha = 0; mNotificationsAlpha = 0; } else if (mClipsQsScrim) { Loading Loading @@ -1051,7 +1054,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump 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; Loading Loading @@ -1105,8 +1113,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } 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(); Loading Loading @@ -1201,11 +1208,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump return true; } if (mState == ScrimState.PULSING) { return true; } return false; return mState == ScrimState.PULSING; } /** Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +111 −3 Original line number Diff line number Diff line Loading @@ -49,6 +49,8 @@ import android.content.Context; 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; Loading @@ -65,6 +67,7 @@ import com.android.systemui.SysuiTestCase; 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; Loading @@ -75,7 +78,9 @@ import com.android.systemui.keyguard.shared.model.TransitionStep; 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; Loading Loading @@ -309,7 +314,11 @@ public class ScrimControllerTest extends SysuiTestCase { mWallpaperRepository.getWallpaperSupportsAmbientMode().setValue(false); mTestScope.getTestScheduler().runCurrent(); if (SceneContainerFlag.isEnabled()) { mScrimController.transitionTo(ScrimState.KEYGUARD); } else { mScrimController.legacyTransitionTo(ScrimState.KEYGUARD); } finishAnimationsImmediately(); } Loading Loading @@ -357,6 +366,47 @@ public class ScrimControllerTest extends SysuiTestCase { )); } @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); Loading Loading @@ -996,6 +1046,64 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimBehind, OPAQUE)); } @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); Loading Loading @@ -2086,7 +2194,7 @@ public class ScrimControllerTest extends SysuiTestCase { } 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) { Loading Loading @@ -2123,7 +2231,7 @@ public class ScrimControllerTest extends SysuiTestCase { 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) { Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +12 −9 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag; 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; Loading @@ -87,6 +88,7 @@ import com.android.systemui.util.wakelock.WakeLock; 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; Loading @@ -101,6 +103,7 @@ import javax.inject.Inject; * security method gets shown). */ @SysUISingleton @ExperimentalCoroutinesApi public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dumpable, CoreStartable { Loading Loading @@ -999,7 +1002,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (!mScreenOffAnimationController.shouldExpandNotifications() && !mAnimatingPanelExpansionOnUnlock && !occluding) { if (mTransparentScrimBackground) { if (mTransparentScrimBackground || DualShade.isEnabled()) { mBehindAlpha = 0; mNotificationsAlpha = 0; } else if (mClipsQsScrim) { Loading Loading @@ -1051,7 +1054,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump 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; Loading Loading @@ -1105,8 +1113,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } 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(); Loading Loading @@ -1201,11 +1208,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump return true; } if (mState == ScrimState.PULSING) { return true; } return false; return mState == ScrimState.PULSING; } /** Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +111 −3 Original line number Diff line number Diff line Loading @@ -49,6 +49,8 @@ import android.content.Context; 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; Loading @@ -65,6 +67,7 @@ import com.android.systemui.SysuiTestCase; 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; Loading @@ -75,7 +78,9 @@ import com.android.systemui.keyguard.shared.model.TransitionStep; 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; Loading Loading @@ -309,7 +314,11 @@ public class ScrimControllerTest extends SysuiTestCase { mWallpaperRepository.getWallpaperSupportsAmbientMode().setValue(false); mTestScope.getTestScheduler().runCurrent(); if (SceneContainerFlag.isEnabled()) { mScrimController.transitionTo(ScrimState.KEYGUARD); } else { mScrimController.legacyTransitionTo(ScrimState.KEYGUARD); } finishAnimationsImmediately(); } Loading Loading @@ -357,6 +366,47 @@ public class ScrimControllerTest extends SysuiTestCase { )); } @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); Loading Loading @@ -996,6 +1046,64 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimBehind, OPAQUE)); } @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); Loading Loading @@ -2086,7 +2194,7 @@ public class ScrimControllerTest extends SysuiTestCase { } 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) { Loading Loading @@ -2123,7 +2231,7 @@ public class ScrimControllerTest extends SysuiTestCase { 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) { Loading