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