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

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

Merge "Create WindowContainerTransaction unit tests." into main

parents 703fd3da 6790550f
Loading
Loading
Loading
Loading
+125 −1
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.server.wm;

import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;

import static org.junit.Assert.assertEquals;
@@ -23,6 +26,7 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.times;

import android.content.Intent;
import android.platform.test.annotations.Presubmit;
@@ -35,6 +39,9 @@ import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.ArrayList;
import java.util.List;

/**
 * Test class for {@link WindowContainerTransaction}.
 *
@@ -45,7 +52,6 @@ import org.junit.runner.RunWith;
@Presubmit
@RunWith(WindowTestRunner.class)
public class WindowContainerTransactionTests extends WindowTestsBase {

    @Test
    public void testRemoveTask() {
        final Task rootTask = createTask(mDisplayContent);
@@ -72,6 +78,123 @@ public class WindowContainerTransactionTests extends WindowTestsBase {
        verify(mAtm.getLockTaskController(), atLeast(1)).clearLockedTask(rootTask);
    }

    @Test
    public void testDesktopMode_tasksAreBroughtToFront() {
        final TestDesktopOrganizer desktopOrganizer = new TestDesktopOrganizer(mAtm);
        TaskDisplayArea tda = desktopOrganizer.mDefaultTDA;
        List<ActivityRecord> activityRecords = new ArrayList<>();
        int numberOfTasks = 4;
        desktopOrganizer.createFreeformTasksWithActivities(desktopOrganizer,
                activityRecords, numberOfTasks);

        final Task task = createTask(mDisplayContent);
        final ActivityRecord activity = createActivityRecord(mDisplayContent, task);
        task.setWindowingMode(WINDOWING_MODE_FULLSCREEN);

        // Bring home to front of the tasks
        desktopOrganizer.bringHomeToFront();

        // Bring tasks in front of the home
        WindowContainerTransaction wct = new WindowContainerTransaction();
        desktopOrganizer.bringDesktopTasksToFront(wct);
        applyTransaction(wct);

        // Verify tasks are resumed and in correct z-order
        verify(mRootWindowContainer, times(2)).ensureActivitiesVisible();
        for (int i = 0; i < numberOfTasks - 1; i++) {
            assertTrue(tda.mChildren
                    .indexOf(desktopOrganizer.mTasks.get(i).getRootTask())
                    < tda.mChildren.indexOf(desktopOrganizer.mTasks.get(i + 1).getRootTask()));
        }
    }

    @Test
    public void testDesktopMode_moveTaskToDesktop() {
        final TestDesktopOrganizer desktopOrganizer = new TestDesktopOrganizer(mAtm);
        TaskDisplayArea tda = desktopOrganizer.mDefaultTDA;
        List<ActivityRecord> activityRecords = new ArrayList<>();
        int numberOfTasks = 4;
        desktopOrganizer.createFreeformTasksWithActivities(desktopOrganizer,
                activityRecords, numberOfTasks);

        final Task task = createTask(mDisplayContent);
        final ActivityRecord activity = createActivityRecord(mDisplayContent, task);
        task.setWindowingMode(WINDOWING_MODE_FULLSCREEN);

        // Bring home to front of the tasks
        desktopOrganizer.bringHomeToFront();

        // Bring tasks in front of the home and newly moved task to on top of them
        WindowContainerTransaction wct = new WindowContainerTransaction();
        desktopOrganizer.bringDesktopTasksToFront(wct);
        desktopOrganizer.addMoveToDesktopChanges(wct, task, true);
        wct.setBounds(task.getTaskInfo().token, desktopOrganizer.getDefaultDesktopTaskBounds());
        applyTransaction(wct);

        // Verify tasks are resumed
        verify(mRootWindowContainer, times(2)).ensureActivitiesVisible();

        // Tasks are in correct z-order
        for (int i = 0; i < numberOfTasks - 1; i++) {
            assertTrue(tda.mChildren
                    .indexOf(desktopOrganizer.mTasks.get(i).getRootTask())
                    < tda.mChildren.indexOf(desktopOrganizer.mTasks.get(i + 1).getRootTask()));
        }
        // New task is on top of other tasks
        assertTrue(tda.mChildren
                .indexOf(desktopOrganizer.mTasks.get(3).getRootTask())
                < tda.mChildren.indexOf(task));

        // New task is in freeform and has specified bounds
        assertEquals(WINDOWING_MODE_FREEFORM, task.getWindowingMode());
        assertEquals(desktopOrganizer.getDefaultDesktopTaskBounds(), task.getBounds());
    }


    @Test
    public void testDesktopMode_moveTaskToFullscreen() {
        final TestDesktopOrganizer desktopOrganizer = new TestDesktopOrganizer(mAtm);
        List<ActivityRecord> activityRecords = new ArrayList<>();
        int numberOfTasks = 4;
        desktopOrganizer.createFreeformTasksWithActivities(desktopOrganizer,
                activityRecords, numberOfTasks);

        Task taskToMove = desktopOrganizer.mTasks.get(numberOfTasks - 1);

        // Bring tasks in front of the home and newly moved task to on top of them
        WindowContainerTransaction wct = new WindowContainerTransaction();
        desktopOrganizer.addMoveToFullscreen(wct, taskToMove, false);
        applyTransaction(wct);

        // New task is in freeform
        assertEquals(WINDOWING_MODE_FULLSCREEN, taskToMove.getWindowingMode());
    }

    @Test
    public void testDesktopMode_moveTaskToFront() {
        final TestDesktopOrganizer desktopOrganizer = new TestDesktopOrganizer(mAtm);
        TaskDisplayArea tda = desktopOrganizer.mDefaultTDA;
        List<ActivityRecord> activityRecords = new ArrayList<>();
        int numberOfTasks = 5;
        desktopOrganizer.createFreeformTasksWithActivities(desktopOrganizer,
                activityRecords, numberOfTasks);

        // Bring task 2 on top of other tasks
        WindowContainerTransaction wct = new WindowContainerTransaction();
        wct.reorder(desktopOrganizer.mTasks.get(2).getTaskInfo().token, true /* onTop */);
        applyTransaction(wct);

        // Tasks are in correct z-order
        assertTrue(tda.mChildren.indexOf(desktopOrganizer.mTasks.get(0).getRootTask())
                < tda.mChildren.indexOf(desktopOrganizer.mTasks.get(1).getRootTask()));
        assertTrue(tda.mChildren.indexOf(desktopOrganizer.mTasks.get(1).getRootTask())
                < tda.mChildren.indexOf(desktopOrganizer.mTasks.get(3).getRootTask()));
        assertTrue(tda.mChildren.indexOf(desktopOrganizer.mTasks.get(3).getRootTask())
                < tda.mChildren.indexOf(desktopOrganizer.mTasks.get(4).getRootTask()));
        assertTrue(tda.mChildren.indexOf(desktopOrganizer.mTasks.get(4).getRootTask())
                < tda.mChildren.indexOf(desktopOrganizer.mTasks.get(2).getRootTask()));
    }

    private Task createTask(int taskId) {
        return new Task.Builder(mAtm)
                .setTaskId(taskId)
@@ -87,3 +210,4 @@ public class WindowContainerTransactionTests extends WindowTestsBase {
        }
    }
}
+69 −3
Original line number Diff line number Diff line
@@ -116,6 +116,7 @@ import android.window.StartingWindowRemovalInfo;
import android.window.TaskFragmentOrganizer;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerTransaction;

