diff options
4 files changed, 61 insertions, 35 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index b3e6f8ab3de6..ba3c919edbc2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -442,20 +442,19 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } private void updateQsState() { - final boolean expanded = mQsExpanded || mInSplitShade; - final boolean expandVisually = expanded || mStackScrollerOverscrolling + final boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling || mHeaderAnimating; - mQSPanelController.setExpanded(expanded); + mQSPanelController.setExpanded(mQsExpanded); boolean keyguardShowing = isKeyguardState(); - mHeader.setVisibility((expanded || !keyguardShowing || mHeaderAnimating + mHeader.setVisibility((mQsExpanded || !keyguardShowing || mHeaderAnimating || mShowCollapsedOnKeyguard) ? View.VISIBLE : View.INVISIBLE); mHeader.setExpanded((keyguardShowing && !mHeaderAnimating && !mShowCollapsedOnKeyguard) - || (expanded && !mStackScrollerOverscrolling), mQuickQSPanelController); + || (mQsExpanded && !mStackScrollerOverscrolling), mQuickQSPanelController); boolean qsPanelVisible = !mQsDisabled && expandVisually; - boolean footerVisible = qsPanelVisible && (expanded || !keyguardShowing || mHeaderAnimating - || mShowCollapsedOnKeyguard); + boolean footerVisible = qsPanelVisible && (mQsExpanded || !keyguardShowing + || mHeaderAnimating || mShowCollapsedOnKeyguard); mFooter.setVisibility(footerVisible ? View.VISIBLE : View.INVISIBLE); if (mQSFooterActionController != null) { mQSFooterActionController.setVisible(footerVisible); @@ -463,7 +462,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mQSFooterActionsViewModel.onVisibilityChangeRequested(footerVisible); } mFooter.setExpanded((keyguardShowing && !mHeaderAnimating && !mShowCollapsedOnKeyguard) - || (expanded && !mStackScrollerOverscrolling)); + || (mQsExpanded && !mStackScrollerOverscrolling)); mQSPanelController.setVisibility(qsPanelVisible ? View.VISIBLE : View.INVISIBLE); if (DEBUG) { Log.d(TAG, "Footer: " + footerVisible + ", QS Panel: " + qsPanelVisible); diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index feda11f50b2c..553ba53a3d91 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -430,6 +430,7 @@ public final class NotificationPanelViewController extends PanelViewController { /** * Determines if QS should be already expanded when expanding shade. * Used for split shade, two finger gesture as well as accessibility shortcut to QS. + * It needs to be set when movement starts as it resets at the end of expansion/collapse. */ @VisibleForTesting boolean mQsExpandImmediate; @@ -1737,8 +1738,10 @@ public final class NotificationPanelViewController extends PanelViewController { } private void setQsExpandImmediate(boolean expandImmediate) { - mQsExpandImmediate = expandImmediate; - mPanelEventsEmitter.notifyExpandImmediateChange(expandImmediate); + if (expandImmediate != mQsExpandImmediate) { + mQsExpandImmediate = expandImmediate; + mPanelEventsEmitter.notifyExpandImmediateChange(expandImmediate); + } } private void setShowShelfOnly(boolean shelfOnly) { @@ -3124,26 +3127,24 @@ public final class NotificationPanelViewController extends PanelViewController { } if (mQsExpandImmediate || (mQsExpanded && !mQsTracking && mQsExpansionAnimator == null && !mQsExpansionFromOverscroll)) { - float t; - if (mKeyguardShowing) { - + float qsExpansionFraction; + if (mSplitShadeEnabled) { + qsExpansionFraction = 1; + } else if (mKeyguardShowing) { // On Keyguard, interpolate the QS expansion linearly to the panel expansion - t = expandedHeight / (getMaxPanelHeight()); + qsExpansionFraction = expandedHeight / (getMaxPanelHeight()); } else { // In Shade, interpolate linearly such that QS is closed whenever panel height is // minimum QS expansion + minStackHeight - float - panelHeightQsCollapsed = + float panelHeightQsCollapsed = mNotificationStackScrollLayoutController.getIntrinsicPadding() + mNotificationStackScrollLayoutController.getLayoutMinHeight(); float panelHeightQsExpanded = calculatePanelHeightQsExpanded(); - t = - (expandedHeight - panelHeightQsCollapsed) / (panelHeightQsExpanded - - panelHeightQsCollapsed); + qsExpansionFraction = (expandedHeight - panelHeightQsCollapsed) + / (panelHeightQsExpanded - panelHeightQsCollapsed); } - float - targetHeight = - mQsMinExpansionHeight + t * (mQsMaxExpansionHeight - mQsMinExpansionHeight); + float targetHeight = mQsMinExpansionHeight + + qsExpansionFraction * (mQsMaxExpansionHeight - mQsMinExpansionHeight); setQsExpansion(targetHeight); } updateExpandedHeight(expandedHeight); @@ -3329,7 +3330,11 @@ public final class NotificationPanelViewController extends PanelViewController { } else { setListening(true); } - setQsExpandImmediate(false); + if (mBarState != SHADE) { + // updating qsExpandImmediate is done in onPanelStateChanged for unlocked shade but + // on keyguard panel state is always OPEN so we need to have that extra update + setQsExpandImmediate(false); + } setShowShelfOnly(false); mTwoFingerQsExpandPossible = false; updateTrackingHeadsUp(null); @@ -4993,6 +4998,7 @@ public final class NotificationPanelViewController extends PanelViewController { updateQSExpansionEnabledAmbient(); if (state == STATE_OPEN && mCurrentPanelState != state) { + setQsExpandImmediate(false); mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } if (state == STATE_OPENING) { @@ -5005,6 +5011,7 @@ public final class NotificationPanelViewController extends PanelViewController { mCentralSurfaces.makeExpandedVisible(false); } if (state == STATE_CLOSED) { + setQsExpandImmediate(false); // Close the status bar in the next frame so we can show the end of the // animation. mView.post(mMaybeHideExpandedRunnable); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index 5d5918de3d9e..2a66773f924e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -402,6 +402,19 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { verify(mQSPanelController).setListening(eq(true), anyBoolean()); } + @Test + public void passCorrectExpansionState_inSplitShade() { + QSFragment fragment = resumeAndGetFragment(); + enableSplitShade(); + clearInvocations(mQSPanelController); + + fragment.setExpanded(true); + verify(mQSPanelController).setExpanded(true); + + fragment.setExpanded(false); + verify(mQSPanelController).setExpanded(false); + } + @Override protected Fragment instantiate(Context context, String className, Bundle arguments) { MockitoAnnotations.initMocks(this); diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index b40d5ac69d7b..0c60d3c72c2a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -23,6 +23,9 @@ import static com.android.keyguard.KeyguardClockSwitch.SMALL; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.StatusBarState.SHADE; import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED; +import static com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManagerKt.STATE_CLOSED; +import static com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManagerKt.STATE_OPEN; +import static com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManagerKt.STATE_OPENING; import static com.google.common.truth.Truth.assertThat; @@ -1249,14 +1252,10 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { @Test public void testQsToBeImmediatelyExpandedWhenOpeningPanelInSplitShade() { enableSplitShade(/* enabled= */ true); - // set panel state to CLOSED - mPanelExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 0, - /* expanded= */ false, /* tracking= */ false, /* dragDownPxAmount= */ 0); + mPanelExpansionStateManager.updateState(STATE_CLOSED); assertThat(mNotificationPanelViewController.mQsExpandImmediate).isFalse(); - // change panel state to OPENING - mPanelExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 0.5f, - /* expanded= */ true, /* tracking= */ true, /* dragDownPxAmount= */ 100); + mPanelExpansionStateManager.updateState(STATE_OPENING); assertThat(mNotificationPanelViewController.mQsExpandImmediate).isTrue(); } @@ -1264,15 +1263,23 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { @Test public void testQsNotToBeImmediatelyExpandedWhenGoingFromUnlockedToLocked() { enableSplitShade(/* enabled= */ true); - // set panel state to CLOSED - mPanelExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 0, - /* expanded= */ false, /* tracking= */ false, /* dragDownPxAmount= */ 0); + mPanelExpansionStateManager.updateState(STATE_CLOSED); - // go to lockscreen, which also sets fraction to 1.0f and makes shade "expanded" mStatusBarStateController.setState(KEYGUARD); - mPanelExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 1, - /* expanded= */ true, /* tracking= */ true, /* dragDownPxAmount= */ 0); + // going to lockscreen would trigger STATE_OPENING + mPanelExpansionStateManager.updateState(STATE_OPENING); + + assertThat(mNotificationPanelViewController.mQsExpandImmediate).isFalse(); + } + + @Test + public void testQsImmediateResetsWhenPanelOpensOrCloses() { + mNotificationPanelViewController.mQsExpandImmediate = true; + mPanelExpansionStateManager.updateState(STATE_OPEN); + assertThat(mNotificationPanelViewController.mQsExpandImmediate).isFalse(); + mNotificationPanelViewController.mQsExpandImmediate = true; + mPanelExpansionStateManager.updateState(STATE_CLOSED); assertThat(mNotificationPanelViewController.mQsExpandImmediate).isFalse(); } |