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 9dea5bc09e10c..71a07866a6eec 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1526,6 +1526,24 @@ public class NotificationPanelViewController extends PanelViewController { mNotificationStackScrollLayoutController.resetScrollPosition(); } + /** Collapses the panel. */ + public void collapsePanel(boolean animate, boolean delayed, float speedUpFactor) { + boolean waiting = false; + if (animate && !isFullyCollapsed()) { + collapse(delayed, speedUpFactor); + waiting = true; + } else { + resetViews(false /* animate */); + setExpandedFraction(0); // just in case + } + if (!waiting) { + // it's possible that nothing animated, so we replicate the termination + // conditions of panelExpansionChanged here + // TODO(b/200063118): This can likely go away in a future refactor CL. + mBar.updateState(STATE_CLOSED); + } + } + @Override public void collapse(boolean delayed, float speedUpFactor) { if (!canPanelBeCollapsed()) { @@ -3052,6 +3070,7 @@ public class NotificationPanelViewController extends PanelViewController { mAffordanceHelper.animateHideLeftRightIcon(); } mNotificationStackScrollLayoutController.onPanelTrackingStarted(); + cancelPendingPanelCollapse(); } @Override @@ -3671,13 +3690,27 @@ public class NotificationPanelViewController extends PanelViewController { mNotificationStackScrollLayoutController.setScrollingEnabled(b); } + private Runnable mHideExpandedRunnable; + private final Runnable mMaybeHideExpandedRunnable = new Runnable() { + @Override + public void run() { + if (getExpansionFraction() == 0.0f) { + mView.post(mHideExpandedRunnable); + } + } + }; + /** * Initialize objects instead of injecting to avoid circular dependencies. + * + * @param hideExpandedRunnable a runnable to run when we need to hide the expanded panel. */ public void initDependencies( StatusBar statusBar, + Runnable hideExpandedRunnable, NotificationShelfController notificationShelfController) { setStatusBar(statusBar); + mHideExpandedRunnable = hideExpandedRunnable; mNotificationStackScrollLayoutController.setShelfController(notificationShelfController); mNotificationShelfController = notificationShelfController; mLockscreenShadeTransitionController.bindController(notificationShelfController); @@ -4568,6 +4601,11 @@ public class NotificationPanelViewController extends PanelViewController { } } + /** Removes any pending runnables that would collapse the panel. */ + public void cancelPendingPanelCollapse() { + mView.removeCallbacks(mMaybeHideExpandedRunnable); + } + private final PanelBar.PanelStateChangeListener mPanelStateChangeListener = new PanelBar.PanelStateChangeListener() { @@ -4582,6 +4620,11 @@ public class NotificationPanelViewController extends PanelViewController { if (state == STATE_OPEN && mCurrentState != state) { mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } + if (state == STATE_CLOSED) { + // Close the status bar in the next frame so we can show the end of the + // animation. + mView.post(mMaybeHideExpandedRunnable); + } mCurrentState = state; } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java index 310fe73df1eac..f76665285e13a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -58,6 +58,14 @@ public abstract class PanelBar extends FrameLayout { private int mState = STATE_CLOSED; private boolean mTracking; + /** Updates the panel state if necessary. */ + public void updateState(@PanelState int state) { + if (DEBUG) LOG("update state: %d -> %d", mState, state); + if (mState != state) { + go(state); + } + } + private void go(@PanelState int state) { if (DEBUG) LOG("go state: %d -> %d", mState, state); mState = state; @@ -171,32 +179,12 @@ public abstract class PanelBar extends FrameLayout { go(STATE_OPEN); } else if (fullyClosed && !mTracking && mState != STATE_CLOSED) { go(STATE_CLOSED); - onPanelCollapsed(); } if (SPEW) LOG("panelExpansionChanged: end state=%d [%s%s ]", mState, fullyOpened?" fullyOpened":"", fullyClosed?" fullyClosed":""); } - public void collapsePanel(boolean animate, boolean delayed, float speedUpFactor) { - boolean waiting = false; - PanelViewController pv = mPanel; - if (animate && !pv.isFullyCollapsed()) { - pv.collapse(delayed, speedUpFactor); - waiting = true; - } else { - pv.resetViews(false /* animate */); - pv.setExpandedFraction(0); // just in case - } - if (DEBUG) LOG("collapsePanel: animate=%s waiting=%s", animate, waiting); - if (!waiting && mState != STATE_CLOSED) { - // it's possible that nothing animated, so we replicate the termination - // conditions of panelExpansionChanged here - go(STATE_CLOSED); - onPanelCollapsed(); - } - } - public void onPanelPeeked() { if (DEBUG) LOG("onPanelPeeked"); } @@ -205,10 +193,6 @@ public abstract class PanelBar extends FrameLayout { return mState == STATE_CLOSED; } - public void onPanelCollapsed() { - if (DEBUG) LOG("onPanelCollapsed"); - } - public void onTrackingStarted() { mTracking = true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java index c23577c523e36..6718306863586 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java @@ -1435,4 +1435,8 @@ public abstract class PanelViewController { private void cancelJankMonitoring(int cuj) { InteractionJankMonitor.getInstance().cancel(cuj); } + + protected float getExpansionFraction() { + return mExpandedFraction; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 150d9c8fcce66..610b0a758b499 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -55,14 +55,6 @@ public class PhoneStatusBarView extends PanelBar { StatusBar mBar; private ScrimController mScrimController; - private Runnable mHideExpandedRunnable = new Runnable() { - @Override - public void run() { - if (mPanelFraction == 0.0f) { - mBar.makeExpandedInvisible(); - } - } - }; private DarkReceiver mBattery; private DarkReceiver mClock; private int mRotationOrientation = -1; @@ -84,7 +76,6 @@ public class PhoneStatusBarView extends PanelBar { * Draw this many pixels into the left/right side of the cutout to optimally use the space */ private int mCutoutSideNudge = 0; - private boolean mHeadsUpVisible; public PhoneStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); @@ -207,17 +198,6 @@ public class PhoneStatusBarView extends PanelBar { mBar.makeExpandedVisible(false); } - @Override - public void onPanelCollapsed() { - super.onPanelCollapsed(); - // Close the status bar in the next frame so we can show the end of the animation. - post(mHideExpandedRunnable); - } - - public void removePendingHideExpandedRunnables() { - removeCallbacks(mHideExpandedRunnable); - } - @Override public boolean onTouchEvent(MotionEvent event) { boolean barConsumedEvent = mBar.interceptTouchEvent(event); @@ -238,7 +218,6 @@ public class PhoneStatusBarView extends PanelBar { super.onTrackingStarted(); mBar.onTrackingStarted(); mScrimController.onTrackingStarted(); - removePendingHideExpandedRunnables(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java index 768222d348624..a54251a469018 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java @@ -128,7 +128,8 @@ public class ShadeControllerImpl implements ShadeController { mNotificationShadeWindowController.setNotificationShadeFocusable(false); getStatusBar().getNotificationShadeWindowViewController().cancelExpandHelper(); - getStatusBarView().collapsePanel(true /* animate */, delayed, speedUpFactor); + getNotificationPanelViewController() + .collapsePanel(true /* animate */, delayed, speedUpFactor); } else if (mBubblesOptional.isPresent()) { mBubblesOptional.get().collapseStack(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 2ebe3c5eec144..b10972a31eb24 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1316,6 +1316,7 @@ public class StatusBar extends SystemUI implements mNotificationPanelViewController.initDependencies( this, + this::makeExpandedInvisible, mNotificationShelfController); BackDropView backdrop = mNotificationShadeWindowView.findViewById(R.id.backdrop); @@ -2157,7 +2158,8 @@ public class StatusBar extends SystemUI implements public void animateCollapseQuickSettings() { if (mState == StatusBarState.SHADE) { - mStatusBarView.collapsePanel(true, false /* delayed */, 1.0f /* speedUpFactor */); + mNotificationPanelViewController.collapsePanel( + true, false /* delayed */, 1.0f /* speedUpFactor */); } } @@ -2170,7 +2172,7 @@ public class StatusBar extends SystemUI implements } // Ensure the panel is fully collapsed (just in case; bug 6765842, 7260868) - mStatusBarView.collapsePanel(/*animate=*/ false, false /* delayed*/, + mNotificationPanelViewController.collapsePanel(/*animate=*/ false, false /* delayed*/, 1.0f /* speedUpFactor */); mNotificationPanelViewController.closeQs(); @@ -4464,7 +4466,7 @@ public class StatusBar extends SystemUI implements mNavigationBarController.touchAutoDim(mDisplayId); Trace.beginSection("StatusBar#updateKeyguardState"); if (mState == StatusBarState.KEYGUARD && mStatusBarView != null) { - mStatusBarView.removePendingHideExpandedRunnables(); + mNotificationPanelViewController.cancelPendingPanelCollapse(); } updateDozingState(); checkBarModes(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java index 5301b25715340..bb1daa252cdf5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java @@ -536,7 +536,7 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { } if (mStatusBar.getStatusBarView() != null) { if (!showing && mStatusBarStateController.getState() == StatusBarState.SHADE) { - mStatusBar.getStatusBarView().collapsePanel( + mNotificationPanelViewController.collapsePanel( false /* animate */, false /* delayed */, 1.0f /* speedUpFactor */); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java index 265e418a279c7..23c76c6161695 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java @@ -450,6 +450,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mControlsComponent); mNotificationPanelViewController.initDependencies( mStatusBar, + () -> {}, mNotificationShelfController); mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager); mNotificationPanelViewController.setBar(mPanelBar);