Limit freeform to front for freeform task launches

When freeform tasks are visible and user attempts to go home, it
triggers a TRANSIT_OPEN transition with target as home screen.
Our current logic checks for TRANSIT_OPEN and brings all freeform apps
to front when this is detected.
Limit bringing freeform apps to front only if a freeform task launches.
Otherwise skip.

Bug: 254736507
Test: atest DesktopModeControllerTest
Change-Id: Ib1ec6449e5236d6e34efdad277fb35bfda7bd068
This commit is contained in:
Ats Jenk
2022-10-20 16:56:29 -07:00
parent 1de186f84a
commit 40828e9713
2 changed files with 57 additions and 3 deletions

View File

@@ -237,11 +237,23 @@ public class DesktopModeController implements RemoteCallable<DesktopModeControll
@Override
public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
@NonNull TransitionRequestInfo request) {
// Only do anything if we are in desktop mode and opening a task/app
if (!DesktopModeStatus.isActive(mContext) || request.getType() != TRANSIT_OPEN) {
// Only do anything if we are in desktop mode and opening a task/app in freeform
if (!DesktopModeStatus.isActive(mContext)) {
ProtoLog.d(WM_SHELL_DESKTOP_MODE,
"skip shell transition request: desktop mode not active");
return null;
}
if (request.getType() != TRANSIT_OPEN) {
ProtoLog.d(WM_SHELL_DESKTOP_MODE,
"skip shell transition request: only supports TRANSIT_OPEN");
return null;
}
if (request.getTriggerTask() == null
|| request.getTriggerTask().getWindowingMode() != WINDOWING_MODE_FREEFORM) {
ProtoLog.d(WM_SHELL_DESKTOP_MODE, "skip shell transition request: not freeform task");
return null;
}
ProtoLog.d(WM_SHELL_DESKTOP_MODE, "handle shell transition request: %s", request);
WindowContainerTransaction wct = mTransitions.dispatchRequest(transition, request, this);
if (wct == null) {

View File

@@ -20,6 +20,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOW_CONFIG_BOUNDS;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_FRONT;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REORDER;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
@@ -35,10 +37,12 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.testing.AndroidTestingRunner;
import android.window.DisplayAreaInfo;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
import android.window.WindowContainerTransaction.Change;
@@ -243,6 +247,44 @@ public class DesktopModeControllerTest extends ShellTestCase {
assertThat(op2.getContainer()).isEqualTo(token2.binder());
}
@Test
public void testHandleTransitionRequest_desktopModeNotActive_returnsNull() {
when(DesktopModeStatus.isActive(any())).thenReturn(false);
WindowContainerTransaction wct = mController.handleRequest(
new Binder(),
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */));
assertThat(wct).isNull();
}
@Test
public void testHandleTransitionRequest_notTransitOpen_returnsNull() {
WindowContainerTransaction wct = mController.handleRequest(
new Binder(),
new TransitionRequestInfo(TRANSIT_TO_FRONT, null /* trigger */, null /* remote */));
assertThat(wct).isNull();
}
@Test
public void testHandleTransitionRequest_notFreeform_returnsNull() {
ActivityManager.RunningTaskInfo trigger = new ActivityManager.RunningTaskInfo();
trigger.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
WindowContainerTransaction wct = mController.handleRequest(
new Binder(),
new TransitionRequestInfo(TRANSIT_TO_FRONT, trigger, null /* remote */));
assertThat(wct).isNull();
}
@Test
public void testHandleTransitionRequest_returnsWct() {
ActivityManager.RunningTaskInfo trigger = new ActivityManager.RunningTaskInfo();
trigger.token = new MockToken().mToken;
trigger.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
WindowContainerTransaction wct = mController.handleRequest(
mock(IBinder.class),
new TransitionRequestInfo(TRANSIT_OPEN, trigger, null /* remote */));
assertThat(wct).isNotNull();
}
private static class MockToken {
private final WindowContainerToken mToken;
private final IBinder mBinder;