blob: 3a6ed5400f6127ab0b24265b63f7ec08555e5f93 [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;
Andrii Kulian0c869cc2019-02-06 19:50:32 -080041import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_INVISIBLE;
42import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_VISIBLE;
43import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
Garfield Tanf6cc5c92019-01-15 13:54:12 -080044import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE;
45import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
Louis Changcdec0802019-11-11 11:45:07 +080046import static com.android.server.wm.Task.REPARENT_MOVE_STACK_TO_FRONT;
Bryce Lee18d51592017-10-25 10:22:19 -070047
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090048import static com.google.common.truth.Truth.assertThat;
49
Bryce Lee5daa3122017-04-19 10:40:42 -070050import static org.junit.Assert.assertEquals;
David Stevens18abd0e2017-08-17 14:55:47 -070051import static org.junit.Assert.assertFalse;
Bryce Lee840c5662017-04-13 10:02:51 -070052import static org.junit.Assert.assertNotNull;
53import static org.junit.Assert.assertNull;
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -070054import static org.junit.Assert.assertTrue;
Riddle Hsu138ef932018-10-26 17:12:06 +080055import static org.mockito.ArgumentMatchers.any;
Riddle Hsue10cea52018-10-16 23:33:23 +080056import static org.mockito.ArgumentMatchers.anyBoolean;
57import static org.mockito.ArgumentMatchers.anyInt;
Riddle Hsue10cea52018-10-16 23:33:23 +080058import static org.mockito.ArgumentMatchers.eq;
Bryce Lee840c5662017-04-13 10:02:51 -070059
Riddle Hsuaaef7312019-01-24 19:00:58 +080060import android.content.ComponentName;
Bryce Lee3345c4e2017-04-25 07:40:41 -070061import android.content.pm.ActivityInfo;
Bryce Lee9f6affd2017-09-01 09:18:35 -070062import android.os.UserHandle;
Bryce Lee840c5662017-04-13 10:02:51 -070063import android.platform.test.annotations.Presubmit;
Bryce Lee840c5662017-04-13 10:02:51 -070064
Brett Chabota26eda92018-07-23 13:08:30 -070065import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070066
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070067import org.junit.Before;
Bryce Lee840c5662017-04-13 10:02:51 -070068import org.junit.Test;
Riddle Hsu73f53572019-09-23 23:13:01 +080069import org.junit.runner.RunWith;
Bryce Lee840c5662017-04-13 10:02:51 -070070
71/**
72 * Tests for the {@link ActivityStack} class.
73 *
74 * Build/Install/Run:
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090075 * atest WmTests:ActivityStackTests
Bryce Lee840c5662017-04-13 10:02:51 -070076 */
77@SmallTest
78@Presubmit
Riddle Hsu73f53572019-09-23 23:13:01 +080079@RunWith(WindowTestRunner.class)
Bryce Lee840c5662017-04-13 10:02:51 -070080public class ActivityStackTests extends ActivityTestsBase {
Winson Chung3e2980e2018-03-29 17:28:57 -070081 private ActivityDisplay mDefaultDisplay;
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070082 private ActivityStack mStack;
Louis Changcdec0802019-11-11 11:45:07 +080083 private Task mTask;
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070084
85 @Before
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070086 public void setUp() throws Exception {
Wale Ogunwaled32da472018-11-16 07:19:28 -080087 mDefaultDisplay = mRootActivityContainer.getDefaultDisplay();
Wale Ogunwale8a1860a2019-06-05 08:57:19 -070088 mStack = mDefaultDisplay.createStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD,
89 true /* onTop */);
90 spyOn(mStack);
Bryce Lee18d51592017-10-25 10:22:19 -070091 mTask = new TaskBuilder(mSupervisor).setStack(mStack).build();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070092 }
93
Bryce Lee840c5662017-04-13 10:02:51 -070094 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090095 public void testResumedActivity() {
Bryce Leec4ab62a2018-03-05 14:19:26 -080096 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090097 assertNull(mStack.getResumedActivity());
Bryce Leec4ab62a2018-03-05 14:19:26 -080098 r.setState(RESUMED, "testResumedActivity");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090099 assertEquals(r, mStack.getResumedActivity());
Bryce Leec4ab62a2018-03-05 14:19:26 -0800100 r.setState(PAUSING, "testResumedActivity");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900101 assertNull(mStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700102 }
Bryce Leec4ab62a2018-03-05 14:19:26 -0800103
Bryce Lee84730a02018-04-03 14:10:04 -0700104 @Test
105 public void testResumedActivityFromTaskReparenting() {
106 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
107 // Ensure moving task between two stacks updates resumed activity
108 r.setState(RESUMED, "testResumedActivityFromTaskReparenting");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900109 assertEquals(r, mStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700110
Wale Ogunwaled32da472018-11-16 07:19:28 -0800111 final ActivityStack destStack = mRootActivityContainer.getDefaultDisplay().createStack(
Bryce Lee84730a02018-04-03 14:10:04 -0700112 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
113
Louis Changcdec0802019-11-11 11:45:07 +0800114 mTask.reparent(destStack, true /* toTop */, Task.REPARENT_KEEP_STACK_AT_FRONT,
Bryce Lee84730a02018-04-03 14:10:04 -0700115 false /* animate */, true /* deferResume*/,
116 "testResumedActivityFromTaskReparenting");
117
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900118 assertNull(mStack.getResumedActivity());
119 assertEquals(r, destStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700120 }
121
122 @Test
123 public void testResumedActivityFromActivityReparenting() {
124 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
125 // Ensure moving task between two stacks updates resumed activity
126 r.setState(RESUMED, "testResumedActivityFromActivityReparenting");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900127 assertEquals(r, mStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700128
Wale Ogunwaled32da472018-11-16 07:19:28 -0800129 final ActivityStack destStack = mRootActivityContainer.getDefaultDisplay().createStack(
Bryce Lee84730a02018-04-03 14:10:04 -0700130 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700131 mTask.reparent(destStack, true /*toTop*/, REPARENT_MOVE_STACK_TO_FRONT, false, false,
132 "testResumedActivityFromActivityReparenting");
Bryce Lee84730a02018-04-03 14:10:04 -0700133
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900134 assertNull(mStack.getResumedActivity());
135 assertEquals(r, destStack.getResumedActivity());
Bryce Lee5daa3122017-04-19 10:40:42 -0700136 }
Bryce Lee3345c4e2017-04-25 07:40:41 -0700137
138 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900139 public void testPrimarySplitScreenRestoresWhenMovedToBack() {
Bryce Lee8cab4a02018-01-05 09:00:49 -0800140 // Create primary splitscreen stack. This will create secondary stacks and places the
141 // existing fullscreen stack on the bottom.
Winson Chung3e2980e2018-03-29 17:28:57 -0700142 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
143 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Bryce Lee8cab4a02018-01-05 09:00:49 -0800144
145 // Assert windowing mode.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900146 assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, primarySplitScreen.getWindowingMode());
Bryce Lee8cab4a02018-01-05 09:00:49 -0800147
148 // Move primary to back.
149 primarySplitScreen.moveToBack("testPrimarySplitScreenToFullscreenWhenMovedToBack",
150 null /* task */);
151
152 // Assert that stack is at the bottom.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900153 assertEquals(0, mDefaultDisplay.getIndexOf(primarySplitScreen));
Bryce Lee8cab4a02018-01-05 09:00:49 -0800154
155 // Ensure no longer in splitscreen.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900156 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700157
158 // Ensure that the override mode is restored to undefined
Evan Roskydfe3da72018-10-26 17:21:06 -0700159 assertEquals(WINDOWING_MODE_UNDEFINED,
160 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700161 }
162
163 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900164 public void testPrimarySplitScreenRestoresPreviousWhenMovedToBack() {
Evan Rosky10475742018-09-05 19:02:48 -0700165 // This time, start with a fullscreen activitystack
166 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900167 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Evan Rosky10475742018-09-05 19:02:48 -0700168
169 primarySplitScreen.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
170
171 // Assert windowing mode.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900172 assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, primarySplitScreen.getWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700173
174 // Move primary to back.
175 primarySplitScreen.moveToBack("testPrimarySplitScreenToFullscreenWhenMovedToBack",
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900176 null /* task */);
Evan Rosky10475742018-09-05 19:02:48 -0700177
178 // Assert that stack is at the bottom.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900179 assertEquals(0, mDefaultDisplay.getIndexOf(primarySplitScreen));
Evan Rosky10475742018-09-05 19:02:48 -0700180
181 // Ensure that the override mode is restored to what it was (fullscreen)
Evan Roskydfe3da72018-10-26 17:21:06 -0700182 assertEquals(WINDOWING_MODE_FULLSCREEN,
183 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700184 }
185
186 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900187 public void testStackInheritsDisplayWindowingMode() {
Evan Rosky10475742018-09-05 19:02:48 -0700188 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900189 WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Evan Rosky10475742018-09-05 19:02:48 -0700190
191 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Evan Roskydfe3da72018-10-26 17:21:06 -0700192 assertEquals(WINDOWING_MODE_UNDEFINED,
193 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700194
195 mDefaultDisplay.setWindowingMode(WINDOWING_MODE_FREEFORM);
196 assertEquals(WINDOWING_MODE_FREEFORM, primarySplitScreen.getWindowingMode());
Evan Roskydfe3da72018-10-26 17:21:06 -0700197 assertEquals(WINDOWING_MODE_UNDEFINED,
198 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700199 }
200
201 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900202 public void testStackOverridesDisplayWindowingMode() {
Evan Rosky10475742018-09-05 19:02:48 -0700203 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900204 WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Evan Rosky10475742018-09-05 19:02:48 -0700205
206 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Evan Roskydfe3da72018-10-26 17:21:06 -0700207 assertEquals(WINDOWING_MODE_UNDEFINED,
208 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700209
210 primarySplitScreen.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
211 // setting windowing mode should still work even though resolved mode is already fullscreen
Evan Roskydfe3da72018-10-26 17:21:06 -0700212 assertEquals(WINDOWING_MODE_FULLSCREEN,
213 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700214
215 mDefaultDisplay.setWindowingMode(WINDOWING_MODE_FREEFORM);
216 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Bryce Lee8cab4a02018-01-05 09:00:49 -0800217 }
218
219 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900220 public void testStopActivityWhenActivityDestroyed() {
Bryce Lee18d51592017-10-25 10:22:19 -0700221 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -0700222 r.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700223 mStack.moveToFront("testStopActivityWithDestroy");
Andrii Kulian79d67982019-08-19 11:56:16 -0700224 r.stopIfPossible();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -0700225 // Mostly testing to make sure there is a crash in the call part, so if we get here we are
226 // good-to-go!
Bryce Lee3345c4e2017-04-25 07:40:41 -0700227 }
Bryce Lee9f6affd2017-09-01 09:18:35 -0700228
229 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900230 public void testFindTaskWithOverlay() {
Bryce Lee18d51592017-10-25 10:22:19 -0700231 final ActivityRecord r = new ActivityBuilder(mService)
232 .setCreateTask(true)
233 .setStack(mStack)
234 .setUid(0)
235 .build();
Louis Changcdec0802019-11-11 11:45:07 +0800236 final Task task = r.getTask();
Bryce Lee9f6affd2017-09-01 09:18:35 -0700237 // Overlay must be for a different user to prevent recognizing a matching top activity
Bryce Lee18d51592017-10-25 10:22:19 -0700238 final ActivityRecord taskOverlay = new ActivityBuilder(mService).setTask(task)
239 .setUid(UserHandle.PER_USER_RANGE * 2).build();
Bryce Lee9f6affd2017-09-01 09:18:35 -0700240 taskOverlay.mTaskOverlay = true;
241
Wale Ogunwaled32da472018-11-16 07:19:28 -0800242 final RootActivityContainer.FindTaskResult result =
243 new RootActivityContainer.FindTaskResult();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -0700244 mStack.findTaskLocked(r, result);
Bryce Lee9f6affd2017-09-01 09:18:35 -0700245
Wale Ogunwale21e06482019-11-18 05:14:15 -0800246 assertEquals(r, task.getTopNonFinishingActivity(false /* includeOverlays */));
247 assertEquals(taskOverlay, task.getTopNonFinishingActivity(true /* includeOverlays */));
Louis Changc85b1a32018-08-14 16:40:53 +0800248 assertNotNull(result.mRecord);
Bryce Lee9f6affd2017-09-01 09:18:35 -0700249 }
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700250
251 @Test
Louis Changb05c8d82019-06-25 11:56:55 +0800252 public void testFindTaskAlias() {
253 final String targetActivity = "target.activity";
254 final String aliasActivity = "alias.activity";
255 final ComponentName target = new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME,
256 targetActivity);
257 final ComponentName alias = new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME,
258 aliasActivity);
Louis Changcdec0802019-11-11 11:45:07 +0800259 final Task task = new TaskBuilder(mService.mStackSupervisor).setStack(mStack).build();
Louis Changb05c8d82019-06-25 11:56:55 +0800260 task.origActivity = alias;
261 task.realActivity = target;
262 new ActivityBuilder(mService).setComponent(target).setTask(task).setTargetActivity(
263 targetActivity).build();
264
265 // Using target activity to find task.
266 final ActivityRecord r1 = new ActivityBuilder(mService).setComponent(
267 target).setTargetActivity(targetActivity).build();
268 RootActivityContainer.FindTaskResult result = new RootActivityContainer.FindTaskResult();
269 mStack.findTaskLocked(r1, result);
270 assertThat(result.mRecord).isNotNull();
271
272 // Using alias activity to find task.
273 final ActivityRecord r2 = new ActivityBuilder(mService).setComponent(
274 alias).setTargetActivity(targetActivity).build();
275 result = new RootActivityContainer.FindTaskResult();
276 mStack.findTaskLocked(r2, result);
277 assertThat(result.mRecord).isNotNull();
278 }
279
280 @Test
Riddle Hsu138ef932018-10-26 17:12:06 +0800281 public void testMoveStackToBackIncludingParent() {
282 final ActivityDisplay display = addNewActivityDisplayAt(ActivityDisplay.POSITION_TOP);
283 final ActivityStack stack1 = createStackForShouldBeVisibleTest(display,
284 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
285 final ActivityStack stack2 = createStackForShouldBeVisibleTest(display,
286 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
287
288 // Do not move display to back because there is still another stack.
289 stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.topTask());
Wale Ogunwalebebd8cd2019-10-28 15:53:31 -0700290 verify(stack2).positionChildAtBottom(any(), eq(false) /* includingParents */);
Riddle Hsu138ef932018-10-26 17:12:06 +0800291
292 // Also move display to back because there is only one stack left.
293 display.removeChild(stack1);
294 stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.topTask());
Wale Ogunwalebebd8cd2019-10-28 15:53:31 -0700295 verify(stack2).positionChildAtBottom(any(), eq(true) /* includingParents */);
Riddle Hsu138ef932018-10-26 17:12:06 +0800296 }
297
298 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900299 public void testShouldBeVisible_Fullscreen() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700300 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700301 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Winson Chung3e2980e2018-03-29 17:28:57 -0700302 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700303 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700304 // Add an activity to the pinned stack so it isn't considered empty for visibility check.
305 final ActivityRecord pinnedActivity = new ActivityBuilder(mService)
306 .setCreateTask(true)
307 .setStack(pinnedStack)
308 .build();
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700309
310 assertTrue(homeStack.shouldBeVisible(null /* starting */));
311 assertTrue(pinnedStack.shouldBeVisible(null /* starting */));
312
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700313 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700314 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
315 // Home stack shouldn't be visible behind an opaque fullscreen stack, but pinned stack
316 // should be visible since it is always on-top.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700317 doReturn(false).when(fullscreenStack).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700318 assertFalse(homeStack.shouldBeVisible(null /* starting */));
319 assertTrue(pinnedStack.shouldBeVisible(null /* starting */));
320 assertTrue(fullscreenStack.shouldBeVisible(null /* starting */));
321
322 // Home stack should be visible behind a translucent fullscreen stack.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700323 doReturn(true).when(fullscreenStack).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700324 assertTrue(homeStack.shouldBeVisible(null /* starting */));
325 assertTrue(pinnedStack.shouldBeVisible(null /* starting */));
326 }
327
328 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900329 public void testShouldBeVisible_SplitScreen() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700330 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700331 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale30e441d2017-11-09 08:28:45 -0800332 // Home stack should always be fullscreen for this test.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700333 doReturn(false).when(homeStack).supportsSplitScreenWindowingMode();
334 final ActivityStack splitScreenPrimary =
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900335 createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700336 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700337 final ActivityStack splitScreenSecondary =
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900338 createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700339 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
340
341 // Home stack shouldn't be visible if both halves of split-screen are opaque.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700342 doReturn(false).when(splitScreenPrimary).isStackTranslucent(any());
343 doReturn(false).when(splitScreenSecondary).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700344 assertFalse(homeStack.shouldBeVisible(null /* starting */));
345 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
346 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800347 assertEquals(STACK_VISIBILITY_INVISIBLE, homeStack.getVisibility(null /* starting */));
348 assertEquals(STACK_VISIBILITY_VISIBLE,
349 splitScreenPrimary.getVisibility(null /* starting */));
350 assertEquals(STACK_VISIBILITY_VISIBLE,
351 splitScreenSecondary.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700352
353 // Home stack should be visible if one of the halves of split-screen is translucent.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700354 doReturn(true).when(splitScreenPrimary).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700355 assertTrue(homeStack.shouldBeVisible(null /* starting */));
356 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
357 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800358 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
359 homeStack.getVisibility(null /* starting */));
360 assertEquals(STACK_VISIBILITY_VISIBLE,
361 splitScreenPrimary.getVisibility(null /* starting */));
362 assertEquals(STACK_VISIBILITY_VISIBLE,
363 splitScreenSecondary.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700364
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700365 final ActivityStack splitScreenSecondary2 =
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900366 createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700367 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
368 // First split-screen secondary shouldn't be visible behind another opaque split-split
369 // secondary.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700370 doReturn(false).when(splitScreenSecondary2).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700371 assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
372 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800373 assertEquals(STACK_VISIBILITY_INVISIBLE,
374 splitScreenSecondary.getVisibility(null /* starting */));
375 assertEquals(STACK_VISIBILITY_VISIBLE,
376 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700377
Wale Ogunwale8e923af2018-03-23 08:48:11 -0700378 // First split-screen secondary should be visible behind another translucent split-screen
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700379 // secondary.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700380 doReturn(true).when(splitScreenSecondary2).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700381 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
382 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800383 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
384 splitScreenSecondary.getVisibility(null /* starting */));
385 assertEquals(STACK_VISIBILITY_VISIBLE,
386 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700387
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700388 final ActivityStack assistantStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700389 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */);
390
391 // Split-screen stacks shouldn't be visible behind an opaque fullscreen stack.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700392 doReturn(false).when(assistantStack).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700393 assertTrue(assistantStack.shouldBeVisible(null /* starting */));
394 assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */));
395 assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
396 assertFalse(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800397 assertEquals(STACK_VISIBILITY_VISIBLE,
398 assistantStack.getVisibility(null /* starting */));
399 assertEquals(STACK_VISIBILITY_INVISIBLE,
400 splitScreenPrimary.getVisibility(null /* starting */));
401 assertEquals(STACK_VISIBILITY_INVISIBLE,
402 splitScreenSecondary.getVisibility(null /* starting */));
403 assertEquals(STACK_VISIBILITY_INVISIBLE,
404 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700405
406 // Split-screen stacks should be visible behind a translucent fullscreen stack.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700407 doReturn(true).when(assistantStack).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700408 assertTrue(assistantStack.shouldBeVisible(null /* starting */));
409 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
410 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
411 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800412 assertEquals(STACK_VISIBILITY_VISIBLE,
413 assistantStack.getVisibility(null /* starting */));
414 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
415 splitScreenPrimary.getVisibility(null /* starting */));
416 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
417 splitScreenSecondary.getVisibility(null /* starting */));
418 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
419 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale8e923af2018-03-23 08:48:11 -0700420
421 // Assistant stack shouldn't be visible behind translucent split-screen stack
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700422 doReturn(false).when(assistantStack).isStackTranslucent(any());
423 doReturn(true).when(splitScreenPrimary).isStackTranslucent(any());
424 doReturn(true).when(splitScreenSecondary2).isStackTranslucent(any());
Wale Ogunwale8e923af2018-03-23 08:48:11 -0700425 splitScreenSecondary2.moveToFront("testShouldBeVisible_SplitScreen");
426 splitScreenPrimary.moveToFront("testShouldBeVisible_SplitScreen");
427 assertFalse(assistantStack.shouldBeVisible(null /* starting */));
428 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
429 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800430 assertEquals(STACK_VISIBILITY_INVISIBLE,
431 assistantStack.getVisibility(null /* starting */));
432 assertEquals(STACK_VISIBILITY_VISIBLE,
433 splitScreenPrimary.getVisibility(null /* starting */));
434 assertEquals(STACK_VISIBILITY_INVISIBLE,
435 splitScreenSecondary.getVisibility(null /* starting */));
436 assertEquals(STACK_VISIBILITY_VISIBLE,
437 splitScreenSecondary2.getVisibility(null /* starting */));
438 }
439
440 @Test
441 public void testGetVisibility_FullscreenBehindTranslucent() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700442 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800443 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
444 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700445 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800446 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
447 true /* translucent */);
448
449 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
450 bottomStack.getVisibility(null /* starting */));
451 assertEquals(STACK_VISIBILITY_VISIBLE,
452 translucentStack.getVisibility(null /* starting */));
453 }
454
455 @Test
456 public void testGetVisibility_FullscreenBehindTranslucentAndOpaque() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700457 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800458 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
459 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700460 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800461 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
462 true /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700463 final ActivityStack opaqueStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800464 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
465 false /* translucent */);
466
467 assertEquals(STACK_VISIBILITY_INVISIBLE, bottomStack.getVisibility(null /* starting */));
468 assertEquals(STACK_VISIBILITY_INVISIBLE,
469 translucentStack.getVisibility(null /* starting */));
470 assertEquals(STACK_VISIBILITY_VISIBLE, opaqueStack.getVisibility(null /* starting */));
471 }
472
473 @Test
474 public void testGetVisibility_FullscreenBehindOpaqueAndTranslucent() {
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 opaqueStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800479 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
480 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700481 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800482 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
483 true /* translucent */);
484
485 assertEquals(STACK_VISIBILITY_INVISIBLE, bottomStack.getVisibility(null /* starting */));
486 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
487 opaqueStack.getVisibility(null /* starting */));
488 assertEquals(STACK_VISIBILITY_VISIBLE,
489 translucentStack.getVisibility(null /* starting */));
490 }
491
492 @Test
493 public void testGetVisibility_FullscreenTranslucentBehindTranslucent() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700494 final ActivityStack bottomTranslucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800495 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
496 true /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700497 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800498 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
499 true /* translucent */);
500
501 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
502 bottomTranslucentStack.getVisibility(null /* starting */));
503 assertEquals(STACK_VISIBILITY_VISIBLE,
504 translucentStack.getVisibility(null /* starting */));
505 }
506
507 @Test
508 public void testGetVisibility_FullscreenTranslucentBehindOpaque() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700509 final ActivityStack bottomTranslucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800510 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
511 true /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700512 final ActivityStack opaqueStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800513 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
514 false /* translucent */);
515
516 assertEquals(STACK_VISIBILITY_INVISIBLE,
517 bottomTranslucentStack.getVisibility(null /* starting */));
518 assertEquals(STACK_VISIBILITY_VISIBLE, opaqueStack.getVisibility(null /* starting */));
519 }
520
521 @Test
522 public void testGetVisibility_FullscreenBehindTranslucentAndPip() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700523 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800524 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
525 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700526 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800527 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
528 true /* translucent */);
529 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
530 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
531
532 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
533 bottomStack.getVisibility(null /* starting */));
534 assertEquals(STACK_VISIBILITY_VISIBLE,
535 translucentStack.getVisibility(null /* starting */));
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700536 // Add an activity to the pinned stack so it isn't considered empty for visibility check.
537 final ActivityRecord pinnedActivity = new ActivityBuilder(mService)
538 .setCreateTask(true)
539 .setStack(pinnedStack)
540 .build();
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800541 assertEquals(STACK_VISIBILITY_VISIBLE, pinnedStack.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700542 }
543
544 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900545 public void testShouldBeVisible_Finishing() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700546 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700547 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700548 ActivityRecord topRunningHomeActivity = homeStack.topRunningActivityLocked();
549 if (topRunningHomeActivity == null) {
550 topRunningHomeActivity = new ActivityBuilder(mService)
551 .setStack(homeStack)
552 .setCreateTask(true)
553 .build();
554 }
555
556 final ActivityStack translucentStack = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700557 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
558 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700559 doReturn(true).when(translucentStack).isStackTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700560
561 assertTrue(homeStack.shouldBeVisible(null /* starting */));
562 assertTrue(translucentStack.shouldBeVisible(null /* starting */));
563
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700564 topRunningHomeActivity.finishing = true;
565 final ActivityRecord topRunningTranslucentActivity =
566 translucentStack.topRunningActivityLocked();
567 topRunningTranslucentActivity.finishing = true;
568
Louis Changf2835df2018-10-17 15:14:45 +0800569 // Home stack should be visible even there are no running activities.
570 assertTrue(homeStack.shouldBeVisible(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700571 // Home should be visible if we are starting an activity within it.
572 assertTrue(homeStack.shouldBeVisible(topRunningHomeActivity /* starting */));
Louis Changf2835df2018-10-17 15:14:45 +0800573 // The translucent stack shouldn't be visible since its activity marked as finishing.
574 assertFalse(translucentStack.shouldBeVisible(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700575 }
576
Winson Chungd922b6b2018-02-16 16:41:50 -0800577 @Test
578 public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindFullscreen() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700579 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800580
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700581 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800582 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700583 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800584 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
585
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700586 doReturn(false).when(homeStack).isStackTranslucent(any());
587 doReturn(false).when(fullscreenStack).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800588
589 // 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 -0700590 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900591 assertEquals(fullscreenStack, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700592 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900593 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800594 }
595
596 @Test
597 public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindTranslucent() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700598 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800599
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700600 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800601 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700602 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800603 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
604
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700605 doReturn(false).when(homeStack).isStackTranslucent(any());
606 doReturn(true).when(fullscreenStack).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800607
608 // 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 -0700609 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900610 assertEquals(fullscreenStack, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700611 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900612 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800613 }
614
615 @Test
616 public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeOnTop() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700617 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800618
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700619 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800620 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700621 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800622 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
623
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700624 doReturn(false).when(homeStack).isStackTranslucent(any());
625 doReturn(false).when(fullscreenStack).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800626
627 // Ensure we don't move the home stack if it is already on top
Winson Chung3e2980e2018-03-29 17:28:57 -0700628 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900629 assertNull(mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700630 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900631 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800632 }
633
634 @Test
635 public void testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreen() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700636 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800637
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700638 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800639 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700640 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700641 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
642 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700643 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700644 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
645 true /* onTop */);
Wale Ogunwale24116192018-11-07 07:46:56 -0800646 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800647 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
648
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700649 doReturn(false).when(homeStack).isStackTranslucent(any());
650 doReturn(false).when(fullscreenStack1).isStackTranslucent(any());
651 doReturn(false).when(fullscreenStack2).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800652
653 // Ensure that we move the home stack behind the bottom most fullscreen stack, ignoring the
654 // pinned stack
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900655 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700656 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900657 assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800658 }
659
660 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900661 public void
662 testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreenAndTranslucent() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700663 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800664
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700665 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800666 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700667 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700668 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
669 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700670 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700671 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
672 true /* onTop */);
Winson Chungd922b6b2018-02-16 16:41:50 -0800673
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700674 doReturn(false).when(homeStack).isStackTranslucent(any());
675 doReturn(false).when(fullscreenStack1).isStackTranslucent(any());
676 doReturn(true).when(fullscreenStack2).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800677
678 // Ensure that we move the home stack behind the bottom most non-translucent fullscreen
679 // stack
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900680 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700681 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900682 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800683 }
684
685 @Test
686 public void testMoveHomeStackBehindStack_BehindHomeStack() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700687 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800688
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700689 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700690 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
691 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700692 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700693 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
694 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700695 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800696 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
697
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700698 doReturn(false).when(homeStack).isStackTranslucent(any());
699 doReturn(false).when(fullscreenStack1).isStackTranslucent(any());
700 doReturn(false).when(fullscreenStack2).isStackTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800701
702 // Ensure we don't move the home stack behind itself
Winson Chung3e2980e2018-03-29 17:28:57 -0700703 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
704 mDefaultDisplay.moveStackBehindStack(homeStack, homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900705 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800706 }
707
708 @Test
709 public void testMoveHomeStackBehindStack() {
Winson Chung3e2980e2018-03-29 17:28:57 -0700710 mDefaultDisplay.removeChild(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800711
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700712 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700713 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
714 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700715 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700716 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
717 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700718 final ActivityStack fullscreenStack3 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700719 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
720 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700721 final ActivityStack fullscreenStack4 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700722 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
723 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700724 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800725 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
726
Winson Chung3e2980e2018-03-29 17:28:57 -0700727 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack1);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900728 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700729 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack2);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900730 assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700731 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack4);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900732 assertEquals(fullscreenStack4, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700733 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack2);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900734 assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800735 }
736
Wale Ogunwalebb285872018-03-01 13:05:30 -0800737 @Test
Kazuki Takisef85197b2018-06-18 18:18:36 +0900738 public void testSetAlwaysOnTop() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700739 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Kazuki Takisef85197b2018-06-18 18:18:36 +0900740 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
741 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
742 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900743 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(homeStack));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900744
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700745 final ActivityStack alwaysOnTopStack = createStackForShouldBeVisibleTest(
Kazuki Takisef85197b2018-06-18 18:18:36 +0900746 mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD,
747 true /* onTop */);
748 alwaysOnTopStack.setAlwaysOnTop(true);
749 assertTrue(alwaysOnTopStack.isAlwaysOnTop());
750 // Ensure (non-pinned) always on top stack is put below pinned stack.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900751 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900752
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700753 final ActivityStack nonAlwaysOnTopStack = createStackForShouldBeVisibleTest(
Kazuki Takisef85197b2018-06-18 18:18:36 +0900754 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
755 true /* onTop */);
756 // Ensure non always on top stack is put below always on top stacks.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900757 assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(nonAlwaysOnTopStack));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900758
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700759 final ActivityStack alwaysOnTopStack2 = createStackForShouldBeVisibleTest(
Kazuki Takisef85197b2018-06-18 18:18:36 +0900760 mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD,
761 true /* onTop */);
762 alwaysOnTopStack2.setAlwaysOnTop(true);
763 assertTrue(alwaysOnTopStack2.isAlwaysOnTop());
764 // Ensure newly created always on top stack is placed above other all always on top stacks.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900765 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900766
767 alwaysOnTopStack2.setAlwaysOnTop(false);
768 // Ensure, when always on top is turned off for a stack, the stack is put just below all
769 // other always on top stacks.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900770 assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takise048e2662018-06-27 17:05:11 +0900771 alwaysOnTopStack2.setAlwaysOnTop(true);
772
773 // Ensure always on top state changes properly when windowing mode changes.
774 alwaysOnTopStack2.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
775 assertFalse(alwaysOnTopStack2.isAlwaysOnTop());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900776 assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takise048e2662018-06-27 17:05:11 +0900777 alwaysOnTopStack2.setWindowingMode(WINDOWING_MODE_FREEFORM);
778 assertTrue(alwaysOnTopStack2.isAlwaysOnTop());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900779 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900780 }
781
782 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900783 public void testSplitScreenMoveToFront() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700784 final ActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700785 mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD,
786 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700787 final ActivityStack splitScreenSecondary = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700788 mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD,
789 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700790 final ActivityStack assistantStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwalebb285872018-03-01 13:05:30 -0800791 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */);
792
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700793 doReturn(false).when(splitScreenPrimary).isStackTranslucent(any());
794 doReturn(false).when(splitScreenSecondary).isStackTranslucent(any());
795 doReturn(false).when(assistantStack).isStackTranslucent(any());
Wale Ogunwalebb285872018-03-01 13:05:30 -0800796
797 assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */));
798 assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
799 assertTrue(assistantStack.shouldBeVisible(null /* starting */));
800
801 splitScreenSecondary.moveToFront("testSplitScreenMoveToFront");
802
803 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
804 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
805 assertFalse(assistantStack.shouldBeVisible(null /* starting */));
806 }
807
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700808 private ActivityStack createStandardStackForVisibilityTest(int windowingMode,
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800809 boolean translucent) {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700810 final ActivityStack stack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800811 windowingMode, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700812 doReturn(translucent).when(stack).isStackTranslucent(any());
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800813 return stack;
814 }
815
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900816 @SuppressWarnings("TypeParameterUnusedInFormals")
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700817 private <T extends ActivityStack> T createStackForShouldBeVisibleTest(
818 ActivityDisplay display, int windowingMode, int activityType, boolean onTop) {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700819 final ActivityStack stack;
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700820 if (activityType == ACTIVITY_TYPE_HOME) {
821 // Home stack and activity are created in ActivityTestsBase#setupActivityManagerService
822 stack = mDefaultDisplay.getStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME);
823 if (onTop) {
Riddle Hsu57831b52018-07-27 00:31:48 +0800824 mDefaultDisplay.positionChildAtTop(stack, false /* includingParents */);
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700825 } else {
826 mDefaultDisplay.positionChildAtBottom(stack);
827 }
828 } else {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700829 stack = new StackBuilder(mRootActivityContainer)
830 .setDisplay(display)
831 .setWindowingMode(windowingMode)
832 .setActivityType(activityType)
833 .setOnTop(onTop)
834 .setCreateActivity(true)
835 .build();
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700836 }
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700837 return (T) stack;
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700838 }
Bryce Leeb0f993f2018-03-02 15:38:01 -0800839
840 @Test
Riddle Hsuaaef7312019-01-24 19:00:58 +0800841 public void testFinishDisabledPackageActivities_FinishAliveActivities() {
Bryce Leefbd263b42018-03-07 10:33:55 -0800842 final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
843 final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
Riddle Hsuaaef7312019-01-24 19:00:58 +0800844 firstActivity.setState(STOPPED, "testFinishDisabledPackageActivities");
845 secondActivity.setState(RESUMED, "testFinishDisabledPackageActivities");
846 mStack.mResumedActivity = secondActivity;
Bryce Leefbd263b42018-03-07 10:33:55 -0800847
Riddle Hsuaaef7312019-01-24 19:00:58 +0800848 // Note the activities have non-null ActivityRecord.app, so it won't remove directly.
849 mStack.finishDisabledPackageActivitiesLocked(firstActivity.packageName,
850 null /* filterByClasses */, true /* doit */, true /* evenPersistent */,
851 UserHandle.USER_ALL);
852
853 // If the activity is disabled with {@link android.content.pm.PackageManager#DONT_KILL_APP}
854 // the activity should still follow the normal flow to finish and destroy.
855 assertThat(firstActivity.getState()).isEqualTo(DESTROYING);
856 assertThat(secondActivity.getState()).isEqualTo(PAUSING);
857 assertTrue(secondActivity.finishing);
858 }
859
860 @Test
861 public void testFinishDisabledPackageActivities_RemoveNonAliveActivities() {
862 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
863
864 // The overlay activity is not in the disabled package but it is in the same task.
865 final ActivityRecord overlayActivity = new ActivityBuilder(mService).setTask(mTask)
866 .setComponent(new ComponentName("package.overlay", ".OverlayActivity")).build();
867 // If the task only remains overlay activity, the task should also be removed.
Andrii Kulian79d67982019-08-19 11:56:16 -0700868 // See {@link ActivityStack#removeFromHistory}.
Riddle Hsuaaef7312019-01-24 19:00:58 +0800869 overlayActivity.mTaskOverlay = true;
870
871 // The activity without an app means it will be removed immediately.
872 // See {@link ActivityStack#destroyActivityLocked}.
873 activity.app = null;
874 overlayActivity.app = null;
Bryce Leefbd263b42018-03-07 10:33:55 -0800875
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200876 assertEquals(2, mTask.getChildCount());
Bryce Leefbd263b42018-03-07 10:33:55 -0800877
Riddle Hsuaaef7312019-01-24 19:00:58 +0800878 mStack.finishDisabledPackageActivitiesLocked(activity.packageName,
879 null /* filterByClasses */, true /* doit */, true /* evenPersistent */,
880 UserHandle.USER_ALL);
Bryce Leefbd263b42018-03-07 10:33:55 -0800881
Riddle Hsuaaef7312019-01-24 19:00:58 +0800882 // Although the overlay activity is in another package, the non-overlay activities are
883 // removed from the task. Since the overlay activity should be removed as well, the task
884 // should be empty.
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200885 assertFalse(mTask.hasChild());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900886 assertThat(mStack.getAllTasks()).isEmpty();
Bryce Leefbd263b42018-03-07 10:33:55 -0800887 }
888
889 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900890 public void testHandleAppDied() {
Bryce Leefbd263b42018-03-07 10:33:55 -0800891 final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
892 final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
893
894 // Making the first activity a task overlay means it will be removed from the task's
895 // activities as well once second activity is removed as handleAppDied processes the
896 // activity list in reverse.
897 firstActivity.mTaskOverlay = true;
898 firstActivity.app = null;
899
900 // second activity will be immediately removed as it has no state.
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700901 secondActivity.setSavedState(null /* savedState */);
Bryce Leefbd263b42018-03-07 10:33:55 -0800902
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200903 assertEquals(2, mTask.getChildCount());
Bryce Leefbd263b42018-03-07 10:33:55 -0800904
905 mStack.handleAppDiedLocked(secondActivity.app);
906
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200907 assertFalse(mTask.hasChild());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900908 assertThat(mStack.getAllTasks()).isEmpty();
Bryce Leefbd263b42018-03-07 10:33:55 -0800909 }
Bryce Lee271617a2018-03-15 10:39:12 -0700910
911 @Test
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800912 public void testHandleAppDied_RelaunchesAfterCrashDuringWindowingModeResize() {
913 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
914
915 activity.mRelaunchReason = RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
916 activity.launchCount = 1;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700917 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800918
919 mStack.handleAppDiedLocked(activity.app);
920
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200921 assertEquals(1, mTask.getChildCount());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800922 assertEquals(1, mStack.getAllTasks().size());
923 }
924
925 @Test
926 public void testHandleAppDied_NotRelaunchAfterThreeCrashesDuringWindowingModeResize() {
927 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
928
929 activity.mRelaunchReason = RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
930 activity.launchCount = 3;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700931 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800932
933 mStack.handleAppDiedLocked(activity.app);
934
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200935 assertFalse(mTask.hasChild());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800936 assertThat(mStack.getAllTasks()).isEmpty();
937 }
938
939 @Test
940 public void testHandleAppDied_RelaunchesAfterCrashDuringFreeResize() {
941 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
942
943 activity.mRelaunchReason = RELAUNCH_REASON_FREE_RESIZE;
944 activity.launchCount = 1;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700945 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800946
947 mStack.handleAppDiedLocked(activity.app);
948
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200949 assertEquals(1, mTask.getChildCount());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800950 assertEquals(1, mStack.getAllTasks().size());
951 }
952
953 @Test
954 public void testHandleAppDied_NotRelaunchAfterThreeCrashesDuringFreeResize() {
955 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
956
957 activity.mRelaunchReason = RELAUNCH_REASON_FREE_RESIZE;
958 activity.launchCount = 3;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700959 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800960
961 mStack.handleAppDiedLocked(activity.app);
962
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200963 assertFalse(mTask.hasChild());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800964 assertThat(mStack.getAllTasks()).isEmpty();
965 }
966
967 @Test
Louis Chang7b03ad92019-08-21 12:32:33 +0800968 public void testCompletePauseOnResumeWhilePausingActivity() {
969 final ActivityRecord bottomActivity = new ActivityBuilder(mService).setTask(mTask).build();
970 doReturn(true).when(bottomActivity).attachedToProcess();
971 mStack.mPausingActivity = null;
972 mStack.mResumedActivity = bottomActivity;
973 final ActivityRecord topActivity = new ActivityBuilder(mService).setTask(mTask).build();
974 topActivity.info.flags |= FLAG_RESUME_WHILE_PAUSING;
975
976 mStack.startPausingLocked(false /* userLeaving */, false /* uiSleeping */, topActivity);
977 verify(mStack).completePauseLocked(anyBoolean(), eq(topActivity));
978 }
979
980 @Test
wilsonshih8824a8a2019-03-12 17:21:35 +0800981 public void testWontFinishHomeStackImmediately() {
982 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
983 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
984
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700985 ActivityRecord activity = homeStack.topRunningActivityLocked();
986 if (activity == null) {
987 activity = new ActivityBuilder(mService)
988 .setStack(homeStack)
989 .setCreateTask(true)
990 .build();
991 }
992
wilsonshih8824a8a2019-03-12 17:21:35 +0800993 // Home stack should not be destroyed immediately.
Andrii Kulian7dd39bb2019-07-22 13:11:10 -0700994 final ActivityRecord activity1 = finishTopActivity(homeStack);
wilsonshih8824a8a2019-03-12 17:21:35 +0800995 assertEquals(FINISHING, activity1.getState());
996 }
997
998 @Test
Riddle Hsue10cea52018-10-16 23:33:23 +0800999 public void testFinishCurrentActivity() {
1000 // Create 2 activities on a new display.
1001 final ActivityDisplay display = addNewActivityDisplayAt(ActivityDisplay.POSITION_TOP);
1002 final ActivityStack stack1 = createStackForShouldBeVisibleTest(display,
1003 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
1004 final ActivityStack stack2 = createStackForShouldBeVisibleTest(display,
1005 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
1006
1007 // There is still an activity1 in stack1 so the activity2 should be added to finishing list
1008 // that will be destroyed until idle.
Issei Suzuki1669ea42019-11-06 14:20:59 +01001009 stack2.getTopNonFinishingActivity().mVisibleRequested = true;
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001010 final ActivityRecord activity2 = finishTopActivity(stack2);
Louis Changf2835df2018-10-17 15:14:45 +08001011 assertEquals(STOPPING, activity2.getState());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001012 assertThat(mSupervisor.mStoppingActivities).contains(activity2);
Riddle Hsue10cea52018-10-16 23:33:23 +08001013
1014 // The display becomes empty. Since there is no next activity to be idle, the activity
1015 // should be destroyed immediately with updating configuration to restore original state.
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001016 final ActivityRecord activity1 = finishTopActivity(stack1);
Riddle Hsue10cea52018-10-16 23:33:23 +08001017 assertEquals(DESTROYING, activity1.getState());
Wale Ogunwaled32da472018-11-16 07:19:28 -08001018 verify(mRootActivityContainer).ensureVisibilityAndConfig(eq(null) /* starting */,
Riddle Hsue10cea52018-10-16 23:33:23 +08001019 eq(display.mDisplayId), anyBoolean(), anyBoolean());
1020 }
1021
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001022 private ActivityRecord finishTopActivity(ActivityStack stack) {
Riddle Hsue10cea52018-10-16 23:33:23 +08001023 final ActivityRecord activity = stack.topRunningActivityLocked();
1024 assertNotNull(activity);
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001025 activity.setState(STOPPED, "finishTopActivity");
Riddle Hsue10cea52018-10-16 23:33:23 +08001026 activity.makeFinishingLocked();
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001027 activity.completeFinishing("finishTopActivity");
Riddle Hsue10cea52018-10-16 23:33:23 +08001028 return activity;
1029 }
1030
1031 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001032 public void testShouldSleepActivities() {
Bryce Lee271617a2018-03-15 10:39:12 -07001033 // When focused activity and keyguard is going away, we should not sleep regardless
1034 // of the display state
1035 verifyShouldSleepActivities(true /* focusedStack */, true /*keyguardGoingAway*/,
1036 true /* displaySleeping */, false /* expected*/);
1037
1038 // When not the focused stack, defer to display sleeping state.
1039 verifyShouldSleepActivities(false /* focusedStack */, true /*keyguardGoingAway*/,
1040 true /* displaySleeping */, true /* expected*/);
1041
1042 // If keyguard is going away, defer to the display sleeping state.
1043 verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/,
1044 true /* displaySleeping */, true /* expected*/);
1045 verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/,
1046 false /* displaySleeping */, false /* expected*/);
1047 }
1048
Winson Chung0f7ec962018-05-03 18:03:15 -07001049 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001050 public void testStackOrderChangedOnRemoveStack() {
Winson Chung0f7ec962018-05-03 18:03:15 -07001051 StackOrderChangedListener listener = new StackOrderChangedListener();
1052 mDefaultDisplay.registerStackOrderChangedListener(listener);
1053 try {
1054 mDefaultDisplay.removeChild(mStack);
1055 } finally {
1056 mDefaultDisplay.unregisterStackOrderChangedListener(listener);
1057 }
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001058 assertTrue(listener.mChanged);
Winson Chung0f7ec962018-05-03 18:03:15 -07001059 }
1060
1061 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001062 public void testStackOrderChangedOnAddPositionStack() {
Winson Chung0f7ec962018-05-03 18:03:15 -07001063 mDefaultDisplay.removeChild(mStack);
1064
1065 StackOrderChangedListener listener = new StackOrderChangedListener();
1066 mDefaultDisplay.registerStackOrderChangedListener(listener);
1067 try {
1068 mDefaultDisplay.addChild(mStack, 0);
1069 } finally {
1070 mDefaultDisplay.unregisterStackOrderChangedListener(listener);
1071 }
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001072 assertTrue(listener.mChanged);
Winson Chung0f7ec962018-05-03 18:03:15 -07001073 }
1074
1075 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001076 public void testStackOrderChangedOnPositionStack() {
Winson Chung0f7ec962018-05-03 18:03:15 -07001077 StackOrderChangedListener listener = new StackOrderChangedListener();
1078 try {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -07001079 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung0f7ec962018-05-03 18:03:15 -07001080 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
1081 true /* onTop */);
1082 mDefaultDisplay.registerStackOrderChangedListener(listener);
1083 mDefaultDisplay.positionChildAtBottom(fullscreenStack1);
1084 } finally {
1085 mDefaultDisplay.unregisterStackOrderChangedListener(listener);
1086 }
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001087 assertTrue(listener.mChanged);
Winson Chung0f7ec962018-05-03 18:03:15 -07001088 }
1089
Louis Changf7f7f9c2019-06-18 16:47:51 +08001090 @Test
1091 public void testResetTaskWithFinishingActivities() {
1092 final ActivityRecord taskTop =
1093 new ActivityBuilder(mService).setStack(mStack).setCreateTask(true).build();
Louis Changcdec0802019-11-11 11:45:07 +08001094 // Make all activities in the task are finishing to simulate Task#getTopActivity
Louis Changf7f7f9c2019-06-18 16:47:51 +08001095 // returns null.
1096 taskTop.finishing = true;
1097
1098 final ActivityRecord newR = new ActivityBuilder(mService).build();
1099 final ActivityRecord result = mStack.resetTaskIfNeededLocked(taskTop, newR);
1100 assertThat(result).isEqualTo(taskTop);
1101 }
1102
Louis Changcfe46212019-07-30 10:34:18 +08001103 @Test
Riddle Hsu13c27ae2019-10-05 23:10:15 +08001104 public void testClearUnknownAppVisibilityBehindFullscreenActivity() {
1105 final UnknownAppVisibilityController unknownAppVisibilityController =
1106 mDefaultDisplay.mDisplayContent.mUnknownAppVisibilityController;
1107 final KeyguardController keyguardController = mSupervisor.getKeyguardController();
1108 doReturn(true).when(keyguardController).isKeyguardLocked();
1109
1110 // Start 2 activities that their processes have not yet started.
1111 final ActivityRecord[] activities = new ActivityRecord[2];
1112 mSupervisor.beginDeferResume();
1113 for (int i = 0; i < activities.length; i++) {
1114 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
1115 activities[i] = r;
1116 doReturn(null).when(mService).getProcessController(
1117 eq(r.processName), eq(r.info.applicationInfo.uid));
1118 r.setState(ActivityStack.ActivityState.INITIALIZING, "test");
1119 // Ensure precondition that the activity is opaque.
1120 assertTrue(r.occludesParent());
1121 mSupervisor.startSpecificActivityLocked(r, false /* andResume */,
1122 false /* checkConfig */);
1123 }
1124 mSupervisor.endDeferResume();
1125
1126 doReturn(false).when(mService).isBooting();
1127 doReturn(true).when(mService).isBooted();
1128 // 2 activities are started while keyguard is locked, so they are waiting to be resolved.
1129 assertFalse(unknownAppVisibilityController.allResolved());
1130
1131 // Assume the top activity is going to resume and
1132 // {@link RootActivityContainer#cancelInitializingActivities} should clear the unknown
1133 // visibility records that are occluded.
1134 mStack.resumeTopActivityUncheckedLocked(null /* prev */, null /* options */);
1135 // Assume the top activity relayouted, just remove it directly.
1136 unknownAppVisibilityController.appRemovedOrHidden(activities[1]);
1137 // All unresolved records should be removed.
1138 assertTrue(unknownAppVisibilityController.allResolved());
1139 }
1140
1141 @Test
Louis Changcfe46212019-07-30 10:34:18 +08001142 public void testNonTopVisibleActivityNotResume() {
1143 final ActivityRecord nonTopVisibleActivity =
1144 new ActivityBuilder(mService).setTask(mTask).build();
1145 new ActivityBuilder(mService).setTask(mTask).build();
1146 doReturn(false).when(nonTopVisibleActivity).attachedToProcess();
Riddle Hsu13c27ae2019-10-05 23:10:15 +08001147 doReturn(true).when(nonTopVisibleActivity).shouldBeVisible(anyBoolean(), anyBoolean());
Louis Changcfe46212019-07-30 10:34:18 +08001148 doNothing().when(mSupervisor).startSpecificActivityLocked(any(), anyBoolean(),
1149 anyBoolean());
1150
1151 mStack.ensureActivitiesVisibleLocked(null /* starting */, 0 /* configChanges */,
1152 false /* preserveWindows */);
1153 verify(mSupervisor).startSpecificActivityLocked(any(), eq(false) /* andResume */,
1154 anyBoolean());
1155 }
1156
Bryce Lee271617a2018-03-15 10:39:12 -07001157 private void verifyShouldSleepActivities(boolean focusedStack,
1158 boolean keyguardGoingAway, boolean displaySleeping, boolean expected) {
Bryce Lee271617a2018-03-15 10:39:12 -07001159 final ActivityDisplay display = mock(ActivityDisplay.class);
1160 final KeyguardController keyguardController = mSupervisor.getKeyguardController();
1161
Wale Ogunwaled32da472018-11-16 07:19:28 -08001162 doReturn(display).when(mRootActivityContainer).getActivityDisplay(anyInt());
Bryce Lee271617a2018-03-15 10:39:12 -07001163 doReturn(keyguardGoingAway).when(keyguardController).isKeyguardGoingAway();
1164 doReturn(displaySleeping).when(display).isSleeping();
Tiger Huang1e5b10a2018-07-30 20:19:51 +08001165 doReturn(focusedStack).when(mStack).isFocusedStackOnDisplay();
Bryce Lee271617a2018-03-15 10:39:12 -07001166
1167 assertEquals(expected, mStack.shouldSleepActivities());
1168 }
Winson Chung0f7ec962018-05-03 18:03:15 -07001169
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001170 private static class StackOrderChangedListener
1171 implements ActivityDisplay.OnStackOrderChangedListener {
1172 public boolean mChanged = false;
Winson Chung0f7ec962018-05-03 18:03:15 -07001173
1174 @Override
Winson Chung65d66d32018-12-13 17:48:39 -08001175 public void onStackOrderChanged(ActivityStack stack) {
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001176 mChanged = true;
Winson Chung0f7ec962018-05-03 18:03:15 -07001177 }
1178 }
Bryce Lee840c5662017-04-13 10:02:51 -07001179}