blob: dae1052286f7a3c53947cef22a94266b3fa41648 [file] [log] [blame]
Andrii Kulian40eda672019-07-30 15:05:57 -07001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.wm;
18
Evan Rosky282ee672019-11-13 15:50:46 -080019import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
Evan Roskyddedfd42019-10-04 13:38:38 -070020import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
21
Andrii Kulian40eda672019-07-30 15:05:57 -070022import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
23
Evan Roskyddedfd42019-10-04 13:38:38 -070024import static org.junit.Assert.assertEquals;
Andrii Kulian40eda672019-07-30 15:05:57 -070025import static org.junit.Assert.assertTrue;
26
27import android.app.Activity;
Evan Rosky282ee672019-11-13 15:50:46 -080028import android.app.ActivityManager;
Evan Rosky82207082019-10-08 17:28:29 -070029import android.content.res.Configuration;
Evan Roskyddedfd42019-10-04 13:38:38 -070030import android.graphics.Rect;
Evan Rosky82207082019-10-08 17:28:29 -070031import android.view.IDisplayWindowListener;
Evan Roskyddedfd42019-10-04 13:38:38 -070032import android.view.WindowContainerTransaction;
Andrii Kulian40eda672019-07-30 15:05:57 -070033
34import androidx.test.filters.MediumTest;
35
36import org.junit.Before;
37import org.junit.Test;
Riddle Hsu73f53572019-09-23 23:13:01 +080038import org.junit.runner.RunWith;
Andrii Kulian40eda672019-07-30 15:05:57 -070039
Evan Rosky82207082019-10-08 17:28:29 -070040import java.util.ArrayList;
41
Andrii Kulian40eda672019-07-30 15:05:57 -070042/**
43 * Tests for the {@link ActivityTaskManagerService} class.
44 *
45 * Build/Install/Run:
46 * atest WmTests:ActivityTaskManagerServiceTests
47 */
48@MediumTest
Riddle Hsu73f53572019-09-23 23:13:01 +080049@RunWith(WindowTestRunner.class)
Andrii Kulian40eda672019-07-30 15:05:57 -070050public class ActivityTaskManagerServiceTests extends ActivityTestsBase {
51
52 @Before
53 public void setUp() throws Exception {
54 doReturn(false).when(mService).isBooting();
55 doReturn(true).when(mService).isBooted();
56 }
57
58 /** Verify that activity is finished correctly upon request. */
59 @Test
60 public void testActivityFinish() {
Wale Ogunwale8a1860a2019-06-05 08:57:19 -070061 final ActivityStack stack = new StackBuilder(mRootActivityContainer).build();
Wale Ogunwale21e06482019-11-18 05:14:15 -080062 final ActivityRecord activity = stack.getChildAt(0).getTopNonFinishingActivity();
Andrii Kulian40eda672019-07-30 15:05:57 -070063 assertTrue("Activity must be finished", mService.finishActivity(activity.appToken,
64 0 /* resultCode */, null /* resultData */,
65 Activity.DONT_FINISH_TASK_WITH_ACTIVITY));
66 assertTrue(activity.finishing);
67
68 assertTrue("Duplicate activity finish request must also return 'true'",
69 mService.finishActivity(activity.appToken, 0 /* resultCode */,
70 null /* resultData */, Activity.DONT_FINISH_TASK_WITH_ACTIVITY));
71 }
Evan Roskyddedfd42019-10-04 13:38:38 -070072
73 @Test
74 public void testTaskTransaction() {
75 removeGlobalMinSizeRestriction();
76 final ActivityStack stack = new StackBuilder(mRootActivityContainer)
77 .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
Louis Changcdec0802019-11-11 11:45:07 +080078 final Task task = stack.topTask();
Evan Roskyddedfd42019-10-04 13:38:38 -070079 WindowContainerTransaction t = new WindowContainerTransaction();
80 Rect newBounds = new Rect(10, 10, 100, 100);
81 t.setBounds(task.mRemoteToken, new Rect(10, 10, 100, 100));
82 mService.applyContainerTransaction(t);
83 assertEquals(newBounds, task.getBounds());
84 }
Evan Rosky282ee672019-11-13 15:50:46 -080085
86 @Test
87 public void testStackTransaction() {
88 removeGlobalMinSizeRestriction();
89 final ActivityStack stack = new StackBuilder(mRootActivityContainer)
90 .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
91 ActivityManager.StackInfo info =
92 mService.getStackInfo(WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD);
93 WindowContainerTransaction t = new WindowContainerTransaction();
94 assertEquals(stack.mRemoteToken, info.stackToken);
95 Rect newBounds = new Rect(10, 10, 100, 100);
96 t.setBounds(info.stackToken, new Rect(10, 10, 100, 100));
97 mService.applyContainerTransaction(t);
98 assertEquals(newBounds, stack.getBounds());
99 }
Evan Rosky82207082019-10-08 17:28:29 -0700100
101 @Test
102 public void testDisplayWindowListener() {
103 final ArrayList<Integer> added = new ArrayList<>();
104 final ArrayList<Integer> changed = new ArrayList<>();
105 final ArrayList<Integer> removed = new ArrayList<>();
106 IDisplayWindowListener listener = new IDisplayWindowListener.Stub() {
107 @Override
108 public void onDisplayAdded(int displayId) {
109 added.add(displayId);
110 }
111
112 @Override
113 public void onDisplayConfigurationChanged(int displayId, Configuration newConfig) {
114 changed.add(displayId);
115 }
116
117 @Override
118 public void onDisplayRemoved(int displayId) {
119 removed.add(displayId);
120 }
121 };
122 mService.mWindowManager.registerDisplayWindowListener(listener);
123 // Check that existing displays call added
124 assertEquals(1, added.size());
125 assertEquals(0, changed.size());
126 assertEquals(0, removed.size());
127 added.clear();
128 // Check adding a display
129 ActivityDisplay newDisp1 = new TestActivityDisplay.Builder(mService, 600, 800).build();
130 assertEquals(1, added.size());
131 assertEquals(0, changed.size());
132 assertEquals(0, removed.size());
133 added.clear();
134 // Check that changes are reported
135 Configuration c = new Configuration(newDisp1.getRequestedOverrideConfiguration());
136 c.windowConfiguration.setBounds(new Rect(0, 0, 1000, 1300));
137 newDisp1.onRequestedOverrideConfigurationChanged(c);
138 mService.mRootActivityContainer.ensureVisibilityAndConfig(null /* starting */,
139 newDisp1.mDisplayId, false /* markFrozenIfConfigChanged */,
140 false /* deferResume */);
141 assertEquals(0, added.size());
142 assertEquals(1, changed.size());
143 assertEquals(0, removed.size());
144 changed.clear();
145 // Check that removal is reported
146 newDisp1.remove();
147 assertEquals(0, added.size());
148 assertEquals(0, changed.size());
149 assertEquals(1, removed.size());
150 }
Andrii Kulian40eda672019-07-30 15:05:57 -0700151}
152