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

Commit 5b2eb450 authored by Matt Sziklay's avatar Matt Sziklay
Browse files

Allow tasks to specify behavior on parent removal.

Adds mReparentOnParentRemoval to determine whether a Task will reparent to another display area when its parent is removed. This value can be specified when creating a root task.

Bug: 391652399
Test: Manual; disconnect displays containing task with flag set.
Flag: com.android.window.flags.enable_display_disconnect_interaction
Change-Id: I1a27776d519d8930f1412497afc19eab54edc29c
parent 8b52e795
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -46,7 +46,7 @@ interface ITaskOrganizerController {
    * {@link WindowContainerTransaction#removeRootTask}.
    * {@link WindowContainerTransaction#removeRootTask}.
    */
    */
    void createRootTask(int displayId, int windowingMode, IBinder launchCookie,
    void createRootTask(int displayId, int windowingMode, IBinder launchCookie,
            boolean removeWithTaskOrganizer);
            boolean removeWithTaskOrganizer, boolean reparentOnDisplayRemoval);


    /** Deletes a persistent root task in WM */
    /** Deletes a persistent root task in WM */
    boolean deleteRootTask(in WindowContainerToken task);
    boolean deleteRootTask(in WindowContainerToken task);
+6 −3
Original line number Original line Diff line number Diff line
@@ -149,14 +149,16 @@ public class TaskOrganizer extends WindowOrganizer {
     * @param launchCookie Launch cookie to associate with the task so that is can be identified
     * @param launchCookie Launch cookie to associate with the task so that is can be identified
     *                     when the {@link ITaskOrganizer#onTaskAppeared} callback is called.
     *                     when the {@link ITaskOrganizer#onTaskAppeared} callback is called.
     * @param removeWithTaskOrganizer True if this task should be removed when organizer destroyed.
     * @param removeWithTaskOrganizer True if this task should be removed when organizer destroyed.
     * @param reparentOnDisplayRemoval True if this task should be reparented when its display
     *                                is removed.
     * @hide
     * @hide
     */
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
    public void createRootTask(int displayId, int windowingMode, @Nullable IBinder launchCookie,
    public void createRootTask(int displayId, int windowingMode, @Nullable IBinder launchCookie,
            boolean removeWithTaskOrganizer) {
            boolean removeWithTaskOrganizer, boolean reparentOnDisplayRemoval) {
        try {
        try {
            mTaskOrganizerController.createRootTask(displayId, windowingMode, launchCookie,
            mTaskOrganizerController.createRootTask(displayId, windowingMode, launchCookie,
                    removeWithTaskOrganizer);
                    removeWithTaskOrganizer, reparentOnDisplayRemoval);
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
        }
        }
@@ -172,7 +174,8 @@ public class TaskOrganizer extends WindowOrganizer {
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
    @Nullable
    @Nullable
    public void createRootTask(int displayId, int windowingMode, @Nullable IBinder launchCookie) {
    public void createRootTask(int displayId, int windowingMode, @Nullable IBinder launchCookie) {
        createRootTask(displayId, windowingMode, launchCookie, false /* removeWithTaskOrganizer */);
        createRootTask(displayId, windowingMode, launchCookie, false /* removeWithTaskOrganizer */,
                false /* reparentOnDisplayRemoval */);
    }
    }


    /** Deletes a persistent root task in WM */
    /** Deletes a persistent root task in WM */
+16 −1
Original line number Original line Diff line number Diff line
@@ -309,11 +309,26 @@ public class ShellTaskOrganizer extends TaskOrganizer {
     */
     */
    public void createRootTask(int displayId, int windowingMode, TaskListener listener,
    public void createRootTask(int displayId, int windowingMode, TaskListener listener,
            boolean removeWithTaskOrganizer) {
            boolean removeWithTaskOrganizer) {
        createRootTask(displayId, windowingMode, listener, removeWithTaskOrganizer,
                false /* reparentOnDisplayRemoval */);
    }

    /**
     * Creates a persistent root task in WM for a particular windowing-mode.
     * @param displayId The display to create the root task on.
     * @param windowingMode Windowing mode to put the root task in.
     * @param listener The listener to get the created task callback.
     * @param removeWithTaskOrganizer True if this task should be removed when organizer destroyed.
     * @param reparentOnDisplayRemoval True if this task should be reparented on display removal.
     */
    public void createRootTask(int displayId, int windowingMode, TaskListener listener,
            boolean removeWithTaskOrganizer, boolean reparentOnDisplayRemoval) {
        ProtoLog.v(WM_SHELL_TASK_ORG, "createRootTask() displayId=%d winMode=%d listener=%s" ,
        ProtoLog.v(WM_SHELL_TASK_ORG, "createRootTask() displayId=%d winMode=%d listener=%s" ,
                displayId, windowingMode, listener.toString());
                displayId, windowingMode, listener.toString());
        final IBinder cookie = new Binder();
        final IBinder cookie = new Binder();
        setPendingLaunchCookieListener(cookie, listener);
        setPendingLaunchCookieListener(cookie, listener);
        super.createRootTask(displayId, windowingMode, cookie, removeWithTaskOrganizer);
        super.createRootTask(displayId, windowingMode, cookie, removeWithTaskOrganizer,
                reparentOnDisplayRemoval);
    }
    }


    /**
    /**
+6 −0
Original line number Original line Diff line number Diff line
@@ -146,6 +146,9 @@ class RootTaskDesksOrganizer(
            WINDOWING_MODE_FREEFORM,
            WINDOWING_MODE_FREEFORM,
            /* listener = */ this,
            /* listener = */ this,
            /* removeWithTaskOrganizer = */ true,
            /* removeWithTaskOrganizer = */ true,
            /* reparentOnDisplayRemoval = */ DesktopExperienceFlags
                .ENABLE_DISPLAY_DISCONNECT_INTERACTION
                .isTrue,
        )
        )
    }
    }


@@ -513,6 +516,9 @@ class RootTaskDesksOrganizer(
            WINDOWING_MODE_FREEFORM,
            WINDOWING_MODE_FREEFORM,
            /* listener = */ this,
            /* listener = */ this,
            /* removeWithTaskOrganizer = */ true,
            /* removeWithTaskOrganizer = */ true,
            /* reparentOnDisplayRemoval = */ DesktopExperienceFlags
                .ENABLE_DISPLAY_DISCONNECT_INTERACTION
                .isTrue,
        )
        )
    }
    }


+17 −2
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import android.testing.AndroidTestingRunner
import android.view.Display.DEFAULT_DISPLAY
import android.view.Display.DEFAULT_DISPLAY
import android.view.SurfaceControl
import android.view.SurfaceControl
import android.view.WindowManager.TRANSIT_TO_FRONT
import android.view.WindowManager.TRANSIT_TO_FRONT
import android.window.DesktopExperienceFlags
import android.window.DisplayAreaInfo
import android.window.DisplayAreaInfo
import android.window.TransitionInfo
import android.window.TransitionInfo
import android.window.WindowContainerToken
import android.window.WindowContainerToken
@@ -235,7 +236,13 @@ class RootTaskDesksOrganizerTest : ShellTestCase() {


        // Only one desk attempt.
        // Only one desk attempt.
        verify(mockShellTaskOrganizer, times(1))
        verify(mockShellTaskOrganizer, times(1))
            .createRootTask(displayId, WINDOWING_MODE_FREEFORM, organizer, true)
            .createRootTask(
                displayId,
                WINDOWING_MODE_FREEFORM,
                organizer,
                true,
                DesktopExperienceFlags.ENABLE_DISPLAY_DISCONNECT_INTERACTION.isTrue,
            )
    }
    }


    @Test
    @Test
@@ -248,7 +255,13 @@ class RootTaskDesksOrganizerTest : ShellTestCase() {


        // One for the warmup/first desk and one for the second desk.
        // One for the warmup/first desk and one for the second desk.
        verify(mockShellTaskOrganizer, times(2))
        verify(mockShellTaskOrganizer, times(2))
            .createRootTask(displayId, WINDOWING_MODE_FREEFORM, organizer, true)
            .createRootTask(
                displayId,
                WINDOWING_MODE_FREEFORM,
                organizer,
                true,
                DesktopExperienceFlags.ENABLE_DISPLAY_DISCONNECT_INTERACTION.isTrue,
            )
    }
    }


    @Test
    @Test
@@ -938,6 +951,7 @@ class RootTaskDesksOrganizerTest : ShellTestCase() {
                    WINDOWING_MODE_FREEFORM,
                    WINDOWING_MODE_FREEFORM,
                    organizer,
                    organizer,
                    true,
                    true,
                    DesktopExperienceFlags.ENABLE_DISPLAY_DISCONNECT_INTERACTION.isTrue,
                )
                )
            )
            )
            .thenAnswer { invocation ->
            .thenAnswer { invocation ->
@@ -972,6 +986,7 @@ class RootTaskDesksOrganizerTest : ShellTestCase() {
                    WINDOWING_MODE_FREEFORM,
                    WINDOWING_MODE_FREEFORM,
                    organizer,
                    organizer,
                    true,
                    true,
                    DesktopExperienceFlags.ENABLE_DISPLAY_DISCONNECT_INTERACTION.isTrue,
                )
                )
            )
            )
            .thenAnswer { invocation ->
            .thenAnswer { invocation ->
Loading