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 596fe46283a7f..0998de9cdb2f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -334,6 +334,7 @@ public class NotificationPanelViewController extends PanelViewController { private boolean mKeyguardUserSwitcherEnabled; private boolean mDozing; private boolean mDozingOnDown; + private boolean mBouncerShowing; private int mBarState; private float mInitialHeightOnTouch; private float mInitialTouchX; @@ -404,7 +405,7 @@ public class NotificationPanelViewController extends PanelViewController { private Runnable mHeadsUpExistenceChangedRunnable = () -> { setHeadsUpAnimatingAway(false); - notifyBarPanelExpansionChanged(); + updatePanelExpansionAndVisibility(); }; // TODO (b/162832756): once migrated to the new pipeline, delete legacy group manager private NotificationGroupManagerLegacy mGroupManager; @@ -3225,11 +3226,19 @@ public class NotificationPanelViewController extends PanelViewController { public void setHeadsUpAnimatingAway(boolean headsUpAnimatingAway) { mHeadsUpAnimatingAway = headsUpAnimatingAway; mNotificationStackScrollLayoutController.setHeadsUpAnimatingAway(headsUpAnimatingAway); - updateHeadsUpVisibility(); + updateVisibility(); } - private void updateHeadsUpVisibility() { - ((PhoneStatusBarView) mBar).setHeadsUpVisible(mHeadsUpAnimatingAway || mHeadsUpPinnedMode); + /** Set whether the bouncer is showing. */ + public void setBouncerShowing(boolean bouncerShowing) { + mBouncerShowing = bouncerShowing; + updateVisibility(); + } + + @Override + protected boolean shouldPanelBeVisible() { + boolean headsUpVisible = mHeadsUpAnimatingAway || mHeadsUpPinnedMode; + return headsUpVisible || isExpanded() || mBouncerShowing; } @Override @@ -3639,6 +3648,11 @@ public class NotificationPanelViewController extends PanelViewController { } } + /** */ + public void setImportantForAccessibility(int mode) { + mView.setImportantForAccessibility(mode); + } + /** * Do not let the user drag the shade up and down for the current touch session. * This is necessary to avoid shade expansion while/after the bouncer is dismissed. @@ -4211,7 +4225,7 @@ public class NotificationPanelViewController extends PanelViewController { } updateGestureExclusionRect(); mHeadsUpPinnedMode = inPinnedMode; - updateHeadsUpVisibility(); + updateVisibility(); mKeyguardStatusBarViewController.updateForHeadsUp(); } 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 e775e96de749e..247ede91eeb31 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -33,8 +33,6 @@ public abstract class PanelBar extends FrameLayout { private static final boolean SPEW = false; private static final String PANEL_BAR_SUPER_PARCELABLE = "panel_bar_super_parcelable"; private static final String STATE = "state"; - private boolean mBouncerShowing; - private boolean mExpanded; protected float mPanelFraction; public static final void LOG(String fmt, Object... args) { @@ -99,33 +97,6 @@ public abstract class PanelBar extends FrameLayout { pv.setBar(this); } - public void setBouncerShowing(boolean showing) { - mBouncerShowing = showing; - int important = showing ? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS - : IMPORTANT_FOR_ACCESSIBILITY_AUTO; - - setImportantForAccessibility(important); - updateVisibility(); - - if (mPanel != null) mPanel.getView().setImportantForAccessibility(important); - } - - public float getExpansionFraction() { - return mPanelFraction; - } - - public boolean isExpanded() { - return mExpanded; - } - - protected void updateVisibility() { - mPanel.getView().setVisibility(shouldPanelBeVisible() ? VISIBLE : INVISIBLE); - } - - protected boolean shouldPanelBeVisible() { - return mExpanded || mBouncerShowing; - } - public boolean panelEnabled() { return true; } @@ -183,9 +154,7 @@ public abstract class PanelBar extends FrameLayout { boolean fullyClosed = true; boolean fullyOpened = false; if (SPEW) LOG("panelExpansionChanged: start state=%d, f=%.1f", mState, frac); - mExpanded = expanded; mPanelFraction = frac; - updateVisibility(); // adjust any other panels that may be partially visible if (expanded) { if (mState == STATE_CLOSED) { 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 51cae8c4af7f1..b2155154d6523 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java @@ -16,6 +16,9 @@ package com.android.systemui.statusbar.phone; +import static android.view.View.INVISIBLE; +import static android.view.View.VISIBLE; + import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE; import static com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK; import static com.android.systemui.classifier.Classifier.GENERIC; @@ -315,7 +318,7 @@ public abstract class PanelViewController { } private void startOpening(MotionEvent event) { - notifyBarPanelExpansionChanged(); + updatePanelExpansionAndVisibility(); maybeVibrateOnOpening(); //TODO: keyguard opens QS a different way; log that too? @@ -447,7 +450,7 @@ public abstract class PanelViewController { protected void onTrackingStopped(boolean expand) { mTracking = false; mBar.onTrackingStopped(expand); - notifyBarPanelExpansionChanged(); + updatePanelExpansionAndVisibility(); } protected void onTrackingStarted() { @@ -455,7 +458,7 @@ public abstract class PanelViewController { mTracking = true; mBar.onTrackingStarted(); notifyExpandingStarted(); - notifyBarPanelExpansionChanged(); + updatePanelExpansionAndVisibility(); } /** @@ -685,7 +688,7 @@ public abstract class PanelViewController { } else { cancelJankMonitoring(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE); } - notifyBarPanelExpansionChanged(); + updatePanelExpansionAndVisibility(); } protected abstract boolean shouldUseDismissingAnimation(); @@ -760,7 +763,7 @@ public abstract class PanelViewController { mExpandedFraction = Math.min(1f, maxPanelHeight == 0 ? 0 : mExpandedHeight / maxPanelHeight); onHeightUpdated(mExpandedHeight); - notifyBarPanelExpansionChanged(); + updatePanelExpansionAndVisibility(); } /** @@ -878,7 +881,7 @@ public abstract class PanelViewController { if (mExpanding) { notifyExpandingFinished(); } - notifyBarPanelExpansionChanged(); + updatePanelExpansionAndVisibility(); // Wait for window manager to pickup the change, so we know the maximum height of the panel // then. @@ -916,7 +919,7 @@ public abstract class PanelViewController { } if (mInstantExpanding) { mInstantExpanding = false; - notifyBarPanelExpansionChanged(); + updatePanelExpansionAndVisibility(); } } @@ -1022,7 +1025,7 @@ public abstract class PanelViewController { public void onAnimationEnd(Animator animation) { setAnimator(null); onAnimationFinished.run(); - notifyBarPanelExpansionChanged(); + updatePanelExpansionAndVisibility(); } }); animator.start(); @@ -1059,19 +1062,39 @@ public abstract class PanelViewController { return animator; } - protected void notifyBarPanelExpansionChanged() { + /** Update the visibility of {@link PanelView} if necessary. */ + public void updateVisibility() { + mView.setVisibility(shouldPanelBeVisible() ? VISIBLE : INVISIBLE); + } + + /** Returns true if {@link PanelView} should be visible. */ + abstract boolean shouldPanelBeVisible(); + + /** + * Updates the panel expansion and {@link PanelView} visibility if necessary. + * + * TODO(b/200063118): Could public calls to this method be replaced with calls to + * {@link #updateVisibility()}? That would allow us to make this method private. + */ + public void updatePanelExpansionAndVisibility() { if (mBar != null) { - mBar.panelExpansionChanged( - mExpandedFraction, - mExpandedFraction > 0f || mInstantExpanding - || isPanelVisibleBecauseOfHeadsUp() || mTracking - || mHeightAnimator != null && !mIsSpringBackAnimation); + mBar.panelExpansionChanged(mExpandedFraction, isExpanded()); } + updateVisibility(); for (int i = 0; i < mExpansionListeners.size(); i++) { mExpansionListeners.get(i).onPanelExpansionChanged(mExpandedFraction, mTracking); } } + public boolean isExpanded() { + return mExpandedFraction > 0f + || mInstantExpanding + || isPanelVisibleBecauseOfHeadsUp() + || mTracking + || mHeightAnimator != null + && !mIsSpringBackAnimation; + } + public void addExpansionListener(PanelExpansionListener panelExpansionListener) { mExpansionListeners.add(panelExpansionListener); } 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 af556a26e3af3..9ab6cdd3053bc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -402,16 +402,6 @@ public class PhoneStatusBarView extends PanelBar { getPaddingBottom()); } - public void setHeadsUpVisible(boolean headsUpVisible) { - mHeadsUpVisible = headsUpVisible; - updateVisibility(); - } - - @Override - protected boolean shouldPanelBeVisible() { - return mHeadsUpVisible || super.shouldPanelBeVisible(); - } - /** An interface that will provide whether panel is enabled. */ interface PanelEnabledProvider { /** Returns true if the panel is enabled and false otherwise. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt index 28040fd8d8a10..4c0332a75df10 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt @@ -61,6 +61,10 @@ class PhoneStatusBarViewController( } } + fun setImportantForAccessibility(mode: Int) { + mView.importantForAccessibility = mode + } + private class StatusBarViewsCenterProvider : UnfoldMoveFromCenterAnimator.ViewCenterProvider { override fun getViewCenter(view: View, outPoint: Point) = when (view.id) { 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 e4447a54ffa61..62313920ad646 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -26,6 +26,8 @@ import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_STATUS_BARS; import static android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_STATUS_BARS; +import static androidx.core.view.ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO; +import static androidx.core.view.ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS; import static androidx.lifecycle.Lifecycle.State.RESUMED; import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME; @@ -1188,22 +1190,13 @@ public class StatusBar extends SystemUI implements ); mBatteryMeterViewController.init(); - // CollapsedStatusBarFragment re-inflated PhoneStatusBarView and both of - // mStatusBarView.mExpanded and mStatusBarView.mBouncerShowing are false. - // PhoneStatusBarView's new instance will set to be gone in - // PanelBar.updateVisibility after calling mStatusBarView.setBouncerShowing - // that will trigger PanelBar.updateVisibility. If there is a heads up showing, - // it needs to notify PhoneStatusBarView's new instance to update the correct - // status by calling mNotificationPanel.notifyBarPanelExpansionChanged(). - if (mHeadsUpManager.hasPinnedHeadsUp()) { - mNotificationPanelViewController.notifyBarPanelExpansionChanged(); - } - mStatusBarView.setBouncerShowing(mBouncerShowing); - if (oldStatusBarView != null) { - float fraction = oldStatusBarView.getExpansionFraction(); - boolean expanded = oldStatusBarView.isExpanded(); - mStatusBarView.panelExpansionChanged(fraction, expanded); - } + // Ensure we re-propagate panel expansion values to the panel controller and + // any listeners it may have, such as PanelBar. This will also ensure we + // re-display the notification panel if necessary (for example, if + // a heads-up notification was being displayed and should continue being + // displayed). + mNotificationPanelViewController.updatePanelExpansionAndVisibility(); + setBouncerShowingForStatusBarComponents(mBouncerShowing); HeadsUpAppearanceController oldController = mHeadsUpAppearanceController; if (mHeadsUpAppearanceController != null) { @@ -3532,7 +3525,7 @@ public class StatusBar extends SystemUI implements mBouncerShowing = bouncerShowing; mKeyguardBypassController.setBouncerShowing(bouncerShowing); mPulseExpansionHandler.setBouncerShowing(bouncerShowing); - if (mStatusBarView != null) mStatusBarView.setBouncerShowing(bouncerShowing); + setBouncerShowingForStatusBarComponents(bouncerShowing); updateHideIconsForBouncer(true /* animate */); mCommandQueue.recomputeDisableFlags(mDisplayId, true /* animate */); updateScrimController(); @@ -3541,6 +3534,23 @@ public class StatusBar extends SystemUI implements } } + /** + * Propagate the bouncer state to status bar components. + * + * Separate from {@link #setBouncerShowing} because we sometimes re-create the status bar and + * should update only the status bar components. + */ + private void setBouncerShowingForStatusBarComponents(boolean bouncerShowing) { + int importance = bouncerShowing + ? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS + : IMPORTANT_FOR_ACCESSIBILITY_AUTO; + if (mPhoneStatusBarViewController != null) { + mPhoneStatusBarViewController.setImportantForAccessibility(importance); + } + mNotificationPanelViewController.setImportantForAccessibility(importance); + mNotificationPanelViewController.setBouncerShowing(bouncerShowing); + } + /** * Collapses the notification shade if it is tracking or expanded. */ @@ -4213,10 +4223,9 @@ public class StatusBar extends SystemUI implements } private void sendInitialExpansionAmount(ExpansionChangedListener expansionChangedListener) { - if (mStatusBarView != null) { - expansionChangedListener.onExpansionChanged(mStatusBarView.getExpansionFraction(), - mStatusBarView.isExpanded()); - } + expansionChangedListener.onExpansionChanged( + mNotificationPanelViewController.getExpandedFraction(), + mNotificationPanelViewController.isExpanded()); } public void removeExpansionChangedListener(@NonNull ExpansionChangedListener listener) {