blob: eb351b63a469af6af22121439f665ec219c3e476 [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
19import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
Brett Chabota26eda92018-07-23 13:08:30 -070020
Arthur Hungfd9d94d2019-08-28 16:06:07 +080021import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
Tadashi G. Takaokad7aa79a2019-02-08 17:42:37 +090022import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
23import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090024import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
chaviw33a82e22018-12-19 10:49:38 -080025import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090026import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
27
Daichi Hirono34fb7312017-12-04 10:00:24 +090028import static org.junit.Assert.assertFalse;
29import static org.junit.Assert.assertNotNull;
30import static org.junit.Assert.assertNull;
31import static org.junit.Assert.assertTrue;
Daichi Hirono34fb7312017-12-04 10:00:24 +090032
33import android.platform.test.annotations.Presubmit;
Daichi Hirono34fb7312017-12-04 10:00:24 +090034import android.view.InputChannel;
Brett Chabota26eda92018-07-23 13:08:30 -070035
yj81.kwon19585ff2019-04-23 18:53:57 -070036import androidx.test.filters.FlakyTest;
Brett Chabota26eda92018-07-23 13:08:30 -070037import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070038
Daichi Hirono34fb7312017-12-04 10:00:24 +090039import org.junit.Before;
40import org.junit.Test;
Daichi Hironoce2f97a2017-11-30 16:44:15 +090041
Daichi Hirono34fb7312017-12-04 10:00:24 +090042/**
43 * Tests for the {@link TaskPositioningController} class.
44 *
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070045 * Build/Install/Run:
yj81.kwon19585ff2019-04-23 18:53:57 -070046 * atest WmTests:TaskPositioningControllerTests
Daichi Hirono34fb7312017-12-04 10:00:24 +090047 */
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070048@SmallTest
Daichi Hirono34fb7312017-12-04 10:00:24 +090049@Presubmit
50public class TaskPositioningControllerTests extends WindowTestsBase {
51 private static final int TIMEOUT_MS = 1000;
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070052
Daichi Hirono34fb7312017-12-04 10:00:24 +090053 private TaskPositioningController mTarget;
54 private WindowState mWindow;
55
56 @Before
57 public void setUp() throws Exception {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070058 assertNotNull(mWm.mTaskPositioningController);
59 mTarget = mWm.mTaskPositioningController;
Daichi Hirono34fb7312017-12-04 10:00:24 +090060
Arthur Hungfd9d94d2019-08-28 16:06:07 +080061 when(mWm.mInputManager.transferTouchFocus(
62 any(InputChannel.class),
63 any(InputChannel.class))).thenReturn(true);
64
Daichi Hirono34fb7312017-12-04 10:00:24 +090065 mWindow = createWindow(null, TYPE_BASE_APPLICATION, "window");
66 mWindow.mInputChannel = new InputChannel();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070067 synchronized (mWm.mGlobalLock) {
68 mWm.mWindowMap.put(mWindow.mClient.asBinder(), mWindow);
Riddle Hsu7f9f37d2019-03-26 17:42:17 +080069 spyOn(mDisplayContent);
70 doReturn(mock(InputMonitor.class)).when(mDisplayContent).getInputMonitor();
Daichi Hirono34fb7312017-12-04 10:00:24 +090071 }
72 }
73
74 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070075 public void testStartAndFinishPositioning() {
76 synchronized (mWm.mGlobalLock) {
Daichi Hirono34fb7312017-12-04 10:00:24 +090077 assertFalse(mTarget.isPositioningLocked());
78 assertNull(mTarget.getDragWindowHandleLocked());
79 }
80
81 assertTrue(mTarget.startMovingTask(mWindow.mClient, 0, 0));
82
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070083 synchronized (mWm.mGlobalLock) {
Daichi Hirono34fb7312017-12-04 10:00:24 +090084 assertTrue(mTarget.isPositioningLocked());
85 assertNotNull(mTarget.getDragWindowHandleLocked());
86 }
87
Daichi Hironoce2f97a2017-11-30 16:44:15 +090088 mTarget.finishTaskPositioning();
89 // Wait until the looper processes finishTaskPositioning.
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070090 assertTrue(mWm.mH.runWithScissors(() -> { }, TIMEOUT_MS));
Daichi Hirono34fb7312017-12-04 10:00:24 +090091
92 assertFalse(mTarget.isPositioningLocked());
93 assertNull(mTarget.getDragWindowHandleLocked());
94 }
95
yj81.kwon19585ff2019-04-23 18:53:57 -070096 @FlakyTest(bugId = 129507487)
97 @Test
98 public void testFinishPositioningWhenAppRequested() {
99 synchronized (mWm.mGlobalLock) {
100 assertFalse(mTarget.isPositioningLocked());
101 assertNull(mTarget.getDragWindowHandleLocked());
102 }
103
104 assertTrue(mTarget.startMovingTask(mWindow.mClient, 0, 0));
105
106 synchronized (mWm.mGlobalLock) {
107 assertTrue(mTarget.isPositioningLocked());
108 assertNotNull(mTarget.getDragWindowHandleLocked());
109 }
110
111 mTarget.finishTaskPositioning(mWindow.mClient);
112 // Wait until the looper processes finishTaskPositioning.
113 assertTrue(mWm.mH.runWithScissors(() -> { }, TIMEOUT_MS));
114
115 assertFalse(mTarget.isPositioningLocked());
116 assertNull(mTarget.getDragWindowHandleLocked());
117 }
118
Daichi Hirono34fb7312017-12-04 10:00:24 +0900119 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700120 public void testHandleTapOutsideTask() {
121 synchronized (mWm.mGlobalLock) {
Daichi Hirono34fb7312017-12-04 10:00:24 +0900122 assertFalse(mTarget.isPositioningLocked());
123 assertNull(mTarget.getDragWindowHandleLocked());
124 }
125
126 final DisplayContent content = mock(DisplayContent.class);
127 when(content.findTaskForResizePoint(anyInt(), anyInt())).thenReturn(mWindow.getTask());
128 assertNotNull(mWindow.getTask().getTopVisibleAppMainWindow());
129
130 mTarget.handleTapOutsideTask(content, 0, 0);
Daichi Hironoce2f97a2017-11-30 16:44:15 +0900131 // Wait until the looper processes finishTaskPositioning.
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700132 assertTrue(mWm.mH.runWithScissors(() -> { }, TIMEOUT_MS));
Daichi Hirono34fb7312017-12-04 10:00:24 +0900133
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700134 synchronized (mWm.mGlobalLock) {
Daichi Hirono34fb7312017-12-04 10:00:24 +0900135 assertTrue(mTarget.isPositioningLocked());
136 assertNotNull(mTarget.getDragWindowHandleLocked());
137 }
138
Daichi Hironoce2f97a2017-11-30 16:44:15 +0900139 mTarget.finishTaskPositioning();
140 // Wait until the looper processes finishTaskPositioning.
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700141 assertTrue(mWm.mH.runWithScissors(() -> { }, TIMEOUT_MS));
Daichi Hirono34fb7312017-12-04 10:00:24 +0900142
143 assertFalse(mTarget.isPositioningLocked());
144 assertNull(mTarget.getDragWindowHandleLocked());
145 }
146}