Loading services/tests/wmtests/src/com/android/server/wm/WindowContainerTransactionTests.java +125 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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}. * Loading @@ -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); Loading @@ -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) Loading @@ -87,3 +210,4 @@ public class WindowContainerTransactionTests extends WindowTestsBase { } } } services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +69 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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()); } Loading @@ -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); Loading @@ -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 */); Loading Loading
services/tests/wmtests/src/com/android/server/wm/WindowContainerTransactionTests.java +125 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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}. * Loading @@ -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); Loading @@ -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) Loading @@ -87,3 +210,4 @@ public class WindowContainerTransactionTests extends WindowTestsBase { } } }
services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +69 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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()); } Loading @@ -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); Loading @@ -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 */); Loading