TaskSnapshotSurfaceTest.java revision d635a4ae20014b6ff52d8b05e7f4f622808d4efd
1/*
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
14 * limitations under the License
15 */
16
17package com.android.server.wm;
18
19import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
20import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
21import static org.junit.Assert.assertEquals;
22import static org.mockito.Matchers.any;
23import static org.mockito.Matchers.anyInt;
24import static org.mockito.Matchers.eq;
25import static org.mockito.Mockito.mock;
26import static org.mockito.Mockito.never;
27import static org.mockito.Mockito.verify;
28import static org.mockito.Mockito.when;
29
30import android.app.ActivityManager.TaskSnapshot;
31import android.graphics.Canvas;
32import android.graphics.Color;
33import android.graphics.GraphicBuffer;
34import android.graphics.PixelFormat;
35import android.graphics.Rect;
36import android.platform.test.annotations.Presubmit;
37import android.support.test.filters.SmallTest;
38import android.support.test.runner.AndroidJUnit4;
39import android.view.Surface;
40
41import com.android.server.wm.TaskSnapshotSurface.Window;
42
43import org.junit.Test;
44import org.junit.runner.RunWith;
45
46/**
47 * Test class for {@link TaskSnapshotSurface}.
48 *
49 * runtest frameworks-services -c com.android.server.wm.TaskSnapshotSurfaceTest
50 */
51@SmallTest
52@Presubmit
53@RunWith(AndroidJUnit4.class)
54public class TaskSnapshotSurfaceTest extends WindowTestsBase {
55
56    private TaskSnapshotSurface mSurface;
57
58    private void setupSurface(int width, int height, Rect contentInsets, int sysuiVis,
59            int windowFlags, Rect taskBounds) {
60        final GraphicBuffer buffer = GraphicBuffer.create(width, height, PixelFormat.RGBA_8888,
61                GraphicBuffer.USAGE_SW_READ_NEVER | GraphicBuffer.USAGE_SW_WRITE_NEVER);
62        final TaskSnapshot snapshot = new TaskSnapshot(buffer,
63                ORIENTATION_PORTRAIT, contentInsets, false, 1.0f);
64        mSurface = new TaskSnapshotSurface(sWm, new Window(), new Surface(), snapshot, "Test",
65                Color.WHITE, Color.RED, Color.BLUE, sysuiVis, windowFlags, 0, taskBounds);
66    }
67
68    private void setupSurface(int width, int height) {
69        setupSurface(width, height, new Rect(), 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
70                new Rect(0, 0, width, height));
71    }
72
73    @Test
74    public void fillEmptyBackground_fillHorizontally() throws Exception {
75        setupSurface(200, 100);
76        final Canvas mockCanvas = mock(Canvas.class);
77        when(mockCanvas.getWidth()).thenReturn(200);
78        when(mockCanvas.getHeight()).thenReturn(100);
79        mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 200));
80        verify(mockCanvas).drawRect(eq(100.0f), eq(0.0f), eq(200.0f), eq(100.0f), any());
81    }
82
83    @Test
84    public void fillEmptyBackground_fillVertically() throws Exception {
85        setupSurface(100, 200);
86        final Canvas mockCanvas = mock(Canvas.class);
87        when(mockCanvas.getWidth()).thenReturn(100);
88        when(mockCanvas.getHeight()).thenReturn(200);
89        mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 200, 100));
90        verify(mockCanvas).drawRect(eq(0.0f), eq(100.0f), eq(100.0f), eq(200.0f), any());
91    }
92
93    @Test
94    public void fillEmptyBackground_fillBoth() throws Exception {
95        setupSurface(200, 200);
96        final Canvas mockCanvas = mock(Canvas.class);
97        when(mockCanvas.getWidth()).thenReturn(200);
98        when(mockCanvas.getHeight()).thenReturn(200);
99        mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 100));
100        verify(mockCanvas).drawRect(eq(100.0f), eq(0.0f), eq(200.0f), eq(100.0f), any());
101        verify(mockCanvas).drawRect(eq(0.0f), eq(100.0f), eq(200.0f), eq(200.0f), any());
102    }
103
104    @Test
105    public void fillEmptyBackground_dontFill_sameSize() throws Exception {
106        setupSurface(100, 100);
107        final Canvas mockCanvas = mock(Canvas.class);
108        when(mockCanvas.getWidth()).thenReturn(100);
109        when(mockCanvas.getHeight()).thenReturn(100);
110        mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 100));
111        verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any());
112    }
113
114    @Test
115    public void fillEmptyBackground_dontFill_bitmapLarger() throws Exception {
116        setupSurface(100, 100);
117        final Canvas mockCanvas = mock(Canvas.class);
118        when(mockCanvas.getWidth()).thenReturn(100);
119        when(mockCanvas.getHeight()).thenReturn(100);
120        mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 200, 200));
121        verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any());
122    }
123
124    @Test
125    public void testCalculateSnapshotCrop() {
126        setupSurface(100, 100, new Rect(0, 10, 0, 10), 0, 0, new Rect(0, 0, 100, 100));
127        assertEquals(new Rect(0, 0, 100, 90), mSurface.calculateSnapshotCrop());
128    }
129
130    @Test
131    public void testCalculateSnapshotCrop_taskNotOnTop() {
132        setupSurface(100, 100, new Rect(0, 10, 0, 10), 0, 0, new Rect(0, 50, 100, 100));
133        assertEquals(new Rect(0, 10, 100, 90), mSurface.calculateSnapshotCrop());
134    }
135
136    @Test
137    public void testCalculateSnapshotCrop_navBarLeft() {
138        setupSurface(100, 100, new Rect(10, 10, 0, 0), 0, 0, new Rect(0, 0, 100, 100));
139        assertEquals(new Rect(10, 0, 100, 100), mSurface.calculateSnapshotCrop());
140    }
141
142    @Test
143    public void testCalculateSnapshotCrop_navBarRight() {
144        setupSurface(100, 100, new Rect(0, 10, 10, 0), 0, 0, new Rect(0, 0, 100, 100));
145        assertEquals(new Rect(0, 0, 90, 100), mSurface.calculateSnapshotCrop());
146    }
147
148    @Test
149    public void testCalculateSnapshotFrame() {
150        setupSurface(100, 100);
151        final Rect insets = new Rect(0, 10, 0, 10);
152        mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
153        assertEquals(new Rect(0, -10, 100, 70),
154                mSurface.calculateSnapshotFrame(new Rect(0, 10, 100, 90)));
155    }
156
157    @Test
158    public void testCalculateSnapshotFrame_navBarLeft() {
159        setupSurface(100, 100);
160        final Rect insets = new Rect(10, 10, 0, 0);
161        mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
162        assertEquals(new Rect(0, -10, 90, 80),
163                mSurface.calculateSnapshotFrame(new Rect(10, 10, 100, 100)));
164    }
165
166    @Test
167    public void testDrawStatusBarBackground() {
168        setupSurface(100, 100);
169        final Rect insets = new Rect(0, 10, 10, 0);
170        mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
171        final Canvas mockCanvas = mock(Canvas.class);
172        when(mockCanvas.getWidth()).thenReturn(100);
173        when(mockCanvas.getHeight()).thenReturn(100);
174        mSurface.mSystemBarBackgroundPainter.drawStatusBarBackground(
175                mockCanvas, new Rect(0, 0, 50, 100), 10);
176        verify(mockCanvas).drawRect(eq(50.0f), eq(0.0f), eq(90.0f), eq(10.0f), any());
177    }
178
179    @Test
180    public void testDrawStatusBarBackground_nullFrame() {
181        setupSurface(100, 100);
182        final Rect insets = new Rect(0, 10, 10, 0);
183        mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
184        final Canvas mockCanvas = mock(Canvas.class);
185        when(mockCanvas.getWidth()).thenReturn(100);
186        when(mockCanvas.getHeight()).thenReturn(100);
187        mSurface.mSystemBarBackgroundPainter.drawStatusBarBackground(
188                mockCanvas, null, 10);
189        verify(mockCanvas).drawRect(eq(0.0f), eq(0.0f), eq(90.0f), eq(10.0f), any());
190    }
191
192    @Test
193    public void testDrawStatusBarBackground_nope() {
194        setupSurface(100, 100);
195        final Rect insets = new Rect(0, 10, 10, 0);
196        mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
197        final Canvas mockCanvas = mock(Canvas.class);
198        when(mockCanvas.getWidth()).thenReturn(100);
199        when(mockCanvas.getHeight()).thenReturn(100);
200        mSurface.mSystemBarBackgroundPainter.drawStatusBarBackground(
201                mockCanvas, new Rect(0, 0, 100, 100), 10);
202        verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any());
203    }
204
205    @Test
206    public void testDrawNavigationBarBackground() {
207        final Rect insets = new Rect(0, 10, 0, 10);
208        setupSurface(100, 100, insets, 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
209                new Rect(0, 0, 100, 100));
210        mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
211        final Canvas mockCanvas = mock(Canvas.class);
212        when(mockCanvas.getWidth()).thenReturn(100);
213        when(mockCanvas.getHeight()).thenReturn(100);
214        mSurface.mSystemBarBackgroundPainter.drawNavigationBarBackground(mockCanvas);
215        verify(mockCanvas).drawRect(eq(new Rect(0, 90, 100, 100)), any());
216    }
217
218    @Test
219    public void testDrawNavigationBarBackground_left() {
220        final Rect insets = new Rect(10, 10, 0, 0);
221        setupSurface(100, 100, insets, 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
222                new Rect(0, 0, 100, 100));
223        mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
224        final Canvas mockCanvas = mock(Canvas.class);
225        when(mockCanvas.getWidth()).thenReturn(100);
226        when(mockCanvas.getHeight()).thenReturn(100);
227        mSurface.mSystemBarBackgroundPainter.drawNavigationBarBackground(mockCanvas);
228        verify(mockCanvas).drawRect(eq(new Rect(0, 0, 10, 100)), any());
229    }
230
231    @Test
232    public void testDrawNavigationBarBackground_right() {
233        final Rect insets = new Rect(0, 10, 10, 0);
234        setupSurface(100, 100, insets, 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
235                new Rect(0, 0, 100, 100));
236        mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
237        final Canvas mockCanvas = mock(Canvas.class);
238        when(mockCanvas.getWidth()).thenReturn(100);
239        when(mockCanvas.getHeight()).thenReturn(100);
240        mSurface.mSystemBarBackgroundPainter.drawNavigationBarBackground(mockCanvas);
241        verify(mockCanvas).drawRect(eq(new Rect(90, 0, 100, 100)), any());
242    }
243}
244