Loading packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +63 −18 Original line number Diff line number Diff line Loading @@ -97,6 +97,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; Loading Loading @@ -1415,19 +1416,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) { Loading @@ -1436,7 +1428,7 @@ public final class NotificationPanelViewController extends PanelViewController { float expandedFraction = mScreenOffAnimationController.shouldExpandNotifications() ? 1.0f : getExpandedFraction(); float darkamount = float darkAmount = mScreenOffAnimationController.shouldExpandNotifications() ? 1.0f : mInterpolatedDarkAmount; Loading @@ -1454,7 +1446,7 @@ public final class NotificationPanelViewController extends PanelViewController { mKeyguardStatusViewController.getLockscreenHeight(), userSwitcherHeight, userSwitcherPreferredY, darkamount, mOverStretchAmount, darkAmount, mOverStretchAmount, bypassEnabled, getUnlockedStackScrollerPadding(), computeQsExpansionFraction(), mDisplayTopInset, Loading Loading @@ -1486,6 +1478,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) { Loading @@ -1512,12 +1532,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(); } /** Loading Loading @@ -3789,6 +3832,8 @@ public final class NotificationPanelViewController extends PanelViewController { mAnimateNextPositionUpdate = false; } mNotificationStackScrollLayoutController.setPulsing(pulsing, animatePulse); updateKeyguardStatusViewAlignment(/* animate= */ true); } public void setAmbientIndicationTop(int ambientIndicationTop, boolean ambientTextVisible) { Loading packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +35 −13 Original line number Diff line number Diff line Loading @@ -905,7 +905,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { setDozing(/* dozing= */ true, /* dozingAlwaysOn= */ true); assertThat(isKeyguardStatusViewCentered()).isTrue(); assertKeyguardStatusViewCentered(); } @Test Loading @@ -916,7 +916,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { setDozing(/* dozing= */ true, /* dozingAlwaysOn= */ false); assertThat(isKeyguardStatusViewCentered()).isFalse(); assertKeyguardStatusViewNotCentered(); } @Test Loading @@ -927,19 +927,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 Loading @@ -949,9 +949,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 Loading @@ -964,7 +964,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mStatusBarStateController.setState(KEYGUARD); setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ false); assertThat(isKeyguardStatusViewCentered()).isFalse(); assertKeyguardStatusViewCentered(); } @Test Loading Loading @@ -1209,7 +1209,8 @@ 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); Loading @@ -1217,9 +1218,24 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { clearInvocations(mKeyguardStatusViewController); mNotificationPanelViewController.setDozing(/* dozing= */ true, /* animate= */ false); 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); verify(mKeyguardStatusViewController).displayClock(SMALL, /* animate= */ true); } @Test public void testSwitchesToBigClockInSplitShadeOnAodAnimateDisabled() { when(mScreenOffAnimationController.shouldAnimateClockChange()).thenReturn(false); Loading Loading @@ -1547,9 +1563,15 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { ); } private boolean isKeyguardStatusViewCentered() { private void assertKeyguardStatusViewCentered() { mNotificationPanelViewController.updateResources(); assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isAnyOf( ConstraintSet.PARENT_ID, ConstraintSet.UNSET); } private void assertKeyguardStatusViewNotCentered() { mNotificationPanelViewController.updateResources(); return getConstraintSetLayout(R.id.keyguard_status_view).endToEnd == ConstraintSet.PARENT_ID; assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isEqualTo( R.id.qs_edge_guideline); } } Loading
packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +63 −18 Original line number Diff line number Diff line Loading @@ -97,6 +97,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; Loading Loading @@ -1415,19 +1416,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) { Loading @@ -1436,7 +1428,7 @@ public final class NotificationPanelViewController extends PanelViewController { float expandedFraction = mScreenOffAnimationController.shouldExpandNotifications() ? 1.0f : getExpandedFraction(); float darkamount = float darkAmount = mScreenOffAnimationController.shouldExpandNotifications() ? 1.0f : mInterpolatedDarkAmount; Loading @@ -1454,7 +1446,7 @@ public final class NotificationPanelViewController extends PanelViewController { mKeyguardStatusViewController.getLockscreenHeight(), userSwitcherHeight, userSwitcherPreferredY, darkamount, mOverStretchAmount, darkAmount, mOverStretchAmount, bypassEnabled, getUnlockedStackScrollerPadding(), computeQsExpansionFraction(), mDisplayTopInset, Loading Loading @@ -1486,6 +1478,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) { Loading @@ -1512,12 +1532,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(); } /** Loading Loading @@ -3789,6 +3832,8 @@ public final class NotificationPanelViewController extends PanelViewController { mAnimateNextPositionUpdate = false; } mNotificationStackScrollLayoutController.setPulsing(pulsing, animatePulse); updateKeyguardStatusViewAlignment(/* animate= */ true); } public void setAmbientIndicationTop(int ambientIndicationTop, boolean ambientTextVisible) { Loading
packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +35 −13 Original line number Diff line number Diff line Loading @@ -905,7 +905,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { setDozing(/* dozing= */ true, /* dozingAlwaysOn= */ true); assertThat(isKeyguardStatusViewCentered()).isTrue(); assertKeyguardStatusViewCentered(); } @Test Loading @@ -916,7 +916,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { setDozing(/* dozing= */ true, /* dozingAlwaysOn= */ false); assertThat(isKeyguardStatusViewCentered()).isFalse(); assertKeyguardStatusViewNotCentered(); } @Test Loading @@ -927,19 +927,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 Loading @@ -949,9 +949,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 Loading @@ -964,7 +964,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mStatusBarStateController.setState(KEYGUARD); setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ false); assertThat(isKeyguardStatusViewCentered()).isFalse(); assertKeyguardStatusViewCentered(); } @Test Loading Loading @@ -1209,7 +1209,8 @@ 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); Loading @@ -1217,9 +1218,24 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { clearInvocations(mKeyguardStatusViewController); mNotificationPanelViewController.setDozing(/* dozing= */ true, /* animate= */ false); 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); verify(mKeyguardStatusViewController).displayClock(SMALL, /* animate= */ true); } @Test public void testSwitchesToBigClockInSplitShadeOnAodAnimateDisabled() { when(mScreenOffAnimationController.shouldAnimateClockChange()).thenReturn(false); Loading Loading @@ -1547,9 +1563,15 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { ); } private boolean isKeyguardStatusViewCentered() { private void assertKeyguardStatusViewCentered() { mNotificationPanelViewController.updateResources(); assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isAnyOf( ConstraintSet.PARENT_ID, ConstraintSet.UNSET); } private void assertKeyguardStatusViewNotCentered() { mNotificationPanelViewController.updateResources(); return getConstraintSetLayout(R.id.keyguard_status_view).endToEnd == ConstraintSet.PARENT_ID; assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd).isEqualTo( R.id.qs_edge_guideline); } }