Loading libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerTest.kt +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -199,6 +200,7 @@ class BubbleControllerTest(flags: FlagsParameterization) { ShellTaskOrganizer( mock<ShellInit>(), ShellCommandHandler(), mock<RootTaskDisplayAreaOrganizer>(), null, Optional.empty(), Optional.empty(), Loading libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IShellTransitions.aidl +6 −0 Original line number Diff line number Diff line Loading @@ -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; } libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +75 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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}, Loading @@ -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; Loading @@ -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, Loading @@ -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); Loading Loading @@ -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 */ Loading Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -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 + " "; Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +2 −0 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -276,6 +277,7 @@ public abstract class WMShellBaseModule { return new ShellTaskOrganizer( shellInit, shellCommandHandler, rootTaskDisplayAreaOrganizer, compatUI.orElse(null), unfoldAnimationController, recentTasksOptional, Loading libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +20 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 Loading
libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerTest.kt +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -199,6 +200,7 @@ class BubbleControllerTest(flags: FlagsParameterization) { ShellTaskOrganizer( mock<ShellInit>(), ShellCommandHandler(), mock<RootTaskDisplayAreaOrganizer>(), null, Optional.empty(), Optional.empty(), Loading
libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IShellTransitions.aidl +6 −0 Original line number Diff line number Diff line Loading @@ -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; }
libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +75 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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}, Loading @@ -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; Loading @@ -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, Loading @@ -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); Loading Loading @@ -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 */ Loading Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -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 + " "; Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +2 −0 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -276,6 +277,7 @@ public abstract class WMShellBaseModule { return new ShellTaskOrganizer( shellInit, shellCommandHandler, rootTaskDisplayAreaOrganizer, compatUI.orElse(null), unfoldAnimationController, recentTasksOptional, Loading
libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +20 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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