summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nergi Rahardi <nergi@google.com> 2024-12-12 21:44:04 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2024-12-12 21:44:04 -0800
commitcf209357c4c44f64f6a307c547beb842017795e6 (patch)
treef921ed2bfc2a47a6face1c88345327a2540b4474
parentbd0532bcd3a26a584d7d372fa3049ecb51a4c81d (diff)
parent9ffdadbee6eca695193633ae587275f0735ffc13 (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.java51
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java119
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;