[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
This commit is contained in:
committed by
Christian Göllner
parent
592f8bf611
commit
c0a699a0ed
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user