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

Commit ab1182c3 authored by Nergi Rahardi's avatar Nergi Rahardi
Browse files

Add builder pattern to build WindowState in WindowTestsBase

The current `createWindow()` method has > 10 overloading
patterns, and many calls with null as params as they're not
needed, and as to not add more overloading.

In the same WindowTestsBase, there's also been TaskBuilder,
ActivityBuilder, TaskFragmentBuilder, and therefore having
"WindowStateBuilder" also fits the class here.

Refactoring of all the usages will be done gradually for
each individual test classes.

Note: No test would be impacted by this as this is adding
a new helper class

Bug: 383480021
Test: presubmit
Flag: EXEMPT cleaning up tests
Change-Id: I56296d595969325a0d3cd63252b8ec5db7e56ed9
parent 3fd36128
Loading
Loading
Loading
Loading
+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;