blob: 7a2707b294e5260cc4f836133c437a79212cdb75 [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;
Riddle Hsuc802e4b2019-12-20 16:54:33 +080028import static org.junit.Assert.assertNotEquals;
Mark Renouf98ba8e62019-11-18 12:42:16 -050029import static org.junit.Assert.assertSame;
30import static org.junit.Assert.assertTrue;
Jorim Jaggi02886a82016-12-06 09:10:06 -080031
Mark Renouf98ba8e62019-11-18 12:42:16 -050032import android.app.ActivityManager;
33import android.app.WindowConfiguration;
34import android.content.ComponentName;
35import android.content.res.Configuration;
36import android.graphics.ColorSpace;
37import android.graphics.GraphicBuffer;
38import android.graphics.PixelFormat;
Peter Kalauskasfe0a4132020-01-31 16:50:42 -080039import android.graphics.Point;
Mark Renouf98ba8e62019-11-18 12:42:16 -050040import android.graphics.Rect;
Jorim Jaggi02886a82016-12-06 09:10:06 -080041import android.platform.test.annotations.Presubmit;
Jorim Jaggi02886a82016-12-06 09:10:06 -080042import android.util.ArraySet;
Mark Renouf98ba8e62019-11-18 12:42:16 -050043import android.view.View;
Jorim Jaggi02886a82016-12-06 09:10:06 -080044
Brett Chabota26eda92018-07-23 13:08:30 -070045import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070046
Winson Chung23aa7b12018-02-01 11:41:43 -080047import com.google.android.collect.Sets;
Brett Chabota26eda92018-07-23 13:08:30 -070048
Jorim Jaggi02886a82016-12-06 09:10:06 -080049import org.junit.Test;
Louis Chang2453d062019-11-19 22:30:48 +080050import org.junit.runner.RunWith;
Mark Renouf98ba8e62019-11-18 12:42:16 -050051import org.mockito.Mockito;
Jorim Jaggi02886a82016-12-06 09:10:06 -080052
53/**
54 * Test class for {@link TaskSnapshotController}.
55 *
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070056 * Build/Install/Run:
Andrii Kulianf5d14112019-10-31 17:37:54 -070057 * * atest WmTests:TaskSnapshotControllerTest
Jorim Jaggi02886a82016-12-06 09:10:06 -080058 */
59@SmallTest
60@Presubmit
Louis Chang2453d062019-11-19 22:30:48 +080061@RunWith(WindowTestRunner.class)
Jorim Jaggi02886a82016-12-06 09:10:06 -080062public class TaskSnapshotControllerTest extends WindowTestsBase {
63
64 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070065 public void testGetClosingApps_closing() {
Jorim Jaggi02886a82016-12-06 09:10:06 -080066 final WindowState closingWindow = createWindow(null, FIRST_APPLICATION_WINDOW,
67 "closingWindow");
Issei Suzuki2bcbd682019-11-08 13:20:14 +010068 closingWindow.mActivityRecord.commitVisibility(
69 false /* visible */, true /* performLayout */);
Garfield Tane8d84ab2019-10-11 09:49:40 -070070 final ArraySet<ActivityRecord> closingApps = new ArraySet<>();
71 closingApps.add(closingWindow.mActivityRecord);
Jorim Jaggi02886a82016-12-06 09:10:06 -080072 final ArraySet<Task> closingTasks = new ArraySet<>();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070073 mWm.mTaskSnapshotController.getClosingTasks(closingApps, closingTasks);
Jorim Jaggi02886a82016-12-06 09:10:06 -080074 assertEquals(1, closingTasks.size());
Garfield Tane8d84ab2019-10-11 09:49:40 -070075 assertEquals(closingWindow.mActivityRecord.getTask(), closingTasks.valueAt(0));
Jorim Jaggi02886a82016-12-06 09:10:06 -080076 }
77
78 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070079 public void testGetClosingApps_notClosing() {
Jorim Jaggi02886a82016-12-06 09:10:06 -080080 final WindowState closingWindow = createWindow(null, FIRST_APPLICATION_WINDOW,
81 "closingWindow");
82 final WindowState openingWindow = createAppWindow(closingWindow.getTask(),
83 FIRST_APPLICATION_WINDOW, "openingWindow");
Issei Suzuki2bcbd682019-11-08 13:20:14 +010084 closingWindow.mActivityRecord.commitVisibility(
85 false /* visible */, true /* performLayout */);
86 openingWindow.mActivityRecord.commitVisibility(
87 true /* visible */, true /* performLayout */);
Garfield Tane8d84ab2019-10-11 09:49:40 -070088 final ArraySet<ActivityRecord> closingApps = new ArraySet<>();
89 closingApps.add(closingWindow.mActivityRecord);
Jorim Jaggi02886a82016-12-06 09:10:06 -080090 final ArraySet<Task> closingTasks = new ArraySet<>();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070091 mWm.mTaskSnapshotController.getClosingTasks(closingApps, closingTasks);
Jorim Jaggi02886a82016-12-06 09:10:06 -080092 assertEquals(0, closingTasks.size());
93 }
Jorim Jaggi0fe7ce962017-02-22 16:45:48 +010094
95 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070096 public void testGetClosingApps_skipClosingAppsSnapshotTasks() {
Winson Chung23aa7b12018-02-01 11:41:43 -080097 final WindowState closingWindow = createWindow(null, FIRST_APPLICATION_WINDOW,
98 "closingWindow");
Issei Suzuki2bcbd682019-11-08 13:20:14 +010099 closingWindow.mActivityRecord.commitVisibility(
100 false /* visible */, true /* performLayout */);
Garfield Tane8d84ab2019-10-11 09:49:40 -0700101 final ArraySet<ActivityRecord> closingApps = new ArraySet<>();
102 closingApps.add(closingWindow.mActivityRecord);
Winson Chung23aa7b12018-02-01 11:41:43 -0800103 final ArraySet<Task> closingTasks = new ArraySet<>();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700104 mWm.mTaskSnapshotController.addSkipClosingAppSnapshotTasks(
Garfield Tane8d84ab2019-10-11 09:49:40 -0700105 Sets.newArraySet(closingWindow.mActivityRecord.getTask()));
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700106 mWm.mTaskSnapshotController.getClosingTasks(closingApps, closingTasks);
Winson Chung23aa7b12018-02-01 11:41:43 -0800107 assertEquals(0, closingTasks.size());
108 }
109
110 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700111 public void testGetSnapshotMode() {
Jorim Jaggi0fe7ce962017-02-22 16:45:48 +0100112 final WindowState disabledWindow = createWindow(null,
Wale Ogunwale11cc5162017-04-25 20:29:13 -0700113 FIRST_APPLICATION_WINDOW, mDisplayContent, "disabledWindow");
Garfield Tane8d84ab2019-10-11 09:49:40 -0700114 disabledWindow.mActivityRecord.setDisablePreviewScreenshots(true);
Jorim Jaggi8f4fe6e2017-03-14 18:21:40 +0100115 assertEquals(SNAPSHOT_MODE_APP_THEME,
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700116 mWm.mTaskSnapshotController.getSnapshotMode(disabledWindow.getTask()));
Jorim Jaggid635a4a2017-05-03 15:21:26 +0200117
Jorim Jaggi0fe7ce962017-02-22 16:45:48 +0100118 final WindowState normalWindow = createWindow(null,
Wale Ogunwale11cc5162017-04-25 20:29:13 -0700119 FIRST_APPLICATION_WINDOW, mDisplayContent, "normalWindow");
Jorim Jaggi8f4fe6e2017-03-14 18:21:40 +0100120 assertEquals(SNAPSHOT_MODE_REAL,
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700121 mWm.mTaskSnapshotController.getSnapshotMode(normalWindow.getTask()));
Jorim Jaggid635a4a2017-05-03 15:21:26 +0200122
123 final WindowState secureWindow = createWindow(null,
124 FIRST_APPLICATION_WINDOW, mDisplayContent, "secureWindow");
125 secureWindow.mAttrs.flags |= FLAG_SECURE;
126 assertEquals(SNAPSHOT_MODE_APP_THEME,
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700127 mWm.mTaskSnapshotController.getSnapshotMode(secureWindow.getTask()));
Jorim Jaggi0fe7ce962017-02-22 16:45:48 +0100128 }
Mark Renouf98ba8e62019-11-18 12:42:16 -0500129
130 @Test
131 public void testSnapshotBuilder() {
132 final GraphicBuffer buffer = Mockito.mock(GraphicBuffer.class);
133 final ColorSpace sRGB = ColorSpace.get(ColorSpace.Named.SRGB);
134 final long id = 1234L;
135 final ComponentName activityComponent = new ComponentName("package", ".Class");
136 final int windowingMode = WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
137 final int systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN;
138 final int pixelFormat = PixelFormat.RGBA_8888;
139 final int orientation = Configuration.ORIENTATION_PORTRAIT;
140 final float scaleFraction = 0.25f;
141 final Rect contentInsets = new Rect(1, 2, 3, 4);
Peter Kalauskasfe0a4132020-01-31 16:50:42 -0800142 final Point taskSize = new Point(5, 6);
Mark Renouf98ba8e62019-11-18 12:42:16 -0500143
144 try {
145 ActivityManager.TaskSnapshot.Builder builder =
146 new ActivityManager.TaskSnapshot.Builder();
147 builder.setId(id);
148 builder.setTopActivityComponent(activityComponent);
149 builder.setSystemUiVisibility(systemUiVisibility);
150 builder.setWindowingMode(windowingMode);
151 builder.setColorSpace(sRGB);
Peter Kalauskas4dc04602020-02-12 18:49:03 -0800152 builder.setIsLowResolution(true);
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 Kalauskas4dc04602020-02-12 18:49:03 -0800170 assertTrue(snapshot.isLowResolution());
Peter Kalauskasfe0a4132020-01-31 16:50:42 -0800171 assertTrue(builder.isLowResolution());
Mark Renouf98ba8e62019-11-18 12:42:16 -0500172 assertEquals(orientation, snapshot.getOrientation());
173 assertEquals(contentInsets, snapshot.getContentInsets());
174 assertTrue(snapshot.isTranslucent());
Mark Renouf98ba8e62019-11-18 12:42:16 -0500175 assertSame(buffer, snapshot.getSnapshot());
176 assertTrue(snapshot.isRealSnapshot());
Peter Kalauskasfe0a4132020-01-31 16:50:42 -0800177 assertEquals(taskSize, snapshot.getTaskSize());
Mark Renouf98ba8e62019-11-18 12:42:16 -0500178 } finally {
179 if (buffer != null) {
180 buffer.destroy();
181 }
182 }
183 }
Riddle Hsuc802e4b2019-12-20 16:54:33 +0800184
185 @Test
186 public void testPrepareTaskSnapshot() {
187 mAppWindow.mWinAnimator.mLastAlpha = 1f;
188 spyOn(mAppWindow.mWinAnimator);
189 doReturn(true).when(mAppWindow.mWinAnimator).getShown();
190 doReturn(true).when(mAppWindow.mActivityRecord).isSurfaceShowing();
191
192 final ActivityManager.TaskSnapshot.Builder builder =
193 new ActivityManager.TaskSnapshot.Builder();
Riddle Hsuc802e4b2019-12-20 16:54:33 +0800194 mWm.mTaskSnapshotController.prepareTaskSnapshot(mAppWindow.mActivityRecord.getTask(),
Peter Kalauskasfe0a4132020-01-31 16:50:42 -0800195 PixelFormat.UNKNOWN, builder);
Riddle Hsuc802e4b2019-12-20 16:54:33 +0800196
Riddle Hsuc802e4b2019-12-20 16:54:33 +0800197 // The pixel format should be selected automatically.
198 assertNotEquals(PixelFormat.UNKNOWN, builder.getPixelFormat());
199 }
Jorim Jaggi02886a82016-12-06 09:10:06 -0800200}