diff options
| author | 2023-11-29 20:00:41 +0000 | |
|---|---|---|
| committer | 2023-12-08 11:40:02 -0800 | |
| commit | e268f3fb26f23f99ea3f70b7158bc42ee764acb7 (patch) | |
| tree | caf871bdd553a24e8e89b2d6fe16baa8af9e5c44 | |
| parent | 3d182295ab53cb2e4c50a2d90bed8154cf8bc264 (diff) | |
Add home task container overlay
Test: Verified the flow in Launcher
Bug: 273828110
Change-Id: Idba36284b6030070d2f650fdb50a93215b5d9dbf
5 files changed, 63 insertions, 9 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java index b1b196d40357..fe65fdd30e48 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java @@ -16,6 +16,7 @@ package com.android.wm.shell; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; @@ -168,6 +169,13 @@ public class ShellTaskOrganizer extends TaskOrganizer implements private final Object mLock = new Object(); private StartingWindowController mStartingWindow; + /** Overlay surface for home root task */ + private final SurfaceControl mHomeTaskOverlayContainer = new SurfaceControl.Builder() + .setName("home_task_overlay_container") + .setContainerLayer() + .setHidden(false) + .build(); + /** * In charge of showing compat UI. Can be {@code null} if the device doesn't support size * compat or if this isn't the main {@link ShellTaskOrganizer}. @@ -428,6 +436,14 @@ public class ShellTaskOrganizer extends TaskOrganizer implements } } + /** + * Returns a surface which can be used to attach overlays to the home root task + */ + @NonNull + public SurfaceControl getHomeTaskOverlayContainer() { + return mHomeTaskOverlayContainer; + } + @Override public void addStartingWindow(StartingWindowInfo info) { if (mStartingWindow != null) { @@ -485,6 +501,15 @@ public class ShellTaskOrganizer extends TaskOrganizer implements if (mUnfoldAnimationController != null) { mUnfoldAnimationController.onTaskAppeared(info.getTaskInfo(), info.getLeash()); } + + if (info.getTaskInfo().getActivityType() == ACTIVITY_TYPE_HOME) { + ProtoLog.v(WM_SHELL_TASK_ORG, "Adding overlay to home task"); + final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); + t.setLayer(mHomeTaskOverlayContainer, Integer.MAX_VALUE); + t.reparent(mHomeTaskOverlayContainer, info.getLeash()); + t.apply(); + } + notifyLocusVisibilityIfNeeded(info.getTaskInfo()); notifyCompatUI(info.getTaskInfo(), listener); mRecentTasks.ifPresent(recentTasks -> recentTasks.onTaskAdded(info.getTaskInfo())); @@ -579,6 +604,12 @@ public class ShellTaskOrganizer extends TaskOrganizer implements notifyCompatUI(taskInfo, null /* taskListener */); // Notify the recent tasks that a task has been removed mRecentTasks.ifPresent(recentTasks -> recentTasks.onTaskRemoved(taskInfo)); + if (taskInfo.getActivityType() == ACTIVITY_TYPE_HOME) { + SurfaceControl.Transaction t = new SurfaceControl.Transaction(); + t.reparent(mHomeTaskOverlayContainer, null); + t.apply(); + ProtoLog.v(WM_SHELL_TASK_ORG, "Removing overlay surface"); + } if (!ENABLE_SHELL_TRANSITIONS && (appearedInfo.getLeash() != null)) { // Preemptively clean up the leash only if shell transitions are not enabled diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl index 644a6a5114a7..7f4a8f1d476a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl @@ -16,6 +16,7 @@ package com.android.wm.shell.transition; +import android.view.SurfaceControl; import android.window.RemoteTransition; import android.window.TransitionFilter; @@ -42,6 +43,13 @@ interface IShellTransitions { */ IBinder getShellApplyToken() = 3; - /** Set listener that will receive callbacks about transitions involving home activity */ + /** + * Set listener that will receive callbacks about transitions involving home activity. + */ oneway void setHomeTransitionListener(in IHomeTransitionListener listener) = 4; + + /** + * Returns a container surface for the home root task. + */ + SurfaceControl getHomeTaskOverlayContainer() = 5; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index b98762d5e104..af69b5272ad5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -64,7 +64,6 @@ import android.window.TransitionInfo; import android.window.TransitionMetrics; import android.window.TransitionRequestInfo; import android.window.WindowContainerTransaction; -import android.window.WindowOrganizer; import androidx.annotation.BinderThread; @@ -72,6 +71,7 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.RootTaskDisplayAreaOrganizer; +import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ExternalInterfaceBinder; import com.android.wm.shell.common.RemoteCallable; @@ -172,7 +172,7 @@ public class Transitions implements RemoteCallable<Transitions>, /** Transition to animate task to desktop. */ public static final int TRANSIT_MOVE_TO_DESKTOP = WindowManager.TRANSIT_FIRST_CUSTOM + 15; - private final WindowOrganizer mOrganizer; + private final ShellTaskOrganizer mOrganizer; private final Context mContext; private final ShellExecutor mMainExecutor; private final ShellExecutor mAnimExecutor; @@ -264,7 +264,7 @@ public class Transitions implements RemoteCallable<Transitions>, public Transitions(@NonNull Context context, @NonNull ShellInit shellInit, @NonNull ShellController shellController, - @NonNull WindowOrganizer organizer, + @NonNull ShellTaskOrganizer organizer, @NonNull TransactionPool pool, @NonNull DisplayController displayController, @NonNull ShellExecutor mainExecutor, @@ -280,7 +280,7 @@ public class Transitions implements RemoteCallable<Transitions>, @NonNull ShellInit shellInit, @Nullable ShellCommandHandler shellCommandHandler, @NonNull ShellController shellController, - @NonNull WindowOrganizer organizer, + @NonNull ShellTaskOrganizer organizer, @NonNull TransactionPool pool, @NonNull DisplayController displayController, @NonNull ShellExecutor mainExecutor, @@ -1240,6 +1240,10 @@ public class Transitions implements RemoteCallable<Transitions>, } } + private SurfaceControl getHomeTaskOverlayContainer() { + return mOrganizer.getHomeTaskOverlayContainer(); + } + /** * Interface for a callback that must be called after a TransitionHandler finishes playing an * animation. @@ -1470,6 +1474,17 @@ public class Transitions implements RemoteCallable<Transitions>, listener); }); } + + @Override + public SurfaceControl getHomeTaskOverlayContainer() { + SurfaceControl[] result = new SurfaceControl[1]; + executeRemoteCallWithTaskPermission(mTransitions, "getHomeTaskOverlayContainer", + (controller) -> { + result[0] = controller.getHomeTaskOverlayContainer(); + }, true /* blocking */); + // Return a copy as writing to parcel releases the original surface + return new SurfaceControl(result[0], "Transitions.HomeOverlay"); + } } private class SettingsObserver extends ContentObserver { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java index 421c44511a54..97530ab1f3c3 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java @@ -40,12 +40,12 @@ import android.os.RemoteException; import android.view.SurfaceControl; import android.window.TransitionInfo; import android.window.TransitionInfo.TransitionMode; -import android.window.WindowOrganizer; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; +import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestShellExecutor; import com.android.wm.shell.common.DisplayController; @@ -68,7 +68,7 @@ import java.util.List; @RunWith(AndroidJUnit4.class) public class HomeTransitionObserverTest extends ShellTestCase { - private final WindowOrganizer mOrganizer = mock(WindowOrganizer.class); + private final ShellTaskOrganizer mOrganizer = mock(ShellTaskOrganizer.class); private final TransactionPool mTransactionPool = mock(TransactionPool.class); private final Context mContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java index 01c9bd0cb9f7..e22bf3de30e4 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java @@ -87,7 +87,6 @@ import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; -import android.window.WindowOrganizer; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -98,6 +97,7 @@ import androidx.test.platform.app.InstrumentationRegistry; import com.android.internal.R; import com.android.internal.policy.TransitionAnimation; import com.android.wm.shell.RootTaskDisplayAreaOrganizer; +import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestShellExecutor; import com.android.wm.shell.common.DisplayController; @@ -130,7 +130,7 @@ import java.util.function.Function; @RunWith(AndroidJUnit4.class) public class ShellTransitionTests extends ShellTestCase { - private final WindowOrganizer mOrganizer = mock(WindowOrganizer.class); + private final ShellTaskOrganizer mOrganizer = mock(ShellTaskOrganizer.class); private final TransactionPool mTransactionPool = mock(TransactionPool.class); private final Context mContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); |