Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0a699a0 authored by Christian Göllner's avatar Christian Göllner Committed by Christian Göllner
Browse files

[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
parent 592f8bf6
Loading
Loading
Loading
Loading
+63 −18
Original line number Diff line number Diff line
@@ -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) {
+36 −15
Original line number Diff line number Diff line
@@ -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();
        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);
    }
}