Loading packages/SystemUI/src/com/android/systemui/scrim/ScrimDrawable.java +4 −1 Original line number Diff line number Diff line Loading @@ -203,7 +203,10 @@ public class ScrimDrawable extends Drawable { } public void setBottomEdgeRadius(float radius) { if (mBottomEdgeRadius != radius) { mBottomEdgeRadius = radius; invalidateSelf(); } } @Override Loading packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +1 −0 Original line number Diff line number Diff line Loading @@ -2206,6 +2206,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump // TODO: non-linearly transform progress fraction into squish amount (ease-in, linear out) mCurrentBackProgress = progressFraction; applyBackScaling(progressFraction); mQsController.setClippingBounds(); } /** Resets back progress. */ Loading packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +29 −2 Original line number Diff line number Diff line Loading @@ -114,6 +114,8 @@ import javax.inject.Inject; public class QuickSettingsController implements Dumpable { public static final String TAG = "QuickSettingsController"; public static final int SHADE_BACK_ANIM_SCALE_MULTIPLIER = 100; private QS mQs; private final Lazy<NotificationPanelViewController> mPanelViewControllerLazy; Loading Loading @@ -1128,7 +1130,7 @@ public class QuickSettingsController implements Dumpable { * Updates scrim bounds, QS clipping, notifications clipping and keyguard status view clipping * as well based on the bounds of the shade and QS state. */ private void setClippingBounds() { void setClippingBounds() { float qsExpansionFraction = computeExpansionFraction(); final int qsPanelBottomY = calculateBottomPosition(qsExpansionFraction); // Split shade has no QQS Loading Loading @@ -1216,7 +1218,10 @@ public class QuickSettingsController implements Dumpable { ? 0 : mScreenCornerRadius; radius = (int) MathUtils.lerp(screenCornerRadius, mScrimCornerRadius, Math.min(top / (float) mScrimCornerRadius, 1f)); mScrimController.setNotificationBottomRadius(radius); float bottomRadius = mExpanded ? screenCornerRadius : calculateBottomCornerRadius(screenCornerRadius); mScrimController.setNotificationBottomRadius(bottomRadius); } if (isQsFragmentCreated()) { float qsTranslation = 0; Loading Loading @@ -1279,6 +1284,28 @@ public class QuickSettingsController implements Dumpable { nsslLeft, nsslTop, nsslRight, nsslBottom, topRadius, bottomRadius); } /** * Bottom corner radius should follow screen corner radius unless * predictive back is running. We want a smooth transition from screen * corner radius to scrim corner radius as the notification scrim is scaled down, * but the transition should be brief enough to accommodate very short back gestures. */ @VisibleForTesting int calculateBottomCornerRadius(float screenCornerRadius) { return (int) MathUtils.lerp(screenCornerRadius, mScrimCornerRadius, Math.min(calculateBottomRadiusProgress(), 1f)); } @VisibleForTesting float calculateBottomRadiusProgress() { return (1 - mScrimController.getBackScaling()) * SHADE_BACK_ANIM_SCALE_MULTIPLIER; } @VisibleForTesting int getScrimCornerRadius() { return mScrimCornerRadius; } void setDisplayInsets(int leftInset, int rightInset) { mDisplayLeftInset = leftInset; mDisplayRightInset = rightInset; Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +4 −0 Original line number Diff line number Diff line Loading @@ -602,6 +602,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mNotificationsScrim.setScaleY(scale); } public float getBackScaling() { return mNotificationsScrim.getScaleY(); } public void onTrackingStarted() { mDarkenWhileDragging = !mKeyguardStateController.canDismissLockScreen(); if (!mKeyguardUnlockAnimationController.isPlayingCannedUnlockAnimation()) { Loading packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java +24 −0 Original line number Diff line number Diff line Loading @@ -580,6 +580,30 @@ public class QuickSettingsControllerTest extends SysuiTestCase { verify(mQs).setQsVisible(true); } @Test public void calculateBottomCornerRadius_scrimScaleMax() { when(mScrimController.getBackScaling()).thenReturn(1.0f); assertThat(mQsController.calculateBottomCornerRadius(0.0f)).isEqualTo(0); } @Test public void calculateBottomCornerRadius_scrimScaleMin() { when(mScrimController.getBackScaling()) .thenReturn(mNotificationPanelViewController.SHADE_BACK_ANIM_MIN_SCALE); assertThat(mQsController.calculateBottomCornerRadius(0.0f)) .isEqualTo(mQsController.getScrimCornerRadius()); } @Test public void calculateBottomCornerRadius_scrimScaleCutoff() { float ratio = 1 / mQsController.calculateBottomRadiusProgress(); float cutoffScale = 1 - mNotificationPanelViewController.SHADE_BACK_ANIM_MIN_SCALE / ratio; when(mScrimController.getBackScaling()) .thenReturn(cutoffScale); assertThat(mQsController.calculateBottomCornerRadius(0.0f)) .isEqualTo(mQsController.getScrimCornerRadius()); } private void lockScreen() { mQsController.setBarState(KEYGUARD); } Loading Loading
packages/SystemUI/src/com/android/systemui/scrim/ScrimDrawable.java +4 −1 Original line number Diff line number Diff line Loading @@ -203,7 +203,10 @@ public class ScrimDrawable extends Drawable { } public void setBottomEdgeRadius(float radius) { if (mBottomEdgeRadius != radius) { mBottomEdgeRadius = radius; invalidateSelf(); } } @Override Loading
packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +1 −0 Original line number Diff line number Diff line Loading @@ -2206,6 +2206,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump // TODO: non-linearly transform progress fraction into squish amount (ease-in, linear out) mCurrentBackProgress = progressFraction; applyBackScaling(progressFraction); mQsController.setClippingBounds(); } /** Resets back progress. */ Loading
packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +29 −2 Original line number Diff line number Diff line Loading @@ -114,6 +114,8 @@ import javax.inject.Inject; public class QuickSettingsController implements Dumpable { public static final String TAG = "QuickSettingsController"; public static final int SHADE_BACK_ANIM_SCALE_MULTIPLIER = 100; private QS mQs; private final Lazy<NotificationPanelViewController> mPanelViewControllerLazy; Loading Loading @@ -1128,7 +1130,7 @@ public class QuickSettingsController implements Dumpable { * Updates scrim bounds, QS clipping, notifications clipping and keyguard status view clipping * as well based on the bounds of the shade and QS state. */ private void setClippingBounds() { void setClippingBounds() { float qsExpansionFraction = computeExpansionFraction(); final int qsPanelBottomY = calculateBottomPosition(qsExpansionFraction); // Split shade has no QQS Loading Loading @@ -1216,7 +1218,10 @@ public class QuickSettingsController implements Dumpable { ? 0 : mScreenCornerRadius; radius = (int) MathUtils.lerp(screenCornerRadius, mScrimCornerRadius, Math.min(top / (float) mScrimCornerRadius, 1f)); mScrimController.setNotificationBottomRadius(radius); float bottomRadius = mExpanded ? screenCornerRadius : calculateBottomCornerRadius(screenCornerRadius); mScrimController.setNotificationBottomRadius(bottomRadius); } if (isQsFragmentCreated()) { float qsTranslation = 0; Loading Loading @@ -1279,6 +1284,28 @@ public class QuickSettingsController implements Dumpable { nsslLeft, nsslTop, nsslRight, nsslBottom, topRadius, bottomRadius); } /** * Bottom corner radius should follow screen corner radius unless * predictive back is running. We want a smooth transition from screen * corner radius to scrim corner radius as the notification scrim is scaled down, * but the transition should be brief enough to accommodate very short back gestures. */ @VisibleForTesting int calculateBottomCornerRadius(float screenCornerRadius) { return (int) MathUtils.lerp(screenCornerRadius, mScrimCornerRadius, Math.min(calculateBottomRadiusProgress(), 1f)); } @VisibleForTesting float calculateBottomRadiusProgress() { return (1 - mScrimController.getBackScaling()) * SHADE_BACK_ANIM_SCALE_MULTIPLIER; } @VisibleForTesting int getScrimCornerRadius() { return mScrimCornerRadius; } void setDisplayInsets(int leftInset, int rightInset) { mDisplayLeftInset = leftInset; mDisplayRightInset = rightInset; Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +4 −0 Original line number Diff line number Diff line Loading @@ -602,6 +602,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mNotificationsScrim.setScaleY(scale); } public float getBackScaling() { return mNotificationsScrim.getScaleY(); } public void onTrackingStarted() { mDarkenWhileDragging = !mKeyguardStateController.canDismissLockScreen(); if (!mKeyguardUnlockAnimationController.isPlayingCannedUnlockAnimation()) { Loading
packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java +24 −0 Original line number Diff line number Diff line Loading @@ -580,6 +580,30 @@ public class QuickSettingsControllerTest extends SysuiTestCase { verify(mQs).setQsVisible(true); } @Test public void calculateBottomCornerRadius_scrimScaleMax() { when(mScrimController.getBackScaling()).thenReturn(1.0f); assertThat(mQsController.calculateBottomCornerRadius(0.0f)).isEqualTo(0); } @Test public void calculateBottomCornerRadius_scrimScaleMin() { when(mScrimController.getBackScaling()) .thenReturn(mNotificationPanelViewController.SHADE_BACK_ANIM_MIN_SCALE); assertThat(mQsController.calculateBottomCornerRadius(0.0f)) .isEqualTo(mQsController.getScrimCornerRadius()); } @Test public void calculateBottomCornerRadius_scrimScaleCutoff() { float ratio = 1 / mQsController.calculateBottomRadiusProgress(); float cutoffScale = 1 - mNotificationPanelViewController.SHADE_BACK_ANIM_MIN_SCALE / ratio; when(mScrimController.getBackScaling()) .thenReturn(cutoffScale); assertThat(mQsController.calculateBottomCornerRadius(0.0f)) .isEqualTo(mQsController.getScrimCornerRadius()); } private void lockScreen() { mQsController.setBarState(KEYGUARD); } Loading