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

Commit 043331cf authored by Randy Pfohl's avatar Randy Pfohl Committed by Android (Google) Code Review
Browse files

Merge "Creating a OverviewOverlayLayer per display" into main

parents 32de032c eda70f92
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ import com.android.wm.shell.Flags.FLAG_ENABLE_BUBBLE_BAR
import com.android.wm.shell.Flags.FLAG_ENABLE_BUBBLE_BAR_TO_FLOATING_TRANSITION
import com.android.wm.shell.Flags.FLAG_ENABLE_CREATE_ANY_BUBBLE
import com.android.wm.shell.R
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.bubbles.Bubbles.BubbleExpandListener
import com.android.wm.shell.bubbles.Bubbles.DISMISS_USER_GESTURE
@@ -199,6 +200,7 @@ class BubbleControllerTest(flags: FlagsParameterization) {
            ShellTaskOrganizer(
                mock<ShellInit>(),
                ShellCommandHandler(),
                mock<RootTaskDisplayAreaOrganizer>(),
                null,
                Optional.empty(),
                Optional.empty(),
+6 −0
Original line number Diff line number Diff line
@@ -65,4 +65,10 @@ interface IShellTransitions {
     * Set listener that will receive callbacks about transitions involving focus switch.
     */
    oneway void setFocusTransitionListener(in IFocusTransitionListener listener) = 7;

    /**
     * Returns a container surface for the overview overlay.
     */
    @nullable
    SurfaceControl getOverviewOverlayContainer(int displayId) = 8;
}
+75 −2
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ import android.window.WindowContainerTransactionCallback;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.ProtoLog;
import com.android.internal.util.FrameworkStatsLog;
import com.android.launcher3.Flags;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.compatui.CompatUIController;
import com.android.wm.shell.compatui.api.CompatUIHandler;
@@ -250,7 +251,13 @@ public class ShellTaskOrganizer extends TaskOrganizer {
            .build();

    /**
     * In charge of showing compat UI. Can be {@code null} if the device doesn't support size
     * Overlay surface for overview. Attached to the display area per display and will be used
     * to put overview overlays above the home task.
     */
    private final SparseArray<SurfaceControl> mOverviewOverlayLeashes = new SparseArray<>();

    /**
     * In charge of showing compat UI. Can be {@code null} if the device doesn't support sizef
     * compat or if this isn't the main {@link ShellTaskOrganizer}.
     *
     * <p>NOTE: only the main {@link ShellTaskOrganizer} should have a {@link CompatUIHandler},
@@ -262,6 +269,9 @@ public class ShellTaskOrganizer extends TaskOrganizer {
    @NonNull
    private final ShellCommandHandler mShellCommandHandler;

    @NonNull
    private final RootTaskDisplayAreaOrganizer mRootTaskDisplayAreaOrganizer;

    @Nullable
    private final Optional<RecentTasksController> mRecentTasks;

@@ -281,17 +291,20 @@ public class ShellTaskOrganizer extends TaskOrganizer {

    public ShellTaskOrganizer(ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            @Nullable CompatUIHandler compatUI,
            Optional<UnfoldAnimationController> unfoldAnimationController,
            Optional<RecentTasksController> recentTasks,
            ShellExecutor mainExecutor) {
        this(shellInit, shellCommandHandler, null /* taskOrganizerController */, compatUI,
        this(shellInit, shellCommandHandler, rootTaskDisplayAreaOrganizer,
                null /* taskOrganizerController */, compatUI,
                unfoldAnimationController, recentTasks, mainExecutor);
    }

    @VisibleForTesting
    protected ShellTaskOrganizer(ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            RootTaskDisplayAreaOrganizer rootDisplayAreaOrganizer,
            ITaskOrganizerController taskOrganizerController,
            @Nullable CompatUIHandler compatUI,
            Optional<UnfoldAnimationController> unfoldAnimationController,
@@ -299,6 +312,7 @@ public class ShellTaskOrganizer extends TaskOrganizer {
            ShellExecutor mainExecutor) {
        super(taskOrganizerController, mainExecutor);
        mShellCommandHandler = shellCommandHandler;
        mRootTaskDisplayAreaOrganizer = rootDisplayAreaOrganizer;
        mCompatUI = compatUI;
        mRecentTasks = recentTasks;
        mUnfoldAnimationController = unfoldAnimationController.orElse(null);
@@ -656,6 +670,35 @@ public class ShellTaskOrganizer extends TaskOrganizer {
        }
    }

    /**
     * Returns a surface which can be used to attach overview overlays above home root task
     */
    @Nullable
    public SurfaceControl getOverviewOverlayContainer(int displayId) {
        return mOverviewOverlayLeashes.get(displayId);
    }

    /**
     * Returns or creates a surface which can be used to attach overlays to the home root task
     */
    private SurfaceControl getOrCreateOverviewOverlayContainer(int displayId) {
        if (!isOverviewOverlayEnabled(displayId)) {
            return null;
        }
        if (!mOverviewOverlayLeashes.contains(displayId)
                && Flags.enableOverviewOnConnectedDisplays()) {
            SurfaceControl.Builder builder = new SurfaceControl.Builder()
                    .setName("overview_overlay_container")
                    .setContainerLayer()
                    .setHidden(false)
                    .setCallsite("ShellTaskOrganizer.mOverviewOverlayLeashes");

            mRootTaskDisplayAreaOrganizer.attachToDisplayArea(displayId, builder);
            mOverviewOverlayLeashes.put(displayId, builder.build());
        }
        return mOverviewOverlayLeashes.get(displayId);
    }

    /**
     * Returns a surface which can be used to attach overlays to the home root task
     */
@@ -737,6 +780,17 @@ public class ShellTaskOrganizer extends TaskOrganizer {
            mUnfoldAnimationController.onTaskAppeared(info.getTaskInfo(), info.getLeash());
        }

        int displayId = info.getTaskInfo().displayId;
        if (isOverviewOverlayEnabled(displayId)
                && info.getTaskInfo().getActivityType() == ACTIVITY_TYPE_HOME) {
            ProtoLog.v(WM_SHELL_TASK_ORG,
                    "Adding overview overlay to home task on displayId=%d", displayId);
            SurfaceControl overviewOverlay = getOrCreateOverviewOverlayContainer(displayId);
            final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
            t.setRelativeLayer(overviewOverlay, info.getLeash(), 1);
            t.apply();
        }

        if (isHomeTaskOnDefaultDisplay(info.getTaskInfo())) {
            ProtoLog.v(WM_SHELL_TASK_ORG, "Adding overlay to home task");
            final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
@@ -846,6 +900,19 @@ public class ShellTaskOrganizer extends TaskOrganizer {
            notifyCompatUI(taskInfo, null /* taskListener */);
            // Notify the recent tasks that a task has been removed
            mRecentTasks.ifPresent(recentTasks -> recentTasks.onTaskRemoved(taskInfo));

            int displayId = taskInfo.displayId;
            if (isOverviewOverlayEnabled(displayId)
                    && taskInfo.getActivityType() == ACTIVITY_TYPE_HOME
                    && mOverviewOverlayLeashes.contains(displayId)) {
                ProtoLog.v(WM_SHELL_TASK_ORG,
                        "Removing overview overlay on displayId=%d", displayId);
                SurfaceControl surfaceControl = mOverviewOverlayLeashes.removeReturnOld(displayId);
                SurfaceControl.Transaction t = new SurfaceControl.Transaction();
                t.remove(surfaceControl);
                t.apply();
            }

            if (isHomeTaskOnDefaultDisplay(taskInfo)) {
                SurfaceControl.Transaction t = new SurfaceControl.Transaction();
                t.reparent(mHomeTaskOverlayContainer, null);
@@ -1160,6 +1227,12 @@ public class ShellTaskOrganizer extends TaskOrganizer {
                && taskInfo.displayId == DEFAULT_DISPLAY;
    }

    private boolean isOverviewOverlayEnabled(int displayId) {
        return (Flags.enableLauncherOverviewInWindow()
                || Flags.enableFallbackOverviewInWindow()
                || (Flags.enableOverviewOnConnectedDisplays() && displayId != DEFAULT_DISPLAY));
    }

    public void dump(@NonNull PrintWriter pw, String prefix) {
        synchronized (mLock) {
            final String innerPrefix = prefix + "  ";
+2 −0
Original line number Diff line number Diff line
@@ -265,6 +265,7 @@ public abstract class WMShellBaseModule {
            Context context,
            ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            Optional<CompatUIHandler> compatUI,
            Optional<UnfoldAnimationController> unfoldAnimationController,
            Optional<RecentTasksController> recentTasksOptional,
@@ -276,6 +277,7 @@ public abstract class WMShellBaseModule {
        return new ShellTaskOrganizer(
                shellInit,
                shellCommandHandler,
                rootTaskDisplayAreaOrganizer,
                compatUI.orElse(null),
                unfoldAnimationController,
                recentTasksOptional,
+20 −0
Original line number Diff line number Diff line
@@ -1402,6 +1402,11 @@ public class Transitions implements RemoteCallable<Transitions>,
        return mOrganizer.getHomeTaskOverlayContainer();
    }

    @Nullable
    private SurfaceControl getOverviewOverlayContainer(int displayId) {
        return mOrganizer.getOverviewOverlayContainer(displayId);
    }

    /**
     * Interface for a callback that must be called after a TransitionHandler finishes playing an
     * animation.
@@ -1762,6 +1767,21 @@ public class Transitions implements RemoteCallable<Transitions>,
                    });
        }

        @Override
        public SurfaceControl getOverviewOverlayContainer(int displayId) {
            SurfaceControl[] result = new SurfaceControl[1];
            executeRemoteCallWithTaskPermission(mTransitions, "getOverviewOverlayContainer",
                    (controller) -> {
                        result[0] = controller.getOverviewOverlayContainer(displayId);
                    }, true /* blocking */);
            if (result[0] == null) {
                Log.wtf("WindowManagerShell", "Null overview overlay surface, "
                        + "mTransitions=%s" + (mTransitions != null) + "displayId: " + displayId);
            }
            // Return a copy as writing to parcel releases the original surface
            return new SurfaceControl(result[0], "Transitions.OverviewOverlay");
        }

        @Override
        public SurfaceControl getHomeTaskOverlayContainer() {
            SurfaceControl[] result = new SurfaceControl[1];
Loading