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

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

Fix media being stretched during the wake-up/unlock animation

This happened only on large screens/split shade, and when there was an
explicit delay to play the doze wake up animation.

During this delay, the device will not be in the "dozing" state anymore,
therefore media was showing up, but the rest of the keyguard was still
positioned as if it was in the "dozing" state, centered, and using the
full width of the screen. Since media is a child view of keyguard on
large screens, it was also using the full width of the screen.

The fix is to keep media hidden during this delay.

Fixes: 283479104
Test: KeyguardMediaControllerTest.kt
Test: NotificationPanelViewControllerTest.java
Change-Id: Id004a74d95e66e7f33ef52aca0dc655db767b893
parent 43d8d44e
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -128,6 +128,15 @@ constructor(

    var visibilityChangedListener: ((Boolean) -> Unit)? = null

    /**
     * Whether the doze wake up animation is delayed and we are currently waiting for it to start.
     */
    var isDozeWakeUpAnimationWaiting: Boolean = false
        set(value) {
            field = value
            refreshMediaPosition()
        }

    /** single pane media container placed at the top of the notifications list */
    var singlePaneContainer: MediaContainerView? = null
        private set
@@ -221,7 +230,13 @@ constructor(
        // by the clock. This is not the case for single-line clock though.
        // For single shade, we don't need to do it, because media is a child of NSSL, which already
        // gets hidden on AOD.
        return !statusBarStateController.isDozing
        // Media also has to be hidden when waking up from dozing, and the doze wake up animation is
        // delayed and waiting to be started.
        // This is to stay in sync with the delaying of the horizontal alignment of the rest of the
        // keyguard container, that is also delayed until the "wait" is over.
        // If we show media during this waiting period, the shade will still be centered, and using
        // the entire width of the screen, and making media show fully stretched.
        return !statusBarStateController.isDozing && !isDozeWakeUpAnimationWaiting
    }

    private fun showMediaPlayer() {
+1 −0
Original line number Diff line number Diff line
@@ -1625,6 +1625,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump

        mWillPlayDelayedDozeAmountAnimation = willPlay;
        mWakeUpCoordinator.logDelayingClockWakeUpAnimation(willPlay);
        mKeyguardMediaController.setDozeWakeUpAnimationWaiting(willPlay);

        // Once changing this value, see if we should move the clock.
        positionClockAndNotifications();
+22 −0
Original line number Diff line number Diff line
@@ -192,6 +192,17 @@ class KeyguardMediaControllerTest : SysuiTestCase() {
        assertThat(splitShadeContainer.visibility).isEqualTo(GONE)
    }

    @Test
    fun dozeWakeUpAnimationWaiting_inSplitShade_mediaIsHidden() {
        val splitShadeContainer = FrameLayout(context)
        keyguardMediaController.attachSplitShadeContainer(splitShadeContainer)
        keyguardMediaController.useSplitShade = true

        keyguardMediaController.isDozeWakeUpAnimationWaiting = true

        assertThat(splitShadeContainer.visibility).isEqualTo(GONE)
    }

    @Test
    fun dozing_inSingleShade_mediaIsVisible() {
        val splitShadeContainer = FrameLayout(context)
@@ -203,6 +214,17 @@ class KeyguardMediaControllerTest : SysuiTestCase() {
        assertThat(mediaContainerView.visibility).isEqualTo(VISIBLE)
    }

    @Test
    fun dozeWakeUpAnimationWaiting_inSingleShade_mediaIsVisible() {
        val splitShadeContainer = FrameLayout(context)
        keyguardMediaController.attachSplitShadeContainer(splitShadeContainer)
        keyguardMediaController.useSplitShade = false

        keyguardMediaController.isDozeWakeUpAnimationWaiting = true

        assertThat(mediaContainerView.visibility).isEqualTo(VISIBLE)
    }

    private fun setDozing() {
        whenever(statusBarStateController.isDozing).thenReturn(true)
        statusBarStateListener.onDozingChanged(true)
+11 −0
Original line number Diff line number Diff line
@@ -513,6 +513,17 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo
        assertKeyguardStatusViewNotCentered();
    }

    @Test
    public void keyguardStatusView_willPlayDelayedDoze_notifiesKeyguardMediaController() {
        when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(2);
        mStatusBarStateController.setState(KEYGUARD);
        enableSplitShade(/* enabled= */ true);

        mNotificationPanelViewController.setWillPlayDelayedDozeAmountAnimation(true);

        verify(mKeyguardMediaController).setDozeWakeUpAnimationWaiting(true);
    }

    @Test
    public void keyguardStatusView_willPlayDelayedDoze_isCentered_thenStillCenteredIfNoNotifs() {
        when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(0);