Merge "Only clear bounds and windowing mode for standard" into tm-qpr-dev

This commit is contained in:
Ats Jenk
2022-09-06 16:06:54 +00:00
committed by Android (Google) Code Review
4 changed files with 82 additions and 34 deletions

View File

@@ -16,6 +16,7 @@
package com.android.wm.shell; package com.android.wm.shell;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
@@ -695,15 +696,19 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
/** /**
* Create a {@link WindowContainerTransaction} to clear task bounds. * Create a {@link WindowContainerTransaction} to clear task bounds.
* *
* Only affects tasks that have {@link RunningTaskInfo#getActivityType()} set to
* {@link WindowConfiguration#ACTIVITY_TYPE_STANDARD}.
*
* @param displayId display id for tasks that will have bounds cleared * @param displayId display id for tasks that will have bounds cleared
* @return {@link WindowContainerTransaction} with pending operations to clear bounds * @return {@link WindowContainerTransaction} with pending operations to clear bounds
*/ */
public WindowContainerTransaction prepareClearBoundsForTasks(int displayId) { public WindowContainerTransaction prepareClearBoundsForStandardTasks(int displayId) {
ProtoLog.d(WM_SHELL_DESKTOP_MODE, "prepareClearBoundsForTasks: displayId=%d", displayId); ProtoLog.d(WM_SHELL_DESKTOP_MODE, "prepareClearBoundsForTasks: displayId=%d", displayId);
WindowContainerTransaction wct = new WindowContainerTransaction(); WindowContainerTransaction wct = new WindowContainerTransaction();
for (int i = 0; i < mTasks.size(); i++) { for (int i = 0; i < mTasks.size(); i++) {
RunningTaskInfo taskInfo = mTasks.valueAt(i).getTaskInfo(); RunningTaskInfo taskInfo = mTasks.valueAt(i).getTaskInfo();
if (taskInfo.displayId == displayId) { if ((taskInfo.displayId == displayId) && (taskInfo.getActivityType()
== WindowConfiguration.ACTIVITY_TYPE_STANDARD)) {
ProtoLog.d(WM_SHELL_DESKTOP_MODE, "clearing bounds for token=%s taskInfo=%s", ProtoLog.d(WM_SHELL_DESKTOP_MODE, "clearing bounds for token=%s taskInfo=%s",
taskInfo.token, taskInfo); taskInfo.token, taskInfo);
wct.setBounds(taskInfo.token, null); wct.setBounds(taskInfo.token, null);
@@ -715,17 +720,21 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
/** /**
* Create a {@link WindowContainerTransaction} to clear task level freeform setting. * Create a {@link WindowContainerTransaction} to clear task level freeform setting.
* *
* Only affects tasks that have {@link RunningTaskInfo#getActivityType()} set to
* {@link WindowConfiguration#ACTIVITY_TYPE_STANDARD}.
*
* @param displayId display id for tasks that will have windowing mode reset to {@link * @param displayId display id for tasks that will have windowing mode reset to {@link
* WindowConfiguration#WINDOWING_MODE_UNDEFINED} * WindowConfiguration#WINDOWING_MODE_UNDEFINED}
* @return {@link WindowContainerTransaction} with pending operations to clear windowing mode * @return {@link WindowContainerTransaction} with pending operations to clear windowing mode
*/ */
public WindowContainerTransaction prepareClearFreeformForTasks(int displayId) { public WindowContainerTransaction prepareClearFreeformForStandardTasks(int displayId) {
ProtoLog.d(WM_SHELL_DESKTOP_MODE, "prepareClearFreeformForTasks: displayId=%d", displayId); ProtoLog.d(WM_SHELL_DESKTOP_MODE, "prepareClearFreeformForTasks: displayId=%d", displayId);
WindowContainerTransaction wct = new WindowContainerTransaction(); WindowContainerTransaction wct = new WindowContainerTransaction();
for (int i = 0; i < mTasks.size(); i++) { for (int i = 0; i < mTasks.size(); i++) {
RunningTaskInfo taskInfo = mTasks.valueAt(i).getTaskInfo(); RunningTaskInfo taskInfo = mTasks.valueAt(i).getTaskInfo();
if (taskInfo.displayId == displayId if (taskInfo.displayId == displayId
&& taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM) { && taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM
&& taskInfo.getActivityType() == ACTIVITY_TYPE_STANDARD) {
ProtoLog.d(WM_SHELL_DESKTOP_MODE, ProtoLog.d(WM_SHELL_DESKTOP_MODE,
"clearing windowing mode for token=%s taskInfo=%s", taskInfo.token, "clearing windowing mode for token=%s taskInfo=%s", taskInfo.token,
taskInfo); taskInfo);

View File

@@ -73,14 +73,15 @@ public class DesktopModeController {
WindowContainerTransaction wct = new WindowContainerTransaction(); WindowContainerTransaction wct = new WindowContainerTransaction();
// Reset freeform windowing mode that is set per task level (tasks should inherit // Reset freeform windowing mode that is set per task level (tasks should inherit
// container value) // container value)
wct.merge(mShellTaskOrganizer.prepareClearFreeformForTasks(displayId), true /* transfer */); wct.merge(mShellTaskOrganizer.prepareClearFreeformForStandardTasks(displayId),
true /* transfer */);
int targetWindowingMode; int targetWindowingMode;
if (active) { if (active) {
targetWindowingMode = WINDOWING_MODE_FREEFORM; targetWindowingMode = WINDOWING_MODE_FREEFORM;
} else { } else {
targetWindowingMode = WINDOWING_MODE_FULLSCREEN; targetWindowingMode = WINDOWING_MODE_FULLSCREEN;
// Clear any resized bounds // Clear any resized bounds
wct.merge(mShellTaskOrganizer.prepareClearBoundsForTasks(displayId), wct.merge(mShellTaskOrganizer.prepareClearBoundsForStandardTasks(displayId),
true /* transfer */); true /* transfer */);
} }
wct.merge(mRootDisplayAreaOrganizer.prepareWindowingModeChange(displayId, wct.merge(mRootDisplayAreaOrganizer.prepareWindowingModeChange(displayId,

View File

@@ -16,6 +16,8 @@
package com.android.wm.shell; package com.android.wm.shell;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
@@ -637,26 +639,22 @@ public class ShellTaskOrganizerTests extends ShellTestCase {
} }
@Test @Test
public void testPrepareClearBoundsForTasks() { public void testPrepareClearBoundsForStandardTasks() {
RunningTaskInfo task1 = createTaskInfo(1, WINDOWING_MODE_UNDEFINED);
task1.displayId = 1;
MockToken token1 = new MockToken(); MockToken token1 = new MockToken();
task1.token = token1.token(); RunningTaskInfo task1 = createTaskInfo(1, WINDOWING_MODE_UNDEFINED, token1);
mOrganizer.onTaskAppeared(task1, null); mOrganizer.onTaskAppeared(task1, null);
RunningTaskInfo task2 = createTaskInfo(2, WINDOWING_MODE_UNDEFINED);
task2.displayId = 1;
MockToken token2 = new MockToken(); MockToken token2 = new MockToken();
task2.token = token2.token(); RunningTaskInfo task2 = createTaskInfo(2, WINDOWING_MODE_UNDEFINED, token2);
mOrganizer.onTaskAppeared(task2, null); mOrganizer.onTaskAppeared(task2, null);
RunningTaskInfo otherDisplayTask = createTaskInfo(3, WINDOWING_MODE_UNDEFINED);
otherDisplayTask.displayId = 2;
MockToken otherDisplayToken = new MockToken(); MockToken otherDisplayToken = new MockToken();
otherDisplayTask.token = otherDisplayToken.token(); RunningTaskInfo otherDisplayTask = createTaskInfo(3, WINDOWING_MODE_UNDEFINED,
otherDisplayToken);
otherDisplayTask.displayId = 2;
mOrganizer.onTaskAppeared(otherDisplayTask, null); mOrganizer.onTaskAppeared(otherDisplayTask, null);
WindowContainerTransaction wct = mOrganizer.prepareClearBoundsForTasks(1); WindowContainerTransaction wct = mOrganizer.prepareClearBoundsForStandardTasks(1);
assertEquals(wct.getChanges().size(), 2); assertEquals(wct.getChanges().size(), 2);
Change boundsChange1 = wct.getChanges().get(token1.binder()); Change boundsChange1 = wct.getChanges().get(token1.binder());
@@ -673,26 +671,40 @@ public class ShellTaskOrganizerTests extends ShellTestCase {
} }
@Test @Test
public void testPrepareClearFreeformForTasks() { public void testPrepareClearBoundsForStandardTasks_onlyClearActivityTypeStandard() {
RunningTaskInfo task1 = createTaskInfo(1, WINDOWING_MODE_FREEFORM);
task1.displayId = 1;
MockToken token1 = new MockToken(); MockToken token1 = new MockToken();
task1.token = token1.token(); RunningTaskInfo task1 = createTaskInfo(1, WINDOWING_MODE_UNDEFINED, token1);
mOrganizer.onTaskAppeared(task1, null); mOrganizer.onTaskAppeared(task1, null);
RunningTaskInfo task2 = createTaskInfo(2, WINDOWING_MODE_MULTI_WINDOW);
task2.displayId = 1;
MockToken token2 = new MockToken(); MockToken token2 = new MockToken();
task2.token = token2.token(); RunningTaskInfo task2 = createTaskInfo(2, WINDOWING_MODE_UNDEFINED, token2);
task2.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_HOME);
mOrganizer.onTaskAppeared(task2, null);
WindowContainerTransaction wct = mOrganizer.prepareClearBoundsForStandardTasks(1);
// Only clear bounds for task1
assertEquals(1, wct.getChanges().size());
assertNotNull(wct.getChanges().get(token1.binder()));
}
@Test
public void testPrepareClearFreeformForStandardTasks() {
MockToken token1 = new MockToken();
RunningTaskInfo task1 = createTaskInfo(1, WINDOWING_MODE_FREEFORM, token1);
mOrganizer.onTaskAppeared(task1, null);
MockToken token2 = new MockToken();
RunningTaskInfo task2 = createTaskInfo(2, WINDOWING_MODE_MULTI_WINDOW, token2);
mOrganizer.onTaskAppeared(task2, null); mOrganizer.onTaskAppeared(task2, null);
RunningTaskInfo otherDisplayTask = createTaskInfo(3, WINDOWING_MODE_FREEFORM);
otherDisplayTask.displayId = 2;
MockToken otherDisplayToken = new MockToken(); MockToken otherDisplayToken = new MockToken();
otherDisplayTask.token = otherDisplayToken.token(); RunningTaskInfo otherDisplayTask = createTaskInfo(3, WINDOWING_MODE_FREEFORM,
otherDisplayToken);
otherDisplayTask.displayId = 2;
mOrganizer.onTaskAppeared(otherDisplayTask, null); mOrganizer.onTaskAppeared(otherDisplayTask, null);
WindowContainerTransaction wct = mOrganizer.prepareClearFreeformForTasks(1); WindowContainerTransaction wct = mOrganizer.prepareClearFreeformForStandardTasks(1);
// Only task with freeform windowing mode and the right display should be updated // Only task with freeform windowing mode and the right display should be updated
assertEquals(wct.getChanges().size(), 1); assertEquals(wct.getChanges().size(), 1);
@@ -701,6 +713,24 @@ public class ShellTaskOrganizerTests extends ShellTestCase {
assertEquals(wmModeChange1.getWindowingMode(), WINDOWING_MODE_UNDEFINED); assertEquals(wmModeChange1.getWindowingMode(), WINDOWING_MODE_UNDEFINED);
} }
@Test
public void testPrepareClearFreeformForStandardTasks_onlyClearActivityTypeStandard() {
MockToken token1 = new MockToken();
RunningTaskInfo task1 = createTaskInfo(1, WINDOWING_MODE_FREEFORM, token1);
mOrganizer.onTaskAppeared(task1, null);
MockToken token2 = new MockToken();
RunningTaskInfo task2 = createTaskInfo(2, WINDOWING_MODE_FREEFORM, token2);
task2.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_HOME);
mOrganizer.onTaskAppeared(task2, null);
WindowContainerTransaction wct = mOrganizer.prepareClearFreeformForStandardTasks(1);
// Only clear freeform for task1
assertEquals(1, wct.getChanges().size());
assertNotNull(wct.getChanges().get(token1.binder()));
}
private static RunningTaskInfo createTaskInfo(int taskId, int windowingMode) { private static RunningTaskInfo createTaskInfo(int taskId, int windowingMode) {
RunningTaskInfo taskInfo = new RunningTaskInfo(); RunningTaskInfo taskInfo = new RunningTaskInfo();
taskInfo.taskId = taskId; taskInfo.taskId = taskId;
@@ -708,6 +738,14 @@ public class ShellTaskOrganizerTests extends ShellTestCase {
return taskInfo; return taskInfo;
} }
private static RunningTaskInfo createTaskInfo(int taskId, int windowingMode, MockToken token) {
RunningTaskInfo taskInfo = createTaskInfo(taskId, windowingMode);
taskInfo.displayId = 1;
taskInfo.token = token.token();
taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_STANDARD);
return taskInfo;
}
private static class MockToken { private static class MockToken {
private final WindowContainerToken mToken; private final WindowContainerToken mToken;
private final IBinder mBinder; private final IBinder mBinder;

View File

@@ -88,8 +88,8 @@ public class DesktopModeControllerTest extends ShellTestCase {
WindowContainerTransaction taskWct = new WindowContainerTransaction(); WindowContainerTransaction taskWct = new WindowContainerTransaction();
MockToken taskMockToken = new MockToken(); MockToken taskMockToken = new MockToken();
taskWct.setWindowingMode(taskMockToken.token(), WINDOWING_MODE_UNDEFINED); taskWct.setWindowingMode(taskMockToken.token(), WINDOWING_MODE_UNDEFINED);
when(mShellTaskOrganizer.prepareClearFreeformForTasks(mContext.getDisplayId())).thenReturn( when(mShellTaskOrganizer.prepareClearFreeformForStandardTasks(
taskWct); mContext.getDisplayId())).thenReturn(taskWct);
// Create a fake WCT to simulate setting display windowing mode to freeform // Create a fake WCT to simulate setting display windowing mode to freeform
WindowContainerTransaction displayWct = new WindowContainerTransaction(); WindowContainerTransaction displayWct = new WindowContainerTransaction();
@@ -126,15 +126,15 @@ public class DesktopModeControllerTest extends ShellTestCase {
WindowContainerTransaction taskWmWct = new WindowContainerTransaction(); WindowContainerTransaction taskWmWct = new WindowContainerTransaction();
MockToken taskWmMockToken = new MockToken(); MockToken taskWmMockToken = new MockToken();
taskWmWct.setWindowingMode(taskWmMockToken.token(), WINDOWING_MODE_UNDEFINED); taskWmWct.setWindowingMode(taskWmMockToken.token(), WINDOWING_MODE_UNDEFINED);
when(mShellTaskOrganizer.prepareClearFreeformForTasks(mContext.getDisplayId())).thenReturn( when(mShellTaskOrganizer.prepareClearFreeformForStandardTasks(
taskWmWct); mContext.getDisplayId())).thenReturn(taskWmWct);
// Create a fake WCT to simulate clearing task bounds // Create a fake WCT to simulate clearing task bounds
WindowContainerTransaction taskBoundsWct = new WindowContainerTransaction(); WindowContainerTransaction taskBoundsWct = new WindowContainerTransaction();
MockToken taskBoundsMockToken = new MockToken(); MockToken taskBoundsMockToken = new MockToken();
taskBoundsWct.setBounds(taskBoundsMockToken.token(), null); taskBoundsWct.setBounds(taskBoundsMockToken.token(), null);
when(mShellTaskOrganizer.prepareClearBoundsForTasks(mContext.getDisplayId())).thenReturn( when(mShellTaskOrganizer.prepareClearBoundsForStandardTasks(
taskBoundsWct); mContext.getDisplayId())).thenReturn(taskBoundsWct);
// Create a fake WCT to simulate setting display windowing mode to fullscreen // Create a fake WCT to simulate setting display windowing mode to fullscreen
WindowContainerTransaction displayWct = new WindowContainerTransaction(); WindowContainerTransaction displayWct = new WindowContainerTransaction();