blob: 2835c1fb59ae3ac9d2d97a2a70c0280437223ef1 [file] [log] [blame]
Bryce Lee840c5662017-04-13 10:02:51 -07001/*
Wale Ogunwale59507092018-10-29 09:00:30 -07002 * Copyright (C) 2018 The Android Open Source Project
Bryce Lee840c5662017-04-13 10:02:51 -07003 *
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
Wale Ogunwale59507092018-10-29 09:00:30 -070014 * limitations under the License
Bryce Lee840c5662017-04-13 10:02:51 -070015 */
16
Wale Ogunwale59507092018-10-29 09:00:30 -070017package com.android.server.wm;
Bryce Lee840c5662017-04-13 10:02:51 -070018
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -070019import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
20import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070021import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
Kazuki Takisef85197b2018-06-18 18:18:36 +090022import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070023import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -070024import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
25import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
26import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
Evan Rosky10475742018-09-05 19:02:48 -070027import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
Louis Chang7b03ad92019-08-21 12:32:33 +080028import static android.content.pm.ActivityInfo.FLAG_RESUME_WHILE_PAUSING;
Bryce Lee18d51592017-10-25 10:22:19 -070029
Louis Changcfe46212019-07-30 10:34:18 +080030import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
Tadashi G. Takaokaa7a66952018-11-16 15:04:21 +090031import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
32import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
Wale Ogunwale8a1860a2019-06-05 08:57:19 -070033import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
Tadashi G. Takaokaa7a66952018-11-16 15:04:21 +090034import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
Wale Ogunwale59507092018-10-29 09:00:30 -070035import static com.android.server.wm.ActivityStack.ActivityState.DESTROYING;
wilsonshih8824a8a2019-03-12 17:21:35 +080036import static com.android.server.wm.ActivityStack.ActivityState.FINISHING;
Wale Ogunwale59507092018-10-29 09:00:30 -070037import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
38import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
Riddle Hsuaaef7312019-01-24 19:00:58 +080039import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
Wale Ogunwale59507092018-10-29 09:00:30 -070040import static com.android.server.wm.ActivityStack.ActivityState.STOPPING;
41import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
Andrii Kulian0c869cc2019-02-06 19:50:32 -080042import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_INVISIBLE;
43import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_VISIBLE;
44import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
Garfield Tanf6cc5c92019-01-15 13:54:12 -080045import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE;
46import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
Wale Ogunwale8a1860a2019-06-05 08:57:19 -070047import static com.android.server.wm.TaskRecord.REPARENT_MOVE_STACK_TO_FRONT;
Bryce Lee18d51592017-10-25 10:22:19 -070048
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090049import static com.google.common.truth.Truth.assertThat;
50
Bryce Lee5daa3122017-04-19 10:40:42 -070051import static org.junit.Assert.assertEquals;
David Stevens18abd0e2017-08-17 14:55:47 -070052import static org.junit.Assert.assertFalse;
Bryce Lee840c5662017-04-13 10:02:51 -070053import static org.junit.Assert.assertNotNull;
54import static org.junit.Assert.assertNull;
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -070055import static org.junit.Assert.assertTrue;
Riddle Hsu138ef932018-10-26 17:12:06 +080056import static org.mockito.ArgumentMatchers.any;
Riddle Hsue10cea52018-10-16 23:33:23 +080057import static org.mockito.ArgumentMatchers.anyBoolean;
58import static org.mockito.ArgumentMatchers.anyInt;
Riddle Hsue10cea52018-10-16 23:33:23 +080059import static org.mockito.ArgumentMatchers.eq;
Bryce Lee840c5662017-04-13 10:02:51 -070060
Riddle Hsuaaef7312019-01-24 19:00:58 +080061import android.content.ComponentName;
Bryce Lee3345c4e2017-04-25 07:40:41 -070062import android.content.pm.ActivityInfo;
Bryce Lee9f6affd2017-09-01 09:18:35 -070063import android.os.UserHandle;
Bryce Lee840c5662017-04-13 10:02:51 -070064import android.platform.test.annotations.Presubmit;
Bryce Lee840c5662017-04-13 10:02:51 -070065
Brett Chabota26eda92018-07-23 13:08:30 -070066import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070067
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070068import org.junit.Before;
Bryce Lee840c5662017-04-13 10:02:51 -070069import org.junit.Test;
Riddle Hsu73f53572019-09-23 23:13:01 +080070import org.junit.runner.RunWith;
Bryce Lee840c5662017-04-13 10:02:51 -070071
72/**
73 * Tests for the {@link ActivityStack} class.
74 *
75 * Build/Install/Run:
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090076 * atest WmTests:ActivityStackTests
Bryce Lee840c5662017-04-13 10:02:51 -070077 */
78@SmallTest
79@Presubmit
Riddle Hsu73f53572019-09-23 23:13:01 +080080@RunWith(WindowTestRunner.class)
Bryce Lee840c5662017-04-13 10:02:51 -070081public class ActivityStackTests extends ActivityTestsBase {
Winson Chung3e2980e2018-03-29 17:28:57 -070082 private ActivityDisplay mDefaultDisplay;
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070083 private ActivityStack mStack;
84 private TaskRecord mTask;
85
86 @Before
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070087 public void setUp() throws Exception {
Wale Ogunwaled32da472018-11-16 07:19:28 -080088 mDefaultDisplay = mRootActivityContainer.getDefaultDisplay();
Wale Ogunwale8a1860a2019-06-05 08:57:19 -070089 mStack = mDefaultDisplay.createStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD,
90 true /* onTop */);
91 spyOn(mStack);
Bryce Lee18d51592017-10-25 10:22:19 -070092 mTask = new TaskBuilder(mSupervisor).setStack(mStack).build();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070093 }
94
Bryce Lee840c5662017-04-13 10:02:51 -070095 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090096 public void testEmptyTaskCleanupOnRemove() {
Yunfan Chen0e7aff92018-12-05 16:35:32 -080097 assertNotNull(mTask.getTask());
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070098 mStack.removeTask(mTask, "testEmptyTaskCleanupOnRemove", REMOVE_TASK_MODE_DESTROYING);
Yunfan Chen0e7aff92018-12-05 16:35:32 -080099 assertNull(mTask.getTask());
Bryce Lee840c5662017-04-13 10:02:51 -0700100 }
Bryce Lee5daa3122017-04-19 10:40:42 -0700101
Bryce Lee840c5662017-04-13 10:02:51 -0700102 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900103 public void testOccupiedTaskCleanupOnRemove() {
Bryce Lee18d51592017-10-25 10:22:19 -0700104 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
Yunfan Chen0e7aff92018-12-05 16:35:32 -0800105 assertNotNull(mTask.getTask());
Wale Ogunwale04a05ac2017-09-17 21:35:02 -0700106 mStack.removeTask(mTask, "testOccupiedTaskCleanupOnRemove", REMOVE_TASK_MODE_DESTROYING);
Yunfan Chen0e7aff92018-12-05 16:35:32 -0800107 assertNotNull(mTask.getTask());
Bryce Lee840c5662017-04-13 10:02:51 -0700108 }
Bryce Lee5daa3122017-04-19 10:40:42 -0700109
110 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900111 public void testResumedActivity() {
Bryce Leec4ab62a2018-03-05 14:19:26 -0800112 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900113 assertNull(mStack.getResumedActivity());
Bryce Leec4ab62a2018-03-05 14:19:26 -0800114 r.setState(RESUMED, "testResumedActivity");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900115 assertEquals(r, mStack.getResumedActivity());
Bryce Leec4ab62a2018-03-05 14:19:26 -0800116 r.setState(PAUSING, "testResumedActivity");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900117 assertNull(mStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700118 }
Bryce Leec4ab62a2018-03-05 14:19:26 -0800119
Bryce Lee84730a02018-04-03 14:10:04 -0700120 @Test
121 public void testResumedActivityFromTaskReparenting() {
122 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
123 // Ensure moving task between two stacks updates resumed activity
124 r.setState(RESUMED, "testResumedActivityFromTaskReparenting");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900125 assertEquals(r, mStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700126
Wale Ogunwaled32da472018-11-16 07:19:28 -0800127 final ActivityStack destStack = mRootActivityContainer.getDefaultDisplay().createStack(
Bryce Lee84730a02018-04-03 14:10:04 -0700128 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
129
130 mTask.reparent(destStack, true /* toTop */, TaskRecord.REPARENT_KEEP_STACK_AT_FRONT,
131 false /* animate */, true /* deferResume*/,
132 "testResumedActivityFromTaskReparenting");
133
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900134 assertNull(mStack.getResumedActivity());
135 assertEquals(r, destStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700136 }
137
138 @Test
139 public void testResumedActivityFromActivityReparenting() {
140 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
141 // Ensure moving task between two stacks updates resumed activity
142 r.setState(RESUMED, "testResumedActivityFromActivityReparenting");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900143 assertEquals(r, mStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700144
Wale Ogunwaled32da472018-11-16 07:19:28 -0800145 final ActivityStack destStack = mRootActivityContainer.getDefaultDisplay().createStack(
Bryce Lee84730a02018-04-03 14:10:04 -0700146 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700147 mTask.reparent(destStack, true /*toTop*/, REPARENT_MOVE_STACK_TO_FRONT, false, false,
148 "testResumedActivityFromActivityReparenting");
Bryce Lee84730a02018-04-03 14:10:04 -0700149
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900150 assertNull(mStack.getResumedActivity());
151 assertEquals(r, destStack.getResumedActivity());
Bryce Lee5daa3122017-04-19 10:40:42 -0700152 }
Bryce Lee3345c4e2017-04-25 07:40:41 -0700153
154 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900155 public void testPrimarySplitScreenRestoresWhenMovedToBack() {
Bryce Lee8cab4a02018-01-05 09:00:49 -0800156 // Create primary splitscreen stack. This will create secondary stacks and places the
157 // existing fullscreen stack on the bottom.
Winson Chung3e2980e2018-03-29 17:28:57 -0700158 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
159 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Bryce Lee8cab4a02018-01-05 09:00:49 -0800160
161 // Assert windowing mode.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900162 assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, primarySplitScreen.getWindowingMode());
Bryce Lee8cab4a02018-01-05 09:00:49 -0800163
164 // Move primary to back.
165 primarySplitScreen.moveToBack("testPrimarySplitScreenToFullscreenWhenMovedToBack",
166 null /* task */);
167
168 // Assert that stack is at the bottom.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900169 assertEquals(0, mDefaultDisplay.getIndexOf(primarySplitScreen));
Bryce Lee8cab4a02018-01-05 09:00:49 -0800170
171 // Ensure no longer in splitscreen.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900172 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700173
174 // Ensure that the override mode is restored to undefined
Evan Roskydfe3da72018-10-26 17:21:06 -0700175 assertEquals(WINDOWING_MODE_UNDEFINED,
176 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700177 }
178
179 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900180 public void testPrimarySplitScreenRestoresPreviousWhenMovedToBack() {
Evan Rosky10475742018-09-05 19:02:48 -0700181 // This time, start with a fullscreen activitystack
182 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900183 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Evan Rosky10475742018-09-05 19:02:48 -0700184
185 primarySplitScreen.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
186
187 // Assert windowing mode.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900188 assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, primarySplitScreen.getWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700189
190 // Move primary to back.
191 primarySplitScreen.moveToBack("testPrimarySplitScreenToFullscreenWhenMovedToBack",
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900192 null /* task */);
Evan Rosky10475742018-09-05 19:02:48 -0700193
194 // Assert that stack is at the bottom.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900195 assertEquals(0, mDefaultDisplay.getIndexOf(primarySplitScreen));
Evan Rosky10475742018-09-05 19:02:48 -0700196
197 // Ensure that the override mode is restored to what it was (fullscreen)
Evan Roskydfe3da72018-10-26 17:21:06 -0700198 assertEquals(WINDOWING_MODE_FULLSCREEN,
199 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700200 }
201
202 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900203 public void testStackInheritsDisplayWindowingMode() {
Evan Rosky10475742018-09-05 19:02:48 -0700204 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900205 WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Evan Rosky10475742018-09-05 19:02:48 -0700206
207 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Evan Roskydfe3da72018-10-26 17:21:06 -0700208 assertEquals(WINDOWING_MODE_UNDEFINED,
209 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700210
211 mDefaultDisplay.setWindowingMode(WINDOWING_MODE_FREEFORM);
212 assertEquals(WINDOWING_MODE_FREEFORM, primarySplitScreen.getWindowingMode());
Evan Roskydfe3da72018-10-26 17:21:06 -0700213 assertEquals(WINDOWING_MODE_UNDEFINED,
214 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700215 }
216
217 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900218 public void testStackOverridesDisplayWindowingMode() {
Evan Rosky10475742018-09-05 19:02:48 -0700219 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900220 WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Evan Rosky10475742018-09-05 19:02:48 -0700221
222 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Evan Roskydfe3da72018-10-26 17:21:06 -0700223 assertEquals(WINDOWING_MODE_UNDEFINED,
224 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700225
226 primarySplitScreen.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
227 // setting windowing mode should still work even though resolved mode is already fullscreen
Evan Roskydfe3da72018-10-26 17:21:06 -0700228 assertEquals(WINDOWING_MODE_FULLSCREEN,
229 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700230
231 mDefaultDisplay.setWindowingMode(WINDOWING_MODE_FREEFORM);
232 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Bryce Lee8cab4a02018-01-05 09:00:49 -0800233 }
234
235 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900236 public void testStopActivityWhenActivityDestroyed() {
Bryce Lee18d51592017-10-25 10:22:19 -0700237 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -0700238 r.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700239 mStack.moveToFront("testStopActivityWithDestroy");
Andrii Kulian79d67982019-08-19 11:56:16 -0700240 r.stopIfPossible();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -0700241 // Mostly testing to make sure there is a crash in the call part, so if we get here we are
242 // good-to-go!
Bryce Lee3345c4e2017-04-25 07:40:41 -0700243 }
Bryce Lee9f6affd2017-09-01 09:18:35 -0700244
245 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900246 public void testFindTaskWithOverlay() {
Bryce Lee18d51592017-10-25 10:22:19 -0700247 final ActivityRecord r = new ActivityBuilder(mService)
248 .setCreateTask(true)
249 .setStack(mStack)
250 .setUid(0)
251 .build();
Wale Ogunwale8b19de92018-11-29 19:58:26 -0800252 final TaskRecord task = r.getTaskRecord();
Bryce Lee9f6affd2017-09-01 09:18:35 -0700253 // Overlay must be for a different user to prevent recognizing a matching top activity
Bryce Lee18d51592017-10-25 10:22:19 -0700254 final ActivityRecord taskOverlay = new ActivityBuilder(mService).setTask(task)
255 .setUid(UserHandle.PER_USER_RANGE * 2).build();
Bryce Lee9f6affd2017-09-01 09:18:35 -0700256 taskOverlay.mTaskOverlay = true;
257
Wale Ogunwaled32da472018-11-16 07:19:28 -0800258 final RootActivityContainer.FindTaskResult result =
259 new RootActivityContainer.FindTaskResult();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -0700260 mStack.findTaskLocked(r, result);
Bryce Lee9f6affd2017-09-01 09:18:35 -0700261
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900262 assertEquals(r, task.getTopActivity(false /* includeOverlays */));
263 assertEquals(taskOverlay, task.getTopActivity(true /* includeOverlays */));
Louis Changc85b1a32018-08-14 16:40:53 +0800264 assertNotNull(result.mRecord);
Bryce Lee9f6affd2017-09-01 09:18:35 -0700265 }
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700266
267 @Test
Louis Changb05c8d82019-06-25 11:56:55 +0800268 public void testFindTaskAlias() {
269 final String targetActivity = "target.activity";
270 final String aliasActivity = "alias.activity";
271 final ComponentName target = new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME,
272 targetActivity);
273 final ComponentName alias = new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME,
274 aliasActivity);
275 final TaskRecord task = new TaskBuilder(mService.mStackSupervisor).setStack(mStack).build();
276 task.origActivity = alias;
277 task.realActivity = target;
278 new ActivityBuilder(mService).setComponent(target).setTask(task).setTargetActivity(
279 targetActivity).build();
280
281 // Using target activity to find task.
282 final ActivityRecord r1 = new ActivityBuilder(mService).setComponent(
283 target).setTargetActivity(targetActivity).build();
284 RootActivityContainer.FindTaskResult result = new RootActivityContainer.FindTaskResult();
285 mStack.findTaskLocked(r1, result);
286 assertThat(result.mRecord).isNotNull();
287
288 // Using alias activity to find task.
289 final ActivityRecord r2 = new ActivityBuilder(mService).setComponent(
290 alias).setTargetActivity(targetActivity).build();
291 result = new RootActivityContainer.FindTaskResult();
292 mStack.findTaskLocked(r2, result);
293 assertThat(result.mRecord).isNotNull();
294 }
295
296 @Test
Riddle Hsu138ef932018-10-26 17:12:06 +0800297 public void testMoveStackToBackIncludingParent() {
298 final ActivityDisplay display = addNewActivityDisplayAt(ActivityDisplay.POSITION_TOP);
299 final ActivityStack stack1 = createStackForShouldBeVisibleTest(display,
300 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
301 final ActivityStack stack2 = createStackForShouldBeVisibleTest(display,
302 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
303
304 // Do not move display to back because there is still another stack.
305 stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.topTask());
Yunfan Chen279f5582018-12-12 15:24:50 -0800306 verify(stack2.getTaskStack()).positionChildAtBottom(any(),
Riddle Hsu138ef932018-10-26 17:12:06 +0800307 eq(false) /* includingParents */);
308
309 // Also move display to back because there is only one stack left.
310 display.removeChild(stack1);
311 stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.topTask());
Yunfan Chen279f5582018-12-12 15:24:50 -0800312 verify(stack2.getTaskStack()).positionChildAtBottom(any(),
Riddle Hsu138ef932018-10-26 17:12:06 +0800313 eq(true) /* includingParents */);
314 }
315
316 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900317 public void testShouldBeVisible_Fullscreen() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700318 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700319 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Winson Chung3e2980e2018-03-29 17:28:57 -0700320 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700321 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700322 // Add an activity to the pinned stack so it isn't considered empty for visibility check.
323 final ActivityRecord pinnedActivity = new ActivityBuilder(mService)
324 .setCreateTask(true)
325 .setStack(pinnedStack)
326 .build();
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700327
328 assertTrue(homeStack.shouldBeVisible(null /* starting */));
329 assertTrue(pinnedStack.shouldBeVisible(null /* starting */));
330
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700331 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700332 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
333 // Home stack shouldn't be visible behind an opaque fullscreen stack, but pinned stack
334 // should be visible since it is always on-top.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700335 doReturn(false).when(fullscreenStack).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700336 assertFalse(homeStack.shouldBeVisible(null /* starting */));
337 assertTrue(pinnedStack.shouldBeVisible(null /* starting */));
338 assertTrue(fullscreenStack.shouldBeVisible(null /* starting */));
339
340 // Home stack should be visible behind a translucent fullscreen stack.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700341 doReturn(true).when(fullscreenStack).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700342 assertTrue(homeStack.shouldBeVisible(null /* starting */));
343 assertTrue(pinnedStack.shouldBeVisible(null /* starting */));
344 }
345
346 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900347 public void testShouldBeVisible_SplitScreen() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700348 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700349 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale30e441d2017-11-09 08:28:45 -0800350 // Home stack should always be fullscreen for this test.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700351 doReturn(false).when(homeStack).supportsSplitScreenWindowingMode();
352 final ActivityStack splitScreenPrimary =
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900353 createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700354 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700355 final ActivityStack splitScreenSecondary =
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900356 createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700357 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
358
359 // Home stack shouldn't be visible if both halves of split-screen are opaque.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700360 doReturn(false).when(splitScreenPrimary).isStackTranslucent(any());
361 doReturn(false).when(splitScreenSecondary).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700362 assertFalse(homeStack.shouldBeVisible(null /* starting */));
363 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
364 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800365 assertEquals(STACK_VISIBILITY_INVISIBLE, homeStack.getVisibility(null /* starting */));
366 assertEquals(STACK_VISIBILITY_VISIBLE,
367 splitScreenPrimary.getVisibility(null /* starting */));
368 assertEquals(STACK_VISIBILITY_VISIBLE,
369 splitScreenSecondary.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700370
371 // Home stack should be visible if one of the halves of split-screen is translucent.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700372 doReturn(true).when(splitScreenPrimary).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700373 assertTrue(homeStack.shouldBeVisible(null /* starting */));
374 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
375 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800376 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
377 homeStack.getVisibility(null /* starting */));
378 assertEquals(STACK_VISIBILITY_VISIBLE,
379 splitScreenPrimary.getVisibility(null /* starting */));
380 assertEquals(STACK_VISIBILITY_VISIBLE,
381 splitScreenSecondary.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700382
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700383 final ActivityStack splitScreenSecondary2 =
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900384 createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700385 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
386 // First split-screen secondary shouldn't be visible behind another opaque split-split
387 // secondary.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700388 doReturn(false).when(splitScreenSecondary2).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700389 assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
390 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800391 assertEquals(STACK_VISIBILITY_INVISIBLE,
392 splitScreenSecondary.getVisibility(null /* starting */));
393 assertEquals(STACK_VISIBILITY_VISIBLE,
394 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700395
Wale Ogunwale8e923af2018-03-23 08:48:11 -0700396 // First split-screen secondary should be visible behind another translucent split-screen
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700397 // secondary.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700398 doReturn(true).when(splitScreenSecondary2).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700399 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
400 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800401 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
402 splitScreenSecondary.getVisibility(null /* starting */));
403 assertEquals(STACK_VISIBILITY_VISIBLE,
404 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700405
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700406 final ActivityStack assistantStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700407 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */);
408
409 // Split-screen stacks shouldn't be visible behind an opaque fullscreen stack.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700410 doReturn(false).when(assistantStack).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700411 assertTrue(assistantStack.shouldBeVisible(null /* starting */));
412 assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */));
413 assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
414 assertFalse(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800415 assertEquals(STACK_VISIBILITY_VISIBLE,
416 assistantStack.getVisibility(null /* starting */));
417 assertEquals(STACK_VISIBILITY_INVISIBLE,
418 splitScreenPrimary.getVisibility(null /* starting */));
419 assertEquals(STACK_VISIBILITY_INVISIBLE,
420 splitScreenSecondary.getVisibility(null /* starting */));
421 assertEquals(STACK_VISIBILITY_INVISIBLE,
422 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700423
424 // Split-screen stacks should be visible behind a translucent fullscreen stack.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700425 doReturn(true).when(assistantStack).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700426 assertTrue(assistantStack.shouldBeVisible(null /* starting */));
427 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
428 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
429 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800430 assertEquals(STACK_VISIBILITY_VISIBLE,
431 assistantStack.getVisibility(null /* starting */));
432 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
433 splitScreenPrimary.getVisibility(null /* starting */));
434 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
435 splitScreenSecondary.getVisibility(null /* starting */));
436 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
437 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale8e923af2018-03-23 08:48:11 -0700438
439 // Assistant stack shouldn't be visible behind translucent split-screen stack
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700440 doReturn(false).when(assistantStack).isStackTranslucent(any());
441 doReturn(true).when(splitScreenPrimary).isStackTranslucent(any());
442 doReturn(true).when(splitScreenSecondary2).isStackTranslucent(any());
Wale Ogunwale8e923af2018-03-23 08:48:11 -0700443 splitScreenSecondary2.moveToFront("testShouldBeVisible_SplitScreen");
444 splitScreenPrimary.moveToFront("testShouldBeVisible_SplitScreen");
445 assertFalse(assistantStack.shouldBeVisible(null /* starting */));
446 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
447 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800448 assertEquals(STACK_VISIBILITY_INVISIBLE,
449 assistantStack.getVisibility(null /* starting */));
450 assertEquals(STACK_VISIBILITY_VISIBLE,
451 splitScreenPrimary.getVisibility(null /* starting */));
452 assertEquals(STACK_VISIBILITY_INVISIBLE,
453 splitScreenSecondary.getVisibility(null /* starting */));
454 assertEquals(STACK_VISIBILITY_VISIBLE,
455 splitScreenSecondary2.getVisibility(null /* starting */));
456 }
457
458 @Test
459 public void testGetVisibility_FullscreenBehindTranslucent() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700460 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800461 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
462 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700463 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800464 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
465 true /* translucent */);
466
467 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
468 bottomStack.getVisibility(null /* starting */));
469 assertEquals(STACK_VISIBILITY_VISIBLE,
470 translucentStack.getVisibility(null /* starting */));
471 }
472
473 @Test
474 public void testGetVisibility_FullscreenBehindTranslucentAndOpaque() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700475 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800476 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
477 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700478 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800479 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
480 true /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700481 final ActivityStack opaqueStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800482 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
483 false /* translucent */);
484
485 assertEquals(STACK_VISIBILITY_INVISIBLE, bottomStack.getVisibility(null /* starting */));
486 assertEquals(STACK_VISIBILITY_INVISIBLE,
487 translucentStack.getVisibility(null /* starting */));
488 assertEquals(STACK_VISIBILITY_VISIBLE, opaqueStack.getVisibility(null /* starting */));
489 }
490
491 @Test
492 public void testGetVisibility_FullscreenBehindOpaqueAndTranslucent() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700493 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800494 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
495 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700496 final ActivityStack opaqueStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800497 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
498 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700499 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800500 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
501 true /* translucent */);
502
503 assertEquals(STACK_VISIBILITY_INVISIBLE, bottomStack.getVisibility(null /* starting */));
504 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
505 opaqueStack.getVisibility(null /* starting */));
506 assertEquals(STACK_VISIBILITY_VISIBLE,
507 translucentStack.getVisibility(null /* starting */));
508 }
509
510 @Test
511 public void testGetVisibility_FullscreenTranslucentBehindTranslucent() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700512 final ActivityStack bottomTranslucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800513 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
514 true /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700515 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800516 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
517 true /* translucent */);
518
519 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
520 bottomTranslucentStack.getVisibility(null /* starting */));
521 assertEquals(STACK_VISIBILITY_VISIBLE,
522 translucentStack.getVisibility(null /* starting */));
523 }
524
525 @Test
526 public void testGetVisibility_FullscreenTranslucentBehindOpaque() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700527 final ActivityStack bottomTranslucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800528 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
529 true /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700530 final ActivityStack opaqueStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800531 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
532 false /* translucent */);
533
534 assertEquals(STACK_VISIBILITY_INVISIBLE,
535 bottomTranslucentStack.getVisibility(null /* starting */));
536 assertEquals(STACK_VISIBILITY_VISIBLE, opaqueStack.getVisibility(null /* starting */));
537 }
538
539 @Test
540 public void testGetVisibility_FullscreenBehindTranslucentAndPip() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700541 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800542 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
543 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700544 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800545 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
546 true /* translucent */);
547 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
548 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
549
550 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
551 bottomStack.getVisibility(null /* starting */));
552 assertEquals(STACK_VISIBILITY_VISIBLE,
553 translucentStack.getVisibility(null /* starting */));
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700554 // Add an activity to the pinned stack so it isn't considered empty for visibility check.
555 final ActivityRecord pinnedActivity = new ActivityBuilder(mService)
556 .setCreateTask(true)
557 .setStack(pinnedStack)
558 .build();
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800559 assertEquals(STACK_VISIBILITY_VISIBLE, pinnedStack.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700560 }
561
562 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900563 public void testShouldBeVisible_Finishing() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700564 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700565 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700566 ActivityRecord topRunningHomeActivity = homeStack.topRunningActivityLocked();
567 if (topRunningHomeActivity == null) {
568 topRunningHomeActivity = new ActivityBuilder(mService)
569 .setStack(homeStack)
570 .setCreateTask(true)
571 .build();
572 }
573
574 final ActivityStack translucentStack = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700575 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
576 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700577 doReturn(true).when(translucentStack).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700578
579 assertTrue(homeStack.shouldBeVisible(null /* starting */));
580 assertTrue(translucentStack.shouldBeVisible(null /* starting */));
581
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700582 topRunningHomeActivity.finishing = true;
583 final ActivityRecord topRunningTranslucentActivity =
584 translucentStack.topRunningActivityLocked();
585 topRunningTranslucentActivity.finishing = true;
586
Louis Changf2835df2018-10-17 15:14:45 +0800587 // Home stack should be visible even there are no running activities.
588 assertTrue(homeStack.shouldBeVisible(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700589 // Home should be visible if we are starting an activity within it.
590 assertTrue(homeStack.shouldBeVisible(topRunningHomeActivity /* starting */));
Louis Changf2835df2018-10-17 15:14:45 +0800591 // The translucent stack shouldn't be visible since its activity marked as finishing.
592 assertFalse(translucentStack.shouldBeVisible(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700593 }
594
Winson Chungd922b6b2018-02-16 16:41:50 -0800595 @Test
596 public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindFullscreen() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700597 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800598
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700599 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800600 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700601 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800602 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
603
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700604 doReturn(false).when(homeStack).isStackTranslucent(any());
605 doReturn(false).when(fullscreenStack).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800606
607 // Ensure that we don't move the home stack if it is already behind the top fullscreen stack
Winson Chung3e2980e2018-03-29 17:28:57 -0700608 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900609 assertEquals(fullscreenStack, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700610 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900611 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800612 }
613
614 @Test
615 public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindTranslucent() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700616 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800617
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700618 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800619 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700620 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800621 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
622
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700623 doReturn(false).when(homeStack).isStackTranslucent(any());
624 doReturn(true).when(fullscreenStack).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800625
626 // Ensure that we don't move the home stack if it is already behind the top fullscreen stack
Winson Chung3e2980e2018-03-29 17:28:57 -0700627 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900628 assertEquals(fullscreenStack, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700629 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900630 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800631 }
632
633 @Test
634 public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeOnTop() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700635 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800636
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700637 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800638 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700639 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800640 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
641
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700642 doReturn(false).when(homeStack).isStackTranslucent(any());
643 doReturn(false).when(fullscreenStack).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800644
645 // Ensure we don't move the home stack if it is already on top
Winson Chung3e2980e2018-03-29 17:28:57 -0700646 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900647 assertNull(mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700648 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900649 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800650 }
651
652 @Test
653 public void testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreen() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700654 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800655
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700656 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800657 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700658 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700659 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
660 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700661 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700662 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
663 true /* onTop */);
Wale Ogunwale24116192018-11-07 07:46:56 -0800664 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800665 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
666
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700667 doReturn(false).when(homeStack).isStackTranslucent(any());
668 doReturn(false).when(fullscreenStack1).isStackTranslucent(any());
669 doReturn(false).when(fullscreenStack2).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800670
671 // Ensure that we move the home stack behind the bottom most fullscreen stack, ignoring the
672 // pinned stack
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900673 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700674 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900675 assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800676 }
677
678 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900679 public void
680 testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreenAndTranslucent() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700681 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800682
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700683 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800684 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700685 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700686 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
687 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700688 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700689 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
690 true /* onTop */);
Winson Chungd922b6b2018-02-16 16:41:50 -0800691
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700692 doReturn(false).when(homeStack).isStackTranslucent(any());
693 doReturn(false).when(fullscreenStack1).isStackTranslucent(any());
694 doReturn(true).when(fullscreenStack2).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800695
696 // Ensure that we move the home stack behind the bottom most non-translucent fullscreen
697 // stack
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900698 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700699 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900700 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800701 }
702
703 @Test
704 public void testMoveHomeStackBehindStack_BehindHomeStack() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700705 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800706
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700707 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700708 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
709 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700710 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700711 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
712 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700713 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800714 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
715
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700716 doReturn(false).when(homeStack).isStackTranslucent(any());
717 doReturn(false).when(fullscreenStack1).isStackTranslucent(any());
718 doReturn(false).when(fullscreenStack2).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800719
720 // Ensure we don't move the home stack behind itself
Winson Chung3e2980e2018-03-29 17:28:57 -0700721 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
722 mDefaultDisplay.moveStackBehindStack(homeStack, homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900723 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800724 }
725
726 @Test
727 public void testMoveHomeStackBehindStack() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700728 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800729
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700730 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700731 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
732 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700733 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700734 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
735 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700736 final ActivityStack fullscreenStack3 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700737 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
738 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700739 final ActivityStack fullscreenStack4 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700740 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
741 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700742 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800743 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
744
Winson Chung3e2980e2018-03-29 17:28:57 -0700745 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack1);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900746 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700747 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack2);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900748 assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700749 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack4);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900750 assertEquals(fullscreenStack4, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700751 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack2);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900752 assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800753 }
754
Wale Ogunwalebb285872018-03-01 13:05:30 -0800755 @Test
Kazuki Takisef85197b2018-06-18 18:18:36 +0900756 public void testSetAlwaysOnTop() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700757 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Kazuki Takisef85197b2018-06-18 18:18:36 +0900758 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
759 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
760 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900761 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(homeStack));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900762
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700763 final ActivityStack alwaysOnTopStack = createStackForShouldBeVisibleTest(
Kazuki Takisef85197b2018-06-18 18:18:36 +0900764 mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD,
765 true /* onTop */);
766 alwaysOnTopStack.setAlwaysOnTop(true);
767 assertTrue(alwaysOnTopStack.isAlwaysOnTop());
768 // Ensure (non-pinned) always on top stack is put below pinned stack.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900769 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900770
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700771 final ActivityStack nonAlwaysOnTopStack = createStackForShouldBeVisibleTest(
Kazuki Takisef85197b2018-06-18 18:18:36 +0900772 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
773 true /* onTop */);
774 // Ensure non always on top stack is put below always on top stacks.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900775 assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(nonAlwaysOnTopStack));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900776
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700777 final ActivityStack alwaysOnTopStack2 = createStackForShouldBeVisibleTest(
Kazuki Takisef85197b2018-06-18 18:18:36 +0900778 mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD,
779 true /* onTop */);
780 alwaysOnTopStack2.setAlwaysOnTop(true);
781 assertTrue(alwaysOnTopStack2.isAlwaysOnTop());
782 // Ensure newly created always on top stack is placed above other all always on top stacks.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900783 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900784
785 alwaysOnTopStack2.setAlwaysOnTop(false);
786 // Ensure, when always on top is turned off for a stack, the stack is put just below all
787 // other always on top stacks.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900788 assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takise048e2662018-06-27 17:05:11 +0900789 alwaysOnTopStack2.setAlwaysOnTop(true);
790
791 // Ensure always on top state changes properly when windowing mode changes.
792 alwaysOnTopStack2.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
793 assertFalse(alwaysOnTopStack2.isAlwaysOnTop());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900794 assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takise048e2662018-06-27 17:05:11 +0900795 alwaysOnTopStack2.setWindowingMode(WINDOWING_MODE_FREEFORM);
796 assertTrue(alwaysOnTopStack2.isAlwaysOnTop());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900797 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900798 }
799
800 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900801 public void testSplitScreenMoveToFront() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700802 final ActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700803 mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD,
804 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700805 final ActivityStack splitScreenSecondary = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700806 mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD,
807 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700808 final ActivityStack assistantStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwalebb285872018-03-01 13:05:30 -0800809 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */);
810
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700811 doReturn(false).when(splitScreenPrimary).isStackTranslucent(any());
812 doReturn(false).when(splitScreenSecondary).isStackTranslucent(any());
813 doReturn(false).when(assistantStack).isStackTranslucent(any());
Wale Ogunwalebb285872018-03-01 13:05:30 -0800814
815 assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */));
816 assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
817 assertTrue(assistantStack.shouldBeVisible(null /* starting */));
818
819 splitScreenSecondary.moveToFront("testSplitScreenMoveToFront");
820
821 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
822 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
823 assertFalse(assistantStack.shouldBeVisible(null /* starting */));
824 }
825
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700826 private ActivityStack createStandardStackForVisibilityTest(int windowingMode,
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800827 boolean translucent) {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700828 final ActivityStack stack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800829 windowingMode, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700830 doReturn(translucent).when(stack).isStackTranslucent(any());
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800831 return stack;
832 }
833
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900834 @SuppressWarnings("TypeParameterUnusedInFormals")
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700835 private <T extends ActivityStack> T createStackForShouldBeVisibleTest(
836 ActivityDisplay display, int windowingMode, int activityType, boolean onTop) {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700837 final ActivityStack stack;
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700838 if (activityType == ACTIVITY_TYPE_HOME) {
839 // Home stack and activity are created in ActivityTestsBase#setupActivityManagerService
840 stack = mDefaultDisplay.getStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME);
841 if (onTop) {
Riddle Hsu57831b52018-07-27 00:31:48 +0800842 mDefaultDisplay.positionChildAtTop(stack, false /* includingParents */);
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700843 } else {
844 mDefaultDisplay.positionChildAtBottom(stack);
845 }
846 } else {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700847 stack = new StackBuilder(mRootActivityContainer)
848 .setDisplay(display)
849 .setWindowingMode(windowingMode)
850 .setActivityType(activityType)
851 .setOnTop(onTop)
852 .setCreateActivity(true)
853 .build();
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700854 }
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700855 return (T) stack;
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700856 }
Bryce Leeb0f993f2018-03-02 15:38:01 -0800857
858 @Test
Riddle Hsuaaef7312019-01-24 19:00:58 +0800859 public void testFinishDisabledPackageActivities_FinishAliveActivities() {
Bryce Leefbd263b42018-03-07 10:33:55 -0800860 final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
861 final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
Riddle Hsuaaef7312019-01-24 19:00:58 +0800862 firstActivity.setState(STOPPED, "testFinishDisabledPackageActivities");
863 secondActivity.setState(RESUMED, "testFinishDisabledPackageActivities");
864 mStack.mResumedActivity = secondActivity;
Bryce Leefbd263b42018-03-07 10:33:55 -0800865
Riddle Hsuaaef7312019-01-24 19:00:58 +0800866 // Note the activities have non-null ActivityRecord.app, so it won't remove directly.
867 mStack.finishDisabledPackageActivitiesLocked(firstActivity.packageName,
868 null /* filterByClasses */, true /* doit */, true /* evenPersistent */,
869 UserHandle.USER_ALL);
870
871 // If the activity is disabled with {@link android.content.pm.PackageManager#DONT_KILL_APP}
872 // the activity should still follow the normal flow to finish and destroy.
873 assertThat(firstActivity.getState()).isEqualTo(DESTROYING);
874 assertThat(secondActivity.getState()).isEqualTo(PAUSING);
875 assertTrue(secondActivity.finishing);
876 }
877
878 @Test
879 public void testFinishDisabledPackageActivities_RemoveNonAliveActivities() {
880 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
881
882 // The overlay activity is not in the disabled package but it is in the same task.
883 final ActivityRecord overlayActivity = new ActivityBuilder(mService).setTask(mTask)
884 .setComponent(new ComponentName("package.overlay", ".OverlayActivity")).build();
885 // If the task only remains overlay activity, the task should also be removed.
Andrii Kulian79d67982019-08-19 11:56:16 -0700886 // See {@link ActivityStack#removeFromHistory}.
Riddle Hsuaaef7312019-01-24 19:00:58 +0800887 overlayActivity.mTaskOverlay = true;
888
889 // The activity without an app means it will be removed immediately.
890 // See {@link ActivityStack#destroyActivityLocked}.
891 activity.app = null;
892 overlayActivity.app = null;
Bryce Leefbd263b42018-03-07 10:33:55 -0800893
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200894 assertEquals(2, mTask.getChildCount());
Bryce Leefbd263b42018-03-07 10:33:55 -0800895
Riddle Hsuaaef7312019-01-24 19:00:58 +0800896 mStack.finishDisabledPackageActivitiesLocked(activity.packageName,
897 null /* filterByClasses */, true /* doit */, true /* evenPersistent */,
898 UserHandle.USER_ALL);
Bryce Leefbd263b42018-03-07 10:33:55 -0800899
Riddle Hsuaaef7312019-01-24 19:00:58 +0800900 // Although the overlay activity is in another package, the non-overlay activities are
901 // removed from the task. Since the overlay activity should be removed as well, the task
902 // should be empty.
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200903 assertFalse(mTask.hasChild());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900904 assertThat(mStack.getAllTasks()).isEmpty();
Bryce Leefbd263b42018-03-07 10:33:55 -0800905 }
906
907 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900908 public void testHandleAppDied() {
Bryce Leefbd263b42018-03-07 10:33:55 -0800909 final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
910 final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
911
912 // Making the first activity a task overlay means it will be removed from the task's
913 // activities as well once second activity is removed as handleAppDied processes the
914 // activity list in reverse.
915 firstActivity.mTaskOverlay = true;
916 firstActivity.app = null;
917
918 // second activity will be immediately removed as it has no state.
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700919 secondActivity.setSavedState(null /* savedState */);
Bryce Leefbd263b42018-03-07 10:33:55 -0800920
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200921 assertEquals(2, mTask.getChildCount());
Bryce Leefbd263b42018-03-07 10:33:55 -0800922
923 mStack.handleAppDiedLocked(secondActivity.app);
924
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200925 assertFalse(mTask.hasChild());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900926 assertThat(mStack.getAllTasks()).isEmpty();
Bryce Leefbd263b42018-03-07 10:33:55 -0800927 }
Bryce Lee271617a2018-03-15 10:39:12 -0700928
929 @Test
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800930 public void testHandleAppDied_RelaunchesAfterCrashDuringWindowingModeResize() {
931 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
932
933 activity.mRelaunchReason = RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
934 activity.launchCount = 1;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700935 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800936
937 mStack.handleAppDiedLocked(activity.app);
938
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200939 assertEquals(1, mTask.getChildCount());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800940 assertEquals(1, mStack.getAllTasks().size());
941 }
942
943 @Test
944 public void testHandleAppDied_NotRelaunchAfterThreeCrashesDuringWindowingModeResize() {
945 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
946
947 activity.mRelaunchReason = RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
948 activity.launchCount = 3;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700949 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800950
951 mStack.handleAppDiedLocked(activity.app);
952
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200953 assertFalse(mTask.hasChild());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800954 assertThat(mStack.getAllTasks()).isEmpty();
955 }
956
957 @Test
958 public void testHandleAppDied_RelaunchesAfterCrashDuringFreeResize() {
959 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
960
961 activity.mRelaunchReason = RELAUNCH_REASON_FREE_RESIZE;
962 activity.launchCount = 1;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700963 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800964
965 mStack.handleAppDiedLocked(activity.app);
966
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200967 assertEquals(1, mTask.getChildCount());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800968 assertEquals(1, mStack.getAllTasks().size());
969 }
970
971 @Test
972 public void testHandleAppDied_NotRelaunchAfterThreeCrashesDuringFreeResize() {
973 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
974
975 activity.mRelaunchReason = RELAUNCH_REASON_FREE_RESIZE;
976 activity.launchCount = 3;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700977 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800978
979 mStack.handleAppDiedLocked(activity.app);
980
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200981 assertFalse(mTask.hasChild());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800982 assertThat(mStack.getAllTasks()).isEmpty();
983 }
984
985 @Test
Louis Chang7b03ad92019-08-21 12:32:33 +0800986 public void testCompletePauseOnResumeWhilePausingActivity() {
987 final ActivityRecord bottomActivity = new ActivityBuilder(mService).setTask(mTask).build();
988 doReturn(true).when(bottomActivity).attachedToProcess();
989 mStack.mPausingActivity = null;
990 mStack.mResumedActivity = bottomActivity;
991 final ActivityRecord topActivity = new ActivityBuilder(mService).setTask(mTask).build();
992 topActivity.info.flags |= FLAG_RESUME_WHILE_PAUSING;
993
994 mStack.startPausingLocked(false /* userLeaving */, false /* uiSleeping */, topActivity);
995 verify(mStack).completePauseLocked(anyBoolean(), eq(topActivity));
996 }
997
998 @Test
Riddle Hsu2b9a6d72019-04-24 23:55:11 +0800999 public void testAdjustFocusedStackToHomeWhenNoActivity() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -07001000 final ActivityStack homeStask = mDefaultDisplay.getHomeStack();
1001 TaskRecord homeTask = homeStask.topTask();
1002 if (homeTask == null) {
1003 // Create home task if there isn't one.
1004 homeTask = new TaskBuilder(mSupervisor).setStack(homeStask).build();
1005 }
1006
Riddle Hsu2b9a6d72019-04-24 23:55:11 +08001007 final ActivityRecord topActivity = new ActivityBuilder(mService).setTask(mTask).build();
1008 mStack.moveToFront("testAdjustFocusedStack");
1009
Riddle Hsu2b9a6d72019-04-24 23:55:11 +08001010 // Simulate that home activity has not been started or is force-stopped.
1011 homeStask.removeTask(homeTask, "testAdjustFocusedStack", REMOVE_TASK_MODE_DESTROYING);
1012
1013 // Finish the only activity.
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001014 topActivity.finishIfPossible("testAdjustFocusedStack", false /* oomAdj */);
Riddle Hsu2b9a6d72019-04-24 23:55:11 +08001015 // Although home stack is empty, it should still be the focused stack.
1016 assertEquals(homeStask, mDefaultDisplay.getFocusedStack());
1017 }
1018
1019 @Test
wilsonshih8824a8a2019-03-12 17:21:35 +08001020 public void testWontFinishHomeStackImmediately() {
1021 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
1022 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
1023
Wale Ogunwale8a1860a2019-06-05 08:57:19 -07001024 ActivityRecord activity = homeStack.topRunningActivityLocked();
1025 if (activity == null) {
1026 activity = new ActivityBuilder(mService)
1027 .setStack(homeStack)
1028 .setCreateTask(true)
1029 .build();
1030 }
1031
wilsonshih8824a8a2019-03-12 17:21:35 +08001032 // Home stack should not be destroyed immediately.
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001033 final ActivityRecord activity1 = finishTopActivity(homeStack);
wilsonshih8824a8a2019-03-12 17:21:35 +08001034 assertEquals(FINISHING, activity1.getState());
1035 }
1036
1037 @Test
Riddle Hsue10cea52018-10-16 23:33:23 +08001038 public void testFinishCurrentActivity() {
1039 // Create 2 activities on a new display.
1040 final ActivityDisplay display = addNewActivityDisplayAt(ActivityDisplay.POSITION_TOP);
1041 final ActivityStack stack1 = createStackForShouldBeVisibleTest(display,
1042 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
1043 final ActivityStack stack2 = createStackForShouldBeVisibleTest(display,
1044 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
1045
1046 // There is still an activity1 in stack1 so the activity2 should be added to finishing list
1047 // that will be destroyed until idle.
Louis Changf2835df2018-10-17 15:14:45 +08001048 stack2.getTopActivity().visible = true;
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001049 final ActivityRecord activity2 = finishTopActivity(stack2);
Louis Changf2835df2018-10-17 15:14:45 +08001050 assertEquals(STOPPING, activity2.getState());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001051 assertThat(mSupervisor.mStoppingActivities).contains(activity2);
Riddle Hsue10cea52018-10-16 23:33:23 +08001052
1053 // The display becomes empty. Since there is no next activity to be idle, the activity
1054 // should be destroyed immediately with updating configuration to restore original state.
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001055 final ActivityRecord activity1 = finishTopActivity(stack1);
Riddle Hsue10cea52018-10-16 23:33:23 +08001056 assertEquals(DESTROYING, activity1.getState());
Wale Ogunwaled32da472018-11-16 07:19:28 -08001057 verify(mRootActivityContainer).ensureVisibilityAndConfig(eq(null) /* starting */,
Riddle Hsue10cea52018-10-16 23:33:23 +08001058 eq(display.mDisplayId), anyBoolean(), anyBoolean());
1059 }
1060
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001061 private ActivityRecord finishTopActivity(ActivityStack stack) {
Riddle Hsue10cea52018-10-16 23:33:23 +08001062 final ActivityRecord activity = stack.topRunningActivityLocked();
1063 assertNotNull(activity);
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001064 activity.setState(STOPPED, "finishTopActivity");
Riddle Hsue10cea52018-10-16 23:33:23 +08001065 activity.makeFinishingLocked();
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001066 activity.completeFinishing("finishTopActivity");
Riddle Hsue10cea52018-10-16 23:33:23 +08001067 return activity;
1068 }
1069
1070 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001071 public void testShouldSleepActivities() {
Bryce Lee271617a2018-03-15 10:39:12 -07001072 // When focused activity and keyguard is going away, we should not sleep regardless
1073 // of the display state
1074 verifyShouldSleepActivities(true /* focusedStack */, true /*keyguardGoingAway*/,
1075 true /* displaySleeping */, false /* expected*/);
1076
1077 // When not the focused stack, defer to display sleeping state.
1078 verifyShouldSleepActivities(false /* focusedStack */, true /*keyguardGoingAway*/,
1079 true /* displaySleeping */, true /* expected*/);
1080
1081 // If keyguard is going away, defer to the display sleeping state.
1082 verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/,
1083 true /* displaySleeping */, true /* expected*/);
1084 verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/,
1085 false /* displaySleeping */, false /* expected*/);
1086 }
1087
Winson Chung0f7ec962018-05-03 18:03:15 -07001088 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001089 public void testStackOrderChangedOnRemoveStack() {
Winson Chung0f7ec962018-05-03 18:03:15 -07001090 StackOrderChangedListener listener = new StackOrderChangedListener();
1091 mDefaultDisplay.registerStackOrderChangedListener(listener);
1092 try {
1093 mDefaultDisplay.removeChild(mStack);
1094 } finally {
1095 mDefaultDisplay.unregisterStackOrderChangedListener(listener);
1096 }
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001097 assertTrue(listener.mChanged);
Winson Chung0f7ec962018-05-03 18:03:15 -07001098 }
1099
1100 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001101 public void testStackOrderChangedOnAddPositionStack() {
Winson Chung0f7ec962018-05-03 18:03:15 -07001102 mDefaultDisplay.removeChild(mStack);
1103
1104 StackOrderChangedListener listener = new StackOrderChangedListener();
1105 mDefaultDisplay.registerStackOrderChangedListener(listener);
1106 try {
1107 mDefaultDisplay.addChild(mStack, 0);
1108 } finally {
1109 mDefaultDisplay.unregisterStackOrderChangedListener(listener);
1110 }
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001111 assertTrue(listener.mChanged);
Winson Chung0f7ec962018-05-03 18:03:15 -07001112 }
1113
1114 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001115 public void testStackOrderChangedOnPositionStack() {
Winson Chung0f7ec962018-05-03 18:03:15 -07001116 StackOrderChangedListener listener = new StackOrderChangedListener();
1117 try {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -07001118 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung0f7ec962018-05-03 18:03:15 -07001119 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
1120 true /* onTop */);
1121 mDefaultDisplay.registerStackOrderChangedListener(listener);
1122 mDefaultDisplay.positionChildAtBottom(fullscreenStack1);
1123 } finally {
1124 mDefaultDisplay.unregisterStackOrderChangedListener(listener);
1125 }
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001126 assertTrue(listener.mChanged);
Winson Chung0f7ec962018-05-03 18:03:15 -07001127 }
1128
Louis Changf7f7f9c2019-06-18 16:47:51 +08001129 @Test
1130 public void testResetTaskWithFinishingActivities() {
1131 final ActivityRecord taskTop =
1132 new ActivityBuilder(mService).setStack(mStack).setCreateTask(true).build();
1133 // Make all activities in the task are finishing to simulate TaskRecord#getTopActivity
1134 // returns null.
1135 taskTop.finishing = true;
1136
1137 final ActivityRecord newR = new ActivityBuilder(mService).build();
1138 final ActivityRecord result = mStack.resetTaskIfNeededLocked(taskTop, newR);
1139 assertThat(result).isEqualTo(taskTop);
1140 }
1141
Louis Changcfe46212019-07-30 10:34:18 +08001142 @Test
1143 public void testNonTopVisibleActivityNotResume() {
1144 final ActivityRecord nonTopVisibleActivity =
1145 new ActivityBuilder(mService).setTask(mTask).build();
1146 new ActivityBuilder(mService).setTask(mTask).build();
1147 doReturn(false).when(nonTopVisibleActivity).attachedToProcess();
1148 doReturn(true).when(nonTopVisibleActivity).shouldBeVisibleIgnoringKeyguard(anyBoolean());
1149 doNothing().when(mSupervisor).startSpecificActivityLocked(any(), anyBoolean(),
1150 anyBoolean());
1151
1152 mStack.ensureActivitiesVisibleLocked(null /* starting */, 0 /* configChanges */,
1153 false /* preserveWindows */);
1154 verify(mSupervisor).startSpecificActivityLocked(any(), eq(false) /* andResume */,
1155 anyBoolean());
1156 }
1157
Bryce Lee271617a2018-03-15 10:39:12 -07001158 private void verifyShouldSleepActivities(boolean focusedStack,
1159 boolean keyguardGoingAway, boolean displaySleeping, boolean expected) {
Bryce Lee271617a2018-03-15 10:39:12 -07001160 final ActivityDisplay display = mock(ActivityDisplay.class);
1161 final KeyguardController keyguardController = mSupervisor.getKeyguardController();
1162
Wale Ogunwaled32da472018-11-16 07:19:28 -08001163 doReturn(display).when(mRootActivityContainer).getActivityDisplay(anyInt());
Bryce Lee271617a2018-03-15 10:39:12 -07001164 doReturn(keyguardGoingAway).when(keyguardController).isKeyguardGoingAway();
1165 doReturn(displaySleeping).when(display).isSleeping();
Tiger Huang1e5b10a2018-07-30 20:19:51 +08001166 doReturn(focusedStack).when(mStack).isFocusedStackOnDisplay();
Bryce Lee271617a2018-03-15 10:39:12 -07001167
1168 assertEquals(expected, mStack.shouldSleepActivities());
1169 }
Winson Chung0f7ec962018-05-03 18:03:15 -07001170
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001171 private static class StackOrderChangedListener
1172 implements ActivityDisplay.OnStackOrderChangedListener {
1173 public boolean mChanged = false;
Winson Chung0f7ec962018-05-03 18:03:15 -07001174
1175 @Override
Winson Chung65d66d32018-12-13 17:48:39 -08001176 public void onStackOrderChanged(ActivityStack stack) {
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001177 mChanged = true;
Winson Chung0f7ec962018-05-03 18:03:15 -07001178 }
1179 }
Bryce Lee840c5662017-04-13 10:02:51 -07001180}