diff options
| author | 2024-12-12 21:44:04 -0800 | |
|---|---|---|
| committer | 2024-12-12 21:44:04 -0800 | |
| commit | cf209357c4c44f64f6a307c547beb842017795e6 (patch) | |
| tree | f921ed2bfc2a47a6face1c88345327a2540b4474 | |
| parent | bd0532bcd3a26a584d7d372fa3049ecb51a4c81d (diff) | |
| parent | 9ffdadbee6eca695193633ae587275f0735ffc13 (diff) | |
Merge changes I39334096,I56296d59 into main
* changes:
Refactor ActivityRecordTests to use WindowStateBuilder
Add builder pattern to build WindowState in WindowTestsBase
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java | 51 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java | 119 |
2 files changed, 149 insertions, 21 deletions
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 661d07e09f99..5cb741fe81d4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -2472,11 +2472,14 @@ public class ActivityRecordTests extends WindowTestsBase { final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); assertEquals(0, activity.getChildCount()); - final WindowState win1 = createWindow(null, TYPE_APPLICATION, activity, "win1"); - final WindowState startingWin = createWindow(null, TYPE_APPLICATION_STARTING, activity, - "startingWin"); - final WindowState baseWin = createWindow(null, TYPE_BASE_APPLICATION, activity, "baseWin"); - final WindowState win4 = createWindow(null, TYPE_APPLICATION, activity, "win4"); + final WindowState win1 = newWindowBuilder("app1", TYPE_APPLICATION).setWindowToken( + activity).build(); + final WindowState startingWin = newWindowBuilder("startingWin", + TYPE_APPLICATION_STARTING).setWindowToken(activity).build(); + final WindowState baseWin = newWindowBuilder("baseWin", + TYPE_BASE_APPLICATION).setWindowToken(activity).build(); + final WindowState win4 = newWindowBuilder("win4", TYPE_APPLICATION).setWindowToken( + activity).build(); // Should not contain the windows that were added above. assertEquals(4, activity.getChildCount()); @@ -2499,14 +2502,17 @@ public class ActivityRecordTests extends WindowTestsBase { final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); assertNull(activity.findMainWindow()); - final WindowState window1 = createWindow(null, TYPE_BASE_APPLICATION, activity, "window1"); - final WindowState window11 = createWindow(window1, FIRST_SUB_WINDOW, activity, "window11"); - final WindowState window12 = createWindow(window1, FIRST_SUB_WINDOW, activity, "window12"); + final WindowState window1 = newWindowBuilder("window1", + TYPE_BASE_APPLICATION).setWindowToken(activity).build(); + final WindowState window11 = newWindowBuilder("window11", FIRST_SUB_WINDOW).setParent( + window1).setWindowToken(activity).build(); + final WindowState window12 = newWindowBuilder("window12", FIRST_SUB_WINDOW).setParent( + window1).setWindowToken(activity).build(); assertEquals(window1, activity.findMainWindow()); window1.mAnimatingExit = true; assertEquals(window1, activity.findMainWindow()); - final WindowState window2 = createWindow(null, TYPE_APPLICATION_STARTING, activity, - "window2"); + final WindowState window2 = newWindowBuilder("window2", + TYPE_APPLICATION_STARTING).setWindowToken(activity).build(); assertEquals(window2, activity.findMainWindow()); activity.removeImmediately(); } @@ -2651,8 +2657,8 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testStuckExitingWindow() { - final WindowState closingWindow = createWindow(null, FIRST_APPLICATION_WINDOW, - "closingWindow"); + final WindowState closingWindow = newWindowBuilder("closingWindow", + FIRST_APPLICATION_WINDOW).build(); closingWindow.mAnimatingExit = true; closingWindow.mRemoveOnExit = true; closingWindow.mActivityRecord.commitVisibility( @@ -3313,7 +3319,7 @@ public class ActivityRecordTests extends WindowTestsBase { @SetupWindows(addWindows = W_INPUT_METHOD) @Test public void testImeInsetsFrozenFlag_resetWhenNoImeFocusableInActivity() { - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); makeWindowVisibleAndDrawn(app, mImeWindow); mDisplayContent.setImeLayeringTarget(app); mDisplayContent.setImeInputTarget(app); @@ -3341,7 +3347,7 @@ public class ActivityRecordTests extends WindowTestsBase { @SetupWindows(addWindows = W_INPUT_METHOD) @Test public void testImeInsetsFrozenFlag_resetWhenReportedToBeImeInputTarget() { - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); mDisplayContent.getInsetsStateController().getImeSourceProvider().setWindowContainer( mImeWindow, null, null); @@ -3385,8 +3391,8 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testImeInsetsFrozenFlag_noDispatchVisibleInsetsWhenAppNotRequest() throws RemoteException { - final WindowState app1 = createWindow(null, TYPE_APPLICATION, "app1"); - final WindowState app2 = createWindow(null, TYPE_APPLICATION, "app2"); + final WindowState app1 = newWindowBuilder("app1", TYPE_APPLICATION).build(); + final WindowState app2 = newWindowBuilder("app2", TYPE_APPLICATION).build(); mDisplayContent.getInsetsStateController().getImeSourceProvider().setWindowContainer( mImeWindow, null, null); @@ -3430,7 +3436,8 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testImeInsetsFrozenFlag_multiWindowActivities() { final WindowToken imeToken = createTestWindowToken(TYPE_INPUT_METHOD, mDisplayContent); - final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, imeToken, "ime"); + final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).setWindowToken( + imeToken).build(); makeWindowVisibleAndDrawn(ime); // Create a split-screen root task with activity1 and activity 2. @@ -3451,8 +3458,10 @@ public class ActivityRecordTests extends WindowTestsBase { activity1.mImeInsetsFrozenUntilStartInput = true; activity2.mImeInsetsFrozenUntilStartInput = true; - final WindowState app1 = createWindow(null, TYPE_APPLICATION, activity1, "app1"); - final WindowState app2 = createWindow(null, TYPE_APPLICATION, activity2, "app2"); + final WindowState app1 = newWindowBuilder("app1", TYPE_APPLICATION).setWindowToken( + activity1).build(); + final WindowState app2 = newWindowBuilder("app2", TYPE_APPLICATION).setWindowToken( + activity2).build(); makeWindowVisibleAndDrawn(app1, app2); final InsetsStateController controller = mDisplayContent.getInsetsStateController(); @@ -3481,7 +3490,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testInClosingAnimation_visibilityNotCommitted_doNotHideSurface() { - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); makeWindowVisibleAndDrawn(app); // Put the activity in close transition. @@ -3508,7 +3517,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testInClosingAnimation_visibilityCommitted_hideSurface() { - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + final WindowState app = newWindowBuilder("app", TYPE_APPLICATION).build(); makeWindowVisibleAndDrawn(app); app.mActivityRecord.prepareSurfaces(); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index b27025c34d6b..b61dada809d8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -89,6 +89,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.service.voice.IVoiceInteractionSession; +import android.tools.function.Supplier; import android.util.MergedConfiguration; import android.util.SparseArray; import android.view.Display; @@ -1804,6 +1805,124 @@ public class WindowTestsBase extends SystemServiceTestsBase { } } + protected WindowStateBuilder newWindowBuilder(String name, int type) { + return new WindowStateBuilder(name, type, mWm, mDisplayContent, mIWindow, + this::getTestSession, this::createWindowToken); + } + + /** + * Builder for creating new window. + */ + protected static class WindowStateBuilder { + private final String mName; + private final int mType; + private final WindowManagerService mWm; + private final DisplayContent mDefaultTargetDisplay; + private final Supplier<WindowToken, Session> mSessionSupplier; + private final WindowTokenCreator mWindowTokenCreator; + + private int mActivityType = ACTIVITY_TYPE_STANDARD; + private IWindow mClientWindow; + private boolean mOwnerCanAddInternalSystemWindow = false; + private int mOwnerId = 0; + private WindowState mParent; + private DisplayContent mTargetDisplay; + private int mWindowingMode = WINDOWING_MODE_FULLSCREEN; + private WindowToken mWindowToken; + + WindowStateBuilder(String name, int type, WindowManagerService windowManagerService, + DisplayContent dc, IWindow iWindow, Supplier<WindowToken, Session> sessionSupplier, + WindowTokenCreator windowTokenCreator) { + mName = name; + mType = type; + mClientWindow = iWindow; + mDefaultTargetDisplay = dc; + mSessionSupplier = sessionSupplier; + mWindowTokenCreator = windowTokenCreator; + mWm = windowManagerService; + } + + WindowStateBuilder setActivityType(int activityType) { + mActivityType = activityType; + return this; + } + + WindowStateBuilder setClientWindow(IWindow clientWindow) { + mClientWindow = clientWindow; + return this; + } + + WindowStateBuilder setDisplay(DisplayContent displayContent) { + mTargetDisplay = displayContent; + return this; + } + + WindowStateBuilder setOwnerCanAddInternalSystemWindow( + boolean ownerCanAddInternalSystemWindow) { + mOwnerCanAddInternalSystemWindow = ownerCanAddInternalSystemWindow; + return this; + } + + WindowStateBuilder setOwnerId(int ownerId) { + mOwnerId = ownerId; + return this; + } + + WindowStateBuilder setParent(WindowState parent) { + mParent = parent; + return this; + } + + WindowStateBuilder setWindowToken(WindowToken token) { + mWindowToken = token; + return this; + } + + WindowStateBuilder setWindowingMode(int windowingMode) { + mWindowingMode = windowingMode; + return this; + } + + WindowState build() { + SystemServicesTestRule.checkHoldsLock(mWm.mGlobalLock); + + final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(mType); + attrs.setTitle(mName); + attrs.packageName = "test"; + + assertFalse( + "targetDisplay shouldn't be specified together with windowToken, since" + + " windowToken will be derived from targetDisplay.", + mWindowToken != null && mTargetDisplay != null); + + if (mWindowToken == null) { + if (mTargetDisplay != null) { + mWindowToken = mWindowTokenCreator.createWindowToken(mTargetDisplay, + mWindowingMode, mActivityType, mType); + } else if (mParent != null) { + mWindowToken = mParent.mToken; + } else { + // Use default mDisplayContent as window token. + mWindowToken = mWindowTokenCreator.createWindowToken(mDefaultTargetDisplay, + mWindowingMode, mActivityType, mType); + } + } + + final WindowState w = new WindowState(mWm, mSessionSupplier.get(mWindowToken), + mClientWindow, mWindowToken, mParent, OP_NONE, attrs, VISIBLE, mOwnerId, + UserHandle.getUserId(mOwnerId), mOwnerCanAddInternalSystemWindow); + // TODO: Probably better to make this call in the WindowState ctor to avoid errors with + // adding it to the token... + mWindowToken.addWindow(w); + return w; + } + + interface WindowTokenCreator { + WindowToken createWindowToken(DisplayContent dc, int windowingMode, int activityType, + int type); + } + } + static class TestStartingWindowOrganizer extends WindowOrganizerTests.StubOrganizer { private final ActivityTaskManagerService mAtm; private final WindowManagerService mWMService; |