blob: 393d8b83cad262ee5476d41e206f799129ba5f2d [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;
Riddle Hsue10cea52018-10-16 23:33:23 +080057import static org.mockito.ArgumentMatchers.eq;
Bryce Lee840c5662017-04-13 10:02:51 -070058
Riddle Hsuaaef7312019-01-24 19:00:58 +080059import android.content.ComponentName;
Bryce Lee3345c4e2017-04-25 07:40:41 -070060import android.content.pm.ActivityInfo;
Bryce Lee9f6affd2017-09-01 09:18:35 -070061import android.os.UserHandle;
Bryce Lee840c5662017-04-13 10:02:51 -070062import android.platform.test.annotations.Presubmit;
Bryce Lee840c5662017-04-13 10:02:51 -070063
Brett Chabota26eda92018-07-23 13:08:30 -070064import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070065
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070066import org.junit.Before;
Bryce Lee840c5662017-04-13 10:02:51 -070067import org.junit.Test;
Riddle Hsu73f53572019-09-23 23:13:01 +080068import org.junit.runner.RunWith;
Bryce Lee840c5662017-04-13 10:02:51 -070069
70/**
71 * Tests for the {@link ActivityStack} class.
72 *
73 * Build/Install/Run:
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090074 * atest WmTests:ActivityStackTests
Bryce Lee840c5662017-04-13 10:02:51 -070075 */
76@SmallTest
77@Presubmit
Riddle Hsu73f53572019-09-23 23:13:01 +080078@RunWith(WindowTestRunner.class)
Bryce Lee840c5662017-04-13 10:02:51 -070079public class ActivityStackTests extends ActivityTestsBase {
Louis Chang677921f2019-12-06 16:44:24 +080080 private DisplayContent mDefaultDisplay;
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070081 private ActivityStack mStack;
Louis Changcdec0802019-11-11 11:45:07 +080082 private Task mTask;
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070083
84 @Before
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070085 public void setUp() throws Exception {
Louis Chang149d5c82019-12-30 09:47:39 +080086 mDefaultDisplay = mRootWindowContainer.getDefaultDisplay();
Wale Ogunwale8a1860a2019-06-05 08:57:19 -070087 mStack = mDefaultDisplay.createStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD,
88 true /* onTop */);
89 spyOn(mStack);
Bryce Lee18d51592017-10-25 10:22:19 -070090 mTask = new TaskBuilder(mSupervisor).setStack(mStack).build();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -070091 }
92
Bryce Lee840c5662017-04-13 10:02:51 -070093 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090094 public void testResumedActivity() {
Bryce Leec4ab62a2018-03-05 14:19:26 -080095 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090096 assertNull(mStack.getResumedActivity());
Bryce Leec4ab62a2018-03-05 14:19:26 -080097 r.setState(RESUMED, "testResumedActivity");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090098 assertEquals(r, mStack.getResumedActivity());
Bryce Leec4ab62a2018-03-05 14:19:26 -080099 r.setState(PAUSING, "testResumedActivity");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900100 assertNull(mStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700101 }
Bryce Leec4ab62a2018-03-05 14:19:26 -0800102
Bryce Lee84730a02018-04-03 14:10:04 -0700103 @Test
104 public void testResumedActivityFromTaskReparenting() {
105 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
106 // Ensure moving task between two stacks updates resumed activity
107 r.setState(RESUMED, "testResumedActivityFromTaskReparenting");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900108 assertEquals(r, mStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700109
Louis Chang149d5c82019-12-30 09:47:39 +0800110 final ActivityStack destStack = mRootWindowContainer.getDefaultDisplay().createStack(
Bryce Lee84730a02018-04-03 14:10:04 -0700111 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
112
Louis Changcdec0802019-11-11 11:45:07 +0800113 mTask.reparent(destStack, true /* toTop */, Task.REPARENT_KEEP_STACK_AT_FRONT,
Bryce Lee84730a02018-04-03 14:10:04 -0700114 false /* animate */, true /* deferResume*/,
115 "testResumedActivityFromTaskReparenting");
116
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900117 assertNull(mStack.getResumedActivity());
118 assertEquals(r, destStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700119 }
120
121 @Test
122 public void testResumedActivityFromActivityReparenting() {
123 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
124 // Ensure moving task between two stacks updates resumed activity
125 r.setState(RESUMED, "testResumedActivityFromActivityReparenting");
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900126 assertEquals(r, mStack.getResumedActivity());
Bryce Lee84730a02018-04-03 14:10:04 -0700127
Louis Chang149d5c82019-12-30 09:47:39 +0800128 final ActivityStack destStack = mRootWindowContainer.getDefaultDisplay().createStack(
Bryce Lee84730a02018-04-03 14:10:04 -0700129 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700130 mTask.reparent(destStack, true /*toTop*/, REPARENT_MOVE_STACK_TO_FRONT, false, false,
131 "testResumedActivityFromActivityReparenting");
Bryce Lee84730a02018-04-03 14:10:04 -0700132
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900133 assertNull(mStack.getResumedActivity());
134 assertEquals(r, destStack.getResumedActivity());
Bryce Lee5daa3122017-04-19 10:40:42 -0700135 }
Bryce Lee3345c4e2017-04-25 07:40:41 -0700136
137 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900138 public void testPrimarySplitScreenRestoresWhenMovedToBack() {
Bryce Lee8cab4a02018-01-05 09:00:49 -0800139 // Create primary splitscreen stack. This will create secondary stacks and places the
140 // existing fullscreen stack on the bottom.
Winson Chung3e2980e2018-03-29 17:28:57 -0700141 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
142 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Bryce Lee8cab4a02018-01-05 09:00:49 -0800143
144 // Assert windowing mode.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900145 assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, primarySplitScreen.getWindowingMode());
Bryce Lee8cab4a02018-01-05 09:00:49 -0800146
147 // Move primary to back.
148 primarySplitScreen.moveToBack("testPrimarySplitScreenToFullscreenWhenMovedToBack",
149 null /* task */);
150
151 // Assert that stack is at the bottom.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900152 assertEquals(0, mDefaultDisplay.getIndexOf(primarySplitScreen));
Bryce Lee8cab4a02018-01-05 09:00:49 -0800153
154 // Ensure no longer in splitscreen.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900155 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700156
157 // Ensure that the override mode is restored to undefined
Evan Roskydfe3da72018-10-26 17:21:06 -0700158 assertEquals(WINDOWING_MODE_UNDEFINED,
159 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700160 }
161
162 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900163 public void testPrimarySplitScreenRestoresPreviousWhenMovedToBack() {
Evan Rosky10475742018-09-05 19:02:48 -0700164 // This time, start with a fullscreen activitystack
165 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900166 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Evan Rosky10475742018-09-05 19:02:48 -0700167
168 primarySplitScreen.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
169
170 // Assert windowing mode.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900171 assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, primarySplitScreen.getWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700172
173 // Move primary to back.
174 primarySplitScreen.moveToBack("testPrimarySplitScreenToFullscreenWhenMovedToBack",
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900175 null /* task */);
Evan Rosky10475742018-09-05 19:02:48 -0700176
177 // Assert that stack is at the bottom.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900178 assertEquals(0, mDefaultDisplay.getIndexOf(primarySplitScreen));
Evan Rosky10475742018-09-05 19:02:48 -0700179
180 // Ensure that the override mode is restored to what it was (fullscreen)
Evan Roskydfe3da72018-10-26 17:21:06 -0700181 assertEquals(WINDOWING_MODE_FULLSCREEN,
182 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700183 }
184
185 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900186 public void testStackInheritsDisplayWindowingMode() {
Evan Rosky10475742018-09-05 19:02:48 -0700187 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900188 WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Evan Rosky10475742018-09-05 19:02:48 -0700189
190 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Evan Roskydfe3da72018-10-26 17:21:06 -0700191 assertEquals(WINDOWING_MODE_UNDEFINED,
192 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700193
194 mDefaultDisplay.setWindowingMode(WINDOWING_MODE_FREEFORM);
195 assertEquals(WINDOWING_MODE_FREEFORM, primarySplitScreen.getWindowingMode());
Evan Roskydfe3da72018-10-26 17:21:06 -0700196 assertEquals(WINDOWING_MODE_UNDEFINED,
197 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700198 }
199
200 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900201 public void testStackOverridesDisplayWindowingMode() {
Evan Rosky10475742018-09-05 19:02:48 -0700202 final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900203 WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Evan Rosky10475742018-09-05 19:02:48 -0700204
205 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Evan Roskydfe3da72018-10-26 17:21:06 -0700206 assertEquals(WINDOWING_MODE_UNDEFINED,
207 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700208
209 primarySplitScreen.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
210 // setting windowing mode should still work even though resolved mode is already fullscreen
Evan Roskydfe3da72018-10-26 17:21:06 -0700211 assertEquals(WINDOWING_MODE_FULLSCREEN,
212 primarySplitScreen.getRequestedOverrideWindowingMode());
Evan Rosky10475742018-09-05 19:02:48 -0700213
214 mDefaultDisplay.setWindowingMode(WINDOWING_MODE_FREEFORM);
215 assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
Bryce Lee8cab4a02018-01-05 09:00:49 -0800216 }
217
218 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900219 public void testStopActivityWhenActivityDestroyed() {
Bryce Lee18d51592017-10-25 10:22:19 -0700220 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -0700221 r.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700222 mStack.moveToFront("testStopActivityWithDestroy");
Andrii Kulian79d67982019-08-19 11:56:16 -0700223 r.stopIfPossible();
Wale Ogunwale04a05ac2017-09-17 21:35:02 -0700224 // Mostly testing to make sure there is a crash in the call part, so if we get here we are
225 // good-to-go!
Bryce Lee3345c4e2017-04-25 07:40:41 -0700226 }
Bryce Lee9f6affd2017-09-01 09:18:35 -0700227
228 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900229 public void testFindTaskWithOverlay() {
Bryce Lee18d51592017-10-25 10:22:19 -0700230 final ActivityRecord r = new ActivityBuilder(mService)
231 .setCreateTask(true)
232 .setStack(mStack)
233 .setUid(0)
234 .build();
Louis Changcdec0802019-11-11 11:45:07 +0800235 final Task task = r.getTask();
Bryce Lee9f6affd2017-09-01 09:18:35 -0700236 // Overlay must be for a different user to prevent recognizing a matching top activity
Bryce Lee18d51592017-10-25 10:22:19 -0700237 final ActivityRecord taskOverlay = new ActivityBuilder(mService).setTask(task)
238 .setUid(UserHandle.PER_USER_RANGE * 2).build();
Wale Ogunwale0b3d2922019-12-30 08:55:07 -0800239 taskOverlay.setTaskOverlay(true);
Bryce Lee9f6affd2017-09-01 09:18:35 -0700240
Louis Chang149d5c82019-12-30 09:47:39 +0800241 final RootWindowContainer.FindTaskResult result =
242 new RootWindowContainer.FindTaskResult();
Wale Ogunwalea38654f2019-11-17 20:37:15 -0800243 result.process(r, mStack);
Bryce Lee9f6affd2017-09-01 09:18:35 -0700244
Wale Ogunwale21e06482019-11-18 05:14:15 -0800245 assertEquals(r, task.getTopNonFinishingActivity(false /* includeOverlays */));
246 assertEquals(taskOverlay, task.getTopNonFinishingActivity(true /* includeOverlays */));
Louis Changc85b1a32018-08-14 16:40:53 +0800247 assertNotNull(result.mRecord);
Bryce Lee9f6affd2017-09-01 09:18:35 -0700248 }
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700249
250 @Test
Louis Changb05c8d82019-06-25 11:56:55 +0800251 public void testFindTaskAlias() {
252 final String targetActivity = "target.activity";
253 final String aliasActivity = "alias.activity";
254 final ComponentName target = new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME,
255 targetActivity);
256 final ComponentName alias = new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME,
257 aliasActivity);
Louis Changcdec0802019-11-11 11:45:07 +0800258 final Task task = new TaskBuilder(mService.mStackSupervisor).setStack(mStack).build();
Louis Changb05c8d82019-06-25 11:56:55 +0800259 task.origActivity = alias;
260 task.realActivity = target;
261 new ActivityBuilder(mService).setComponent(target).setTask(task).setTargetActivity(
262 targetActivity).build();
263
264 // Using target activity to find task.
265 final ActivityRecord r1 = new ActivityBuilder(mService).setComponent(
266 target).setTargetActivity(targetActivity).build();
Louis Chang149d5c82019-12-30 09:47:39 +0800267 RootWindowContainer.FindTaskResult result = new RootWindowContainer.FindTaskResult();
Wale Ogunwalea38654f2019-11-17 20:37:15 -0800268 result.process(r1, mStack);
Louis Changb05c8d82019-06-25 11:56:55 +0800269 assertThat(result.mRecord).isNotNull();
270
271 // Using alias activity to find task.
272 final ActivityRecord r2 = new ActivityBuilder(mService).setComponent(
273 alias).setTargetActivity(targetActivity).build();
Louis Chang149d5c82019-12-30 09:47:39 +0800274 result = new RootWindowContainer.FindTaskResult();
Wale Ogunwalea38654f2019-11-17 20:37:15 -0800275 result.process(r2, mStack);
Louis Changb05c8d82019-06-25 11:56:55 +0800276 assertThat(result.mRecord).isNotNull();
277 }
278
279 @Test
Riddle Hsu138ef932018-10-26 17:12:06 +0800280 public void testMoveStackToBackIncludingParent() {
Louis Chang677921f2019-12-06 16:44:24 +0800281 final DisplayContent display = addNewDisplayContentAt(DisplayContent.POSITION_TOP);
Riddle Hsu138ef932018-10-26 17:12:06 +0800282 final ActivityStack stack1 = createStackForShouldBeVisibleTest(display,
283 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
284 final ActivityStack stack2 = createStackForShouldBeVisibleTest(display,
285 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
286
287 // Do not move display to back because there is still another stack.
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900288 stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.getTopMostTask());
Wale Ogunwalebebd8cd2019-10-28 15:53:31 -0700289 verify(stack2).positionChildAtBottom(any(), eq(false) /* includingParents */);
Riddle Hsu138ef932018-10-26 17:12:06 +0800290
291 // Also move display to back because there is only one stack left.
Louis Chang2453d062019-11-19 22:30:48 +0800292 display.removeStack(stack1);
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900293 stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.getTopMostTask());
Wale Ogunwalebebd8cd2019-10-28 15:53:31 -0700294 verify(stack2).positionChildAtBottom(any(), eq(true) /* includingParents */);
Riddle Hsu138ef932018-10-26 17:12:06 +0800295 }
296
297 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900298 public void testShouldBeVisible_Fullscreen() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700299 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700300 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Winson Chung3e2980e2018-03-29 17:28:57 -0700301 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700302 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700303 // Add an activity to the pinned stack so it isn't considered empty for visibility check.
304 final ActivityRecord pinnedActivity = new ActivityBuilder(mService)
305 .setCreateTask(true)
306 .setStack(pinnedStack)
307 .build();
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700308
309 assertTrue(homeStack.shouldBeVisible(null /* starting */));
310 assertTrue(pinnedStack.shouldBeVisible(null /* starting */));
311
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700312 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700313 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
314 // Home stack shouldn't be visible behind an opaque fullscreen stack, but pinned stack
315 // should be visible since it is always on-top.
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800316 doReturn(false).when(fullscreenStack).isTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700317 assertFalse(homeStack.shouldBeVisible(null /* starting */));
318 assertTrue(pinnedStack.shouldBeVisible(null /* starting */));
319 assertTrue(fullscreenStack.shouldBeVisible(null /* starting */));
320
321 // Home stack should be visible behind a translucent fullscreen stack.
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800322 doReturn(true).when(fullscreenStack).isTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700323 assertTrue(homeStack.shouldBeVisible(null /* starting */));
324 assertTrue(pinnedStack.shouldBeVisible(null /* starting */));
325 }
326
327 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900328 public void testShouldBeVisible_SplitScreen() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700329 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700330 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale30e441d2017-11-09 08:28:45 -0800331 // Home stack should always be fullscreen for this test.
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700332 doReturn(false).when(homeStack).supportsSplitScreenWindowingMode();
333 final ActivityStack splitScreenPrimary =
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900334 createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700335 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700336 final ActivityStack splitScreenSecondary =
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900337 createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700338 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
339
340 // Home stack shouldn't be visible if both halves of split-screen are opaque.
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800341 doReturn(false).when(splitScreenPrimary).isTranslucent(any());
342 doReturn(false).when(splitScreenSecondary).isTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700343 assertFalse(homeStack.shouldBeVisible(null /* starting */));
344 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
345 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800346 assertEquals(STACK_VISIBILITY_INVISIBLE, homeStack.getVisibility(null /* starting */));
347 assertEquals(STACK_VISIBILITY_VISIBLE,
348 splitScreenPrimary.getVisibility(null /* starting */));
349 assertEquals(STACK_VISIBILITY_VISIBLE,
350 splitScreenSecondary.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700351
352 // Home stack should be visible if one of the halves of split-screen is translucent.
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800353 doReturn(true).when(splitScreenPrimary).isTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700354 assertTrue(homeStack.shouldBeVisible(null /* starting */));
355 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
356 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800357 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
358 homeStack.getVisibility(null /* starting */));
359 assertEquals(STACK_VISIBILITY_VISIBLE,
360 splitScreenPrimary.getVisibility(null /* starting */));
361 assertEquals(STACK_VISIBILITY_VISIBLE,
362 splitScreenSecondary.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700363
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700364 final ActivityStack splitScreenSecondary2 =
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900365 createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700366 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
367 // First split-screen secondary shouldn't be visible behind another opaque split-split
368 // secondary.
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800369 doReturn(false).when(splitScreenSecondary2).isTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700370 assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
371 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800372 assertEquals(STACK_VISIBILITY_INVISIBLE,
373 splitScreenSecondary.getVisibility(null /* starting */));
374 assertEquals(STACK_VISIBILITY_VISIBLE,
375 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700376
Wale Ogunwale8e923af2018-03-23 08:48:11 -0700377 // First split-screen secondary should be visible behind another translucent split-screen
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700378 // secondary.
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800379 doReturn(true).when(splitScreenSecondary2).isTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700380 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
381 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800382 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
383 splitScreenSecondary.getVisibility(null /* starting */));
384 assertEquals(STACK_VISIBILITY_VISIBLE,
385 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700386
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700387 final ActivityStack assistantStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700388 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */);
389
390 // Split-screen stacks shouldn't be visible behind an opaque fullscreen stack.
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800391 doReturn(false).when(assistantStack).isTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700392 assertTrue(assistantStack.shouldBeVisible(null /* starting */));
393 assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */));
394 assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
395 assertFalse(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800396 assertEquals(STACK_VISIBILITY_VISIBLE,
397 assistantStack.getVisibility(null /* starting */));
398 assertEquals(STACK_VISIBILITY_INVISIBLE,
399 splitScreenPrimary.getVisibility(null /* starting */));
400 assertEquals(STACK_VISIBILITY_INVISIBLE,
401 splitScreenSecondary.getVisibility(null /* starting */));
402 assertEquals(STACK_VISIBILITY_INVISIBLE,
403 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700404
405 // Split-screen stacks should be visible behind a translucent fullscreen stack.
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800406 doReturn(true).when(assistantStack).isTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700407 assertTrue(assistantStack.shouldBeVisible(null /* starting */));
408 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
409 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
410 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800411 assertEquals(STACK_VISIBILITY_VISIBLE,
412 assistantStack.getVisibility(null /* starting */));
413 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
414 splitScreenPrimary.getVisibility(null /* starting */));
415 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
416 splitScreenSecondary.getVisibility(null /* starting */));
417 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
418 splitScreenSecondary2.getVisibility(null /* starting */));
Wale Ogunwale8e923af2018-03-23 08:48:11 -0700419
420 // Assistant stack shouldn't be visible behind translucent split-screen stack
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800421 doReturn(false).when(assistantStack).isTranslucent(any());
422 doReturn(true).when(splitScreenPrimary).isTranslucent(any());
423 doReturn(true).when(splitScreenSecondary2).isTranslucent(any());
Wale Ogunwale8e923af2018-03-23 08:48:11 -0700424 splitScreenSecondary2.moveToFront("testShouldBeVisible_SplitScreen");
425 splitScreenPrimary.moveToFront("testShouldBeVisible_SplitScreen");
426 assertFalse(assistantStack.shouldBeVisible(null /* starting */));
427 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
428 assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800429 assertEquals(STACK_VISIBILITY_INVISIBLE,
430 assistantStack.getVisibility(null /* starting */));
431 assertEquals(STACK_VISIBILITY_VISIBLE,
432 splitScreenPrimary.getVisibility(null /* starting */));
433 assertEquals(STACK_VISIBILITY_INVISIBLE,
434 splitScreenSecondary.getVisibility(null /* starting */));
435 assertEquals(STACK_VISIBILITY_VISIBLE,
436 splitScreenSecondary2.getVisibility(null /* starting */));
437 }
438
439 @Test
440 public void testGetVisibility_FullscreenBehindTranslucent() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700441 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800442 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
443 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700444 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800445 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
446 true /* translucent */);
447
448 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
449 bottomStack.getVisibility(null /* starting */));
450 assertEquals(STACK_VISIBILITY_VISIBLE,
451 translucentStack.getVisibility(null /* starting */));
452 }
453
454 @Test
455 public void testGetVisibility_FullscreenBehindTranslucentAndOpaque() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700456 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800457 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
458 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700459 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800460 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
461 true /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700462 final ActivityStack opaqueStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800463 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
464 false /* translucent */);
465
466 assertEquals(STACK_VISIBILITY_INVISIBLE, bottomStack.getVisibility(null /* starting */));
467 assertEquals(STACK_VISIBILITY_INVISIBLE,
468 translucentStack.getVisibility(null /* starting */));
469 assertEquals(STACK_VISIBILITY_VISIBLE, opaqueStack.getVisibility(null /* starting */));
470 }
471
472 @Test
473 public void testGetVisibility_FullscreenBehindOpaqueAndTranslucent() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700474 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800475 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
476 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700477 final ActivityStack opaqueStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800478 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
479 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700480 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800481 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
482 true /* translucent */);
483
484 assertEquals(STACK_VISIBILITY_INVISIBLE, bottomStack.getVisibility(null /* starting */));
485 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
486 opaqueStack.getVisibility(null /* starting */));
487 assertEquals(STACK_VISIBILITY_VISIBLE,
488 translucentStack.getVisibility(null /* starting */));
489 }
490
491 @Test
492 public void testGetVisibility_FullscreenTranslucentBehindTranslucent() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700493 final ActivityStack bottomTranslucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800494 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
495 true /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700496 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800497 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
498 true /* translucent */);
499
500 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
501 bottomTranslucentStack.getVisibility(null /* starting */));
502 assertEquals(STACK_VISIBILITY_VISIBLE,
503 translucentStack.getVisibility(null /* starting */));
504 }
505
506 @Test
507 public void testGetVisibility_FullscreenTranslucentBehindOpaque() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700508 final ActivityStack bottomTranslucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800509 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
510 true /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700511 final ActivityStack opaqueStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800512 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
513 false /* translucent */);
514
515 assertEquals(STACK_VISIBILITY_INVISIBLE,
516 bottomTranslucentStack.getVisibility(null /* starting */));
517 assertEquals(STACK_VISIBILITY_VISIBLE, opaqueStack.getVisibility(null /* starting */));
518 }
519
520 @Test
521 public void testGetVisibility_FullscreenBehindTranslucentAndPip() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700522 final ActivityStack bottomStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800523 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
524 false /* translucent */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700525 final ActivityStack translucentStack =
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800526 createStandardStackForVisibilityTest(WINDOWING_MODE_FULLSCREEN,
527 true /* translucent */);
528 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
529 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
530
531 assertEquals(STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
532 bottomStack.getVisibility(null /* starting */));
533 assertEquals(STACK_VISIBILITY_VISIBLE,
534 translucentStack.getVisibility(null /* starting */));
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700535 // Add an activity to the pinned stack so it isn't considered empty for visibility check.
536 final ActivityRecord pinnedActivity = new ActivityBuilder(mService)
537 .setCreateTask(true)
538 .setStack(pinnedStack)
539 .build();
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800540 assertEquals(STACK_VISIBILITY_VISIBLE, pinnedStack.getVisibility(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700541 }
542
543 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900544 public void testShouldBeVisible_Finishing() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700545 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700546 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900547 ActivityRecord topRunningHomeActivity = homeStack.topRunningActivity();
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700548 if (topRunningHomeActivity == null) {
549 topRunningHomeActivity = new ActivityBuilder(mService)
550 .setStack(homeStack)
551 .setCreateTask(true)
552 .build();
553 }
554
555 final ActivityStack translucentStack = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700556 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
557 true /* onTop */);
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800558 doReturn(true).when(translucentStack).isTranslucent(any());
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700559
560 assertTrue(homeStack.shouldBeVisible(null /* starting */));
561 assertTrue(translucentStack.shouldBeVisible(null /* starting */));
562
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700563 topRunningHomeActivity.finishing = true;
564 final ActivityRecord topRunningTranslucentActivity =
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900565 translucentStack.topRunningActivity();
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700566 topRunningTranslucentActivity.finishing = true;
567
Louis Changf2835df2018-10-17 15:14:45 +0800568 // Home stack should be visible even there are no running activities.
569 assertTrue(homeStack.shouldBeVisible(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700570 // Home should be visible if we are starting an activity within it.
571 assertTrue(homeStack.shouldBeVisible(topRunningHomeActivity /* starting */));
Louis Changf2835df2018-10-17 15:14:45 +0800572 // The translucent stack shouldn't be visible since its activity marked as finishing.
573 assertFalse(translucentStack.shouldBeVisible(null /* starting */));
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700574 }
575
Winson Chungd922b6b2018-02-16 16:41:50 -0800576 @Test
Jeff Chang24b0bf62019-12-19 19:15:07 +0800577 public void testShouldBeVisible_FullscreenBehindTranslucentInHomeStack() {
578 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
579 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
580
581 final ActivityRecord firstActivity = new ActivityBuilder(mService)
582 .setStack(homeStack)
583 .setCreateTask(true)
584 .build();
585 final Task task = firstActivity.getTask();
586 final ActivityRecord secondActivity = new ActivityBuilder(mService)
587 .setTask(task)
588 .build();
589
590 doReturn(false).when(secondActivity).occludesParent();
591 homeStack.ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
592 false /* preserveWindows */);
593
594 assertTrue(firstActivity.shouldBeVisible());
595 }
596
597 @Test
Winson Chungd922b6b2018-02-16 16:41:50 -0800598 public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindFullscreen() {
Louis Chang2453d062019-11-19 22:30:48 +0800599 mDefaultDisplay.removeStack(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800600
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700601 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800602 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700603 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800604 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
605
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800606 doReturn(false).when(homeStack).isTranslucent(any());
607 doReturn(false).when(fullscreenStack).isTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800608
609 // 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 -0700610 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900611 assertEquals(fullscreenStack, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700612 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900613 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800614 }
615
616 @Test
617 public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindTranslucent() {
Louis Chang2453d062019-11-19 22:30:48 +0800618 mDefaultDisplay.removeStack(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800619
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700620 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800621 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700622 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800623 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
624
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800625 doReturn(false).when(homeStack).isTranslucent(any());
626 doReturn(true).when(fullscreenStack).isTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800627
628 // 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 -0700629 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900630 assertEquals(fullscreenStack, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700631 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900632 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800633 }
634
635 @Test
636 public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeOnTop() {
Louis Chang2453d062019-11-19 22:30:48 +0800637 mDefaultDisplay.removeStack(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800638
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700639 final ActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800640 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700641 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800642 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
643
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800644 doReturn(false).when(homeStack).isTranslucent(any());
645 doReturn(false).when(fullscreenStack).isTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800646
647 // Ensure we don't move the home stack if it is already on top
Winson Chung3e2980e2018-03-29 17:28:57 -0700648 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900649 assertNull(mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700650 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900651 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800652 }
653
654 @Test
655 public void testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreen() {
Louis Chang2453d062019-11-19 22:30:48 +0800656 mDefaultDisplay.removeStack(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800657
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700658 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800659 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700660 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700661 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
662 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700663 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700664 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
665 true /* onTop */);
Wale Ogunwale24116192018-11-07 07:46:56 -0800666 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800667 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
668
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800669 doReturn(false).when(homeStack).isTranslucent(any());
670 doReturn(false).when(fullscreenStack1).isTranslucent(any());
671 doReturn(false).when(fullscreenStack2).isTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800672
673 // Ensure that we move the home stack behind the bottom most fullscreen stack, ignoring the
674 // pinned stack
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900675 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700676 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900677 assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800678 }
679
680 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900681 public void
682 testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreenAndTranslucent() {
Louis Chang2453d062019-11-19 22:30:48 +0800683 mDefaultDisplay.removeStack(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800684
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700685 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800686 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700687 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700688 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
689 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700690 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700691 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
692 true /* onTop */);
Winson Chungd922b6b2018-02-16 16:41:50 -0800693
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800694 doReturn(false).when(homeStack).isTranslucent(any());
695 doReturn(false).when(fullscreenStack1).isTranslucent(any());
696 doReturn(true).when(fullscreenStack2).isTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800697
698 // Ensure that we move the home stack behind the bottom most non-translucent fullscreen
699 // stack
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900700 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700701 mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900702 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800703 }
704
705 @Test
706 public void testMoveHomeStackBehindStack_BehindHomeStack() {
Louis Chang2453d062019-11-19 22:30:48 +0800707 mDefaultDisplay.removeStack(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800708
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700709 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700710 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
711 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700712 final ActivityStack fullscreenStack2 = 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 homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800716 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
717
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800718 doReturn(false).when(homeStack).isTranslucent(any());
719 doReturn(false).when(fullscreenStack1).isTranslucent(any());
720 doReturn(false).when(fullscreenStack2).isTranslucent(any());
Winson Chungd922b6b2018-02-16 16:41:50 -0800721
722 // Ensure we don't move the home stack behind itself
Winson Chung3e2980e2018-03-29 17:28:57 -0700723 int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
724 mDefaultDisplay.moveStackBehindStack(homeStack, homeStack);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900725 assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800726 }
727
728 @Test
729 public void testMoveHomeStackBehindStack() {
Louis Chang2453d062019-11-19 22:30:48 +0800730 mDefaultDisplay.removeStack(mStack);
Winson Chungd922b6b2018-02-16 16:41:50 -0800731
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700732 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700733 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
734 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700735 final ActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700736 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
737 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700738 final ActivityStack fullscreenStack3 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700739 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
740 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700741 final ActivityStack fullscreenStack4 = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700742 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
743 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700744 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Winson Chungd922b6b2018-02-16 16:41:50 -0800745 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
746
Winson Chung3e2980e2018-03-29 17:28:57 -0700747 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack1);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900748 assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700749 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack2);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900750 assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700751 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack4);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900752 assertEquals(fullscreenStack4, mDefaultDisplay.getStackAbove(homeStack));
Winson Chung3e2980e2018-03-29 17:28:57 -0700753 mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack2);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900754 assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
Winson Chungd922b6b2018-02-16 16:41:50 -0800755 }
756
Wale Ogunwalebb285872018-03-01 13:05:30 -0800757 @Test
Kazuki Takisef85197b2018-06-18 18:18:36 +0900758 public void testSetAlwaysOnTop() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700759 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Kazuki Takisef85197b2018-06-18 18:18:36 +0900760 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
761 final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
762 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900763 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(homeStack));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900764
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700765 final ActivityStack alwaysOnTopStack = createStackForShouldBeVisibleTest(
Kazuki Takisef85197b2018-06-18 18:18:36 +0900766 mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD,
767 true /* onTop */);
768 alwaysOnTopStack.setAlwaysOnTop(true);
769 assertTrue(alwaysOnTopStack.isAlwaysOnTop());
770 // Ensure (non-pinned) always on top stack is put below pinned stack.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900771 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900772
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700773 final ActivityStack nonAlwaysOnTopStack = createStackForShouldBeVisibleTest(
Kazuki Takisef85197b2018-06-18 18:18:36 +0900774 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
775 true /* onTop */);
776 // Ensure non always on top stack is put below always on top stacks.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900777 assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(nonAlwaysOnTopStack));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900778
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700779 final ActivityStack alwaysOnTopStack2 = createStackForShouldBeVisibleTest(
Kazuki Takisef85197b2018-06-18 18:18:36 +0900780 mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD,
781 true /* onTop */);
782 alwaysOnTopStack2.setAlwaysOnTop(true);
783 assertTrue(alwaysOnTopStack2.isAlwaysOnTop());
784 // Ensure newly created always on top stack is placed above other all always on top stacks.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900785 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900786
787 alwaysOnTopStack2.setAlwaysOnTop(false);
788 // Ensure, when always on top is turned off for a stack, the stack is put just below all
789 // other always on top stacks.
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900790 assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takise048e2662018-06-27 17:05:11 +0900791 alwaysOnTopStack2.setAlwaysOnTop(true);
792
793 // Ensure always on top state changes properly when windowing mode changes.
794 alwaysOnTopStack2.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
795 assertFalse(alwaysOnTopStack2.isAlwaysOnTop());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900796 assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takise048e2662018-06-27 17:05:11 +0900797 alwaysOnTopStack2.setWindowingMode(WINDOWING_MODE_FREEFORM);
798 assertTrue(alwaysOnTopStack2.isAlwaysOnTop());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900799 assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
Kazuki Takisef85197b2018-06-18 18:18:36 +0900800 }
801
802 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900803 public void testSplitScreenMoveToFront() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700804 final ActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700805 mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD,
806 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700807 final ActivityStack splitScreenSecondary = createStackForShouldBeVisibleTest(
Winson Chung3e2980e2018-03-29 17:28:57 -0700808 mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD,
809 true /* onTop */);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700810 final ActivityStack assistantStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Wale Ogunwalebb285872018-03-01 13:05:30 -0800811 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */);
812
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800813 doReturn(false).when(splitScreenPrimary).isTranslucent(any());
814 doReturn(false).when(splitScreenSecondary).isTranslucent(any());
815 doReturn(false).when(assistantStack).isTranslucent(any());
Wale Ogunwalebb285872018-03-01 13:05:30 -0800816
817 assertFalse(splitScreenPrimary.shouldBeVisible(null /* starting */));
818 assertFalse(splitScreenSecondary.shouldBeVisible(null /* starting */));
819 assertTrue(assistantStack.shouldBeVisible(null /* starting */));
820
821 splitScreenSecondary.moveToFront("testSplitScreenMoveToFront");
822
823 assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
824 assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
825 assertFalse(assistantStack.shouldBeVisible(null /* starting */));
826 }
827
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700828 private ActivityStack createStandardStackForVisibilityTest(int windowingMode,
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800829 boolean translucent) {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700830 final ActivityStack stack = createStackForShouldBeVisibleTest(mDefaultDisplay,
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800831 windowingMode, ACTIVITY_TYPE_STANDARD, true /* onTop */);
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800832 doReturn(translucent).when(stack).isTranslucent(any());
Andrii Kulian0c869cc2019-02-06 19:50:32 -0800833 return stack;
834 }
835
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900836 @SuppressWarnings("TypeParameterUnusedInFormals")
Louis Chang2453d062019-11-19 22:30:48 +0800837 private ActivityStack createStackForShouldBeVisibleTest(
Louis Chang677921f2019-12-06 16:44:24 +0800838 DisplayContent display, int windowingMode, int activityType, boolean onTop) {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700839 final ActivityStack stack;
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700840 if (activityType == ACTIVITY_TYPE_HOME) {
841 // Home stack and activity are created in ActivityTestsBase#setupActivityManagerService
842 stack = mDefaultDisplay.getStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME);
843 if (onTop) {
Louis Chang2453d062019-11-19 22:30:48 +0800844 mDefaultDisplay.positionStackAtTop(stack, false /* includingParents */);
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700845 } else {
Louis Chang2453d062019-11-19 22:30:48 +0800846 mDefaultDisplay.positionStackAtBottom(stack);
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700847 }
848 } else {
Louis Chang149d5c82019-12-30 09:47:39 +0800849 stack = new StackBuilder(mRootWindowContainer)
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700850 .setDisplay(display)
851 .setWindowingMode(windowingMode)
852 .setActivityType(activityType)
853 .setOnTop(onTop)
854 .setCreateActivity(true)
855 .build();
Andrii Kulian6a6c4f12018-07-16 21:23:33 -0700856 }
Louis Chang2453d062019-11-19 22:30:48 +0800857 return stack;
Wale Ogunwale7e1f5f52017-10-18 15:19:59 -0700858 }
Bryce Leeb0f993f2018-03-02 15:38:01 -0800859
860 @Test
Riddle Hsuaaef7312019-01-24 19:00:58 +0800861 public void testFinishDisabledPackageActivities_FinishAliveActivities() {
Bryce Leefbd263b42018-03-07 10:33:55 -0800862 final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
863 final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
Riddle Hsuaaef7312019-01-24 19:00:58 +0800864 firstActivity.setState(STOPPED, "testFinishDisabledPackageActivities");
865 secondActivity.setState(RESUMED, "testFinishDisabledPackageActivities");
866 mStack.mResumedActivity = secondActivity;
Bryce Leefbd263b42018-03-07 10:33:55 -0800867
Riddle Hsuaaef7312019-01-24 19:00:58 +0800868 // Note the activities have non-null ActivityRecord.app, so it won't remove directly.
Louis Chang149d5c82019-12-30 09:47:39 +0800869 mRootWindowContainer.mFinishDisabledPackageActivitiesHelper.process(
Wale Ogunwalea38654f2019-11-17 20:37:15 -0800870 firstActivity.packageName, null /* filterByClasses */, true /* doit */,
871 true /* evenPersistent */, UserHandle.USER_ALL);
Riddle Hsuaaef7312019-01-24 19:00:58 +0800872
873 // If the activity is disabled with {@link android.content.pm.PackageManager#DONT_KILL_APP}
874 // the activity should still follow the normal flow to finish and destroy.
875 assertThat(firstActivity.getState()).isEqualTo(DESTROYING);
876 assertThat(secondActivity.getState()).isEqualTo(PAUSING);
877 assertTrue(secondActivity.finishing);
878 }
879
880 @Test
881 public void testFinishDisabledPackageActivities_RemoveNonAliveActivities() {
882 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
883
884 // The overlay activity is not in the disabled package but it is in the same task.
885 final ActivityRecord overlayActivity = new ActivityBuilder(mService).setTask(mTask)
886 .setComponent(new ComponentName("package.overlay", ".OverlayActivity")).build();
887 // If the task only remains overlay activity, the task should also be removed.
Andrii Kulian79d67982019-08-19 11:56:16 -0700888 // See {@link ActivityStack#removeFromHistory}.
Wale Ogunwale0b3d2922019-12-30 08:55:07 -0800889 overlayActivity.setTaskOverlay(true);
Riddle Hsuaaef7312019-01-24 19:00:58 +0800890
891 // The activity without an app means it will be removed immediately.
892 // See {@link ActivityStack#destroyActivityLocked}.
893 activity.app = null;
894 overlayActivity.app = null;
Bryce Leefbd263b42018-03-07 10:33:55 -0800895
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200896 assertEquals(2, mTask.getChildCount());
Bryce Leefbd263b42018-03-07 10:33:55 -0800897
Louis Chang149d5c82019-12-30 09:47:39 +0800898 mRootWindowContainer.mFinishDisabledPackageActivitiesHelper.process(
Wale Ogunwalea38654f2019-11-17 20:37:15 -0800899 activity.packageName, null /* filterByClasses */, true /* doit */,
900 true /* evenPersistent */, UserHandle.USER_ALL);
Bryce Leefbd263b42018-03-07 10:33:55 -0800901
Riddle Hsuaaef7312019-01-24 19:00:58 +0800902 // Although the overlay activity is in another package, the non-overlay activities are
903 // removed from the task. Since the overlay activity should be removed as well, the task
904 // should be empty.
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200905 assertFalse(mTask.hasChild());
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900906 assertFalse(mStack.hasChild());
Bryce Leefbd263b42018-03-07 10:33:55 -0800907 }
908
909 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900910 public void testHandleAppDied() {
Bryce Leefbd263b42018-03-07 10:33:55 -0800911 final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
912 final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
913
914 // Making the first activity a task overlay means it will be removed from the task's
915 // activities as well once second activity is removed as handleAppDied processes the
916 // activity list in reverse.
Wale Ogunwale0b3d2922019-12-30 08:55:07 -0800917 firstActivity.setTaskOverlay(true);
Bryce Leefbd263b42018-03-07 10:33:55 -0800918 firstActivity.app = null;
919
920 // second activity will be immediately removed as it has no state.
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700921 secondActivity.setSavedState(null /* savedState */);
Bryce Leefbd263b42018-03-07 10:33:55 -0800922
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200923 assertEquals(2, mTask.getChildCount());
Bryce Leefbd263b42018-03-07 10:33:55 -0800924
Louis Chang149d5c82019-12-30 09:47:39 +0800925 mRootWindowContainer.handleAppDied(secondActivity.app);
Bryce Leefbd263b42018-03-07 10:33:55 -0800926
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200927 assertFalse(mTask.hasChild());
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900928 assertFalse(mStack.hasChild());
Bryce Leefbd263b42018-03-07 10:33:55 -0800929 }
Bryce Lee271617a2018-03-15 10:39:12 -0700930
931 @Test
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800932 public void testHandleAppDied_RelaunchesAfterCrashDuringWindowingModeResize() {
933 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
934
935 activity.mRelaunchReason = RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
936 activity.launchCount = 1;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700937 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800938
Louis Chang149d5c82019-12-30 09:47:39 +0800939 mRootWindowContainer.handleAppDied(activity.app);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800940
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200941 assertEquals(1, mTask.getChildCount());
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900942 assertEquals(1, mStack.getChildCount());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800943 }
944
945 @Test
946 public void testHandleAppDied_NotRelaunchAfterThreeCrashesDuringWindowingModeResize() {
947 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
948
949 activity.mRelaunchReason = RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
950 activity.launchCount = 3;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700951 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800952
Louis Chang149d5c82019-12-30 09:47:39 +0800953 mRootWindowContainer.handleAppDied(activity.app);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800954
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200955 assertFalse(mTask.hasChild());
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900956 assertFalse(mStack.hasChild());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800957 }
958
959 @Test
960 public void testHandleAppDied_RelaunchesAfterCrashDuringFreeResize() {
961 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
962
963 activity.mRelaunchReason = RELAUNCH_REASON_FREE_RESIZE;
964 activity.launchCount = 1;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700965 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800966
Louis Chang149d5c82019-12-30 09:47:39 +0800967 mRootWindowContainer.handleAppDied(activity.app);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800968
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200969 assertEquals(1, mTask.getChildCount());
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900970 assertEquals(1, mStack.getChildCount());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800971 }
972
973 @Test
974 public void testHandleAppDied_NotRelaunchAfterThreeCrashesDuringFreeResize() {
975 final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
976
977 activity.mRelaunchReason = RELAUNCH_REASON_FREE_RESIZE;
978 activity.launchCount = 3;
Andrii Kulian06b8dcb2019-07-10 21:09:38 -0700979 activity.setSavedState(null /* savedState */);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800980
Louis Chang149d5c82019-12-30 09:47:39 +0800981 mRootWindowContainer.handleAppDied(activity.app);
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800982
Wale Ogunwale1a06f152019-10-11 11:26:30 +0200983 assertFalse(mTask.hasChild());
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900984 assertFalse(mStack.hasChild());
Garfield Tanf6cc5c92019-01-15 13:54:12 -0800985 }
986
987 @Test
Louis Chang7b03ad92019-08-21 12:32:33 +0800988 public void testCompletePauseOnResumeWhilePausingActivity() {
989 final ActivityRecord bottomActivity = new ActivityBuilder(mService).setTask(mTask).build();
990 doReturn(true).when(bottomActivity).attachedToProcess();
991 mStack.mPausingActivity = null;
992 mStack.mResumedActivity = bottomActivity;
993 final ActivityRecord topActivity = new ActivityBuilder(mService).setTask(mTask).build();
994 topActivity.info.flags |= FLAG_RESUME_WHILE_PAUSING;
995
996 mStack.startPausingLocked(false /* userLeaving */, false /* uiSleeping */, topActivity);
997 verify(mStack).completePauseLocked(anyBoolean(), eq(topActivity));
998 }
999
1000 @Test
wilsonshih8824a8a2019-03-12 17:21:35 +08001001 public void testWontFinishHomeStackImmediately() {
1002 final ActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
1003 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
1004
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09001005 ActivityRecord activity = homeStack.topRunningActivity();
Wale Ogunwale8a1860a2019-06-05 08:57:19 -07001006 if (activity == null) {
1007 activity = new ActivityBuilder(mService)
1008 .setStack(homeStack)
1009 .setCreateTask(true)
1010 .build();
1011 }
1012
wilsonshih8824a8a2019-03-12 17:21:35 +08001013 // Home stack should not be destroyed immediately.
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001014 final ActivityRecord activity1 = finishTopActivity(homeStack);
wilsonshih8824a8a2019-03-12 17:21:35 +08001015 assertEquals(FINISHING, activity1.getState());
1016 }
1017
1018 @Test
Riddle Hsue10cea52018-10-16 23:33:23 +08001019 public void testFinishCurrentActivity() {
1020 // Create 2 activities on a new display.
Louis Chang677921f2019-12-06 16:44:24 +08001021 final DisplayContent display = addNewDisplayContentAt(DisplayContent.POSITION_TOP);
Riddle Hsue10cea52018-10-16 23:33:23 +08001022 final ActivityStack stack1 = createStackForShouldBeVisibleTest(display,
1023 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
1024 final ActivityStack stack2 = createStackForShouldBeVisibleTest(display,
1025 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
1026
1027 // There is still an activity1 in stack1 so the activity2 should be added to finishing list
1028 // that will be destroyed until idle.
Issei Suzuki1669ea42019-11-06 14:20:59 +01001029 stack2.getTopNonFinishingActivity().mVisibleRequested = true;
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001030 final ActivityRecord activity2 = finishTopActivity(stack2);
Louis Changf2835df2018-10-17 15:14:45 +08001031 assertEquals(STOPPING, activity2.getState());
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001032 assertThat(mSupervisor.mStoppingActivities).contains(activity2);
Riddle Hsue10cea52018-10-16 23:33:23 +08001033
1034 // The display becomes empty. Since there is no next activity to be idle, the activity
1035 // should be destroyed immediately with updating configuration to restore original state.
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001036 final ActivityRecord activity1 = finishTopActivity(stack1);
Riddle Hsue10cea52018-10-16 23:33:23 +08001037 assertEquals(DESTROYING, activity1.getState());
Louis Chang149d5c82019-12-30 09:47:39 +08001038 verify(mRootWindowContainer).ensureVisibilityAndConfig(eq(null) /* starting */,
Riddle Hsue10cea52018-10-16 23:33:23 +08001039 eq(display.mDisplayId), anyBoolean(), anyBoolean());
1040 }
1041
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001042 private ActivityRecord finishTopActivity(ActivityStack stack) {
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09001043 final ActivityRecord activity = stack.topRunningActivity();
Riddle Hsue10cea52018-10-16 23:33:23 +08001044 assertNotNull(activity);
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001045 activity.setState(STOPPED, "finishTopActivity");
Riddle Hsue10cea52018-10-16 23:33:23 +08001046 activity.makeFinishingLocked();
Andrii Kulian7dd39bb2019-07-22 13:11:10 -07001047 activity.completeFinishing("finishTopActivity");
Riddle Hsue10cea52018-10-16 23:33:23 +08001048 return activity;
1049 }
1050
1051 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001052 public void testShouldSleepActivities() {
Bryce Lee271617a2018-03-15 10:39:12 -07001053 // When focused activity and keyguard is going away, we should not sleep regardless
1054 // of the display state
1055 verifyShouldSleepActivities(true /* focusedStack */, true /*keyguardGoingAway*/,
1056 true /* displaySleeping */, false /* expected*/);
1057
1058 // When not the focused stack, defer to display sleeping state.
1059 verifyShouldSleepActivities(false /* focusedStack */, true /*keyguardGoingAway*/,
1060 true /* displaySleeping */, true /* expected*/);
1061
1062 // If keyguard is going away, defer to the display sleeping state.
1063 verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/,
1064 true /* displaySleeping */, true /* expected*/);
1065 verifyShouldSleepActivities(true /* focusedStack */, false /*keyguardGoingAway*/,
1066 false /* displaySleeping */, false /* expected*/);
1067 }
1068
Winson Chung0f7ec962018-05-03 18:03:15 -07001069 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001070 public void testStackOrderChangedOnRemoveStack() {
Winson Chung0f7ec962018-05-03 18:03:15 -07001071 StackOrderChangedListener listener = new StackOrderChangedListener();
1072 mDefaultDisplay.registerStackOrderChangedListener(listener);
1073 try {
Louis Chang2453d062019-11-19 22:30:48 +08001074 mDefaultDisplay.removeStack(mStack);
Winson Chung0f7ec962018-05-03 18:03:15 -07001075 } finally {
1076 mDefaultDisplay.unregisterStackOrderChangedListener(listener);
1077 }
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001078 assertTrue(listener.mChanged);
Winson Chung0f7ec962018-05-03 18:03:15 -07001079 }
1080
1081 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001082 public void testStackOrderChangedOnAddPositionStack() {
Louis Chang2453d062019-11-19 22:30:48 +08001083 mDefaultDisplay.removeStack(mStack);
Winson Chung0f7ec962018-05-03 18:03:15 -07001084
1085 StackOrderChangedListener listener = new StackOrderChangedListener();
1086 mDefaultDisplay.registerStackOrderChangedListener(listener);
1087 try {
Louis Chang677921f2019-12-06 16:44:24 +08001088 mStack.mReparenting = true;
Louis Chang2453d062019-11-19 22:30:48 +08001089 mDefaultDisplay.addStack(mStack, 0);
Winson Chung0f7ec962018-05-03 18:03:15 -07001090 } finally {
1091 mDefaultDisplay.unregisterStackOrderChangedListener(listener);
1092 }
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001093 assertTrue(listener.mChanged);
Winson Chung0f7ec962018-05-03 18:03:15 -07001094 }
1095
1096 @Test
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001097 public void testStackOrderChangedOnPositionStack() {
Winson Chung0f7ec962018-05-03 18:03:15 -07001098 StackOrderChangedListener listener = new StackOrderChangedListener();
1099 try {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -07001100 final ActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
Winson Chung0f7ec962018-05-03 18:03:15 -07001101 mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
1102 true /* onTop */);
1103 mDefaultDisplay.registerStackOrderChangedListener(listener);
Louis Chang2453d062019-11-19 22:30:48 +08001104 mDefaultDisplay.positionStackAtBottom(fullscreenStack1);
Winson Chung0f7ec962018-05-03 18:03:15 -07001105 } finally {
1106 mDefaultDisplay.unregisterStackOrderChangedListener(listener);
1107 }
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001108 assertTrue(listener.mChanged);
Winson Chung0f7ec962018-05-03 18:03:15 -07001109 }
1110
Louis Changf7f7f9c2019-06-18 16:47:51 +08001111 @Test
1112 public void testResetTaskWithFinishingActivities() {
1113 final ActivityRecord taskTop =
1114 new ActivityBuilder(mService).setStack(mStack).setCreateTask(true).build();
Louis Changcdec0802019-11-11 11:45:07 +08001115 // Make all activities in the task are finishing to simulate Task#getTopActivity
Louis Changf7f7f9c2019-06-18 16:47:51 +08001116 // returns null.
1117 taskTop.finishing = true;
1118
1119 final ActivityRecord newR = new ActivityBuilder(mService).build();
Wale Ogunwaledfbeed72019-11-20 08:57:39 -08001120 final ActivityRecord result = mStack.resetTaskIfNeeded(taskTop, newR);
Louis Changf7f7f9c2019-06-18 16:47:51 +08001121 assertThat(result).isEqualTo(taskTop);
1122 }
1123
Louis Changcfe46212019-07-30 10:34:18 +08001124 @Test
Riddle Hsu13c27ae2019-10-05 23:10:15 +08001125 public void testClearUnknownAppVisibilityBehindFullscreenActivity() {
1126 final UnknownAppVisibilityController unknownAppVisibilityController =
1127 mDefaultDisplay.mDisplayContent.mUnknownAppVisibilityController;
1128 final KeyguardController keyguardController = mSupervisor.getKeyguardController();
1129 doReturn(true).when(keyguardController).isKeyguardLocked();
1130
1131 // Start 2 activities that their processes have not yet started.
1132 final ActivityRecord[] activities = new ActivityRecord[2];
1133 mSupervisor.beginDeferResume();
1134 for (int i = 0; i < activities.length; i++) {
1135 final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
1136 activities[i] = r;
1137 doReturn(null).when(mService).getProcessController(
1138 eq(r.processName), eq(r.info.applicationInfo.uid));
1139 r.setState(ActivityStack.ActivityState.INITIALIZING, "test");
1140 // Ensure precondition that the activity is opaque.
1141 assertTrue(r.occludesParent());
Wale Ogunwale076c3b12019-11-20 12:17:22 -08001142 mSupervisor.startSpecificActivity(r, false /* andResume */,
Riddle Hsu13c27ae2019-10-05 23:10:15 +08001143 false /* checkConfig */);
1144 }
1145 mSupervisor.endDeferResume();
1146
1147 doReturn(false).when(mService).isBooting();
1148 doReturn(true).when(mService).isBooted();
1149 // 2 activities are started while keyguard is locked, so they are waiting to be resolved.
1150 assertFalse(unknownAppVisibilityController.allResolved());
1151
1152 // Assume the top activity is going to resume and
Louis Chang149d5c82019-12-30 09:47:39 +08001153 // {@link RootWindowContainer#cancelInitializingActivities} should clear the unknown
Riddle Hsu13c27ae2019-10-05 23:10:15 +08001154 // visibility records that are occluded.
1155 mStack.resumeTopActivityUncheckedLocked(null /* prev */, null /* options */);
1156 // Assume the top activity relayouted, just remove it directly.
1157 unknownAppVisibilityController.appRemovedOrHidden(activities[1]);
1158 // All unresolved records should be removed.
1159 assertTrue(unknownAppVisibilityController.allResolved());
1160 }
1161
1162 @Test
Louis Changcfe46212019-07-30 10:34:18 +08001163 public void testNonTopVisibleActivityNotResume() {
1164 final ActivityRecord nonTopVisibleActivity =
1165 new ActivityBuilder(mService).setTask(mTask).build();
1166 new ActivityBuilder(mService).setTask(mTask).build();
1167 doReturn(false).when(nonTopVisibleActivity).attachedToProcess();
Riddle Hsu13c27ae2019-10-05 23:10:15 +08001168 doReturn(true).when(nonTopVisibleActivity).shouldBeVisible(anyBoolean(), anyBoolean());
Wale Ogunwale076c3b12019-11-20 12:17:22 -08001169 doNothing().when(mSupervisor).startSpecificActivity(any(), anyBoolean(),
Louis Changcfe46212019-07-30 10:34:18 +08001170 anyBoolean());
1171
Wale Ogunwale076c3b12019-11-20 12:17:22 -08001172 mStack.ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
Louis Changcfe46212019-07-30 10:34:18 +08001173 false /* preserveWindows */);
Wale Ogunwale076c3b12019-11-20 12:17:22 -08001174 verify(mSupervisor).startSpecificActivity(any(), eq(false) /* andResume */,
Louis Changcfe46212019-07-30 10:34:18 +08001175 anyBoolean());
1176 }
1177
Bryce Lee271617a2018-03-15 10:39:12 -07001178 private void verifyShouldSleepActivities(boolean focusedStack,
1179 boolean keyguardGoingAway, boolean displaySleeping, boolean expected) {
Louis Chang677921f2019-12-06 16:44:24 +08001180 final DisplayContent display = mock(DisplayContent.class);
Bryce Lee271617a2018-03-15 10:39:12 -07001181 final KeyguardController keyguardController = mSupervisor.getKeyguardController();
1182
Louis Chang677921f2019-12-06 16:44:24 +08001183 doReturn(display).when(mStack).getDisplay();
Bryce Lee271617a2018-03-15 10:39:12 -07001184 doReturn(keyguardGoingAway).when(keyguardController).isKeyguardGoingAway();
1185 doReturn(displaySleeping).when(display).isSleeping();
Tiger Huang1e5b10a2018-07-30 20:19:51 +08001186 doReturn(focusedStack).when(mStack).isFocusedStackOnDisplay();
Bryce Lee271617a2018-03-15 10:39:12 -07001187
1188 assertEquals(expected, mStack.shouldSleepActivities());
1189 }
Winson Chung0f7ec962018-05-03 18:03:15 -07001190
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001191 private static class StackOrderChangedListener
Louis Chang677921f2019-12-06 16:44:24 +08001192 implements DisplayContent.OnStackOrderChangedListener {
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001193 public boolean mChanged = false;
Winson Chung0f7ec962018-05-03 18:03:15 -07001194
1195 @Override
Winson Chung65d66d32018-12-13 17:48:39 -08001196 public void onStackOrderChanged(ActivityStack stack) {
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09001197 mChanged = true;
Winson Chung0f7ec962018-05-03 18:03:15 -07001198 }
1199 }
Bryce Lee840c5662017-04-13 10:02:51 -07001200}