1f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr/*
2f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr * Copyright (C) 2017 The Android Open Source Project
3f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr *
4f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr * Licensed under the Apache License, Version 2.0 (the "License");
5f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr * you may not use this file except in compliance with the License.
6f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr * You may obtain a copy of the License at
7f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr *
8f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr *      http://www.apache.org/licenses/LICENSE-2.0
9f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr *
10f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr * Unless required by applicable law or agreed to in writing, software
11f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr * distributed under the License is distributed on an "AS IS" BASIS,
12f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr * See the License for the specific language governing permissions and
14f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr * limitations under the License
15f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr */
16f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
17f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carrpackage com.android.server.wm;
18f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
192fb06bc31f06ac046c94e41dbcaf019623052de8chaviwimport static org.junit.Assert.assertEquals;
202fb06bc31f06ac046c94e41dbcaf019623052de8chaviwimport static org.junit.Assert.assertNotNull;
2187ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviwimport static org.mockito.ArgumentMatchers.any;
2287ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviwimport static org.mockito.ArgumentMatchers.anyBoolean;
232fb06bc31f06ac046c94e41dbcaf019623052de8chaviwimport static org.mockito.Mockito.mock;
242fb06bc31f06ac046c94e41dbcaf019623052de8chaviwimport static org.mockito.Mockito.never;
2587ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviwimport static org.mockito.Mockito.reset;
2687ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviwimport static org.mockito.Mockito.spy;
27f20bd225a21eaf3b20beba7b019b30d4919415b9chaviwimport static org.mockito.Mockito.times;
282fb06bc31f06ac046c94e41dbcaf019623052de8chaviwimport static org.mockito.Mockito.verify;
29f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
30f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carrimport android.graphics.Rect;
31f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carrimport android.platform.test.annotations.Presubmit;
32f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carrimport android.support.test.runner.AndroidJUnit4;
33f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carrimport android.view.SurfaceControl;
34f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carrimport android.view.SurfaceSession;
35f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
362fb06bc31f06ac046c94e41dbcaf019623052de8chaviwimport org.junit.Before;
372fb06bc31f06ac046c94e41dbcaf019623052de8chaviwimport org.junit.Test;
382fb06bc31f06ac046c94e41dbcaf019623052de8chaviwimport org.junit.runner.RunWith;
39f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
40f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr/**
41f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr * Build/Install/Run:
422fb06bc31f06ac046c94e41dbcaf019623052de8chaviw * atest FrameworksServicesTests:com.android.server.wm.DimmerTests;
43f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr */
44f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr@Presubmit
45f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr@RunWith(AndroidJUnit4.class)
46f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carrpublic class DimmerTests extends WindowTestsBase {
472fb06bc31f06ac046c94e41dbcaf019623052de8chaviw
48f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    private class TestWindowContainer extends WindowContainer<TestWindowContainer> {
49f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        final SurfaceControl mControl = mock(SurfaceControl.class);
50f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        final SurfaceControl.Transaction mTransaction = mock(SurfaceControl.Transaction.class);
51f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
52ffe128d46dc45939df08231c8ec382b33306a77fJorim Jaggi        TestWindowContainer() {
53ffe128d46dc45939df08231c8ec382b33306a77fJorim Jaggi            super(sWm);
54ffe128d46dc45939df08231c8ec382b33306a77fJorim Jaggi        }
55ffe128d46dc45939df08231c8ec382b33306a77fJorim Jaggi
56f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        @Override
57a5e105728fb87264b9dc2e66b3703168f8864110Jorim Jaggi        public SurfaceControl getSurfaceControl() {
58f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr            return mControl;
59f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        }
60f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
61f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        @Override
62a5e105728fb87264b9dc2e66b3703168f8864110Jorim Jaggi        public SurfaceControl.Transaction getPendingTransaction() {
63f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr            return mTransaction;
64f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        }
65f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
66f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
67f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    private class MockSurfaceBuildingContainer extends WindowContainer<TestWindowContainer> {
68f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        final SurfaceSession mSession = new SurfaceSession();
69f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        final SurfaceControl mHostControl = mock(SurfaceControl.class);
70f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        final SurfaceControl.Transaction mHostTransaction = mock(SurfaceControl.Transaction.class);
71f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
72ffe128d46dc45939df08231c8ec382b33306a77fJorim Jaggi        MockSurfaceBuildingContainer() {
73ffe128d46dc45939df08231c8ec382b33306a77fJorim Jaggi            super(sWm);
74ffe128d46dc45939df08231c8ec382b33306a77fJorim Jaggi        }
75ffe128d46dc45939df08231c8ec382b33306a77fJorim Jaggi
76f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        class MockSurfaceBuilder extends SurfaceControl.Builder {
77f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr            MockSurfaceBuilder(SurfaceSession ss) {
78f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr                super(ss);
79f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr            }
80f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
81f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr            @Override
82f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr            public SurfaceControl build() {
83f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw                return mock(SurfaceControl.class);
84f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr            }
85f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        }
86f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
87f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        @Override
88f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        SurfaceControl.Builder makeChildSurface(WindowContainer child) {
89f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw            return new MockSurfaceBuilder(mSession);
90f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        }
91f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
92f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        @Override
93f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        public SurfaceControl getSurfaceControl() {
94f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw            return mHostControl;
95f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        }
96f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
97f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        @Override
98a5e105728fb87264b9dc2e66b3703168f8864110Jorim Jaggi        public SurfaceControl.Transaction getPendingTransaction() {
99f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr            return mHostTransaction;
100f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        }
101f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
102f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
103f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw    private MockSurfaceBuildingContainer mHost;
104f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw    private Dimmer mDimmer;
105f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw    private SurfaceControl.Transaction mTransaction;
10687ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw    private Dimmer.SurfaceAnimatorStarter mSurfaceAnimatorStarter;
10787ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw
10887ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw    private static class SurfaceAnimatorStarterImpl implements Dimmer.SurfaceAnimatorStarter {
10987ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        @Override
11087ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        public void startAnimation(SurfaceAnimator surfaceAnimator, SurfaceControl.Transaction t,
11187ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw                AnimationAdapter anim, boolean hidden) {
11287ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw            surfaceAnimator.mAnimationFinishedCallback.run();
11387ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        }
11487ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw    }
115f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
116f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    @Before
117f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    public void setUp() throws Exception {
118f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        super.setUp();
119f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mHost = new MockSurfaceBuildingContainer();
12087ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        mSurfaceAnimatorStarter = spy(new SurfaceAnimatorStarterImpl());
121f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mTransaction = mock(SurfaceControl.Transaction.class);
12287ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        mDimmer = new Dimmer(mHost, mSurfaceAnimatorStarter);
123f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
124f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
125f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    @Test
126f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    public void testDimAboveNoChildCreatesSurface() throws Exception {
127f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        final float alpha = 0.8f;
128f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.dimAbove(mTransaction, alpha);
129f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
130f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        SurfaceControl dimLayer = getDimLayer();
1312fb06bc31f06ac046c94e41dbcaf019623052de8chaviw
1322fb06bc31f06ac046c94e41dbcaf019623052de8chaviw        assertNotNull("Dimmer should have created a surface", dimLayer);
1332fb06bc31f06ac046c94e41dbcaf019623052de8chaviw
1342fb06bc31f06ac046c94e41dbcaf019623052de8chaviw        verify(mTransaction).setAlpha(dimLayer, alpha);
1352fb06bc31f06ac046c94e41dbcaf019623052de8chaviw        verify(mTransaction).setLayer(dimLayer, Integer.MAX_VALUE);
136f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
137f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
138f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    @Test
139f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    public void testDimAboveNoChildRedundantlyUpdatesAlphaOnExistingSurface() throws Exception {
140f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        float alpha = 0.8f;
141f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.dimAbove(mTransaction, alpha);
142f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        final SurfaceControl firstSurface = getDimLayer();
143f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
144f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        alpha = 0.9f;
145f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.dimAbove(mTransaction, alpha);
146f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
147f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        assertEquals(firstSurface, getDimLayer());
148f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        verify(mTransaction).setAlpha(firstSurface, 0.9f);
149f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
150f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
151f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    @Test
152f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    public void testUpdateDimsAppliesSize() throws Exception {
153f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.dimAbove(mTransaction, 0.8f);
154f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
155f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        int width = 100;
156f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        int height = 300;
157f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        Rect bounds = new Rect(0, 0, width, height);
158f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.updateDims(mTransaction, bounds);
1592fb06bc31f06ac046c94e41dbcaf019623052de8chaviw
160f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).setSize(getDimLayer(), width, height);
161f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).show(getDimLayer());
162f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
163f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
164f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    @Test
165f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    public void testDimAboveNoChildNotReset() throws Exception {
166f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.dimAbove(mTransaction, 0.8f);
167f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        SurfaceControl dimLayer = getDimLayer();
168f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.resetDimStates();
169f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
170f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.updateDims(mTransaction, new Rect());
171f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).show(getDimLayer());
1722fb06bc31f06ac046c94e41dbcaf019623052de8chaviw        verify(dimLayer, never()).destroy();
173f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
174f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
175f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    @Test
176f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    public void testDimAboveWithChildCreatesSurfaceAboveChild() throws Exception {
177f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        TestWindowContainer child = new TestWindowContainer();
178f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mHost.addChild(child, 0);
179f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
180f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        final float alpha = 0.8f;
181f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.dimAbove(mTransaction, child, alpha);
182f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        SurfaceControl dimLayer = getDimLayer();
1832fb06bc31f06ac046c94e41dbcaf019623052de8chaviw
184f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        assertNotNull("Dimmer should have created a surface", dimLayer);
185f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
186f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).setAlpha(dimLayer, alpha);
187f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).setRelativeLayer(dimLayer, child.mControl, 1);
188f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
189f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
190f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    @Test
191f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    public void testDimBelowWithChildSurfaceCreatesSurfaceBelowChild() throws Exception {
192f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        TestWindowContainer child = new TestWindowContainer();
193f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mHost.addChild(child, 0);
194f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
195f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        final float alpha = 0.8f;
196f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.dimBelow(mTransaction, child, alpha);
197f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        SurfaceControl dimLayer = getDimLayer();
198f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
199f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        assertNotNull("Dimmer should have created a surface", dimLayer);
2002fb06bc31f06ac046c94e41dbcaf019623052de8chaviw
201f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).setAlpha(dimLayer, alpha);
202f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).setRelativeLayer(dimLayer, child.mControl, -1);
203f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
204f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
205f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    @Test
206f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    public void testDimBelowWithChildSurfaceDestroyedWhenReset() throws Exception {
207f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        TestWindowContainer child = new TestWindowContainer();
208f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mHost.addChild(child, 0);
209f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
210f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        final float alpha = 0.8f;
211f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.dimAbove(mTransaction, child, alpha);
212f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        SurfaceControl dimLayer = getDimLayer();
213f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.resetDimStates();
2142fb06bc31f06ac046c94e41dbcaf019623052de8chaviw
215f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.updateDims(mTransaction, new Rect());
21687ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        verify(mSurfaceAnimatorStarter).startAnimation(any(SurfaceAnimator.class), any(
21787ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw                SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean());
2182fb06bc31f06ac046c94e41dbcaf019623052de8chaviw        verify(dimLayer).destroy();
219f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
220f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
221f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    @Test
222f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    public void testDimBelowWithChildSurfaceNotDestroyedWhenPersisted() throws Exception {
223f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        TestWindowContainer child = new TestWindowContainer();
224f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mHost.addChild(child, 0);
225f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
226f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        final float alpha = 0.8f;
227f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.dimAbove(mTransaction, child, alpha);
228f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        SurfaceControl dimLayer = getDimLayer();
229f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.resetDimStates();
230f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.dimAbove(mTransaction, child, alpha);
231f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr
232f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr        mDimmer.updateDims(mTransaction, new Rect());
2332fb06bc31f06ac046c94e41dbcaf019623052de8chaviw        verify(mTransaction).show(dimLayer);
2342fb06bc31f06ac046c94e41dbcaf019623052de8chaviw        verify(dimLayer, never()).destroy();
2352fb06bc31f06ac046c94e41dbcaf019623052de8chaviw    }
2362fb06bc31f06ac046c94e41dbcaf019623052de8chaviw
237f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw    @Test
238f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw    public void testDimUpdateWhileDimming() throws Exception {
239f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        Rect bounds = new Rect();
240f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        TestWindowContainer child = new TestWindowContainer();
241f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        mHost.addChild(child, 0);
242f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw
243f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        final float alpha = 0.8f;
244f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        mDimmer.dimAbove(mTransaction, child, alpha);
245f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw
246f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        SurfaceControl dimLayer = getDimLayer();
247f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        bounds.set(0, 0, 10, 10);
248f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        mDimmer.updateDims(mTransaction, bounds);
249f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction, times(1)).show(dimLayer);
250f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).setSize(dimLayer, bounds.width(), bounds.height());
251f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).setPosition(dimLayer, 0, 0);
252f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw
253f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        bounds.set(10, 10, 30, 30);
254f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        mDimmer.updateDims(mTransaction, bounds);
255f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).setSize(dimLayer, bounds.width(), bounds.height());
256f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        verify(mTransaction).setPosition(dimLayer, 10, 10);
257f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw    }
258f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw
25987ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw    @Test
26087ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw    public void testRemoveDimImmediately() throws Exception {
26187ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        TestWindowContainer child = new TestWindowContainer();
26287ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        mHost.addChild(child, 0);
26387ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw
26487ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        mDimmer.dimAbove(mTransaction, child, 1);
26587ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        SurfaceControl dimLayer = getDimLayer();
26687ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        mDimmer.updateDims(mTransaction, new Rect());
26787ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        verify(mTransaction, times(1)).show(dimLayer);
26887ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw
26987ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        reset(mSurfaceAnimatorStarter);
27087ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        mDimmer.dontAnimateExit();
27187ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        mDimmer.resetDimStates();
27287ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        mDimmer.updateDims(mTransaction, new Rect());
27387ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        verify(mSurfaceAnimatorStarter, never()).startAnimation(any(SurfaceAnimator.class), any(
27487ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw                SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean());
27587ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw        verify(mTransaction).destroy(dimLayer);
27687ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw    }
27787ca63a7bc6f1d7fae899fb968dfa8a0f8ade5a6chaviw
278f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw    private SurfaceControl getDimLayer() {
279f20bd225a21eaf3b20beba7b019b30d4919415b9chaviw        return mDimmer.mDimState.mDimLayer;
280f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr    }
281f59b8ddd93a52b72a09150d0e19dbebb4b6ecf39Robert Carr}
282