blob: 8eca650398bf2aea364c6a26b7ecac161db86f2f [file] [log] [blame]
Jorim Jaggi5bb571d2018-11-06 14:42:04 +01001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
Adrian Roosdb5b0c22020-02-12 15:05:27 -080014 * limitations under the License.
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010015 */
16
17package android.view;
18
Tiger Huang332793b2019-10-29 23:21:27 +080019import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
20import static android.view.InsetsState.ITYPE_STATUS_BAR;
Tarandeep Singh215929b2019-01-11 18:24:37 -080021import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
Tarandeep Singh215929b2019-01-11 18:24:37 -080022import static android.view.WindowInsets.Type.systemBars;
Adrian Roos53989972020-03-19 20:15:57 +010023
Tadashi G. Takaoka82eb7a52019-03-26 18:22:01 +090024import static org.junit.Assert.assertEquals;
Adrian Roos02a3eb62020-03-18 18:03:39 +010025import static org.junit.Assert.assertFalse;
26import static org.junit.Assert.assertTrue;
Tarandeep Singh215929b2019-01-11 18:24:37 -080027import static org.junit.Assert.fail;
Adrian Roos53989972020-03-19 20:15:57 +010028import static org.mockito.ArgumentMatchers.any;
Tarandeep Singh215929b2019-01-11 18:24:37 -080029import static org.mockito.ArgumentMatchers.eq;
Jorim Jaggif1035882020-03-31 22:47:12 +020030import static org.mockito.Mockito.doAnswer;
Adrian Roos53989972020-03-19 20:15:57 +010031import static org.mockito.Mockito.never;
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010032import static org.mockito.Mockito.verify;
Tarandeep Singh215929b2019-01-11 18:24:37 -080033import static org.mockito.Mockito.when;
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010034
35import android.graphics.Insets;
36import android.graphics.Matrix;
Tarandeep Singh215929b2019-01-11 18:24:37 -080037import android.graphics.Point;
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010038import android.graphics.Rect;
39import android.graphics.RectF;
40import android.platform.test.annotations.Presubmit;
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010041import android.util.SparseArray;
42import android.view.SurfaceControl.Transaction;
43import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
Jorim Jaggidd3304e2020-01-20 17:24:51 +010044import android.view.animation.LinearInterpolator;
Charles Chen2783faf2019-04-16 17:39:23 +080045import android.view.test.InsetsModeSession;
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010046
Adrian Roos53989972020-03-19 20:15:57 +010047import androidx.test.runner.AndroidJUnit4;
48
Charles Chen2783faf2019-04-16 17:39:23 +080049import org.junit.AfterClass;
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010050import org.junit.Before;
Charles Chen2783faf2019-04-16 17:39:23 +080051import org.junit.BeforeClass;
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010052import org.junit.Test;
53import org.junit.runner.RunWith;
54import org.mockito.ArgumentCaptor;
55import org.mockito.Mock;
56import org.mockito.MockitoAnnotations;
57
58import java.util.List;
59
Tadashi G. Takaoka82eb7a52019-03-26 18:22:01 +090060/**
61 * Tests for {@link InsetsAnimationControlImpl}.
62 *
63 * <p>Build/Install/Run:
64 * atest FrameworksCoreTests:InsetsAnimationControlImplTest
65 *
66 * <p>This test class is a part of Window Manager Service tests and specified in
67 * {@link com.android.server.wm.test.filters.FrameworksTestsFilter}.
68 */
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010069@Presubmit
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010070@RunWith(AndroidJUnit4.class)
71public class InsetsAnimationControlImplTest {
72
73 private InsetsAnimationControlImpl mController;
74
75 private SurfaceSession mSession = new SurfaceSession();
76 private SurfaceControl mTopLeash;
77 private SurfaceControl mNavLeash;
Tarandeep Singh215929b2019-01-11 18:24:37 -080078 private InsetsState mInsetsState;
Charles Chen2783faf2019-04-16 17:39:23 +080079 private static InsetsModeSession sInsetsModeSession;
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010080
81 @Mock Transaction mMockTransaction;
82 @Mock InsetsController mMockController;
83 @Mock WindowInsetsAnimationControlListener mMockListener;
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010084
Charles Chen2783faf2019-04-16 17:39:23 +080085 @BeforeClass
86 public static void setupOnce() {
87 sInsetsModeSession = new InsetsModeSession(NEW_INSETS_MODE_FULL);
88 }
89
90 @AfterClass
Jorim Jaggi28620472019-01-02 23:21:49 +010091 public static void tearDownOnce() {
Charles Chen2783faf2019-04-16 17:39:23 +080092 sInsetsModeSession.close();
93 }
94
Jorim Jaggi5bb571d2018-11-06 14:42:04 +010095 @Before
96 public void setup() {
97 MockitoAnnotations.initMocks(this);
98 mTopLeash = new SurfaceControl.Builder(mSession)
99 .setName("testSurface")
100 .build();
101 mNavLeash = new SurfaceControl.Builder(mSession)
102 .setName("testSurface")
103 .build();
Tarandeep Singh215929b2019-01-11 18:24:37 -0800104 mInsetsState = new InsetsState();
Tiger Huang332793b2019-10-29 23:21:27 +0800105 mInsetsState.getSource(ITYPE_STATUS_BAR).setFrame(new Rect(0, 0, 500, 100));
106 mInsetsState.getSource(ITYPE_NAVIGATION_BAR).setFrame(new Rect(400, 0, 500, 500));
107 InsetsSourceConsumer topConsumer = new InsetsSourceConsumer(ITYPE_STATUS_BAR, mInsetsState,
Jorim Jaggi5bb571d2018-11-06 14:42:04 +0100108 () -> mMockTransaction, mMockController);
Tiger Huang332793b2019-10-29 23:21:27 +0800109 topConsumer.setControl(
Jorim Jaggi3182ef12020-01-30 00:16:18 +0100110 new InsetsSourceControl(ITYPE_STATUS_BAR, mTopLeash, new Point(0, 0)),
111 new int[1], new int[1]);
Jorim Jaggi5bb571d2018-11-06 14:42:04 +0100112
Tiger Huang332793b2019-10-29 23:21:27 +0800113 InsetsSourceConsumer navConsumer = new InsetsSourceConsumer(ITYPE_NAVIGATION_BAR,
Tarandeep Singh215929b2019-01-11 18:24:37 -0800114 mInsetsState, () -> mMockTransaction, mMockController);
Tiger Huang332793b2019-10-29 23:21:27 +0800115 navConsumer.setControl(new InsetsSourceControl(ITYPE_NAVIGATION_BAR, mNavLeash,
Jorim Jaggi3182ef12020-01-30 00:16:18 +0100116 new Point(400, 0)), new int[1], new int[1]);
117 navConsumer.hide();
Jorim Jaggi5bb571d2018-11-06 14:42:04 +0100118
Yunfan Chen02abf552019-12-05 14:51:09 +0900119 SparseArray<InsetsSourceControl> controls = new SparseArray<>();
120 controls.put(ITYPE_STATUS_BAR, topConsumer.getControl());
121 controls.put(ITYPE_NAVIGATION_BAR, navConsumer.getControl());
122 mController = new InsetsAnimationControlImpl(controls,
Tarandeep Singh215929b2019-01-11 18:24:37 -0800123 new Rect(0, 0, 500, 500), mInsetsState, mMockListener, systemBars(),
Jorim Jaggidd3304e2020-01-20 17:24:51 +0100124 mMockController, 10 /* durationMs */, new LinearInterpolator(),
Jorim Jaggi5875cca2020-03-17 13:44:57 +0100125 0 /* animationType */);
Adrian Roos53989972020-03-19 20:15:57 +0100126 mController.mReadyDispatched = true;
Jorim Jaggi5bb571d2018-11-06 14:42:04 +0100127 }
128
129 @Test
130 public void testGetters() {
131 assertEquals(Insets.of(0, 100, 100, 0), mController.getShownStateInsets());
132 assertEquals(Insets.of(0, 0, 0, 0), mController.getHiddenStateInsets());
133 assertEquals(Insets.of(0, 100, 0, 0), mController.getCurrentInsets());
Tarandeep Singh215929b2019-01-11 18:24:37 -0800134 assertEquals(systemBars(), mController.getTypes());
Jorim Jaggi5bb571d2018-11-06 14:42:04 +0100135 }
136
137 @Test
Adrian Roos02a3eb62020-03-18 18:03:39 +0100138 public void testReady() {
139 assertTrue(mController.isReady());
140 assertFalse(mController.isFinished());
141 assertFalse(mController.isCancelled());
142 }
143
144 @Test
Jorim Jaggi5bb571d2018-11-06 14:42:04 +0100145 public void testChangeInsets() {
Tarandeep Singh54554e22019-11-01 14:43:05 -0700146 mController.setInsetsAndAlpha(Insets.of(0, 30, 40, 0), 1f /* alpha */,
147 0f /* fraction */);
Jorim Jaggifae3e272019-01-14 14:05:05 +0100148 mController.applyChangeInsets(new InsetsState());
Jorim Jaggi5bb571d2018-11-06 14:42:04 +0100149 assertEquals(Insets.of(0, 30, 40, 0), mController.getCurrentInsets());
Tarandeep Singh699aa672019-11-22 23:19:30 -0800150 assertEquals(1f, mController.getCurrentAlpha(), 1f - mController.getCurrentAlpha());
Jorim Jaggi5bb571d2018-11-06 14:42:04 +0100151
152 ArgumentCaptor<SurfaceParams> captor = ArgumentCaptor.forClass(SurfaceParams.class);
Yunfan Chen02abf552019-12-05 14:51:09 +0900153 verify(mMockController).applySurfaceParams(captor.capture());
Jorim Jaggi5bb571d2018-11-06 14:42:04 +0100154 List<SurfaceParams> params = captor.getAllValues();
155 assertEquals(2, params.size());
156 SurfaceParams first = params.get(0);
157 SurfaceParams second = params.get(1);
158 SurfaceParams topParams = first.surface == mTopLeash ? first : second;
159 SurfaceParams navParams = first.surface == mNavLeash ? first : second;
160 assertPosition(topParams.matrix, new Rect(0, 0, 500, 100), new Rect(0, -70, 500, 30));
161 assertPosition(navParams.matrix, new Rect(400, 0, 500, 500), new Rect(460, 0, 560, 500));
162 }
163
Jorim Jaggi5ed50cc2019-01-23 16:59:42 +0100164 @Test
Tarandeep Singh699aa672019-11-22 23:19:30 -0800165 public void testChangeAlphaNoInsets() {
166 Insets initialInsets = mController.getCurrentInsets();
167 mController.setInsetsAndAlpha(null, 0.5f, 0f /* fraction*/);
168 mController.applyChangeInsets(new InsetsState());
169 assertEquals(0.5f, mController.getCurrentAlpha(), 0.5f - mController.getCurrentAlpha());
170 assertEquals(initialInsets, mController.getCurrentInsets());
171 }
172
173 @Test
174 public void testChangeInsetsAndAlpha() {
175 mController.setInsetsAndAlpha(Insets.of(0, 30, 40, 0), 0.5f, 1f);
176 mController.applyChangeInsets(new InsetsState());
177 assertEquals(0.5f, mController.getCurrentAlpha(), 0.5f - mController.getCurrentAlpha());
178 assertEquals(Insets.of(0, 30, 40, 0), mController.getCurrentInsets());
179 }
180
181 @Test
Jorim Jaggi5ed50cc2019-01-23 16:59:42 +0100182 public void testFinishing() {
183 when(mMockController.getState()).thenReturn(mInsetsState);
Tarandeep Singh54554e22019-11-01 14:43:05 -0700184 mController.finish(true /* shown */);
Jorim Jaggi5ed50cc2019-01-23 16:59:42 +0100185 mController.applyChangeInsets(mInsetsState);
Tarandeep Singh54554e22019-11-01 14:43:05 -0700186 assertEquals(Insets.of(0, 100, 100, 0), mController.getCurrentInsets());
187 verify(mMockController).notifyFinished(eq(mController), eq(true /* shown */));
Adrian Roos02a3eb62020-03-18 18:03:39 +0100188 assertFalse(mController.isReady());
189 assertTrue(mController.isFinished());
190 assertFalse(mController.isCancelled());
191 verify(mMockListener).onFinished(mController);
Jorim Jaggi5ed50cc2019-01-23 16:59:42 +0100192 }
193
194 @Test
195 public void testCancelled() {
Jorim Jaggi6d5c8012020-02-28 01:40:27 +0100196 mController.cancel();
Jorim Jaggi5ed50cc2019-01-23 16:59:42 +0100197 try {
Tarandeep Singh54554e22019-11-01 14:43:05 -0700198 mController.setInsetsAndAlpha(Insets.NONE, 1f /*alpha */, 0f /* fraction */);
Jorim Jaggi5ed50cc2019-01-23 16:59:42 +0100199 fail("Expected exception to be thrown");
200 } catch (IllegalStateException ignored) {
201 }
Adrian Roos02a3eb62020-03-18 18:03:39 +0100202 assertFalse(mController.isReady());
203 assertFalse(mController.isFinished());
204 assertTrue(mController.isCancelled());
Adrian Roos5d557ed2020-03-17 20:04:35 +0100205 verify(mMockListener).onCancelled(mController);
Tarandeep Singh54554e22019-11-01 14:43:05 -0700206 mController.finish(true /* shown */);
Adrian Roos53989972020-03-19 20:15:57 +0100207 verify(mMockListener, never()).onFinished(any());
208 }
209
210 @Test
211 public void testCancelled_beforeReadyDispatched() {
212 mController.mReadyDispatched = false;
213 mController.cancel();
214 assertFalse(mController.isReady());
215 assertFalse(mController.isFinished());
216 assertTrue(mController.isCancelled());
217 verify(mMockListener).onCancelled(null);
218 verify(mMockListener, never()).onFinished(any());
Jorim Jaggi5ed50cc2019-01-23 16:59:42 +0100219 }
220
Jorim Jaggif1035882020-03-31 22:47:12 +0200221 @Test
222 public void testFinish_immediately() {
223 when(mMockController.getState()).thenReturn(mInsetsState);
224 doAnswer(invocation -> {
225 mController.applyChangeInsets(mInsetsState);
226 return null;
Adrian Roos6a4448f2020-04-01 15:01:08 +0200227 }).when(mMockController).scheduleApplyChangeInsets(any());
Jorim Jaggif1035882020-03-31 22:47:12 +0200228 mController.finish(true /* shown */);
229 assertEquals(Insets.of(0, 100, 100, 0), mController.getCurrentInsets());
230 verify(mMockController).notifyFinished(eq(mController), eq(true /* shown */));
231 assertFalse(mController.isReady());
232 assertTrue(mController.isFinished());
233 assertFalse(mController.isCancelled());
234 verify(mMockListener).onFinished(mController);
235 }
236
Jorim Jaggi5bb571d2018-11-06 14:42:04 +0100237 private void assertPosition(Matrix m, Rect original, Rect transformed) {
238 RectF rect = new RectF(original);
239 rect.offsetTo(0, 0);
240 m.mapRect(rect);
241 rect.round(original);
242 assertEquals(original, transformed);
243 }
244}