Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf209357 authored by Nergi Rahardi's avatar Nergi Rahardi Committed by Android (Google) Code Review
Browse files

Merge changes I39334096,I56296d59 into main

* changes:
  Refactor ActivityRecordTests to use WindowStateBuilder
  Add builder pattern to build WindowState in WindowTestsBase
parents bd0532bc 9ffdadbe
Loading
Loading
Loading
Loading
+30 −21
Original line number Diff line number Diff line
@@ -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();

+119 −0
Original line number Diff line number Diff line
@@ -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;