blob: cb6dc6d42bd569e998c598849e17bc7fb8d7ceca [file] [log] [blame]
Jorim Jaggi829b9cd2017-01-23 16:20:53 +01001/*
2 * Copyright (C) 2017 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
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090014 * limitations under the License.
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010015 */
16
17package com.android.server.wm;
18
Winson Chunga4fa8d52018-04-20 15:54:51 -070019import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
Jorim Jaggi30d64f32017-04-07 16:33:17 +020020import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
21import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
Brett Chabota26eda92018-07-23 13:08:30 -070022
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090023import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
24import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
25import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
26import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
27
Jorim Jaggi30d64f32017-04-07 16:33:17 +020028import static org.junit.Assert.assertEquals;
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010029import static org.mockito.Matchers.any;
30import static org.mockito.Matchers.anyInt;
31import static org.mockito.Matchers.eq;
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010032
Adrian Roos4c864592019-04-10 14:47:57 +020033import android.app.ActivityManager.TaskDescription;
Jorim Jaggi30d64f32017-04-07 16:33:17 +020034import android.app.ActivityManager.TaskSnapshot;
Winson Chung48b25652018-10-22 14:04:30 -070035import android.content.ComponentName;
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010036import android.graphics.Canvas;
37import android.graphics.Color;
Jorim Jaggi30d64f32017-04-07 16:33:17 +020038import android.graphics.GraphicBuffer;
39import android.graphics.PixelFormat;
40import android.graphics.Rect;
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010041import android.platform.test.annotations.Presubmit;
Robert Carr5fea55b2018-12-10 13:05:52 -080042import android.view.SurfaceControl;
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010043
Brett Chabota26eda92018-07-23 13:08:30 -070044import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070045
Jorim Jaggi30d64f32017-04-07 16:33:17 +020046import com.android.server.wm.TaskSnapshotSurface.Window;
47
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010048import org.junit.Test;
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010049
50/**
51 * Test class for {@link TaskSnapshotSurface}.
52 *
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070053 * Build/Install/Run:
54 * atest FrameworksServicesTests:TaskSnapshotSurfaceTest
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010055 */
56@SmallTest
57@Presubmit
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010058public class TaskSnapshotSurfaceTest extends WindowTestsBase {
59
60 private TaskSnapshotSurface mSurface;
61
Jorim Jaggi30d64f32017-04-07 16:33:17 +020062 private void setupSurface(int width, int height, Rect contentInsets, int sysuiVis,
63 int windowFlags, Rect taskBounds) {
64 final GraphicBuffer buffer = GraphicBuffer.create(width, height, PixelFormat.RGBA_8888,
Tadashi G. Takaoka17aa9a52018-07-05 16:47:47 +090065 GraphicBuffer.USAGE_SW_READ_RARELY | GraphicBuffer.USAGE_SW_WRITE_NEVER);
Winson Chung48b25652018-10-22 14:04:30 -070066 final TaskSnapshot snapshot = new TaskSnapshot(new ComponentName("", ""), buffer,
Winson Chunga4fa8d52018-04-20 15:54:51 -070067 ORIENTATION_PORTRAIT, contentInsets, false, 1.0f, true /* isRealSnapshot */,
Winson Chung173020c2018-05-04 15:36:47 -070068 WINDOWING_MODE_FULLSCREEN, 0 /* systemUiVisibility */, false /* isTranslucent */);
Robert Carr5fea55b2018-12-10 13:05:52 -080069 mSurface = new TaskSnapshotSurface(mWm, new Window(), new SurfaceControl(), snapshot, "Test",
Adrian Roos4c864592019-04-10 14:47:57 +020070 createTaskDescription(Color.WHITE, Color.RED, Color.BLUE), sysuiVis, windowFlags, 0,
71 taskBounds, ORIENTATION_PORTRAIT);
72 }
73
74 private static TaskDescription createTaskDescription(int background, int statusBar,
75 int navigationBar) {
76 final TaskDescription td = new TaskDescription();
77 td.setBackgroundColor(background);
78 td.setStatusBarColor(statusBar);
79 td.setNavigationBarColor(navigationBar);
80 return td;
Jorim Jaggi30d64f32017-04-07 16:33:17 +020081 }
82
83 private void setupSurface(int width, int height) {
84 setupSurface(width, height, new Rect(), 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
85 new Rect(0, 0, width, height));
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010086 }
87
88 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070089 public void fillEmptyBackground_fillHorizontally() {
Jorim Jaggi30d64f32017-04-07 16:33:17 +020090 setupSurface(200, 100);
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010091 final Canvas mockCanvas = mock(Canvas.class);
92 when(mockCanvas.getWidth()).thenReturn(200);
93 when(mockCanvas.getHeight()).thenReturn(100);
Jorim Jaggi30d64f32017-04-07 16:33:17 +020094 mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 200));
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010095 verify(mockCanvas).drawRect(eq(100.0f), eq(0.0f), eq(200.0f), eq(100.0f), any());
96 }
97
98 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070099 public void fillEmptyBackground_fillVertically() {
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200100 setupSurface(100, 200);
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100101 final Canvas mockCanvas = mock(Canvas.class);
102 when(mockCanvas.getWidth()).thenReturn(100);
103 when(mockCanvas.getHeight()).thenReturn(200);
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200104 mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 200, 100));
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100105 verify(mockCanvas).drawRect(eq(0.0f), eq(100.0f), eq(100.0f), eq(200.0f), any());
106 }
107
108 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700109 public void fillEmptyBackground_fillBoth() {
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200110 setupSurface(200, 200);
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100111 final Canvas mockCanvas = mock(Canvas.class);
112 when(mockCanvas.getWidth()).thenReturn(200);
113 when(mockCanvas.getHeight()).thenReturn(200);
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200114 mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 100));
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100115 verify(mockCanvas).drawRect(eq(100.0f), eq(0.0f), eq(200.0f), eq(100.0f), any());
116 verify(mockCanvas).drawRect(eq(0.0f), eq(100.0f), eq(200.0f), eq(200.0f), any());
117 }
118
119 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700120 public void fillEmptyBackground_dontFill_sameSize() {
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200121 setupSurface(100, 100);
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100122 final Canvas mockCanvas = mock(Canvas.class);
123 when(mockCanvas.getWidth()).thenReturn(100);
124 when(mockCanvas.getHeight()).thenReturn(100);
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200125 mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 100));
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100126 verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any());
127 }
128
129 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700130 public void fillEmptyBackground_dontFill_bitmapLarger() {
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200131 setupSurface(100, 100);
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100132 final Canvas mockCanvas = mock(Canvas.class);
133 when(mockCanvas.getWidth()).thenReturn(100);
134 when(mockCanvas.getHeight()).thenReturn(100);
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200135 mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 200, 200));
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100136 verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any());
137 }
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200138
139 @Test
140 public void testCalculateSnapshotCrop() {
141 setupSurface(100, 100, new Rect(0, 10, 0, 10), 0, 0, new Rect(0, 0, 100, 100));
142 assertEquals(new Rect(0, 0, 100, 90), mSurface.calculateSnapshotCrop());
143 }
144
145 @Test
146 public void testCalculateSnapshotCrop_taskNotOnTop() {
147 setupSurface(100, 100, new Rect(0, 10, 0, 10), 0, 0, new Rect(0, 50, 100, 100));
148 assertEquals(new Rect(0, 10, 100, 90), mSurface.calculateSnapshotCrop());
149 }
150
151 @Test
152 public void testCalculateSnapshotCrop_navBarLeft() {
153 setupSurface(100, 100, new Rect(10, 10, 0, 0), 0, 0, new Rect(0, 0, 100, 100));
154 assertEquals(new Rect(10, 0, 100, 100), mSurface.calculateSnapshotCrop());
155 }
156
157 @Test
158 public void testCalculateSnapshotCrop_navBarRight() {
159 setupSurface(100, 100, new Rect(0, 10, 10, 0), 0, 0, new Rect(0, 0, 100, 100));
160 assertEquals(new Rect(0, 0, 90, 100), mSurface.calculateSnapshotCrop());
161 }
162
163 @Test
164 public void testCalculateSnapshotFrame() {
165 setupSurface(100, 100);
166 final Rect insets = new Rect(0, 10, 0, 10);
167 mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
168 assertEquals(new Rect(0, -10, 100, 70),
169 mSurface.calculateSnapshotFrame(new Rect(0, 10, 100, 90)));
170 }
171
172 @Test
173 public void testCalculateSnapshotFrame_navBarLeft() {
174 setupSurface(100, 100);
175 final Rect insets = new Rect(10, 10, 0, 0);
176 mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
177 assertEquals(new Rect(0, -10, 90, 80),
178 mSurface.calculateSnapshotFrame(new Rect(10, 10, 100, 100)));
179 }
180
181 @Test
182 public void testDrawStatusBarBackground() {
183 setupSurface(100, 100);
184 final Rect insets = new Rect(0, 10, 10, 0);
185 mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
186 final Canvas mockCanvas = mock(Canvas.class);
187 when(mockCanvas.getWidth()).thenReturn(100);
188 when(mockCanvas.getHeight()).thenReturn(100);
Jorim Jaggid635a4a2017-05-03 15:21:26 +0200189 mSurface.mSystemBarBackgroundPainter.drawStatusBarBackground(
190 mockCanvas, new Rect(0, 0, 50, 100), 10);
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200191 verify(mockCanvas).drawRect(eq(50.0f), eq(0.0f), eq(90.0f), eq(10.0f), any());
192 }
193
194 @Test
Jorim Jaggid635a4a2017-05-03 15:21:26 +0200195 public void testDrawStatusBarBackground_nullFrame() {
196 setupSurface(100, 100);
197 final Rect insets = new Rect(0, 10, 10, 0);
198 mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
199 final Canvas mockCanvas = mock(Canvas.class);
200 when(mockCanvas.getWidth()).thenReturn(100);
201 when(mockCanvas.getHeight()).thenReturn(100);
202 mSurface.mSystemBarBackgroundPainter.drawStatusBarBackground(
203 mockCanvas, null, 10);
204 verify(mockCanvas).drawRect(eq(0.0f), eq(0.0f), eq(90.0f), eq(10.0f), any());
205 }
206
207 @Test
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200208 public void testDrawStatusBarBackground_nope() {
209 setupSurface(100, 100);
210 final Rect insets = new Rect(0, 10, 10, 0);
211 mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
212 final Canvas mockCanvas = mock(Canvas.class);
213 when(mockCanvas.getWidth()).thenReturn(100);
214 when(mockCanvas.getHeight()).thenReturn(100);
Jorim Jaggid635a4a2017-05-03 15:21:26 +0200215 mSurface.mSystemBarBackgroundPainter.drawStatusBarBackground(
216 mockCanvas, new Rect(0, 0, 100, 100), 10);
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200217 verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any());
218 }
219
220 @Test
221 public void testDrawNavigationBarBackground() {
222 final Rect insets = new Rect(0, 10, 0, 10);
223 setupSurface(100, 100, insets, 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
224 new Rect(0, 0, 100, 100));
225 mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
226 final Canvas mockCanvas = mock(Canvas.class);
227 when(mockCanvas.getWidth()).thenReturn(100);
228 when(mockCanvas.getHeight()).thenReturn(100);
Jorim Jaggid635a4a2017-05-03 15:21:26 +0200229 mSurface.mSystemBarBackgroundPainter.drawNavigationBarBackground(mockCanvas);
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200230 verify(mockCanvas).drawRect(eq(new Rect(0, 90, 100, 100)), any());
231 }
232
233 @Test
234 public void testDrawNavigationBarBackground_left() {
235 final Rect insets = new Rect(10, 10, 0, 0);
236 setupSurface(100, 100, insets, 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
237 new Rect(0, 0, 100, 100));
238 mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
239 final Canvas mockCanvas = mock(Canvas.class);
240 when(mockCanvas.getWidth()).thenReturn(100);
241 when(mockCanvas.getHeight()).thenReturn(100);
Jorim Jaggid635a4a2017-05-03 15:21:26 +0200242 mSurface.mSystemBarBackgroundPainter.drawNavigationBarBackground(mockCanvas);
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200243 verify(mockCanvas).drawRect(eq(new Rect(0, 0, 10, 100)), any());
244 }
245
246 @Test
247 public void testDrawNavigationBarBackground_right() {
248 final Rect insets = new Rect(0, 10, 10, 0);
249 setupSurface(100, 100, insets, 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
250 new Rect(0, 0, 100, 100));
251 mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
252 final Canvas mockCanvas = mock(Canvas.class);
253 when(mockCanvas.getWidth()).thenReturn(100);
254 when(mockCanvas.getHeight()).thenReturn(100);
Jorim Jaggid635a4a2017-05-03 15:21:26 +0200255 mSurface.mSystemBarBackgroundPainter.drawNavigationBarBackground(mockCanvas);
Jorim Jaggi30d64f32017-04-07 16:33:17 +0200256 verify(mockCanvas).drawRect(eq(new Rect(90, 0, 100, 100)), any());
257 }
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100258}