Loading packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +7 −8 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +22 −15 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -1737,9 +1738,11 @@ public final class NotificationPanelViewController extends PanelViewController { } private void setQsExpandImmediate(boolean expandImmediate) { if (expandImmediate != mQsExpandImmediate) { mQsExpandImmediate = expandImmediate; mPanelEventsEmitter.notifyExpandImmediateChange(expandImmediate); } } private void setShowShelfOnly(boolean shelfOnly) { mNotificationStackScrollLayoutController.setShouldShowShelfOnly( Loading Loading @@ -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); Loading Loading @@ -3329,7 +3330,11 @@ public final class NotificationPanelViewController extends PanelViewController { } else { setListening(true); } 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); Loading Loading @@ -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) { Loading @@ -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); Loading packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +13 −0 Original line number Diff line number Diff line Loading @@ -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); Loading packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +19 −12 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading @@ -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(); } Loading Loading
packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +7 −8 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading
packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +22 −15 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -1737,9 +1738,11 @@ public final class NotificationPanelViewController extends PanelViewController { } private void setQsExpandImmediate(boolean expandImmediate) { if (expandImmediate != mQsExpandImmediate) { mQsExpandImmediate = expandImmediate; mPanelEventsEmitter.notifyExpandImmediateChange(expandImmediate); } } private void setShowShelfOnly(boolean shelfOnly) { mNotificationStackScrollLayoutController.setShouldShowShelfOnly( Loading Loading @@ -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); Loading Loading @@ -3329,7 +3330,11 @@ public final class NotificationPanelViewController extends PanelViewController { } else { setListening(true); } 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); Loading Loading @@ -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) { Loading @@ -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); Loading
packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +13 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +19 −12 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading @@ -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(); } Loading