blob: f985a140bf0c9905fd185b79efb7e541a2e56308 [file] [log] [blame]
Jorim Jaggi02886a82016-12-06 09:10:06 -08001/*
2 * Copyright (C) 2016 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. Takaokab6e148c2018-11-03 02:59:06 -070014 * limitations under the License.
Jorim Jaggi02886a82016-12-06 09:10:06 -080015 */
16
17package com.android.server.wm;
18
19import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
Jorim Jaggid635a4a2017-05-03 15:21:26 +020020import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
Brett Chabota26eda92018-07-23 13:08:30 -070021
Riddle Hsuc802e4b2019-12-20 16:54:33 +080022import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
23import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070024import static com.android.server.wm.TaskSnapshotController.SNAPSHOT_MODE_APP_THEME;
25import static com.android.server.wm.TaskSnapshotController.SNAPSHOT_MODE_REAL;
Brett Chabota26eda92018-07-23 13:08:30 -070026
Tadashi G. Takaoka82eb7a52019-03-26 18:22:01 +090027import static org.junit.Assert.assertEquals;
Peter Kalauskas84f02a82020-01-22 16:06:18 -080028import static org.junit.Assert.assertFalse;
Riddle Hsuc802e4b2019-12-20 16:54:33 +080029import static org.junit.Assert.assertNotEquals;
Mark Renouf98ba8e62019-11-18 12:42:16 -050030import static org.junit.Assert.assertSame;
31import static org.junit.Assert.assertTrue;
Jorim Jaggi02886a82016-12-06 09:10:06 -080032
Mark Renouf98ba8e62019-11-18 12:42:16 -050033import android.app.ActivityManager;
34import android.app.WindowConfiguration;
35import android.content.ComponentName;
36import android.content.res.Configuration;
37import android.graphics.ColorSpace;
38import android.graphics.GraphicBuffer;
39import android.graphics.PixelFormat;
Peter Kalauskasfe0a4132020-01-31 16:50:42 -080040import android.graphics.Point;
Mark Renouf98ba8e62019-11-18 12:42:16 -050041import android.graphics.Rect;
Jorim Jaggi02886a82016-12-06 09:10:06 -080042import android.platform.test.annotations.Presubmit;
Jorim Jaggi02886a82016-12-06 09:10:06 -080043import android.util.ArraySet;
Mark Renouf98ba8e62019-11-18 12:42:16 -050044import android.view.View;
Jorim Jaggi02886a82016-12-06 09:10:06 -080045
Brett Chabota26eda92018-07-23 13:08:30 -070046import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070047
Winson Chung23aa7b12018-02-01 11:41:43 -080048import com.google.android.collect.Sets;
Brett Chabota26eda92018-07-23 13:08:30 -070049
Jorim Jaggi02886a82016-12-06 09:10:06 -080050import org.junit.Test;
Louis Chang2453d062019-11-19 22:30:48 +080051import org.junit.runner.RunWith;
Mark Renouf98ba8e62019-11-18 12:42:16 -050052import org.mockito.Mockito;
Jorim Jaggi02886a82016-12-06 09:10:06 -080053
54/**
55 * Test class for {@link TaskSnapshotController}.
56 *
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070057 * Build/Install/Run:
Andrii Kulianf5d14112019-10-31 17:37:54 -070058 * * atest WmTests:TaskSnapshotControllerTest
Jorim Jaggi02886a82016-12-06 09:10:06 -080059 */
60@SmallTest
61@Presubmit
Louis Chang2453d062019-11-19 22:30:48 +080062@RunWith(WindowTestRunner.class)
Jorim Jaggi02886a82016-12-06 09:10:06 -080063public class TaskSnapshotControllerTest extends WindowTestsBase {
64
65 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070066 public void testGetClosingApps_closing() {
Jorim Jaggi02886a82016-12-06 09:10:06 -080067 final WindowState closingWindow = createWindow(null, FIRST_APPLICATION_WINDOW,
68 "closingWindow");
Issei Suzuki2bcbd682019-11-08 13:20:14 +010069 closingWindow.mActivityRecord.commitVisibility(
70 false /* visible */, true /* performLayout */);
Garfield Tane8d84ab2019-10-11 09:49:40 -070071 final ArraySet<ActivityRecord> closingApps = new ArraySet<>();
72 closingApps.add(closingWindow.mActivityRecord);
Jorim Jaggi02886a82016-12-06 09:10:06 -080073 final ArraySet<Task> closingTasks = new ArraySet<>();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070074 mWm.mTaskSnapshotController.getClosingTasks(closingApps, closingTasks);
Jorim Jaggi02886a82016-12-06 09:10:06 -080075 assertEquals(1, closingTasks.size());
Garfield Tane8d84ab2019-10-11 09:49:40 -070076 assertEquals(closingWindow.mActivityRecord.getTask(), closingTasks.valueAt(0));
Jorim Jaggi02886a82016-12-06 09:10:06 -080077 }
78
79 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070080 public void testGetClosingApps_notClosing() {
Jorim Jaggi02886a82016-12-06 09:10:06 -080081 final WindowState closingWindow = createWindow(null, FIRST_APPLICATION_WINDOW,
82 "closingWindow");
83 final WindowState openingWindow = createAppWindow(closingWindow.getTask(),
84 FIRST_APPLICATION_WINDOW, "openingWindow");
Issei Suzuki2bcbd682019-11-08 13:20:14 +010085 closingWindow.mActivityRecord.commitVisibility(
86 false /* visible */, true /* performLayout */);
87 openingWindow.mActivityRecord.commitVisibility(
88 true /* visible */, true /* performLayout */);
Garfield Tane8d84ab2019-10-11 09:49:40 -070089 final ArraySet<ActivityRecord> closingApps = new ArraySet<>();
90 closingApps.add(closingWindow.mActivityRecord);
Jorim Jaggi02886a82016-12-06 09:10:06 -080091 final ArraySet<Task> closingTasks = new ArraySet<>();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070092 mWm.mTaskSnapshotController.getClosingTasks(closingApps, closingTasks);
Jorim Jaggi02886a82016-12-06 09:10:06 -080093 assertEquals(0, closingTasks.size());
94 }
Jorim Jaggi0fe7ce962017-02-22 16:45:48 +010095
96 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070097 public void testGetClosingApps_skipClosingAppsSnapshotTasks() {
Winson Chung23aa7b12018-02-01 11:41:43 -080098 final WindowState closingWindow = createWindow(null, FIRST_APPLICATION_WINDOW,
99 "closingWindow");
Issei Suzuki2bcbd682019-11-08 13:20:14 +0100100 closingWindow.mActivityRecord.commitVisibility(
101 false /* visible */, true /* performLayout */);
Garfield Tane8d84ab2019-10-11 09:49:40 -0700102 final ArraySet<ActivityRecord> closingApps = new ArraySet<>();
103 closingApps.add(closingWindow.mActivityRecord);
Winson Chung23aa7b12018-02-01 11:41:43 -0800104 final ArraySet<Task> closingTasks = new ArraySet<>();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700105 mWm.mTaskSnapshotController.addSkipClosingAppSnapshotTasks(
Garfield Tane8d84ab2019-10-11 09:49:40 -0700106 Sets.newArraySet(closingWindow.mActivityRecord.getTask()));
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700107 mWm.mTaskSnapshotController.getClosingTasks(closingApps, closingTasks);
Winson Chung23aa7b12018-02-01 11:41:43 -0800108 assertEquals(0, closingTasks.size());
109 }
110
111 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700112 public void testGetSnapshotMode() {
Jorim Jaggi0fe7ce962017-02-22 16:45:48 +0100113 final WindowState disabledWindow = createWindow(null,
Wale Ogunwale11cc5162017-04-25 20:29:13 -0700114 FIRST_APPLICATION_WINDOW, mDisplayContent, "disabledWindow");
Garfield Tane8d84ab2019-10-11 09:49:40 -0700115 disabledWindow.mActivityRecord.setDisablePreviewScreenshots(true);
Jorim Jaggi8f4fe6e2017-03-14 18:21:40 +0100116 assertEquals(SNAPSHOT_MODE_APP_THEME,
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700117 mWm.mTaskSnapshotController.getSnapshotMode(disabledWindow.getTask()));
Jorim Jaggid635a4a2017-05-03 15:21:26 +0200118
Jorim Jaggi0fe7ce962017-02-22 16:45:48 +0100119 final WindowState normalWindow = createWindow(null,
Wale Ogunwale11cc5162017-04-25 20:29:13 -0700120 FIRST_APPLICATION_WINDOW, mDisplayContent, "normalWindow");
Jorim Jaggi8f4fe6e2017-03-14 18:21:40 +0100121 assertEquals(SNAPSHOT_MODE_REAL,
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700122 mWm.mTaskSnapshotController.getSnapshotMode(normalWindow.getTask()));
Jorim Jaggid635a4a2017-05-03 15:21:26 +0200123
124 final WindowState secureWindow = createWindow(null,
125 FIRST_APPLICATION_WINDOW, mDisplayContent, "secureWindow");
126 secureWindow.mAttrs.flags |= FLAG_SECURE;
127 assertEquals(SNAPSHOT_MODE_APP_THEME,
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700128 mWm.mTaskSnapshotController.getSnapshotMode(secureWindow.getTask()));
Jorim Jaggi0fe7ce962017-02-22 16:45:48 +0100129 }
Mark Renouf98ba8e62019-11-18 12:42:16 -0500130
131 @Test
132 public void testSnapshotBuilder() {
133 final GraphicBuffer buffer = Mockito.mock(GraphicBuffer.class);
134 final ColorSpace sRGB = ColorSpace.get(ColorSpace.Named.SRGB);
135 final long id = 1234L;
136 final ComponentName activityComponent = new ComponentName("package", ".Class");
137 final int windowingMode = WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
138 final int systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN;
139 final int pixelFormat = PixelFormat.RGBA_8888;
140 final int orientation = Configuration.ORIENTATION_PORTRAIT;
141 final float scaleFraction = 0.25f;
142 final Rect contentInsets = new Rect(1, 2, 3, 4);
Peter Kalauskasfe0a4132020-01-31 16:50:42 -0800143 final Point taskSize = new Point(5, 6);
Mark Renouf98ba8e62019-11-18 12:42:16 -0500144
145 try {
146 ActivityManager.TaskSnapshot.Builder builder =
147 new ActivityManager.TaskSnapshot.Builder();
148 builder.setId(id);
149 builder.setTopActivityComponent(activityComponent);
150 builder.setSystemUiVisibility(systemUiVisibility);
151 builder.setWindowingMode(windowingMode);
152 builder.setColorSpace(sRGB);
Mark Renouf98ba8e62019-11-18 12:42:16 -0500153 builder.setOrientation(orientation);
154 builder.setContentInsets(contentInsets);
155 builder.setIsTranslucent(true);
Mark Renouf98ba8e62019-11-18 12:42:16 -0500156 builder.setSnapshot(buffer);
157 builder.setIsRealSnapshot(true);
158 builder.setPixelFormat(pixelFormat);
Peter Kalauskasfe0a4132020-01-31 16:50:42 -0800159 builder.setTaskSize(taskSize);
Mark Renouf98ba8e62019-11-18 12:42:16 -0500160
161 // Not part of TaskSnapshot itself, used in screenshot process
162 assertEquals(pixelFormat, builder.getPixelFormat());
163
164 ActivityManager.TaskSnapshot snapshot = builder.build();
165 assertEquals(id, snapshot.getId());
166 assertEquals(activityComponent, snapshot.getTopActivityComponent());
167 assertEquals(systemUiVisibility, snapshot.getSystemUiVisibility());
168 assertEquals(windowingMode, snapshot.getWindowingMode());
169 assertEquals(sRGB, snapshot.getColorSpace());
Peter Kalauskas84f02a82020-01-22 16:06:18 -0800170 // Snapshots created with the Builder class are always high-res. The only way to get a
171 // low-res snapshot is to load it from the disk in TaskSnapshotLoader.
172 assertFalse(snapshot.isLowResolution());
Mark Renouf98ba8e62019-11-18 12:42:16 -0500173 assertEquals(orientation, snapshot.getOrientation());
174 assertEquals(contentInsets, snapshot.getContentInsets());
175 assertTrue(snapshot.isTranslucent());
Mark Renouf98ba8e62019-11-18 12:42:16 -0500176 assertSame(buffer, snapshot.getSnapshot());
177 assertTrue(snapshot.isRealSnapshot());
Peter Kalauskasfe0a4132020-01-31 16:50:42 -0800178 assertEquals(taskSize, snapshot.getTaskSize());
Mark Renouf98ba8e62019-11-18 12:42:16 -0500179 } finally {
180 if (buffer != null) {
181 buffer.destroy();
182 }
183 }
184 }
Riddle Hsuc802e4b2019-12-20 16:54:33 +0800185
186 @Test
187 public void testPrepareTaskSnapshot() {
188 mAppWindow.mWinAnimator.mLastAlpha = 1f;
189 spyOn(mAppWindow.mWinAnimator);
190 doReturn(true).when(mAppWindow.mWinAnimator).getShown();
191 doReturn(true).when(mAppWindow.mActivityRecord).isSurfaceShowing();
192
193 final ActivityManager.TaskSnapshot.Builder builder =
194 new ActivityManager.TaskSnapshot.Builder();
Riddle Hsu742313e2020-05-05 17:20:32 +0800195 boolean success = mWm.mTaskSnapshotController.prepareTaskSnapshot(
196 mAppWindow.mActivityRecord.getTask(), PixelFormat.UNKNOWN, builder);
Riddle Hsuc802e4b2019-12-20 16:54:33 +0800197
Riddle Hsu742313e2020-05-05 17:20:32 +0800198 assertTrue(success);
Riddle Hsuc802e4b2019-12-20 16:54:33 +0800199 // The pixel format should be selected automatically.
200 assertNotEquals(PixelFormat.UNKNOWN, builder.getPixelFormat());
Riddle Hsu742313e2020-05-05 17:20:32 +0800201
202 // Snapshot should not be taken while the rotation of activity and task are different.
203 doReturn(true).when(mAppWindow.mActivityRecord).hasFixedRotationTransform();
204 success = mWm.mTaskSnapshotController.prepareTaskSnapshot(
205 mAppWindow.mActivityRecord.getTask(), PixelFormat.UNKNOWN, builder);
206
207 assertFalse(success);
Riddle Hsuc802e4b2019-12-20 16:54:33 +0800208 }
Jorim Jaggi02886a82016-12-06 09:10:06 -0800209}