From d0b48e36668503e5ba7ca3b3b6e955149b0a29bc Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 24 May 2019 20:49:23 -0700 Subject: [PATCH] Fixed that notifications could be stuck and invisible on AOD Notifications could get stuck if they were pulsing while the prox sensor was covered. We're now only showing notifications if we're pulsing. This also fixes a bug around the background not drawing properly while pulsing. Fixes: 129552328 Test: atest SystemUITests Change-Id: I499c6c167b155c69a2f8313850ca467da9ea295a --- .../statusbar/PulseExpansionHandler.kt | 1 + .../NotificationWakeUpCoordinator.kt | 32 ++++++++++++++++--- .../notification/row/NotificationMenuRow.java | 1 + .../notification/stack/AmbientState.java | 7 ++++ .../stack/NotificationSection.java | 1 + .../stack/NotificationStackScrollLayout.java | 13 ++++---- .../stack/NotificationSwipeHelper.java | 8 ++++- .../systemui/statusbar/phone/StatusBar.java | 1 + 8 files changed, 52 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index bf9947450126f..a9d4fdeae3970 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -149,6 +149,7 @@ constructor(context: Context, } isExpanding = false isWakingToShadeLocked = true + mWakeUpCoordinator.willWakeUp = true mPowerManager!!.wakeUp(SystemClock.uptimeMillis(), WAKE_REASON_GESTURE, "com.android.systemui:PULSEDRAG") mShadeController!!.goToLockedShade(mStartingChild) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 1e506ad0ee945..c65e90ea7bea2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -63,6 +63,25 @@ class NotificationWakeUpCoordinator @Inject constructor( private var mWakingUp = false private val mEntrySetToClearWhenFinished = mutableSetOf() private val mDozeParameters: DozeParameters; + var willWakeUp = false + set(value) { + if (value && mDozeAmount != 0.0f) { + field = value + } + } + + var pulsing: Boolean = false + set(value) { + field = value + if (value) { + // Only when setting pulsing to true we want an immediate update, since we get + // this already when the doze service finishes which is usually before we get + // the waking up callback + updateNotificationVisibility(animate = shouldAnimateVisibility(), + increaseSpeed = false) + } + } + init { mAmbientPulseManager.addListener(this) @@ -92,8 +111,9 @@ class NotificationWakeUpCoordinator @Inject constructor( } private fun updateNotificationVisibility(animate: Boolean, increaseSpeed: Boolean) { - var visible = mNotificationsVisibleForExpansion || mAmbientPulseManager.hasNotifications() - if (!visible && mNotificationsVisible && mWakingUp && mDozeAmount != 0.0f) { + var visible = (mNotificationsVisibleForExpansion || mAmbientPulseManager.hasNotifications()) + && pulsing; + if (!visible && mNotificationsVisible && (mWakingUp || willWakeUp) && mDozeAmount != 0.0f) { // let's not make notifications invisible while waking up, otherwise the animation // is strange return; @@ -192,6 +212,7 @@ class NotificationWakeUpCoordinator @Inject constructor( } fun setWakingUp(wakingUp: Boolean) { + willWakeUp = false mWakingUp = wakingUp if (wakingUp && mNotificationsVisible && !mNotificationsVisibleForExpansion) { // We're waking up while pulsing, let's make sure the animation looks nice @@ -200,9 +221,9 @@ class NotificationWakeUpCoordinator @Inject constructor( } override fun onAmbientStateChanged(entry: NotificationEntry, isPulsing: Boolean) { - var animate = mDozeParameters.getAlwaysOn() && !mDozeParameters.getDisplayNeedsBlanking() + var animate = shouldAnimateVisibility() if (!isPulsing) { - if (mLinearDozeAmount != 0.0f) { + if (mLinearDozeAmount != 0.0f && mLinearVisibilityAmount != 0.0f) { if (entry.isRowDismissed) { // if we animate, we see the shelf briefly visible. Instead we fully animate // the notification and its background out @@ -218,4 +239,7 @@ class NotificationWakeUpCoordinator @Inject constructor( } updateNotificationVisibility(animate, increaseSpeed = false) } + + private fun shouldAnimateVisibility() = + mDozeParameters.getAlwaysOn() && !mDozeParameters.getDisplayNeedsBlanking() } \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java index 73f7732fe4abd..ecbb2161a0cfe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java @@ -340,6 +340,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl && !NotificationStackScrollLayout.isPinnedHeadsUp(getParent()) && !mParent.areGutsExposed() && !mParent.isDark() + && !mParent.showingAmbientPulsing() && (mCheckForDrag == null || !mHandler.hasCallbacks(mCheckForDrag))) { // Only show the menu if we're not a heads up view and guts aren't exposed. mCheckForDrag = new CheckForDrag(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index 8c6d1015bd4d6..e5fbf63966671 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -395,6 +395,13 @@ public class AmbientState { mPulsing = hasPulsing; } + /** + * @return if we're pulsing in general + */ + public boolean isPulsing() { + return mPulsing; + } + public boolean isPulsing(NotificationEntry entry) { if (!mPulsing || mAmbientPulseManager == null) { return false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java index dd6d3833f147d..cbcfdd4b2ea7d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java @@ -260,6 +260,7 @@ class NotificationSection { + ExpandableViewState.getFinalActualHeight(firstView)); if (shiftBackgroundWithFirst) { mBounds.left += Math.max(firstView.getTranslation(), 0); + mBounds.right += Math.min(firstView.getTranslation(), 0); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 8c73e98341953..dccf404f04830 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -871,6 +871,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd int lastSectionBottom = mSections[0].getCurrentBounds().bottom + animationYOffset; int previousLeft = left; + int previousRight = right; boolean first = true; for (NotificationSection section : mSections) { if (section.getFirstVisibleChild() == null) { @@ -878,6 +879,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } int sectionTop = section.getCurrentBounds().top + animationYOffset; int ownLeft = Math.min(Math.max(left, section.getCurrentBounds().left), right); + int ownRight = Math.max(Math.min(right, section.getCurrentBounds().right), ownLeft); // If sections are directly adjacent to each other, we don't want to draw them // as separate roundrects, as the rounded corners right next to each other look // bad. @@ -885,19 +887,20 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd || (previousLeft != ownLeft && !first)) { canvas.drawRoundRect(ownLeft, backgroundRectTop, - right, + ownRight, lastSectionBottom, mCornerRadius, mCornerRadius, mBackgroundPaint); backgroundRectTop = sectionTop; } previousLeft = ownLeft; + previousRight = ownRight; lastSectionBottom = section.getCurrentBounds().bottom + animationYOffset; first = false; } canvas.drawRoundRect(previousLeft, backgroundRectTop, - right, + previousRight, lastSectionBottom, mCornerRadius, mCornerRadius, mBackgroundPaint); } @@ -2406,11 +2409,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mAmbientState.setLayoutMaxHeight(mContentHeight); } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - private boolean isPulsing(NotificationEntry entry) { - return mAmbientState.isPulsing(entry); - } - @Override @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public boolean hasPulsingNotifications() { @@ -5170,6 +5168,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } mPulsing = pulsing; mAmbientState.setPulsing(pulsing); + mSwipeHelper.setPulsing(pulsing); updateNotificationAnimationStates(); updateAlgorithmHeightAndPadding(); updateContentHeight(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java index 0f71192277df1..8dd324b332874 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java @@ -49,6 +49,7 @@ class NotificationSwipeHelper extends SwipeHelper private NotificationMenuRowPlugin mCurrMenuRow; private boolean mIsExpanded; + private boolean mPulsing; public NotificationSwipeHelper(int swipeDirection, NotificationCallback callback, Context context, NotificationMenuRowPlugin.OnMenuEventListener menuListener) { @@ -205,7 +206,8 @@ class NotificationSwipeHelper extends SwipeHelper boolean slowSwipedFarEnough = swipedEnoughToShowMenu(menuRow) && isSlowSwipe; boolean isFastNonDismissGesture = gestureFastEnough && !gestureTowardsMenu && !isDismissGesture; - boolean isAbleToShowMenu = menuRow.shouldShowGutsOnSnapOpen() || mIsExpanded; + boolean isAbleToShowMenu = menuRow.shouldShowGutsOnSnapOpen() + || mIsExpanded && !mPulsing; boolean isMenuRevealingGestureAwayFromMenu = slowSwipedFarEnough || (isFastNonDismissGesture && isAbleToShowMenu); int menuSnapTarget = menuRow.getMenuSnapTarget(); @@ -436,6 +438,10 @@ class NotificationSwipeHelper extends SwipeHelper return ret; } + public void setPulsing(boolean pulsing) { + mPulsing = pulsing; + } + public interface NotificationCallback extends SwipeHelper.Callback{ /** * @return if the view should be dismissed as soon as the touch is released, otherwise its 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 4e8f584133030..1da819f1a7643 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3982,6 +3982,7 @@ public class StatusBar extends SystemUI implements DemoMode, } updateScrimController(); mPulseExpansionHandler.setPulsing(pulsing); + mWakeUpCoordinator.setPulsing(pulsing); } }, reason); // DozeScrimController is in pulse state, now let's ask ScrimController to start