From 9e153664ad64071af67ff4106dd8b5c05f42c12a Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 4 Nov 2021 16:53:30 -0700 Subject: [PATCH] Fix 2 finger pull down animation In order to animate smoothly when going directly to QS, and skipping QQS, we need to propagate the squishiness amount to the paged tile layout. Test: pull down shade, on split screen, landscape, portrait Test: pull down QS, scroll through pages Test: pull down shade with 2 fingers Test: atest QSSquishinessControllerTest Fixes: 204916761 Change-Id: I249e49a7b6c6ce1e9b6da28ab80ead771b962edc --- .../android/systemui/qs/PagedTileLayout.java | 5 ++++- .../systemui/qs/QSSquishinessController.kt | 13 ++----------- .../src/com/android/systemui/qs/TileLayout.java | 7 +++++++ .../phone/NotificationPanelViewController.java | 4 +++- .../systemui/qs/QSSquishinessControllerTest.kt | 17 ++++++----------- 5 files changed, 22 insertions(+), 24 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index 1784f73e1f531..cdf770f80387e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -178,7 +178,10 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { @Override public void setSquishinessFraction(float squishinessFraction) { - // No-op, paged layouts are not squishy. + int nPages = mPages.size(); + for (int i = 0; i < nPages; i++) { + mPages.get(i).setSquishinessFraction(squishinessFraction); + } } private void updateListening() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSquishinessController.kt b/packages/SystemUI/src/com/android/systemui/qs/QSSquishinessController.kt index 4854600994aa2..c1c146d40e383 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSSquishinessController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/QSSquishinessController.kt @@ -3,15 +3,14 @@ package com.android.systemui.qs import android.view.ViewGroup import com.android.systemui.qs.dagger.QSFragmentModule.QQS_FOOTER import com.android.systemui.qs.dagger.QSScope -import com.android.systemui.qs.tileimpl.HeightOverrideable import javax.inject.Inject import javax.inject.Named @QSScope class QSSquishinessController @Inject constructor( - private val qsTileHost: QSTileHost, @Named(QQS_FOOTER) private val qqsFooterActionsView: FooterActionsView, private val qsAnimator: QSAnimator, + private val qsPanelController: QSPanelController, private val quickQSPanelController: QuickQSPanelController ) { @@ -34,18 +33,10 @@ class QSSquishinessController @Inject constructor( * Change the height of all tiles and repositions their siblings. */ private fun updateSquishiness() { - // Update tile positions in the layout + (qsPanelController.tileLayout as QSPanel.QSTileLayout).setSquishinessFraction(squishiness) val tileLayout = quickQSPanelController.tileLayout as TileLayout tileLayout.setSquishinessFraction(squishiness) - // Adjust their heights as well - for (tile in qsTileHost.tiles) { - val tileView = quickQSPanelController.getTileView(tile) - (tileView as? HeightOverrideable)?.let { - it.squishinessFraction = squishiness - } - } - // Calculate how much we should move the footer val tileHeightOffset = tileLayout.height - tileLayout.tilesHeight val footerTopMargin = (qqsFooterActionsView.layoutParams as ViewGroup.MarginLayoutParams) diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java index 58c05089b0625..7f08e5bdb575f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java @@ -13,6 +13,7 @@ import com.android.internal.logging.UiEventLogger; import com.android.systemui.R; import com.android.systemui.qs.QSPanel.QSTileLayout; import com.android.systemui.qs.QSPanelControllerBase.TileRecord; +import com.android.systemui.qs.tileimpl.HeightOverrideable; import java.util.ArrayList; @@ -285,5 +286,11 @@ public class TileLayout extends ViewGroup implements QSTileLayout { } mSquishinessFraction = squishinessFraction; layoutTileRecords(mRecords.size(), false /* forLayout */); + + for (TileRecord record : mRecords) { + if (record.tileView instanceof HeightOverrideable) { + ((HeightOverrideable) record.tileView).setSquishinessFraction(mSquishinessFraction); + } + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index f6005a834661b..4a869a692368d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -2227,8 +2227,10 @@ public class NotificationPanelViewController extends PanelViewController { private void updateQsExpansion() { if (mQs == null) return; float qsExpansionFraction = computeQsExpansionFraction(); + float squishiness = mNotificationStackScrollLayoutController + .getNotificationSquishinessFraction(); mQs.setQsExpansion(qsExpansionFraction, getExpandedFraction(), getHeaderTranslation(), - mNotificationStackScrollLayoutController.getNotificationSquishinessFraction()); + mQsExpandImmediate || mQsExpanded ? 1f : squishiness); mSplitShadeHeaderController.setQsExpandedFraction(qsExpansionFraction); mMediaHierarchyManager.setQsExpansion(qsExpansionFraction); int qsPanelBottomY = calculateQsBottomPosition(qsExpansionFraction); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSquishinessControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSquishinessControllerTest.kt index 3059aa1ae6585..f41d7b127a9e8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSquishinessControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSquishinessControllerTest.kt @@ -4,13 +4,10 @@ import android.testing.AndroidTestingRunner import android.view.ViewGroup import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.plugins.qs.QSTile -import com.android.systemui.qs.tileimpl.QSTileViewImpl import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.ArgumentMatchers.any import org.mockito.Mock import org.mockito.Mockito.`when` import org.mockito.Mockito.never @@ -21,14 +18,13 @@ import org.mockito.junit.MockitoJUnit @SmallTest class QSSquishinessControllerTest : SysuiTestCase() { - @Mock private lateinit var qsTileHost: QSTileHost @Mock private lateinit var qqsFooterActionsView: FooterActionsView @Mock private lateinit var qqsFooterActionsViewLP: ViewGroup.MarginLayoutParams @Mock private lateinit var qsAnimator: QSAnimator + @Mock private lateinit var qsPanelController: QSPanelController @Mock private lateinit var quickQsPanelController: QuickQSPanelController - @Mock private lateinit var qstileView: QSTileViewImpl - @Mock private lateinit var qstile: QSTile @Mock private lateinit var tileLayout: TileLayout + @Mock private lateinit var pagedTileLayout: PagedTileLayout @JvmField @Rule val mockitoRule = MockitoJUnit.rule() @@ -36,11 +32,10 @@ class QSSquishinessControllerTest : SysuiTestCase() { @Before fun setup() { - qsSquishinessController = QSSquishinessController(qsTileHost, qqsFooterActionsView, - qsAnimator, quickQsPanelController) - `when`(qsTileHost.tiles).thenReturn(mutableListOf(qstile)) - `when`(quickQsPanelController.getTileView(any())).thenReturn(qstileView) + qsSquishinessController = QSSquishinessController(qqsFooterActionsView, qsAnimator, + qsPanelController, quickQsPanelController) `when`(quickQsPanelController.tileLayout).thenReturn(tileLayout) + `when`(qsPanelController.tileLayout).thenReturn(pagedTileLayout) `when`(qqsFooterActionsView.layoutParams).thenReturn(qqsFooterActionsViewLP) } @@ -56,7 +51,7 @@ class QSSquishinessControllerTest : SysuiTestCase() { @Test fun setSquishiness_updatesTiles() { qsSquishinessController.squishiness = 0.5f - verify(qstileView).squishinessFraction = 0.5f verify(tileLayout).setSquishinessFraction(0.5f) + verify(pagedTileLayout).setSquishinessFraction(0.5f) } } \ No newline at end of file