import com.android.internal.policy.AttributeCache;
import com.android.internal.util.ArrayUtils;
@@ -1899,12 +1900,14 @@ class WindowTestsBase extends SystemServiceTestsBase {
        final int mDesktopModeDefaultWidthDp = 840;
        final int mDesktopModeDefaultHeightDp = 630;
        final int mDesktopDensity = 284;
        final int mOverrideDensity = 285;

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

        TestDesktopOrganizer(ActivityTaskManagerService service, DisplayContent display) {
            mService = service;
@@ -1913,8 +1916,8 @@ class WindowTestsBase extends SystemServiceTestsBase {
            mService.mTaskOrganizerController.registerTaskOrganizer(this);
            mTasks = new ArrayList<>();
            mStableBounds = display.getBounds();
            mHomeTask =  mDefaultTDA.getRootHomeTask();
        }

        TestDesktopOrganizer(ActivityTaskManagerService service) {
            this(service, service.mTaskSupervisor.mRootWindowContainer.getDefaultDisplay());
        }
@@ -1929,8 +1932,10 @@ class WindowTestsBase extends SystemServiceTestsBase {
        }

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

            outBounds.set(0, 0, width, height);
@@ -1942,7 +1947,68 @@ class WindowTestsBase extends SystemServiceTestsBase {
            return outBounds;
        }

        public void createFreeformTasksWithActivities(TestDesktopOrganizer desktopOrganizer,
                List<ActivityRecord> activityRecords, int numberOfTasks) {
            for (int i = 0; i < numberOfTasks; i++) {
                Rect bounds = new Rect(desktopOrganizer.getDefaultDesktopTaskBounds());
                bounds.offset(20 * i, 20 * i);
                desktopOrganizer.createTask(bounds);
            }

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

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

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

        public void bringHomeToFront() {
            WindowContainerTransaction wct = new WindowContainerTransaction();
            wct.reorder(mHomeTask.getTaskInfo().token, true /* onTop */);
            applyTransaction(wct);
        }

        public void bringDesktopTasksToFront(WindowContainerTransaction wct) {
            for (Task task: mTasks) {
                wct.reorder(task.getTaskInfo().token, true /* onTop */);
            }
        }

        public void addMoveToDesktopChanges(WindowContainerTransaction wct, Task task,
                boolean overrideDensity) {
            wct.setWindowingMode(task.getTaskInfo().token, WINDOWING_MODE_FREEFORM);
            wct.reorder(task.getTaskInfo().token, true /* onTop */);
            if (overrideDensity) {
                wct.setDensityDpi(task.getTaskInfo().token, mOverrideDensity);
            }
        }

        public void addMoveToFullscreen(WindowContainerTransaction wct, Task task,
                boolean overrideDensity) {
            wct.setWindowingMode(task.getTaskInfo().token, WINDOWING_MODE_FULLSCREEN);
            wct.setBounds(task.getTaskInfo().token, new Rect());
            if (overrideDensity) {
                wct.setDensityDpi(task.getTaskInfo().token, mOverrideDensity);
            }
        }

        private void applyTransaction(@androidx.annotation.NonNull WindowContainerTransaction wct) {
            if (!wct.isEmpty()) {
                mService.mWindowOrganizerController.applyTransaction(wct);
            }
        }
    }


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