Tadashi G. Takaoka | 74ccec2 | 2018-10-23 11:07:13 +0900 | [diff] [blame] | 1 | /* |
| 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 |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | package com.android.server.wm; |
| 18 | |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 19 | import static android.app.AppOpsManager.OP_NONE; |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 20 | |
Tadashi G. Takaoka | a7a6695 | 2018-11-16 15:04:21 +0900 | [diff] [blame] | 21 | import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 22 | import static com.android.server.wm.WindowContainer.POSITION_TOP; |
Tadashi G. Takaoka | 74ccec2 | 2018-10-23 11:07:13 +0900 | [diff] [blame] | 23 | |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 24 | import android.os.IBinder; |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 25 | import android.view.IWindow; |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 26 | import android.view.WindowManager; |
Tadashi G. Takaoka | 74ccec2 | 2018-10-23 11:07:13 +0900 | [diff] [blame] | 27 | |
Garfield Tan | e8d84ab | 2019-10-11 09:49:40 -0700 | [diff] [blame] | 28 | import com.android.server.wm.ActivityTestsBase.ActivityBuilder; |
| 29 | |
Tadashi G. Takaoka | 74ccec2 | 2018-10-23 11:07:13 +0900 | [diff] [blame] | 30 | /** |
Tadashi G. Takaoka | d7aa79a | 2019-02-08 17:42:37 +0900 | [diff] [blame] | 31 | * A collection of static functions that provide access to WindowManager related test functionality. |
Tadashi G. Takaoka | 74ccec2 | 2018-10-23 11:07:13 +0900 | [diff] [blame] | 32 | */ |
Tadashi G. Takaoka | d7aa79a | 2019-02-08 17:42:37 +0900 | [diff] [blame] | 33 | class WindowTestUtils { |
Tadashi G. Takaoka | 74ccec2 | 2018-10-23 11:07:13 +0900 | [diff] [blame] | 34 | |
Wale Ogunwale | bebd8cd | 2019-10-28 15:53:31 -0700 | [diff] [blame] | 35 | /** Creates a {@link Task} and adds it to the specified {@link ActivityStack}. */ |
| 36 | static Task createTaskInStack(WindowManagerService service, ActivityStack stack, int userId) { |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 37 | synchronized (service.mGlobalLock) { |
Louis Chang | cdec080 | 2019-11-11 11:45:07 +0800 | [diff] [blame] | 38 | final Task task = new ActivityTestsBase.TaskBuilder( |
Wale Ogunwale | bebd8cd | 2019-10-28 15:53:31 -0700 | [diff] [blame] | 39 | stack.mStackSupervisor) |
Wale Ogunwale | a733c79 | 2019-10-16 21:31:15 -0700 | [diff] [blame] | 40 | .setUserId(userId) |
Wale Ogunwale | bebd8cd | 2019-10-28 15:53:31 -0700 | [diff] [blame] | 41 | .setStack(stack) |
Wale Ogunwale | a733c79 | 2019-10-16 21:31:15 -0700 | [diff] [blame] | 42 | .build(); |
Wale Ogunwale | 2322bed | 2019-10-10 17:24:19 +0200 | [diff] [blame] | 43 | return task; |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 44 | } |
| 45 | } |
| 46 | |
Garfield Tan | e8d84ab | 2019-10-11 09:49:40 -0700 | [diff] [blame] | 47 | /** Creates an {@link ActivityRecord} and adds it to the specified {@link Task}. */ |
| 48 | static ActivityRecord createActivityRecordInTask(DisplayContent dc, Task task) { |
| 49 | final ActivityRecord activity = createTestActivityRecord(dc); |
| 50 | task.addChild(activity, POSITION_TOP); |
| 51 | return activity; |
Yunfan Chen | 0e7aff9 | 2018-12-05 16:35:32 -0800 | [diff] [blame] | 52 | } |
| 53 | |
Wale Ogunwale | a733c79 | 2019-10-16 21:31:15 -0700 | [diff] [blame] | 54 | static ActivityRecord createTestActivityRecord(ActivityStack stack) { |
| 55 | synchronized (stack.mService.mGlobalLock) { |
| 56 | final ActivityRecord activity = new ActivityTestsBase.ActivityBuilder( |
| 57 | stack.mService) |
| 58 | .setStack(stack) |
| 59 | .setCreateTask(true) |
| 60 | .build(); |
Wale Ogunwale | bebd8cd | 2019-10-28 15:53:31 -0700 | [diff] [blame] | 61 | postCreateActivitySetup(activity, stack.getDisplayContent()); |
Wale Ogunwale | a733c79 | 2019-10-16 21:31:15 -0700 | [diff] [blame] | 62 | return activity; |
| 63 | } |
| 64 | } |
| 65 | |
Garfield Tan | e8d84ab | 2019-10-11 09:49:40 -0700 | [diff] [blame] | 66 | static ActivityRecord createTestActivityRecord(DisplayContent dc) { |
Wale Ogunwale | 8b19de9 | 2018-11-29 19:58:26 -0800 | [diff] [blame] | 67 | synchronized (dc.mWmService.mGlobalLock) { |
Garfield Tan | e8d84ab | 2019-10-11 09:49:40 -0700 | [diff] [blame] | 68 | final ActivityRecord activity = new ActivityBuilder(dc.mWmService.mAtmService).build(); |
Wale Ogunwale | a733c79 | 2019-10-16 21:31:15 -0700 | [diff] [blame] | 69 | postCreateActivitySetup(activity, dc); |
Garfield Tan | e8d84ab | 2019-10-11 09:49:40 -0700 | [diff] [blame] | 70 | return activity; |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 71 | } |
| 72 | } |
| 73 | |
Wale Ogunwale | a733c79 | 2019-10-16 21:31:15 -0700 | [diff] [blame] | 74 | private static void postCreateActivitySetup(ActivityRecord activity, DisplayContent dc) { |
| 75 | activity.onDisplayChanged(dc); |
| 76 | activity.setOccludesParent(true); |
Issei Suzuki | 7b9e257 | 2019-11-14 16:19:54 +0100 | [diff] [blame] | 77 | activity.setHidden(false); |
Issei Suzuki | 1669ea4 | 2019-11-06 14:20:59 +0100 | [diff] [blame] | 78 | activity.mVisibleRequested = true; |
Wale Ogunwale | a733c79 | 2019-10-16 21:31:15 -0700 | [diff] [blame] | 79 | } |
| 80 | |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 81 | static TestWindowToken createTestWindowToken(int type, DisplayContent dc) { |
| 82 | return createTestWindowToken(type, dc, false /* persistOnEmpty */); |
| 83 | } |
| 84 | |
| 85 | static TestWindowToken createTestWindowToken(int type, DisplayContent dc, |
| 86 | boolean persistOnEmpty) { |
Wale Ogunwale | 8b19de9 | 2018-11-29 19:58:26 -0800 | [diff] [blame] | 87 | synchronized (dc.mWmService.mGlobalLock) { |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 88 | return new TestWindowToken(type, dc, persistOnEmpty); |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | /* Used so we can gain access to some protected members of the {@link WindowToken} class */ |
Tadashi G. Takaoka | d7aa79a | 2019-02-08 17:42:37 +0900 | [diff] [blame] | 93 | static class TestWindowToken extends WindowToken { |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 94 | |
| 95 | private TestWindowToken(int type, DisplayContent dc, boolean persistOnEmpty) { |
Wale Ogunwale | 8b19de9 | 2018-11-29 19:58:26 -0800 | [diff] [blame] | 96 | super(dc.mWmService, mock(IBinder.class), type, persistOnEmpty, dc, |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 97 | false /* ownerCanManageAppTokens */); |
| 98 | } |
| 99 | |
| 100 | int getWindowsCount() { |
| 101 | return mChildren.size(); |
| 102 | } |
| 103 | |
| 104 | boolean hasWindow(WindowState w) { |
| 105 | return mChildren.contains(w); |
| 106 | } |
| 107 | } |
| 108 | |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 109 | /** Used to track resize reports. */ |
Tadashi G. Takaoka | d7aa79a | 2019-02-08 17:42:37 +0900 | [diff] [blame] | 110 | static class TestWindowState extends WindowState { |
Tadashi G. Takaoka | bf0d57b | 2018-11-19 16:09:58 +0900 | [diff] [blame] | 111 | boolean mResizeReported; |
| 112 | |
| 113 | TestWindowState(WindowManagerService service, Session session, IWindow window, |
| 114 | WindowManager.LayoutParams attrs, WindowToken token) { |
| 115 | super(service, session, window, token, null, OP_NONE, 0, attrs, 0, 0, |
| 116 | false /* ownerCanAddInternalSystemWindow */); |
| 117 | } |
| 118 | |
| 119 | @Override |
| 120 | void reportResized() { |
| 121 | super.reportResized(); |
| 122 | mResizeReported = true; |
| 123 | } |
| 124 | |
| 125 | @Override |
| 126 | public boolean isGoneForLayoutLw() { |
| 127 | return false; |
| 128 | } |
| 129 | |
| 130 | @Override |
| 131 | void updateResizingWindowIfNeeded() { |
| 132 | // Used in AppWindowTokenTests#testLandscapeSeascapeRotationRelayout to deceive |
| 133 | // the system that it can actually update the window. |
| 134 | boolean hadSurface = mHasSurface; |
| 135 | mHasSurface = true; |
| 136 | |
| 137 | super.updateResizingWindowIfNeeded(); |
| 138 | |
| 139 | mHasSurface = hadSurface; |
| 140 | } |
| 141 | } |
Tadashi G. Takaoka | 74ccec2 | 2018-10-23 11:07:13 +0900 | [diff] [blame] | 142 | } |