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

Commit 946c82ea authored by Orhan Uysal's avatar Orhan Uysal Committed by Android (Google) Code Review
Browse files

Merge "Create unit tests and unit test utils for desktop" into main

parents 246f57f7 e89e4fc7
Loading
Loading
Loading
Loading
+82 −0
Original line number Diff line number Diff line
@@ -132,8 +132,10 @@ import org.junit.runner.RunWith;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
@@ -563,6 +565,86 @@ public class ActivityStarterTests extends WindowTestsBase {
        return Pair.create(splitPrimaryActivity, splitSecondActivity);
    }

    /**
     * This test ensures that if the intent is being delivered to a desktop mode unfocused task
     * while it is already on top, reports it as delivering to top.
     */
    @Test
    public void testDesktopModeDeliverToTop() {
        final ActivityStarter starter = prepareStarter(
                FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | FLAG_ACTIVITY_SINGLE_TOP,
                false /* mockGetRootTask */);
        final List<ActivityRecord> activities = createActivitiesInDesktopMode();

        // Set focus back to the first task.
        activities.get(0).moveFocusableActivityToTop("testDesktopModeDeliverToTop");

        // Start activity and delivered new intent.
        starter.getIntent().setComponent(activities.get(3).mActivityComponent);
        doReturn(activities.get(3)).when(mRootWindowContainer).findTask(any(), any());
        final int result = starter.setReason("testDesktopModeDeliverToTop").execute();

        // Ensure result is delivering intent to top.
        assertEquals(START_DELIVERED_TO_TOP, result);
    }

    /**
     * This test ensures that if the intent is being delivered to a desktop mode unfocused task
     * reports it is brought to front instead of delivering to top.
     */
    @Test
    public void testDesktopModeTaskToFront() {
        final ActivityStarter starter = prepareStarter(
                FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | FLAG_ACTIVITY_SINGLE_TOP, false);
        final List<ActivityRecord> activities = createActivitiesInDesktopMode();
        final ActivityRecord desktopModeFocusActivity = activities.get(0);
        final ActivityRecord desktopModeReusableActivity = activities.get(1);
        final ActivityRecord desktopModeTopActivity = new ActivityBuilder(mAtm).setCreateTask(true)
                .setParentTask(desktopModeReusableActivity.getRootTask()).build();
        assertTrue(desktopModeTopActivity.inMultiWindowMode());

        // Let first stack has focus.
        desktopModeFocusActivity.moveFocusableActivityToTop("testDesktopModeTaskToFront");

        // Start activity and delivered new intent.
        starter.getIntent().setComponent(desktopModeReusableActivity.mActivityComponent);
        doReturn(desktopModeReusableActivity).when(mRootWindowContainer).findTask(any(), any());
        final int result = starter.setReason("testDesktopModeMoveToFront").execute();

        // Ensure result is moving task to front.
        assertEquals(START_TASK_TO_FRONT, result);
    }

    /** Returns 4 activities. */
    private List<ActivityRecord> createActivitiesInDesktopMode() {
        final TestDesktopOrganizer desktopOrganizer = new TestDesktopOrganizer(mAtm);
        List<ActivityRecord> activityRecords = new ArrayList<>();

        for (int i = 0; i < 4; i++) {
            Rect bounds = new Rect(desktopOrganizer.getDefaultDesktopTaskBounds());
            bounds.offset(20 * i, 20 * i);
            desktopOrganizer.createTask(bounds);
        }

        for (int i = 0; i < 4; i++) {
            activityRecords.add(new TaskBuilder(mSupervisor)
                    .setParentTask(desktopOrganizer.mTasks.get(i))
                    .setCreateActivity(true)
                    .build()
                    .getTopMostActivity());
        }

        for (int i = 0; i < 4; i++) {
            activityRecords.get(i).setVisibleRequested(true);
        }

        for (int i = 0; i < 4; i++) {
            assertEquals(desktopOrganizer.mTasks.get(i), activityRecords.get(i).getRootTask());
        }

        return activityRecords;
    }

    @Test
    public void testMoveVisibleTaskToFront() {
        final ActivityRecord activity = new TaskBuilder(mSupervisor)
+52 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.app.AppOpsManager.OP_NONE;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
@@ -133,7 +134,9 @@ import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/** Common base class for window manager unit test classes. */
class WindowTestsBase extends SystemServiceTestsBase {
@@ -1892,6 +1895,55 @@ class WindowTestsBase extends SystemServiceTestsBase {
        }
    }

    static class TestDesktopOrganizer extends WindowOrganizerTests.StubOrganizer {
        final int mDesktopModeDefaultWidthDp = 840;
        final int mDesktopModeDefaultHeightDp = 630;
        final int mDesktopDensity = 284;

        final ActivityTaskManagerService mService;
        final TaskDisplayArea mDefaultTDA;
        List<Task> mTasks;
        final DisplayContent mDisplay;
        Rect mStableBounds;

        TestDesktopOrganizer(ActivityTaskManagerService service, DisplayContent display) {
            mService = service;
            mDefaultTDA = display.getDefaultTaskDisplayArea();
            mDisplay = display;
            mService.mTaskOrganizerController.registerTaskOrganizer(this);
            mTasks = new ArrayList<>();
            mStableBounds = display.getBounds();
        }

        TestDesktopOrganizer(ActivityTaskManagerService service) {
            this(service, service.mTaskSupervisor.mRootWindowContainer.getDefaultDisplay());
        }

        public Task createTask(Rect bounds) {
            Task task = mService.mTaskOrganizerController.createRootTask(
                    mDisplay, WINDOWING_MODE_FREEFORM, null);
            task.setBounds(bounds);
            mTasks.add(task);
            spyOn(task);
            return task;
        }

        public Rect getDefaultDesktopTaskBounds() {
            int width = (int) (mDesktopModeDefaultWidthDp * mDesktopDensity + 0.5f);
            int height = (int) (mDesktopModeDefaultHeightDp * mDesktopDensity + 0.5f);
            Rect outBounds = new Rect();

            outBounds.set(0, 0, width, height);
            // Center the task in stable bounds
            outBounds.offset(
                    mStableBounds.centerX() - outBounds.centerX(),
                    mStableBounds.centerY() - outBounds.centerY()
            );
            return outBounds;
        }

    }

    static TestWindowToken createTestWindowToken(int type, DisplayContent dc) {
        return createTestWindowToken(type, dc, false /* persistOnEmpty */);
    }