blob: 75226b7e66f77acb23b1d9b991c6ef753705c11e [file] [log] [blame]
Daichi Hirono34fb7312017-12-04 10:00:24 +09001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070014 * limitations under the License.
Daichi Hirono34fb7312017-12-04 10:00:24 +090015 */
16
17package com.android.server.wm;
18
Shivam Agrawal780b5bb2019-07-17 10:17:11 -070019import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
20import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
Daichi Hirono34fb7312017-12-04 10:00:24 +090021import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
Brett Chabota26eda92018-07-23 13:08:30 -070022
Arthur Hungfd9d94d2019-08-28 16:06:07 +080023import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
Tadashi G. Takaokad7aa79a2019-02-08 17:42:37 +090024import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
25import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090026import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
27import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
28
Daichi Hirono34fb7312017-12-04 10:00:24 +090029import static org.junit.Assert.assertFalse;
30import static org.junit.Assert.assertNotNull;
31import static org.junit.Assert.assertNull;
32import static org.junit.Assert.assertTrue;
Daichi Hirono34fb7312017-12-04 10:00:24 +090033
34import android.platform.test.annotations.Presubmit;
Daichi Hirono34fb7312017-12-04 10:00:24 +090035import android.view.InputChannel;
Brett Chabota26eda92018-07-23 13:08:30 -070036
yj81.kwon19585ff2019-04-23 18:53:57 -070037import androidx.test.filters.FlakyTest;
Brett Chabota26eda92018-07-23 13:08:30 -070038import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070039
Daichi Hirono34fb7312017-12-04 10:00:24 +090040import org.junit.Before;
41import org.junit.Test;
Riddle Hsu73f53572019-09-23 23:13:01 +080042import org.junit.runner.RunWith;
Daichi Hironoce2f97a2017-11-30 16:44:15 +090043
Daichi Hirono34fb7312017-12-04 10:00:24 +090044/**
45 * Tests for the {@link TaskPositioningController} class.
46 *
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070047 * Build/Install/Run:
yj81.kwon19585ff2019-04-23 18:53:57 -070048 * atest WmTests:TaskPositioningControllerTests
Daichi Hirono34fb7312017-12-04 10:00:24 +090049 */
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070050@SmallTest
Daichi Hirono34fb7312017-12-04 10:00:24 +090051@Presubmit
Riddle Hsu73f53572019-09-23 23:13:01 +080052@RunWith(WindowTestRunner.class)
Daichi Hirono34fb7312017-12-04 10:00:24 +090053public class TaskPositioningControllerTests extends WindowTestsBase {
54 private static final int TIMEOUT_MS = 1000;
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070055
Daichi Hirono34fb7312017-12-04 10:00:24 +090056 private TaskPositioningController mTarget;
57 private WindowState mWindow;
58
59 @Before
60 public void setUp() throws Exception {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070061 assertNotNull(mWm.mTaskPositioningController);
62 mTarget = mWm.mTaskPositioningController;
Daichi Hirono34fb7312017-12-04 10:00:24 +090063
Arthur Hungfd9d94d2019-08-28 16:06:07 +080064 when(mWm.mInputManager.transferTouchFocus(
65 any(InputChannel.class),
66 any(InputChannel.class))).thenReturn(true);
67
Daichi Hirono34fb7312017-12-04 10:00:24 +090068 mWindow = createWindow(null, TYPE_BASE_APPLICATION, "window");
Louis Changcdec0802019-11-11 11:45:07 +080069 mWindow.getTask().setResizeMode(RESIZE_MODE_RESIZEABLE);
Daichi Hirono34fb7312017-12-04 10:00:24 +090070 mWindow.mInputChannel = new InputChannel();
Riddle Hsu73f53572019-09-23 23:13:01 +080071 mWm.mWindowMap.put(mWindow.mClient.asBinder(), mWindow);
72 doReturn(mock(InputMonitor.class)).when(mDisplayContent).getInputMonitor();
Daichi Hirono34fb7312017-12-04 10:00:24 +090073 }
74
75 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070076 public void testStartAndFinishPositioning() {
Riddle Hsu73f53572019-09-23 23:13:01 +080077 assertFalse(mTarget.isPositioningLocked());
78 assertNull(mTarget.getDragWindowHandleLocked());
Daichi Hirono34fb7312017-12-04 10:00:24 +090079
80 assertTrue(mTarget.startMovingTask(mWindow.mClient, 0, 0));
81
Riddle Hsu73f53572019-09-23 23:13:01 +080082 assertTrue(mTarget.isPositioningLocked());
83 assertNotNull(mTarget.getDragWindowHandleLocked());
Daichi Hirono34fb7312017-12-04 10:00:24 +090084
Daichi Hironoce2f97a2017-11-30 16:44:15 +090085 mTarget.finishTaskPositioning();
86 // Wait until the looper processes finishTaskPositioning.
Tiger Huang4e7c9bb2020-01-07 14:41:45 +080087 assertTrue(waitHandlerIdle(mWm.mAnimationHandler, TIMEOUT_MS));
Daichi Hirono34fb7312017-12-04 10:00:24 +090088
89 assertFalse(mTarget.isPositioningLocked());
90 assertNull(mTarget.getDragWindowHandleLocked());
91 }
92
yj81.kwon19585ff2019-04-23 18:53:57 -070093 @Test
94 public void testFinishPositioningWhenAppRequested() {
Riddle Hsu73f53572019-09-23 23:13:01 +080095 assertFalse(mTarget.isPositioningLocked());
96 assertNull(mTarget.getDragWindowHandleLocked());
yj81.kwon19585ff2019-04-23 18:53:57 -070097
98 assertTrue(mTarget.startMovingTask(mWindow.mClient, 0, 0));
99
Riddle Hsu73f53572019-09-23 23:13:01 +0800100 assertTrue(mTarget.isPositioningLocked());
101 assertNotNull(mTarget.getDragWindowHandleLocked());
yj81.kwon19585ff2019-04-23 18:53:57 -0700102
103 mTarget.finishTaskPositioning(mWindow.mClient);
104 // Wait until the looper processes finishTaskPositioning.
Tiger Huang4e7c9bb2020-01-07 14:41:45 +0800105 assertTrue(waitHandlerIdle(mWm.mAnimationHandler, TIMEOUT_MS));
yj81.kwon19585ff2019-04-23 18:53:57 -0700106
107 assertFalse(mTarget.isPositioningLocked());
108 assertNull(mTarget.getDragWindowHandleLocked());
109 }
110
Daichi Hirono34fb7312017-12-04 10:00:24 +0900111 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700112 public void testHandleTapOutsideTask() {
Riddle Hsu73f53572019-09-23 23:13:01 +0800113 assertFalse(mTarget.isPositioningLocked());
114 assertNull(mTarget.getDragWindowHandleLocked());
Daichi Hirono34fb7312017-12-04 10:00:24 +0900115
116 final DisplayContent content = mock(DisplayContent.class);
Wale Ogunwaleda8b8272018-11-29 19:37:37 -0800117 doReturn(mWindow.getTask()).when(content).findTaskForResizePoint(anyInt(), anyInt());
Daichi Hirono34fb7312017-12-04 10:00:24 +0900118 assertNotNull(mWindow.getTask().getTopVisibleAppMainWindow());
119
120 mTarget.handleTapOutsideTask(content, 0, 0);
Tiger Huang4e7c9bb2020-01-07 14:41:45 +0800121 // Wait until the looper processes handleTapOutsideTask.
Riddle Hsu73f53572019-09-23 23:13:01 +0800122 assertTrue(waitHandlerIdle(mWm.mH, TIMEOUT_MS));
Daichi Hirono34fb7312017-12-04 10:00:24 +0900123
Riddle Hsu73f53572019-09-23 23:13:01 +0800124 assertTrue(mTarget.isPositioningLocked());
125 assertNotNull(mTarget.getDragWindowHandleLocked());
Daichi Hirono34fb7312017-12-04 10:00:24 +0900126
Daichi Hironoce2f97a2017-11-30 16:44:15 +0900127 mTarget.finishTaskPositioning();
128 // Wait until the looper processes finishTaskPositioning.
Tiger Huang4e7c9bb2020-01-07 14:41:45 +0800129 assertTrue(waitHandlerIdle(mWm.mAnimationHandler, TIMEOUT_MS));
Daichi Hirono34fb7312017-12-04 10:00:24 +0900130
131 assertFalse(mTarget.isPositioningLocked());
132 assertNull(mTarget.getDragWindowHandleLocked());
133 }
Shivam Agrawal780b5bb2019-07-17 10:17:11 -0700134
135 @Test
136 public void testHandleTapOutsideNonResizableTask() {
137 assertFalse(mTarget.isPositioningLocked());
138 assertNull(mTarget.getDragWindowHandleLocked());
139
140 final DisplayContent content = mock(DisplayContent.class);
141 doReturn(mWindow.getTask()).when(content).findTaskForResizePoint(anyInt(), anyInt());
142 assertNotNull(mWindow.getTask().getTopVisibleAppMainWindow());
143
Louis Changcdec0802019-11-11 11:45:07 +0800144 mWindow.getTask().setResizeMode(RESIZE_MODE_UNRESIZEABLE);
Shivam Agrawal780b5bb2019-07-17 10:17:11 -0700145
146 mTarget.handleTapOutsideTask(content, 0, 0);
Tiger Huang4e7c9bb2020-01-07 14:41:45 +0800147 // Wait until the looper processes handleTapOutsideTask.
Shivam Agrawal780b5bb2019-07-17 10:17:11 -0700148 assertTrue(waitHandlerIdle(mWm.mH, TIMEOUT_MS));
149
150 assertFalse(mTarget.isPositioningLocked());
151 }
152
Daichi Hirono34fb7312017-12-04 10:00:24 +0900153}