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

Commit 64feeb26 authored by Marzia Favaro's avatar Marzia Favaro
Browse files

Restrict to assumptions that have been valid for a while

Bug: 327332488
Test: DimmerTests
Flag: EXEMPT no logic change

Change-Id: I545a39ec0fae15f98b138bfd3487c675e1f834f8
parent 0d323f1d
Loading
Loading
Loading
Loading
+15 −16
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ class Dimmer {
        SurfaceControl mDimSurface;
        final WindowContainer<?> mHostContainer;
        // The last container to request to dim
        private WindowContainer<?> mLastRequestedDimContainer;
        private WindowState mLastDimmingWindow;
        /** Animation */
        private final DimmerAnimationHelper mAnimationHelper;
        boolean mSkipAnimation = false;
@@ -129,8 +129,8 @@ class Dimmer {
         * Set the parameters to prepare the dim to be relative parented to the dimming container
         */
        void prepareReparent(@NonNull WindowContainer<?> geometryParent,
                @NonNull WindowContainer<?> relativeParent, int relativeLayer) {
            mAnimationHelper.setRequestedRelativeParent(relativeParent, relativeLayer);
                @NonNull WindowState relativeParent) {
            mAnimationHelper.setRequestedRelativeParent(relativeParent);
            mAnimationHelper.setRequestedGeometryParent(geometryParent);
        }

@@ -146,7 +146,7 @@ class Dimmer {
         * Whether anyone is currently requesting the dim
         */
        boolean isDimming() {
            return mLastRequestedDimContainer != null
            return mLastDimmingWindow != null
                    && (mHostContainer.isVisibleRequested() || !Flags.useTasksDimOnly());
        }

@@ -186,7 +186,7 @@ class Dimmer {
     */
    void resetDimStates() {
        if (mDimState != null) {
            mDimState.mLastRequestedDimContainer = null;
            mDimState.mLastDimmingWindow = null;
        }
    }

@@ -200,7 +200,7 @@ class Dimmer {
     * @param alpha      Dim amount
     * @param blurRadius Blur amount
     */
    protected void adjustAppearance(@NonNull WindowContainer<?> dimmingContainer,
    protected void adjustAppearance(@NonNull WindowState dimmingContainer,
                                    float alpha, int blurRadius) {
        final DimState d = obtainDimState(dimmingContainer);
        d.prepareLookChange(alpha, blurRadius);
@@ -218,14 +218,13 @@ class Dimmer {
     * continue dimming. Indeed, this method won't be able to keep dimming or get a new DimState
     * without also adjusting the appearance.
     * @param geometryParent    The container that defines the geometry of the dim
     * @param dimmingContainer      The container which to dim above. Should be a child of the host.
     * @param relativeLayer  The position of the dim wrt the container
     * @param dimmingContainer      The container that is dimming. The dim layer will be rel-z
     *                              parented below it
     */
    public void adjustPosition(@NonNull WindowContainer<?> geometryParent,
                                    @NonNull WindowContainer<?> dimmingContainer,
                                    int relativeLayer) {
                                    @NonNull WindowState dimmingContainer) {
        if (mDimState != null) {
            mDimState.prepareReparent(geometryParent, dimmingContainer, relativeLayer);
            mDimState.prepareReparent(geometryParent, dimmingContainer);
        }
    }

@@ -250,9 +249,9 @@ class Dimmer {
            if (!Flags.useTasksDimOnly()) {
                mDimState.adjustSurfaceLayout(t);
            }
            final WindowState ws = mDimState.mLastRequestedDimContainer.asWindowState();
            if (!mDimState.mIsVisible && ws != null && ws.mActivityRecord != null
                    && ws.mActivityRecord.mStartingData != null) {
            if (!mDimState.mIsVisible && mDimState.mLastDimmingWindow != null
                    && mDimState.mLastDimmingWindow.mActivityRecord != null
                    && mDimState.mLastDimmingWindow.mActivityRecord.mStartingData != null) {
                // Skip enter animation while starting window is on top of its activity
                mDimState.mSkipAnimation = true;
            }
@@ -262,11 +261,11 @@ class Dimmer {
    }

    @NonNull
    private DimState obtainDimState(@NonNull WindowContainer<?> container) {
    private DimState obtainDimState(@NonNull WindowState window) {
        if (mDimState == null) {
            mDimState = new DimState();
        }
        mDimState.mLastRequestedDimContainer = container;
        mDimState.mLastDimmingWindow = window;
        return mDimState;
    }

+18 −17
Original line number Diff line number Diff line
@@ -48,9 +48,8 @@ public class DimmerAnimationHelper {
    static class Change {
        private float mAlpha = -1f;
        private int mBlurRadius = -1;
        private WindowContainer<?> mDimmingContainer = null;
        private WindowState mDimmingContainer = null;
        private WindowContainer<?> mGeometryParent = null;
        private int mRelativeLayer = -1;
        private static final float EPSILON = 0.0001f;

        Change() {}
@@ -64,7 +63,6 @@ public class DimmerAnimationHelper {
            mBlurRadius = other.mBlurRadius;
            mDimmingContainer = other.mDimmingContainer;
            mGeometryParent = other.mGeometryParent;
            mRelativeLayer = other.mRelativeLayer;
        }

        // Same alpha and blur
@@ -84,7 +82,7 @@ public class DimmerAnimationHelper {
        @Override
        public String toString() {
            return "Dim state: alpha=" + mAlpha + ", blur=" + mBlurRadius + ", container="
                    + mDimmingContainer + ", relativePosition=" + mRelativeLayer;
                    + mDimmingContainer + ", geometryParent " + mGeometryParent;
        }
    }

@@ -100,14 +98,13 @@ public class DimmerAnimationHelper {
    }

    void setExitParameters() {
        setRequestedRelativeParent(mRequestedProperties.mDimmingContainer, -1 /* relativeLayer */);
        setRequestedRelativeParent(mRequestedProperties.mDimmingContainer);
        setRequestedAppearance(0f /* alpha */, 0 /* blur */);
    }

    // Sets a requested change without applying it immediately
    void setRequestedRelativeParent(@NonNull WindowContainer<?> relativeParent, int relativeLayer) {
    void setRequestedRelativeParent(@NonNull WindowState relativeParent) {
        mRequestedProperties.mDimmingContainer = relativeParent;
        mRequestedProperties.mRelativeLayer = relativeLayer;
    }

    // Sets the requested layer to reparent the dim to without applying it immediately
@@ -124,7 +121,7 @@ public class DimmerAnimationHelper {
    /**
     * Commit the last changes we received. Called after
     * {@link Change#setExitParameters()},
     * {@link Change#setRequestedRelativeParent(WindowContainer, int)}, or
     * {@link Change#setRequestedRelativeParent(WindowContainer)}, or
     * {@link Change#setRequestedAppearance(float, int)}
     */
    void applyChanges(@NonNull SurfaceControl.Transaction t, @NonNull Dimmer.DimState dim) {
@@ -147,8 +144,8 @@ public class DimmerAnimationHelper {
        reparent(dim.mDimSurface,
                startProperties.mGeometryParent != mRequestedProperties.mGeometryParent
                        ? mRequestedProperties.mGeometryParent.getSurfaceControl() : null,
                mRequestedProperties.mDimmingContainer.getSurfaceControl(),
                mRequestedProperties.mRelativeLayer, t);
                mRequestedProperties.mDimmingContainer != startProperties.mDimmingContainer
                        ? mRequestedProperties.mDimmingContainer.getSurfaceControl() : null, t);

        if (!startProperties.hasSameVisualProperties(mRequestedProperties)) {
            stopCurrentAnimation(dim.mDimSurface);
@@ -232,14 +229,15 @@ public class DimmerAnimationHelper {
     */
    static void reparent(@NonNull SurfaceControl dimLayer,
                  @Nullable SurfaceControl newGeometryParent,
                  @NonNull SurfaceControl relativeParent,
                  int relativePosition,
                  @Nullable SurfaceControl newRelativeParent,
                  @NonNull SurfaceControl.Transaction t) {
        try {
            if (newGeometryParent != null) {
                t.reparent(dimLayer, newGeometryParent);
            }
            t.setRelativeLayer(dimLayer, relativeParent, relativePosition);
            if (newRelativeParent != null) {
                t.setRelativeLayer(dimLayer, newRelativeParent, -1);
            }
        } catch (NullPointerException e) {
            Log.w(TAG, "Tried to change parent of dim " + dimLayer + " after remove", e);
        }
@@ -256,11 +254,14 @@ public class DimmerAnimationHelper {

    private static long getDimDuration(@NonNull WindowContainer<?> container) {
        // Use the same duration as the animation on the WindowContainer
        if (container.mSurfaceAnimator != null) {
            AnimationAdapter animationAdapter = container.mSurfaceAnimator.getAnimation();
            final float durationScale = container.mWmService.getTransitionAnimationScaleLocked();
            return animationAdapter == null ? (long) (DEFAULT_DIM_ANIM_DURATION_MS * durationScale)
                    : animationAdapter.getDurationHint();
        }
        return 0;
    }

    /**
     * Collects the animation specifics
+1 −2
Original line number Diff line number Diff line
@@ -5210,8 +5210,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
            if (isVisibleNow()) {
                dimmer.adjustAppearance(this, dimAmount, blurRadius);
            }
            dimmer.adjustPosition(geometryParent,
                    this /* relativeParent */, -1 /* relativeLayer */);
            dimmer.adjustPosition(geometryParent, this /* relativeParent */);
        }
    }

+58 −91
Original line number Diff line number Diff line
@@ -52,39 +52,14 @@ import org.junit.runner.RunWith;
@RunWith(WindowTestRunner.class)
public class DimmerTests extends WindowTestsBase {

    private static class TestWindowContainer extends WindowContainer<TestWindowContainer> {
        final SurfaceControl mControl = mock(SurfaceControl.class);
        final SurfaceControl.Transaction mPendingTransaction = spy(StubTransaction.class);
        final SurfaceControl.Transaction mSyncTransaction = spy(StubTransaction.class);

        TestWindowContainer(WindowManagerService wm) {
            super(wm);
            setVisibleRequested(true);
        }

        @Override
        public SurfaceControl getSurfaceControl() {
            return mControl;
        }

        @Override
        public SurfaceControl.Transaction getSyncTransaction() {
            return mSyncTransaction;
        }

        @Override
        public SurfaceControl.Transaction getPendingTransaction() {
            return mPendingTransaction;
        }
    }

    private static class MockSurfaceBuildingContainer extends WindowContainer<TestWindowContainer> {
    private static class MockSurfaceBuildingContainer extends WindowContainer<WindowState> {
        final SurfaceSession mSession = new SurfaceSession();
        final SurfaceControl mHostControl = mock(SurfaceControl.class);
        final SurfaceControl.Transaction mHostTransaction = spy(StubTransaction.class);

        MockSurfaceBuildingContainer(WindowManagerService wm) {
            super(wm);
            mVisibleRequested = true;
        }

        class MockSurfaceBuilder extends SurfaceControl.Builder {
@@ -129,28 +104,41 @@ public class DimmerTests extends WindowTestsBase {
        }
    }

    private MockSurfaceBuildingContainer mHost;
    private Dimmer mDimmer;
    private SurfaceControl.Transaction mTransaction;
    private TestWindowContainer mChild;
    private WindowState mChild1;
    private WindowState mChild2;
    private static AnimationAdapter sTestAnimation;

    @Before
    public void setUp() throws Exception {
        mHost = new MockSurfaceBuildingContainer(mWm);
        MockSurfaceBuildingContainer host = new MockSurfaceBuildingContainer(mWm);
        mTransaction = spy(StubTransaction.class);
        mChild = new TestWindowContainer(mWm);

        final SurfaceControl mControl1 = mock(SurfaceControl.class);
        final SurfaceControl mControl2 = mock(SurfaceControl.class);

        SurfaceAnimator animator = mock(SurfaceAnimator.class);
        when(animator.getAnimation()).thenReturn(null);

        mChild1 = mock(WindowState.class);
        when(mChild1.getSurfaceControl()).thenReturn(mControl1);

        mChild2 = mock(WindowState.class);
        when(mChild2.getSurfaceControl()).thenReturn(mControl2);

        host.addChild(mChild1, 0);
        host.addChild(mChild2, 1);

        sTestAnimation = spy(new MockAnimationAdapter());
        mDimmer = new Dimmer(mHost, new MockAnimationAdapterFactory());
        mDimmer = new Dimmer(host, new MockAnimationAdapterFactory());
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_USE_TASKS_DIM_ONLY)
    public void testUpdateDimsAppliesCrop() {
        mHost.addChild(mChild, 0);

        mDimmer.adjustAppearance(mChild, 1, 1);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, 1, 1);
        mDimmer.adjustPosition(mChild1, mChild1);

        int width = 100;
        int height = 300;
@@ -165,9 +153,8 @@ public class DimmerTests extends WindowTestsBase {
    public void testDimBelowWithChildSurfaceCreatesSurfaceBelowChild() {
        final float alpha = 0.7f;
        final int blur = 50;
        mHost.addChild(mChild, 0);
        mDimmer.adjustAppearance(mChild, alpha, blur);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, alpha, blur);
        mDimmer.adjustPosition(mChild1, mChild1);
        SurfaceControl dimLayer = mDimmer.getDimLayer();

        assertNotNull("Dimmer should have created a surface", dimLayer);
@@ -175,25 +162,23 @@ public class DimmerTests extends WindowTestsBase {
        mDimmer.updateDims(mTransaction);
        verify(sTestAnimation).startAnimation(eq(dimLayer), eq(mTransaction),
                anyInt(), any(SurfaceAnimator.OnAnimationFinishedCallback.class));
        verify(mTransaction).setRelativeLayer(dimLayer, mChild.mControl, -1);
        verify(mTransaction).setRelativeLayer(dimLayer, mChild1.getSurfaceControl(), -1);
        verify(mTransaction, lastCall()).setAlpha(dimLayer, alpha);
        verify(mTransaction).setBackgroundBlurRadius(dimLayer, blur);
    }

    @Test
    public void testDimBelowWithChildSurfaceDestroyedWhenReset() {
        mHost.addChild(mChild, 0);

        final float alpha = 0.8f;
        final int blur = 50;
        // Dim once
        mDimmer.adjustAppearance(mChild, alpha, blur);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, alpha, blur);
        mDimmer.adjustPosition(mChild1, mChild1);
        SurfaceControl dimLayer = mDimmer.getDimLayer();
        mDimmer.updateDims(mTransaction);
        // Reset, and don't dim
        mDimmer.resetDimStates();
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustPosition(mChild1, mChild1);
        mDimmer.updateDims(mTransaction);
        verify(mTransaction).show(dimLayer);
        verify(mTransaction).remove(dimLayer);
@@ -201,19 +186,17 @@ public class DimmerTests extends WindowTestsBase {

    @Test
    public void testDimBelowWithChildSurfaceNotDestroyedWhenPersisted() {
        mHost.addChild(mChild, 0);

        final float alpha = 0.8f;
        final int blur = 20;
        // Dim once
        mDimmer.adjustAppearance(mChild, alpha, blur);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, alpha, blur);
        mDimmer.adjustPosition(mChild1, mChild1);
        SurfaceControl dimLayer = mDimmer.getDimLayer();
        mDimmer.updateDims(mTransaction);
        // Reset and dim again
        mDimmer.resetDimStates();
        mDimmer.adjustAppearance(mChild, alpha, blur);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, alpha, blur);
        mDimmer.adjustPosition(mChild1, mChild1);
        mDimmer.updateDims(mTransaction);
        verify(mTransaction).show(dimLayer);
        verify(mTransaction, never()).remove(dimLayer);
@@ -222,10 +205,9 @@ public class DimmerTests extends WindowTestsBase {
    @Test
    @RequiresFlagsDisabled(Flags.FLAG_USE_TASKS_DIM_ONLY)
    public void testDimUpdateWhileDimming() {
        mHost.addChild(mChild, 0);
        final float alpha = 0.8f;
        mDimmer.adjustAppearance(mChild, alpha, 20);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, alpha, 20);
        mDimmer.adjustPosition(mChild1, mChild1);
        final Rect bounds = mDimmer.getDimBounds();

        SurfaceControl dimLayer = mDimmer.getDimLayer();
@@ -243,9 +225,8 @@ public class DimmerTests extends WindowTestsBase {

    @Test
    public void testRemoveDimImmediately() {
        mHost.addChild(mChild, 0);
        mDimmer.adjustAppearance(mChild, 1, 2);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, 1, 2);
        mDimmer.adjustPosition(mChild1, mChild1);
        SurfaceControl dimLayer = mDimmer.getDimLayer();
        mDimmer.updateDims(mTransaction);
        verify(mTransaction, times(1)).show(dimLayer);
@@ -266,22 +247,20 @@ public class DimmerTests extends WindowTestsBase {
     */
    @Test
    public void testContainerDimsOpeningAnimationByItself() {
        mHost.addChild(mChild, 0);

        mDimmer.resetDimStates();
        mDimmer.adjustAppearance(mChild, 0.1f, 0);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, 0.1f, 0);
        mDimmer.adjustPosition(mChild1, mChild1);
        SurfaceControl dimLayer = mDimmer.getDimLayer();
        mDimmer.updateDims(mTransaction);

        mDimmer.resetDimStates();
        mDimmer.adjustAppearance(mChild, 0.2f, 0);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, 0.2f, 0);
        mDimmer.adjustPosition(mChild1, mChild1);
        mDimmer.updateDims(mTransaction);

        mDimmer.resetDimStates();
        mDimmer.adjustAppearance(mChild, 0.3f, 0);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, 0.3f, 0);
        mDimmer.adjustPosition(mChild1, mChild1);
        mDimmer.updateDims(mTransaction);

        verify(mTransaction).setAlpha(dimLayer, 0.2f);
@@ -297,22 +276,20 @@ public class DimmerTests extends WindowTestsBase {
     */
    @Test
    public void testContainerDimsClosingAnimationByItself() {
        mHost.addChild(mChild, 0);

        mDimmer.resetDimStates();
        mDimmer.adjustAppearance(mChild, 0.2f, 0);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, 0.2f, 0);
        mDimmer.adjustPosition(mChild1, mChild1);
        SurfaceControl dimLayer = mDimmer.getDimLayer();
        mDimmer.updateDims(mTransaction);

        mDimmer.resetDimStates();
        mDimmer.adjustAppearance(mChild, 0.1f, 0);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, 0.1f, 0);
        mDimmer.adjustPosition(mChild1, mChild1);
        mDimmer.updateDims(mTransaction);

        mDimmer.resetDimStates();
        mDimmer.adjustAppearance(mChild, 0f, 0);
        mDimmer.adjustPosition(mChild, mChild, -1);
        mDimmer.adjustAppearance(mChild1, 0f, 0);
        mDimmer.adjustPosition(mChild1, mChild1);
        mDimmer.updateDims(mTransaction);

        mDimmer.resetDimStates();
@@ -325,19 +302,14 @@ public class DimmerTests extends WindowTestsBase {
     */
    @Test
    public void testMultipleContainersDimmingConsecutively() {
        TestWindowContainer first = mChild;
        TestWindowContainer second = new TestWindowContainer(mWm);
        mHost.addChild(first, 0);
        mHost.addChild(second, 1);

        mDimmer.adjustAppearance(first, 0.5f, 0);
        mDimmer.adjustPosition(mChild, first, -1);
        mDimmer.adjustAppearance(mChild1, 0.5f, 0);
        mDimmer.adjustPosition(mChild1, mChild1);
        SurfaceControl dimLayer = mDimmer.getDimLayer();
        mDimmer.updateDims(mTransaction);

        mDimmer.resetDimStates();
        mDimmer.adjustAppearance(second, 0.9f, 0);
        mDimmer.adjustPosition(mChild, second, -1);
        mDimmer.adjustAppearance(mChild2, 0.9f, 0);
        mDimmer.adjustPosition(mChild1, mChild2);
        mDimmer.updateDims(mTransaction);

        verify(sTestAnimation, times(2)).startAnimation(
@@ -353,16 +325,11 @@ public class DimmerTests extends WindowTestsBase {
     */
    @Test
    public void testMultipleContainersDimmingAtTheSameTime() {
        TestWindowContainer first = mChild;
        TestWindowContainer second = new TestWindowContainer(mWm);
        mHost.addChild(first, 0);
        mHost.addChild(second, 1);

        mDimmer.adjustAppearance(first, 0.5f, 0);
        mDimmer.adjustPosition(mChild, first, -1);
        mDimmer.adjustAppearance(mChild1, 0.5f, 0);
        mDimmer.adjustPosition(mChild1, mChild1);
        SurfaceControl dimLayer = mDimmer.getDimLayer();
        mDimmer.adjustAppearance(second, 0.9f, 0);
        mDimmer.adjustPosition(mChild, second, -1);
        mDimmer.adjustAppearance(mChild2, 0.9f, 0);
        mDimmer.adjustPosition(mChild1, mChild2);
        mDimmer.updateDims(mTransaction);

        verify(sTestAnimation, times(1)).startAnimation(