diff options
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowContainerTransactionTests.java | 126 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java | 72 |
2 files changed, 194 insertions, 4 deletions
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTransactionTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTransactionTests.java index d2552718f218..e9ece5dbdcc4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTransactionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTransactionTests.java @@ -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 { } } } + 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 a0bafb64090f..be837441ef94 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -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,8 +1947,69 @@ 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 */); } |