From c0a699a0ed759815dd2a8420f457cf5da97168ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6llner?= Date: Wed, 10 Aug 2022 13:45:53 +0200 Subject: [PATCH] [Slit shade] Fix pulsing notification overlapping with centered clock The fix is to move the clock to the left when pulsing. Fixes: 242019437 Test: NotificationPanelViewControllerTest.java Test: Manually Change-Id: If79e23a72ffd1856384682ed3fea711af012d9c1 --- .../NotificationPanelViewController.java | 81 ++++++++++++++----- .../NotificationPanelViewControllerTest.java | 51 ++++++++---- 2 files changed, 99 insertions(+), 33 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 4b8379a67ac70..69e17ec7b510c 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -98,6 +98,7 @@ import com.android.internal.policy.ScreenDecorationsUtils; import com.android.internal.policy.SystemBarUtils; import com.android.internal.util.LatencyTracker; import com.android.keyguard.ActiveUnlockConfig; +import com.android.keyguard.KeyguardClockSwitch.ClockSize; import com.android.keyguard.KeyguardStatusView; import com.android.keyguard.KeyguardStatusViewController; import com.android.keyguard.KeyguardUnfoldTransition; @@ -1439,19 +1440,10 @@ public final class NotificationPanelViewController extends PanelViewController { private void updateClockAppearance() { int userSwitcherPreferredY = mStatusBarHeaderHeightKeyguard; boolean bypassEnabled = mKeyguardBypassController.getBypassEnabled(); - final boolean hasVisibleNotifications = mNotificationStackScrollLayoutController - .getVisibleNotificationCount() != 0 - || mMediaDataManager.hasActiveMediaOrRecommendation(); - boolean splitShadeWithActiveMedia = - mSplitShadeEnabled && mMediaDataManager.hasActiveMediaOrRecommendation(); boolean shouldAnimateClockChange = mScreenOffAnimationController.shouldAnimateClockChange(); - if ((hasVisibleNotifications && !mSplitShadeEnabled) - || (splitShadeWithActiveMedia && !mDozing)) { - mKeyguardStatusViewController.displayClock(SMALL, shouldAnimateClockChange); - } else { - mKeyguardStatusViewController.displayClock(LARGE, shouldAnimateClockChange); - } - updateKeyguardStatusViewAlignment(true /* animate */); + mKeyguardStatusViewController.displayClock(computeDesiredClockSize(), + shouldAnimateClockChange); + updateKeyguardStatusViewAlignment(/* animate= */true); int userSwitcherHeight = mKeyguardQsUserSwitchController != null ? mKeyguardQsUserSwitchController.getUserIconHeight() : 0; if (mKeyguardUserSwitcherController != null) { @@ -1460,7 +1452,7 @@ public final class NotificationPanelViewController extends PanelViewController { float expandedFraction = mScreenOffAnimationController.shouldExpandNotifications() ? 1.0f : getExpandedFraction(); - float darkamount = + float darkAmount = mScreenOffAnimationController.shouldExpandNotifications() ? 1.0f : mInterpolatedDarkAmount; @@ -1478,7 +1470,7 @@ public final class NotificationPanelViewController extends PanelViewController { mKeyguardStatusViewController.getLockscreenHeight(), userSwitcherHeight, userSwitcherPreferredY, - darkamount, mOverStretchAmount, + darkAmount, mOverStretchAmount, bypassEnabled, getUnlockedStackScrollerPadding(), computeQsExpansionFraction(), mDisplayTopInset, @@ -1510,6 +1502,34 @@ public final class NotificationPanelViewController extends PanelViewController { updateClock(); } + @ClockSize + private int computeDesiredClockSize() { + if (mSplitShadeEnabled) { + return computeDesiredClockSizeForSplitShade(); + } + return computeDesiredClockSizeForSingleShade(); + } + + @ClockSize + private int computeDesiredClockSizeForSingleShade() { + if (hasVisibleNotifications()) { + return SMALL; + } + return LARGE; + } + + @ClockSize + private int computeDesiredClockSizeForSplitShade() { + // Media is not visible to the user on AOD. + boolean isMediaVisibleToUser = + mMediaDataManager.hasActiveMediaOrRecommendation() && !isOnAod(); + if (isMediaVisibleToUser) { + // When media is visible, it overlaps with the large clock. Use small clock instead. + return SMALL; + } + return LARGE; + } + private void updateKeyguardStatusViewAlignment(boolean animate) { boolean shouldBeCentered = shouldKeyguardStatusViewBeCentered(); if (mStatusViewCentered != shouldBeCentered) { @@ -1536,12 +1556,35 @@ public final class NotificationPanelViewController extends PanelViewController { } private boolean shouldKeyguardStatusViewBeCentered() { - boolean hasVisibleNotifications = mNotificationStackScrollLayoutController + if (mSplitShadeEnabled) { + return shouldKeyguardStatusViewBeCenteredInSplitShade(); + } + return true; + } + + private boolean shouldKeyguardStatusViewBeCenteredInSplitShade() { + if (!hasVisibleNotifications()) { + // No notifications visible. It is safe to have the clock centered as there will be no + // overlap. + return true; + } + if (hasPulsingNotifications()) { + // Pulsing notification appears on the right. Move clock left to avoid overlap. + return false; + } + // "Visible" notifications are actually not visible on AOD (unless pulsing), so it is safe + // to center the clock without overlap. + return isOnAod(); + } + + private boolean isOnAod() { + return mDozing && mDozeParameters.getAlwaysOn(); + } + + private boolean hasVisibleNotifications() { + return mNotificationStackScrollLayoutController .getVisibleNotificationCount() != 0 || mMediaDataManager.hasActiveMediaOrRecommendation(); - boolean isOnAod = mDozing && mDozeParameters.getAlwaysOn(); - return !mSplitShadeEnabled || !hasVisibleNotifications || isOnAod - || hasPulsingNotifications(); } /** @@ -3795,6 +3838,8 @@ public final class NotificationPanelViewController extends PanelViewController { mAnimateNextPositionUpdate = false; } mNotificationStackScrollLayoutController.setPulsing(pulsing, animatePulse); + + updateKeyguardStatusViewAlignment(/* animate= */ true); } public void setAmbientIndicationTop(int ambientIndicationTop, boolean ambientTextVisible) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index fc28349e1e570..278e7b5163ff6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -911,7 +911,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { setDozing(/* dozing= */ true, /* dozingAlwaysOn= */ true); - assertThat(isKeyguardStatusViewCentered()).isTrue(); + assertKeyguardStatusViewCentered(); } @Test @@ -922,7 +922,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { setDozing(/* dozing= */ true, /* dozingAlwaysOn= */ false); - assertThat(isKeyguardStatusViewCentered()).isFalse(); + assertKeyguardStatusViewNotCentered(); } @Test @@ -933,19 +933,19 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ true); - assertThat(isKeyguardStatusViewCentered()).isFalse(); + assertKeyguardStatusViewNotCentered(); } @Test - public void keyguardStatusView_splitShade_pulsing_isCentered() { + public void keyguardStatusView_splitShade_pulsing_isNotCentered() { when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(2); when(mNotificationListContainer.hasPulsingNotifications()).thenReturn(true); mStatusBarStateController.setState(KEYGUARD); enableSplitShade(/* enabled= */ true); - setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ true); + setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ false); - assertThat(isKeyguardStatusViewCentered()).isFalse(); + assertKeyguardStatusViewNotCentered(); } @Test @@ -955,9 +955,9 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mStatusBarStateController.setState(KEYGUARD); enableSplitShade(/* enabled= */ true); - setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ true); + setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ false); - assertThat(isKeyguardStatusViewCentered()).isFalse(); + assertKeyguardStatusViewNotCentered(); } @Test @@ -970,7 +970,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mStatusBarStateController.setState(KEYGUARD); setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ false); - assertThat(isKeyguardStatusViewCentered()).isFalse(); + assertKeyguardStatusViewCentered(); } @Test @@ -1215,16 +1215,31 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @Test - public void testSwitchesToBigClockInSplitShadeOnAod() { + public void clockSize_mediaShowing_inSplitShade_onAod_isLarge() { + when(mDozeParameters.getAlwaysOn()).thenReturn(true); mStatusBarStateController.setState(KEYGUARD); enableSplitShade(/* enabled= */ true); when(mMediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(true); when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(2); clearInvocations(mKeyguardStatusViewController); - mNotificationPanelViewController.setDozing(true, false, null); + mNotificationPanelViewController.setDozing(/* dozing= */ true, /* animate= */ false, null); - verify(mKeyguardStatusViewController).displayClock(LARGE, /* animate */ true); + verify(mKeyguardStatusViewController).displayClock(LARGE, /* animate= */ true); + } + + @Test + public void clockSize_mediaShowing_inSplitShade_screenOff_notAod_isSmall() { + when(mDozeParameters.getAlwaysOn()).thenReturn(false); + mStatusBarStateController.setState(KEYGUARD); + enableSplitShade(/* enabled= */ true); + when(mMediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(true); + when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(2); + clearInvocations(mKeyguardStatusViewController); + + mNotificationPanelViewController.setDozing(/* dozing= */ true, /* animate= */ false, null); + + verify(mKeyguardStatusViewController).displayClock(SMALL, /* animate= */ true); } @Test @@ -1555,9 +1570,15 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { ); } - private boolean isKeyguardStatusViewCentered() { + private void assertKeyguardStatusViewCentered() { mNotificationPanelViewController.updateResources(); - return getConstraintSetLayout(R.id.keyguard_status_view).endToEnd - == ConstraintSet.PARENT_ID; + assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isAnyOf( + ConstraintSet.PARENT_ID, ConstraintSet.UNSET); + } + + private void assertKeyguardStatusViewNotCentered() { + mNotificationPanelViewController.updateResources(); + assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isEqualTo( + R.id.qs_edge_guideline); } }