diff options
7 files changed, 79 insertions, 19 deletions
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index d14840317197..cff4ffd2d7b4 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -561,6 +561,9 @@ <!-- The height of the gap between adjacent notification sections. --> <dimen name="notification_section_divider_height">@dimen/notification_side_paddings</dimen> + <!-- The height of the gap between adjacent notification sections on lockscreen. --> + <dimen name="notification_section_divider_height_lockscreen">4dp</dimen> + <!-- Size of the face pile shown on one-line (children of a group) conversation notifications --> <dimen name="conversation_single_line_face_pile_size">24dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 633786ffa787..afce945a5bc5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -85,9 +85,6 @@ public class NotificationShelf extends ActivatableNotificationView implements private NotificationShelfController mController; private float mActualWidth = -1; - /** Fraction of lockscreen to shade animation (on lockscreen swipe down). */ - private float mFractionToShade; - public NotificationShelf(Context context, AttributeSet attrs) { super(context, attrs); } @@ -234,13 +231,6 @@ public class NotificationShelf extends ActivatableNotificationView implements } /** - * @param fractionToShade Fraction of lockscreen to shade transition - */ - public void setFractionToShade(float fractionToShade) { - mFractionToShade = fractionToShade; - } - - /** * @return Actual width of shelf, accounting for possible ongoing width animation */ public int getActualWidth() { @@ -411,7 +401,8 @@ public class NotificationShelf extends ActivatableNotificationView implements || !mShowNotificationShelf || numViewsInShelf < 1f; - final float fractionToShade = Interpolators.STANDARD.getInterpolation(mFractionToShade); + final float fractionToShade = Interpolators.STANDARD.getInterpolation( + mAmbientState.getFractionToShade()); final float shortestWidth = mShelfIcons.calculateWidthFor(numViewsInShelf); updateActualWidth(fractionToShade, shortestWidth); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index 2f1022a904e8..ec770d8a1497 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -77,6 +77,23 @@ public class AmbientState { private boolean mAppearing; private float mPulseHeight = MAX_PULSE_HEIGHT; + /** Fraction of lockscreen to shade animation (on lockscreen swipe down). */ + private float mFractionToShade; + + /** + * @param fractionToShade Fraction of lockscreen to shade transition + */ + public void setFractionToShade(float fractionToShade) { + mFractionToShade = fractionToShade; + } + + /** + * @return fractionToShade Fraction of lockscreen to shade transition + */ + public float getFractionToShade() { + return mFractionToShade; + } + /** How we much we are sleeping. 1f fully dozing (AOD), 0f fully awake (for all other states) */ private float mDozeAmount = 0.0f; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index b52fd6107701..851794c0440e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -2295,7 +2295,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable int visibleIndex ) { return mStackScrollAlgorithm.getGapHeightForChild(mSectionsManager, visibleIndex, current, - previous); + previous, mAmbientState.getFractionToShade(), mAmbientState.isOnKeyguard()); } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) @@ -5501,7 +5501,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable * where it remains until the next lockscreen-to-shade transition. */ public void setFractionToShade(float fraction) { - mShelf.setFractionToShade(fraction); + mAmbientState.setFractionToShade(fraction); requestChildrenUpdate(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index c0971337a19f..17844fff67ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -53,6 +53,7 @@ public class StackScrollAlgorithm { private int mPaddingBetweenElements; private int mGapHeight; + private int mGapHeightOnLockscreen; private int mCollapsedSize; private StackScrollAlgorithmState mTempAlgorithmState = new StackScrollAlgorithmState(); @@ -86,6 +87,8 @@ public class StackScrollAlgorithm { mPinnedZTranslationExtra = res.getDimensionPixelSize( R.dimen.heads_up_pinned_elevation); mGapHeight = res.getDimensionPixelSize(R.dimen.notification_section_divider_height); + mGapHeightOnLockscreen = res.getDimensionPixelSize( + R.dimen.notification_section_divider_height_lockscreen); mNotificationScrimPadding = res.getDimensionPixelSize(R.dimen.notification_side_paddings); mMarginBottom = res.getDimensionPixelSize(R.dimen.notification_panel_margin_bottom); } @@ -304,7 +307,8 @@ public class StackScrollAlgorithm { ambientState.getSectionProvider(), i, view, getPreviousView(i, state)); if (applyGapHeight) { - currentY += mGapHeight; + currentY += getGapForLocation( + ambientState.getFractionToShade(), ambientState.isOnKeyguard()); } if (ambientState.getShelf() != null) { @@ -451,8 +455,10 @@ public class StackScrollAlgorithm { ambientState.getSectionProvider(), i, view, getPreviousView(i, algorithmState)); if (applyGapHeight) { - algorithmState.mCurrentYPosition += expansionFraction * mGapHeight; - algorithmState.mCurrentExpandedYPosition += mGapHeight; + final float gap = getGapForLocation( + ambientState.getFractionToShade(), ambientState.isOnKeyguard()); + algorithmState.mCurrentYPosition += expansionFraction * gap; + algorithmState.mCurrentExpandedYPosition += gap; } viewState.yTranslation = algorithmState.mCurrentYPosition; @@ -536,16 +542,29 @@ public class StackScrollAlgorithm { SectionProvider sectionProvider, int visibleIndex, View child, - View previousChild) { + View previousChild, + float fractionToShade, + boolean onKeyguard) { if (childNeedsGapHeight(sectionProvider, visibleIndex, child, previousChild)) { - return mGapHeight; + return getGapForLocation(fractionToShade, onKeyguard); } else { return 0; } } + @VisibleForTesting + float getGapForLocation(float fractionToShade, boolean onKeyguard) { + if (fractionToShade > 0f) { + return MathUtils.lerp(mGapHeightOnLockscreen, mGapHeight, fractionToShade); + } + if (onKeyguard) { + return mGapHeightOnLockscreen; + } + return mGapHeight; + } + /** * Does a given child need a gap, i.e spacing before a view? * diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt index 5d160366b27d..4270d72770dc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt @@ -144,7 +144,7 @@ class NotificationShelfTest : SysuiTestCase() { } private fun setFractionToShade(fraction: Float) { - shelf.setFractionToShade(fraction) + whenever(ambientState.fractionToShade).thenReturn(fraction) } private fun setOnLockscreen(isOnLockscreen: Boolean) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt index 1da9bbcdb836..f864fb0281f8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt @@ -1,5 +1,6 @@ package com.android.systemui.statusbar.notification.stack +import android.annotation.DimenRes import android.widget.FrameLayout import androidx.test.filters.SmallTest import com.android.systemui.R @@ -26,6 +27,14 @@ class StackScrollAlgorithmTest : SysuiTestCase() { SectionProvider { _, _ -> false }, BypassController { false }) + private val testableResources = mContext.orCreateTestableResources + + private fun px(@DimenRes id: Int): Float = + testableResources.resources.getDimensionPixelSize(id).toFloat() + + private val bigGap = px(R.dimen.notification_section_divider_height) + private val smallGap = px(R.dimen.notification_section_divider_height_lockscreen) + @Before fun setUp() { whenever(notificationRow.viewState).thenReturn(expandableViewState) @@ -75,4 +84,25 @@ class StackScrollAlgorithmTest : SysuiTestCase() { val centeredY = ambientState.stackY + fullHeight / 2f - emptyShadeView.height / 2f assertThat(emptyShadeView.viewState?.yTranslation).isEqualTo(centeredY) } + + @Test + fun getGapForLocation_onLockscreen_returnsSmallGap() { + val gap = stackScrollAlgorithm.getGapForLocation( + /* fractionToShade= */ 0f, /* onKeyguard= */ true) + assertThat(gap).isEqualTo(smallGap) + } + + @Test + fun getGapForLocation_goingToShade_interpolatesGap() { + val gap = stackScrollAlgorithm.getGapForLocation( + /* fractionToShade= */ 0.5f, /* onKeyguard= */ true) + assertThat(gap).isEqualTo(smallGap * 0.5f + bigGap * 0.5f) + } + + @Test + fun getGapForLocation_notOnLockscreen_returnsBigGap() { + val gap = stackScrollAlgorithm.getGapForLocation( + /* fractionToShade= */ 0f, /* onKeyguard= */ false) + assertThat(gap).isEqualTo(bigGap) + } } |