Merge "[Slit shade] Fix pulsing notification overlapping with centered clock" into tm-qpr-dev

This commit is contained in:
Christian Göllner
2022-08-19 10:39:12 +00:00
committed by Android (Google) Code Review
2 changed files with 99 additions and 33 deletions

View File

@@ -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;
@@ -1427,19 +1428,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) {
@@ -1448,7 +1440,7 @@ public final class NotificationPanelViewController extends PanelViewController {
float expandedFraction =
mScreenOffAnimationController.shouldExpandNotifications()
? 1.0f : getExpandedFraction();
float darkamount =
float darkAmount =
mScreenOffAnimationController.shouldExpandNotifications()
? 1.0f : mInterpolatedDarkAmount;
@@ -1466,7 +1458,7 @@ public final class NotificationPanelViewController extends PanelViewController {
mKeyguardStatusViewController.getLockscreenHeight(),
userSwitcherHeight,
userSwitcherPreferredY,
darkamount, mOverStretchAmount,
darkAmount, mOverStretchAmount,
bypassEnabled, getUnlockedStackScrollerPadding(),
computeQsExpansionFraction(),
mDisplayTopInset,
@@ -1498,6 +1490,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) {
@@ -1524,12 +1544,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();
}
/**
@@ -3783,6 +3826,8 @@ public final class NotificationPanelViewController extends PanelViewController {
mAnimateNextPositionUpdate = false;
}
mNotificationStackScrollLayoutController.setPulsing(pulsing, animatePulse);
updateKeyguardStatusViewAlignment(/* animate= */ true);
}
public void setAmbientIndicationTop(int ambientIndicationTop, boolean ambientTextVisible) {

View File

@@ -904,7 +904,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
setDozing(/* dozing= */ true, /* dozingAlwaysOn= */ true);
assertThat(isKeyguardStatusViewCentered()).isTrue();
assertKeyguardStatusViewCentered();
}
@Test
@@ -915,7 +915,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
setDozing(/* dozing= */ true, /* dozingAlwaysOn= */ false);
assertThat(isKeyguardStatusViewCentered()).isFalse();
assertKeyguardStatusViewNotCentered();
}
@Test
@@ -926,19 +926,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
@@ -948,9 +948,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
@@ -963,7 +963,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
mStatusBarStateController.setState(KEYGUARD);
setDozing(/* dozing= */ false, /* dozingAlwaysOn= */ false);
assertThat(isKeyguardStatusViewCentered()).isFalse();
assertKeyguardStatusViewCentered();
}
@Test
@@ -1208,16 +1208,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
@@ -1548,9 +1563,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);
}
}