diff options
3 files changed, 66 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 8a2c101f7057..734199eee72e 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -578,6 +578,18 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } /** + * Called when the status bar has become visible or invisible (either permanently or + * temporarily). + */ + public void onStatusBarVisibilityChanged(boolean visible) { + if (mStackView != null) { + // Hide the stack temporarily if the status bar has been made invisible, and the stack + // is collapsed. An expanded stack should remain visible until collapsed. + mStackView.setTemporarilyInvisible(!visible && !isStackExpanded()); + } + } + + /** * Sets whether to perform inflation on the same thread as the caller. This method should only * be used in tests, not in production. */ diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 8a80c4d75e84..2ceb06690da6 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -80,6 +80,7 @@ import androidx.dynamicanimation.animation.SpringForce; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ContrastColorUtil; import com.android.internal.widget.ViewClippingUtil; +import com.android.systemui.Interpolators; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.bubbles.animation.ExpandedAnimationController; @@ -89,6 +90,7 @@ import com.android.systemui.model.SysUiState; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.util.DismissCircleView; import com.android.systemui.util.FloatingContentCoordinator; @@ -243,6 +245,9 @@ public class BubbleStackView extends FrameLayout /** Whether a touch gesture, such as a stack/bubble drag or flyout drag, is in progress. */ private boolean mIsGestureInProgress = false; + /** Whether or not the stack is temporarily invisible off the side of the screen. */ + private boolean mTemporarilyInvisible = false; + /** Description of current animation controller state. */ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("Stack view state:"); @@ -919,6 +924,38 @@ public class BubbleStackView extends FrameLayout return true; }); + + animate() + .setInterpolator(Interpolators.PANEL_CLOSE_ACCELERATED) + .setDuration(CollapsedStatusBarFragment.FADE_IN_DURATION); + } + + /** + * Sets whether or not the stack should become temporarily invisible by moving off the side of + * the screen. + * + * If a flyout comes in while it's invisible, it will animate back in while the flyout is + * showing but disappear again when the flyout is gone. + */ + public void setTemporarilyInvisible(boolean invisible) { + mTemporarilyInvisible = invisible; + animateTemporarilyInvisible(); + } + + /** + * Animates onto or off the screen depending on whether we're temporarily invisible, and whether + * a flyout is visible. + */ + private void animateTemporarilyInvisible() { + if (mTemporarilyInvisible && mFlyout.getVisibility() != View.VISIBLE) { + if (mStackAnimationController.isStackOnLeftSide()) { + animate().translationX(-mBubbleSize).start(); + } else { + animate().translationX(mBubbleSize).start(); + } + } else { + animate().translationX(0).start(); + } } private void setUpManageMenu() { @@ -1989,6 +2026,9 @@ public class BubbleStackView extends FrameLayout // Stop suppressing the dot now that the flyout has morphed into the dot. bubbleView.removeDotSuppressionFlag( BadgedImageView.SuppressionFlag.FLYOUT_VISIBLE); + + mFlyout.setVisibility(INVISIBLE); + animateTemporarilyInvisible(); }; mFlyout.setVisibility(INVISIBLE); @@ -2006,6 +2046,7 @@ public class BubbleStackView extends FrameLayout final Runnable expandFlyoutAfterDelay = () -> { mAnimateInFlyout = () -> { mFlyout.setVisibility(VISIBLE); + animateTemporarilyInvisible(); mFlyoutDragDeltaX = mStackAnimationController.isStackOnLeftSide() ? -mFlyout.getWidth() 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 e0e52001e740..1bc42d1a169d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -2253,6 +2253,8 @@ public class StatusBar extends SystemUI implements DemoMode, updateHideIconsForBouncer(false /* animate */); } } + + updateBubblesVisibility(); } @Override @@ -2268,6 +2270,8 @@ public class StatusBar extends SystemUI implements DemoMode, } mLightBarController.onStatusBarAppearanceChanged(appearanceRegions, barModeChanged, mStatusBarMode, navbarColorManagedByIme); + + updateBubblesVisibility(); } @Override @@ -2311,6 +2315,7 @@ public class StatusBar extends SystemUI implements DemoMode, final int barMode = barMode(mTransientShown, mAppearance); if (updateBarMode(barMode)) { mLightBarController.onStatusBarModeChanged(barMode); + updateBubblesVisibility(); } } @@ -2395,6 +2400,14 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanelViewController.setQsScrimEnabled(scrimEnabled); } + /** Temporarily hides Bubbles if the status bar is hidden. */ + private void updateBubblesVisibility() { + mBubbleController.onStatusBarVisibilityChanged( + mStatusBarMode != MODE_LIGHTS_OUT + && mStatusBarMode != MODE_LIGHTS_OUT_TRANSPARENT + && !mStatusBarWindowHidden); + } + void checkBarMode(@TransitionMode int mode, @WindowVisibleState int windowState, BarTransitions transitions) { final boolean anim = !mNoAnimationOnNextBarModeChange && mDeviceInteractive |