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

Commit ad91a8d9 authored by Peter Kalauskas's avatar Peter Kalauskas Committed by Automerger Merge Worker
Browse files

Merge "Start AOD transition a frame earlier" into tm-dev am: 42c727df am: 3a76f7cf

parents d06896d8 3a76f7cf
Loading
Loading
Loading
Loading
+21 −5
Original line number Original line Diff line number Diff line
@@ -44,6 +44,7 @@ import android.view.animation.Interpolator;
import androidx.annotation.NonNull;
import androidx.annotation.NonNull;


import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.jank.InteractionJankMonitor.Configuration;
import com.android.internal.jank.InteractionJankMonitor.Configuration;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLogger;
@@ -335,10 +336,24 @@ public class StatusBarStateControllerImpl implements
                    ? Interpolators.FAST_OUT_SLOW_IN
                    ? Interpolators.FAST_OUT_SLOW_IN
                    : Interpolators.TOUCH_RESPONSE_REVERSE;
                    : Interpolators.TOUCH_RESPONSE_REVERSE;
        }
        }
        mDarkAnimator = ObjectAnimator.ofFloat(this, SET_DARK_AMOUNT_PROPERTY, mDozeAmountTarget);
        if (mDozeAmount == 1f && !mIsDozing) {
        mDarkAnimator.setInterpolator(Interpolators.LINEAR);
            // Workaround to force relayoutWindow to be called a frame earlier. Otherwise, if
        mDarkAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP);
            // mDozeAmount = 1f, then neither start() nor the first frame of the animation will
        mDarkAnimator.addListener(new AnimatorListenerAdapter() {
            // cause the scrim opacity to change, which ultimately results in an extra relayout and
            // causes us to miss a frame. By settings the doze amount to be <1f a frame earlier,
            // we can batch the relayout with the one in NotificationShadeWindowControllerImpl.
            setDozeAmountInternal(0.99f);
        }
        mDarkAnimator = createDarkAnimator();
    }

    @VisibleForTesting
    protected ObjectAnimator createDarkAnimator() {
        ObjectAnimator darkAnimator = ObjectAnimator.ofFloat(
                this, SET_DARK_AMOUNT_PROPERTY, mDozeAmountTarget);
        darkAnimator.setInterpolator(Interpolators.LINEAR);
        darkAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP);
        darkAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            @Override
            public void onAnimationCancel(Animator animation) {
            public void onAnimationCancel(Animator animation) {
                cancelInteractionJankMonitor();
                cancelInteractionJankMonitor();
@@ -354,7 +369,8 @@ public class StatusBarStateControllerImpl implements
                beginInteractionJankMonitor();
                beginInteractionJankMonitor();
            }
            }
        });
        });
        mDarkAnimator.start();
        darkAnimator.start();
        return darkAnimator;
    }
    }


    private void setDozeAmountInternal(float dozeAmount) {
    private void setDozeAmountInternal(float dozeAmount) {
+25 −2
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.systemui.statusbar
package com.android.systemui.statusbar


import android.animation.ObjectAnimator
import android.testing.AndroidTestingRunner
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.testing.TestableLooper
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
@@ -46,6 +47,7 @@ import org.mockito.Mockito.`when` as whenever
class StatusBarStateControllerImplTest : SysuiTestCase() {
class StatusBarStateControllerImplTest : SysuiTestCase() {


    @Mock lateinit var interactionJankMonitor: InteractionJankMonitor
    @Mock lateinit var interactionJankMonitor: InteractionJankMonitor
    @Mock private lateinit var mockDarkAnimator: ObjectAnimator


    private lateinit var controller: StatusBarStateControllerImpl
    private lateinit var controller: StatusBarStateControllerImpl
    private lateinit var uiEventLogger: UiEventLoggerFake
    private lateinit var uiEventLogger: UiEventLoggerFake
@@ -57,11 +59,13 @@ class StatusBarStateControllerImplTest : SysuiTestCase() {
        whenever(interactionJankMonitor.end(anyInt())).thenReturn(true)
        whenever(interactionJankMonitor.end(anyInt())).thenReturn(true)


        uiEventLogger = UiEventLoggerFake()
        uiEventLogger = UiEventLoggerFake()
        controller = StatusBarStateControllerImpl(
        controller = object : StatusBarStateControllerImpl(
            uiEventLogger,
            uiEventLogger,
            mock(DumpManager::class.java),
            mock(DumpManager::class.java),
            interactionJankMonitor
            interactionJankMonitor
        )
        ) {
            override fun createDarkAnimator(): ObjectAnimator { return mockDarkAnimator }
        }
    }
    }


    @Test
    @Test
@@ -127,4 +131,23 @@ class StatusBarStateControllerImplTest : SysuiTestCase() {
        // Double check that we can still force it to happen.
        // Double check that we can still force it to happen.
        assertTrue(controller.setState(StatusBarState.SHADE, true /* force */))
        assertTrue(controller.setState(StatusBarState.SHADE, true /* force */))
    }
    }

    @Test
    fun testSetDozeAmount_immediatelyChangesDozeAmount_lockscreenTransitionFromAod() {
        // Put controller in AOD state
        controller.setDozeAmount(1f, false)

        // When waking from doze, CentralSurfaces#updateDozingState will update the dozing state
        // before the doze amount changes
        controller.setIsDozing(false)

        // Animate the doze amount to 0f, as would normally happen
        controller.setAndInstrumentDozeAmount(null, 0f, true)

        // Check that the doze amount is immediately set to a value slightly less than 1f. This is
        // to ensure that any scrim implementation changes its opacity immediately rather than
        // waiting an extra frame. Waiting an extra frame will cause a relayout (which is expensive)
        // and cause us to drop a frame during the LOCKSCREEN_TRANSITION_FROM_AOD CUJ.
        assertEquals(0.99f, controller.dozeAmount, 0.009f)
    }
}
}