From 7de50009a336fc42c81ee4ff5407a059b1d51596 Mon Sep 17 00:00:00 2001 From: chaviw Date: Mon, 27 Apr 2020 12:33:30 -0700 Subject: [PATCH] Remove getLeash from WindowContainerToken If the WindowContainer was revoked from a registered organizer, the client could still call getLeash to system server and control the leash for the WindowContainer. Instead, pass the leash back to the client in onTaskAppeared and onDisplayAreaAppeared. Once the WindowContainer is revoked from the client, the leash will reference the old WindowContainer SurfaceControl and will not be able to control the WindowContainer anymore. Test: Split screen Test: DisplayAreaOrganizerTest Test: WindowOrganizerTest Bug: 154558563 Change-Id: I1f6eb987a2a3fecfef912a3009ee52989c85ff4b --- api/test-current.txt | 5 +- .../android/window/DisplayAreaOrganizer.java | 9 ++- .../android/window/IDisplayAreaOrganizer.aidl | 3 +- core/java/android/window/ITaskOrganizer.aidl | 9 ++- .../android/window/IWindowContainerToken.aidl | 5 -- core/java/android/window/TaskOrganizer.java | 8 ++- .../window/TaskOrganizerTaskEmbedder.java | 5 +- .../android/window/WindowContainerToken.java | 13 ---- .../systemui/pip/PipTaskOrganizer.java | 4 +- .../SplitScreenTaskOrganizer.java | 6 +- .../wm/DisplayAreaOrganizerController.java | 4 +- .../server/wm/TaskOrganizerController.java | 4 +- .../android/server/wm/WindowContainer.java | 10 ---- .../android/server/wm/ActivityTestsBase.java | 3 +- .../server/wm/DisplayAreaOrganizerTest.java | 8 ++- .../server/wm/WindowOrganizerTests.java | 59 +++++++++++-------- .../TaskOrganizerMultiWindowTest.java | 38 ++++++------ .../test/taskembed/TaskOrganizerPipTest.java | 15 ++--- .../com/android/test/taskembed/TaskView.java | 37 +++++------- 19 files changed, 120 insertions(+), 125 deletions(-) diff --git a/api/test-current.txt b/api/test-current.txt index 5df84ec97bf7a..bde91e38d054f 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -5283,7 +5283,7 @@ package android.window { public class DisplayAreaOrganizer extends android.window.WindowOrganizer { ctor public DisplayAreaOrganizer(); - method public void onDisplayAreaAppeared(@NonNull android.window.DisplayAreaInfo); + method public void onDisplayAreaAppeared(@NonNull android.window.DisplayAreaInfo, @NonNull android.view.SurfaceControl); method public void onDisplayAreaVanished(@NonNull android.window.DisplayAreaInfo); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void registerOrganizer(int); field public static final int FEATURE_DEFAULT_TASK_CONTAINER = 1; // 0x1 @@ -5303,7 +5303,7 @@ package android.window { method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static android.window.WindowContainerToken getImeTarget(int); method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static java.util.List getRootTasks(int, @NonNull int[]); method @BinderThread public void onBackPressedOnTaskRoot(@NonNull android.app.ActivityManager.RunningTaskInfo); - method @BinderThread public void onTaskAppeared(@NonNull android.app.ActivityManager.RunningTaskInfo); + method @BinderThread public void onTaskAppeared(@NonNull android.app.ActivityManager.RunningTaskInfo, @NonNull android.view.SurfaceControl); method @BinderThread public void onTaskInfoChanged(@NonNull android.app.ActivityManager.RunningTaskInfo); method @BinderThread public void onTaskVanished(@NonNull android.app.ActivityManager.RunningTaskInfo); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public final void registerOrganizer(int); @@ -5314,7 +5314,6 @@ package android.window { public final class WindowContainerToken implements android.os.Parcelable { method public int describeContents(); - method @Nullable public android.view.SurfaceControl getLeash(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; } diff --git a/core/java/android/window/DisplayAreaOrganizer.java b/core/java/android/window/DisplayAreaOrganizer.java index f3ef5a0c0aa26..a2fd128e22468 100644 --- a/core/java/android/window/DisplayAreaOrganizer.java +++ b/core/java/android/window/DisplayAreaOrganizer.java @@ -21,6 +21,7 @@ import android.annotation.RequiresPermission; import android.annotation.TestApi; import android.os.RemoteException; import android.util.Singleton; +import android.view.SurfaceControl; /** * Interface for WindowManager to delegate control of display areas. @@ -64,7 +65,8 @@ public class DisplayAreaOrganizer extends WindowOrganizer { } } - public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) {} + public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo, + @NonNull SurfaceControl leash) {} public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {} @@ -76,8 +78,9 @@ public class DisplayAreaOrganizer extends WindowOrganizer { private final IDisplayAreaOrganizer mInterface = new IDisplayAreaOrganizer.Stub() { @Override - public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) { - DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo); + public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo, + @NonNull SurfaceControl leash) { + DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo, leash); } @Override diff --git a/core/java/android/window/IDisplayAreaOrganizer.aidl b/core/java/android/window/IDisplayAreaOrganizer.aidl index 39a9235a42240..5e3e5e8e7d42e 100644 --- a/core/java/android/window/IDisplayAreaOrganizer.aidl +++ b/core/java/android/window/IDisplayAreaOrganizer.aidl @@ -17,13 +17,14 @@ package android.window; import android.window.DisplayAreaInfo; +import android.view.SurfaceControl; /** * Interface for WindowManager to delegate control of display areas. * {@hide} */ oneway interface IDisplayAreaOrganizer { - void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo); + void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo, in SurfaceControl leash); void onDisplayAreaVanished(in DisplayAreaInfo displayAreaInfo); void onDisplayAreaInfoChanged(in DisplayAreaInfo displayAreaInfo); } diff --git a/core/java/android/window/ITaskOrganizer.aidl b/core/java/android/window/ITaskOrganizer.aidl index b4f0162b71af4..67465252d38e3 100644 --- a/core/java/android/window/ITaskOrganizer.aidl +++ b/core/java/android/window/ITaskOrganizer.aidl @@ -25,7 +25,14 @@ import android.window.WindowContainerToken; * {@hide} */ oneway interface ITaskOrganizer { - void onTaskAppeared(in ActivityManager.RunningTaskInfo taskInfo); + /** + * A callback when the Task is available for the registered organizer. The client is responsible + * for releasing the SurfaceControl in the callback. + * + * @param taskInfo The information about the Task that's available + * @param leash A persistent leash for this Task. + */ + void onTaskAppeared(in ActivityManager.RunningTaskInfo taskInfo, in SurfaceControl leash); void onTaskVanished(in ActivityManager.RunningTaskInfo taskInfo); /** diff --git a/core/java/android/window/IWindowContainerToken.aidl b/core/java/android/window/IWindowContainerToken.aidl index 57c7abf9c7e12..81a04e9c10af4 100644 --- a/core/java/android/window/IWindowContainerToken.aidl +++ b/core/java/android/window/IWindowContainerToken.aidl @@ -24,9 +24,4 @@ import android.view.SurfaceControl; * @hide */ interface IWindowContainerToken { - - /** - * Gets a persistent leash for this container or {@code null}. - */ - SurfaceControl getLeash(); } diff --git a/core/java/android/window/TaskOrganizer.java b/core/java/android/window/TaskOrganizer.java index f661d9af59993..1f5e53369cd8f 100644 --- a/core/java/android/window/TaskOrganizer.java +++ b/core/java/android/window/TaskOrganizer.java @@ -24,6 +24,7 @@ import android.annotation.TestApi; import android.app.ActivityManager; import android.os.RemoteException; import android.util.Singleton; +import android.view.SurfaceControl; import java.util.List; @@ -59,7 +60,8 @@ public class TaskOrganizer extends WindowOrganizer { } @BinderThread - public void onTaskAppeared(@NonNull ActivityManager.RunningTaskInfo taskInfo) {} + public void onTaskAppeared(@NonNull ActivityManager.RunningTaskInfo taskInfo, + @NonNull SurfaceControl leash) {} @BinderThread public void onTaskVanished(@NonNull ActivityManager.RunningTaskInfo taskInfo) {} @@ -155,8 +157,8 @@ public class TaskOrganizer extends WindowOrganizer { private final ITaskOrganizer mInterface = new ITaskOrganizer.Stub() { @Override - public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo) { - TaskOrganizer.this.onTaskAppeared(taskInfo); + public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { + TaskOrganizer.this.onTaskAppeared(taskInfo, leash); } @Override diff --git a/core/java/android/window/TaskOrganizerTaskEmbedder.java b/core/java/android/window/TaskOrganizerTaskEmbedder.java index b63741ec69c46..2fb46509f337d 100644 --- a/core/java/android/window/TaskOrganizerTaskEmbedder.java +++ b/core/java/android/window/TaskOrganizerTaskEmbedder.java @@ -21,7 +21,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import android.app.ActivityManager; import android.app.ActivityOptions; -import android.app.TaskStackListener; import android.content.Context; import android.graphics.Rect; import android.util.Log; @@ -215,14 +214,14 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder { private class TaskOrganizerImpl extends TaskOrganizer { @Override - public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo) { + public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { if (DEBUG) { log("taskAppeared: " + taskInfo.taskId); } mTaskInfo = taskInfo; mTaskToken = taskInfo.token; - mTaskLeash = mTaskToken.getLeash(); + mTaskLeash = leash; mTransaction.reparent(mTaskLeash, mSurfaceControl) .show(mTaskLeash) .show(mSurfaceControl) diff --git a/core/java/android/window/WindowContainerToken.java b/core/java/android/window/WindowContainerToken.java index 3316d0e5b71f1..c92ccae66ff8f 100644 --- a/core/java/android/window/WindowContainerToken.java +++ b/core/java/android/window/WindowContainerToken.java @@ -17,14 +17,10 @@ package android.window; import android.annotation.NonNull; -import android.annotation.Nullable; import android.annotation.TestApi; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; -import android.os.RemoteException; -import android.view.SurfaceControl; -import android.window.IWindowContainerToken; /** * Interface for a window container to communicate with the window manager. This also acts as a @@ -45,15 +41,6 @@ public final class WindowContainerToken implements Parcelable { mRealToken = IWindowContainerToken.Stub.asInterface(in.readStrongBinder()); } - @Nullable - public SurfaceControl getLeash() { - try { - return mRealToken.getLeash(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - /** @hide */ public IBinder asBinder() { return mRealToken.asBinder(); diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index 9c8fb7c52eecd..d38c481752c69 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -250,7 +250,7 @@ public class PipTaskOrganizer extends TaskOrganizer { } @Override - public void onTaskAppeared(ActivityManager.RunningTaskInfo info) { + public void onTaskAppeared(ActivityManager.RunningTaskInfo info, SurfaceControl leash) { Objects.requireNonNull(info, "Requires RunningTaskInfo"); final Rect destinationBounds = mPipBoundsHandler.getDestinationBounds( info.topActivity, getAspectRatioOrDefault(info.pictureInPictureParams), @@ -259,7 +259,7 @@ public class PipTaskOrganizer extends TaskOrganizer { mTaskInfo = info; mToken = mTaskInfo.token; mInPip = true; - mLeash = mToken.getLeash(); + mLeash = leash; final Rect currentBounds = mTaskInfo.configuration.windowConfiguration.getBounds(); mBoundsToRestore.put(mToken.asBinder(), currentBounds); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java index fd6722ad7d4e1..717edc591d7fc 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java @@ -83,7 +83,7 @@ class SplitScreenTaskOrganizer extends TaskOrganizer { } @Override - public void onTaskAppeared(RunningTaskInfo taskInfo) { + public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { synchronized (this) { if (mPrimary == null || mSecondary == null) { Log.w(TAG, "Received onTaskAppeared before creating root tasks " + taskInfo); @@ -91,9 +91,9 @@ class SplitScreenTaskOrganizer extends TaskOrganizer { } if (taskInfo.token.equals(mPrimary.token)) { - mPrimarySurface = taskInfo.token.getLeash(); + mPrimarySurface = leash; } else if (taskInfo.token.equals(mSecondary.token)) { - mSecondarySurface = taskInfo.token.getLeash(); + mSecondarySurface = leash; } if (!mSplitScreenSupported && mPrimarySurface != null && mSecondarySurface != null) { diff --git a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java index 2c8c8201c534f..b6c71bb176313 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java +++ b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java @@ -21,6 +21,7 @@ import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; +import android.view.SurfaceControl; import android.window.IDisplayAreaOrganizer; import android.window.IDisplayAreaOrganizerController; @@ -113,7 +114,8 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl void onDisplayAreaAppeared(IDisplayAreaOrganizer organizer, DisplayArea da) { try { - organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo()); + SurfaceControl outSurfaceControl = new SurfaceControl(da.getSurfaceControl()); + organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo(), outSurfaceControl); } catch (RemoteException e) { // Oh well... } diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index 9d229df1967ea..83105c2f86960 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -36,6 +36,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; import android.util.SparseArray; +import android.view.SurfaceControl; import android.window.ITaskOrganizer; import android.window.ITaskOrganizerController; import android.window.WindowContainerToken; @@ -112,7 +113,8 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { final RunningTaskInfo taskInfo = task.getTaskInfo(); mDeferTaskOrgCallbacksConsumer.accept(() -> { try { - mTaskOrganizer.onTaskAppeared(taskInfo); + SurfaceControl outSurfaceControl = new SurfaceControl(task.getSurfaceControl()); + mTaskOrganizer.onTaskAppeared(taskInfo, outSurfaceControl); } catch (RemoteException e) { Slog.e(TAG, "Exception sending onTaskAppeared callback", e); } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 1155bb8520ae4..3f8d7b5710aad 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -2557,16 +2557,6 @@ class WindowContainer extends ConfigurationContainer< return (RemoteToken) binder; } - @Override - public SurfaceControl getLeash() { - final WindowContainer wc = getContainer(); - if (wc == null) return null; - // We need to copy the SurfaceControl instead of returning the original - // because the Parcel FLAGS PARCELABLE_WRITE_RETURN_VALUE cause SurfaceControls - // to release themselves. - return new SurfaceControl(wc.getSurfaceControl()); - } - WindowContainerToken toWindowContainerToken() { if (mWindowContainerToken == null) { mWindowContainerToken = new WindowContainerToken(this); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index 0700f9f2b29c0..2991859c5dd4f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -49,6 +49,7 @@ import android.os.Build; import android.os.Bundle; import android.os.UserHandle; import android.service.voice.IVoiceInteractionSession; +import android.view.SurfaceControl; import android.window.ITaskOrganizer; import android.window.WindowContainerToken; @@ -552,7 +553,7 @@ class ActivityTestsBase extends SystemServiceTestsBase { mMoveToSecondaryOnEnter = move; } @Override - public void onTaskAppeared(ActivityManager.RunningTaskInfo info) { + public void onTaskAppeared(ActivityManager.RunningTaskInfo info, SurfaceControl leash) { } @Override public void onTaskVanished(ActivityManager.RunningTaskInfo info) { diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java index 307b40f1b0398..6a1f50d7e58a8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java @@ -27,6 +27,8 @@ import android.graphics.Rect; import android.os.Binder; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; +import android.view.SurfaceControl; +import android.window.DisplayAreaInfo; import android.window.IDisplayAreaOrganizer; import androidx.test.filters.SmallTest; @@ -74,7 +76,8 @@ public class DisplayAreaOrganizerTest extends WindowTestsBase { @Test public void testAppearedVanished() throws RemoteException { IDisplayAreaOrganizer organizer = registerMockOrganizer(FEATURE_VENDOR_FIRST); - verify(organizer).onDisplayAreaAppeared(any()); + verify(organizer) + .onDisplayAreaAppeared(any(DisplayAreaInfo.class), any(SurfaceControl.class)); unregisterMockOrganizer(organizer); verify(organizer).onDisplayAreaVanished(any()); @@ -83,7 +86,8 @@ public class DisplayAreaOrganizerTest extends WindowTestsBase { @Test public void testChanged() throws RemoteException { IDisplayAreaOrganizer organizer = registerMockOrganizer(FEATURE_VENDOR_FIRST); - verify(organizer).onDisplayAreaAppeared(any()); + verify(organizer) + .onDisplayAreaAppeared(any(DisplayAreaInfo.class), any(SurfaceControl.class)); mDisplayContent.setBounds(new Rect(0, 0, 1000, 1000)); verify(organizer).onDisplayAreaInfoChanged(any()); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index 7d2e88014f456..aa68c6900f6f8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -65,6 +65,7 @@ import android.platform.test.annotations.Presubmit; import android.util.ArrayMap; import android.util.Rational; import android.view.Display; +import android.view.SurfaceControl; import android.window.ITaskOrganizer; import android.window.WindowContainerTransaction; @@ -133,7 +134,8 @@ public class WindowOrganizerTests extends WindowTestsBase { final ITaskOrganizer organizer = registerMockOrganizer(); task.setTaskOrganizer(organizer); - verify(organizer).onTaskAppeared(any()); + verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); + task.removeImmediately(); verify(organizer).onTaskVanished(any()); @@ -147,11 +149,12 @@ public class WindowOrganizerTests extends WindowTestsBase { task.setTaskOrganizer(organizer); - verify(organizer, never()).onTaskAppeared(any()); + verify(organizer, never()) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); task.setHasBeenVisible(true); assertTrue(stack.getHasBeenVisible()); - verify(organizer).onTaskAppeared(any()); + verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); task.removeImmediately(); verify(organizer).onTaskVanished(any()); @@ -167,7 +170,8 @@ public class WindowOrganizerTests extends WindowTestsBase { // that even though a TaskOrganizer is set remove doesn't emit // a vanish callback, because we never emitted appear. task.setTaskOrganizer(organizer); - verify(organizer, never()).onTaskAppeared(any()); + verify(organizer, never()) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); task.removeImmediately(); verify(organizer, never()).onTaskVanished(any()); } @@ -180,10 +184,10 @@ public class WindowOrganizerTests extends WindowTestsBase { final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_PINNED); task.setTaskOrganizer(organizer); - verify(organizer).onTaskAppeared(any()); + verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); task.setTaskOrganizer(organizer2); verify(organizer).onTaskVanished(any()); - verify(organizer2).onTaskAppeared(any()); + verify(organizer2).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); } @Test @@ -194,10 +198,10 @@ public class WindowOrganizerTests extends WindowTestsBase { final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_PINNED); stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); - verify(organizer).onTaskAppeared(any()); + verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); stack.setWindowingMode(WINDOWING_MODE_PINNED); verify(organizer).onTaskVanished(any()); - verify(organizer2).onTaskAppeared(any()); + verify(organizer2).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); } @Test @@ -207,7 +211,8 @@ public class WindowOrganizerTests extends WindowTestsBase { final ITaskOrganizer organizer = registerMockOrganizer(); stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); - verify(organizer, never()).onTaskAppeared(any()); + verify(organizer, never()) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); assertTrue(stack.isOrganized()); mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer); @@ -222,7 +227,7 @@ public class WindowOrganizerTests extends WindowTestsBase { final ITaskOrganizer organizer = registerMockOrganizer(); stack.setTaskOrganizer(organizer); - verify(organizer).onTaskAppeared(any()); + verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); assertTrue(stack.isOrganized()); stack.setTaskOrganizer(null); @@ -237,7 +242,7 @@ public class WindowOrganizerTests extends WindowTestsBase { final ITaskOrganizer organizer = registerMockOrganizer(); stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); - verify(organizer).onTaskAppeared(any()); + verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); assertTrue(stack.isOrganized()); mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer); @@ -257,7 +262,8 @@ public class WindowOrganizerTests extends WindowTestsBase { // First organizer is registered, verify a task appears when changing windowing mode stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); - verify(organizer, times(1)).onTaskAppeared(any()); + verify(organizer, times(1)) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); assertTrue(stack.isOrganized()); // Now we replace the registration and1 verify the new organizer receives tasks @@ -265,7 +271,8 @@ public class WindowOrganizerTests extends WindowTestsBase { final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW); stack2.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); // One each for task and task2 - verify(organizer2, times(2)).onTaskAppeared(any()); + verify(organizer2, times(2)) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); verify(organizer2, times(0)).onTaskVanished(any()); // One for task verify(organizer).onTaskVanished(any()); @@ -274,11 +281,13 @@ public class WindowOrganizerTests extends WindowTestsBase { // Now we unregister the second one, the first one should automatically be reregistered // so we verify that it's now seeing changes. mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2); - verify(organizer, times(3)).onTaskAppeared(any()); + verify(organizer, times(3)) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); verify(organizer2, times(2)).onTaskVanished(any()); stack3.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); - verify(organizer, times(4)).onTaskAppeared(any()); + verify(organizer, times(4)) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); verify(organizer2, times(2)).onTaskVanished(any()); assertTrue(stack3.isOrganized()); } @@ -291,7 +300,8 @@ public class WindowOrganizerTests extends WindowTestsBase { final Task task = createTask(stack); final Task task2 = createTask(stack); stack.setWindowingMode(WINDOWING_MODE_PINNED); - verify(organizer, times(1)).onTaskAppeared(any()); + verify(organizer, times(1)) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN); verify(organizer, times(1)).onTaskVanished(any()); @@ -304,7 +314,8 @@ public class WindowOrganizerTests extends WindowTestsBase { stack.setWindowingMode(WINDOWING_MODE_PINNED); final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_PINNED); - verify(organizer, times(1)).onTaskAppeared(any()); + verify(organizer, times(1)) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); } @Test @@ -459,7 +470,7 @@ public class WindowOrganizerTests extends WindowTestsBase { public void testTileAddRemoveChild() { ITaskOrganizer listener = new ITaskOrganizer.Stub() { @Override - public void onTaskAppeared(RunningTaskInfo taskInfo) { } + public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { } @Override public void onTaskVanished(RunningTaskInfo container) { } @@ -515,7 +526,7 @@ public class WindowOrganizerTests extends WindowTestsBase { final boolean[] called = {false}; ITaskOrganizer listener = new ITaskOrganizer.Stub() { @Override - public void onTaskAppeared(RunningTaskInfo taskInfo) { } + public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { } @Override public void onTaskVanished(RunningTaskInfo container) { } @@ -577,7 +588,7 @@ public class WindowOrganizerTests extends WindowTestsBase { final ArrayMap lastReportedTiles = new ArrayMap<>(); ITaskOrganizer listener = new ITaskOrganizer.Stub() { @Override - public void onTaskAppeared(RunningTaskInfo taskInfo) { } + public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { } @Override public void onTaskVanished(RunningTaskInfo container) { } @@ -804,7 +815,7 @@ public class WindowOrganizerTests extends WindowTestsBase { RunningTaskInfo mInfo; @Override - public void onTaskAppeared(RunningTaskInfo info) { + public void onTaskAppeared(RunningTaskInfo info, SurfaceControl leash) { mInfo = info; } @Override @@ -907,12 +918,14 @@ public class WindowOrganizerTests extends WindowTestsBase { task.setTaskOrganizer(organizer); // setHasBeenVisible was already called once by the set-up code. task.setHasBeenVisible(true); - verify(organizer, times(1)).onTaskAppeared(any()); + verify(organizer, times(1)) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); task.setTaskOrganizer(null); verify(organizer, times(1)).onTaskVanished(any()); task.setTaskOrganizer(organizer); - verify(organizer, times(2)).onTaskAppeared(any()); + verify(organizer, times(2)) + .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class)); task.removeImmediately(); verify(organizer, times(2)).onTaskVanished(any()); diff --git a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerMultiWindowTest.java b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerMultiWindowTest.java index da4afec8a172c..073ae30aaf1ae 100644 --- a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerMultiWindowTest.java +++ b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerMultiWindowTest.java @@ -38,7 +38,7 @@ import android.window.WindowContainerTransaction; import android.window.WindowContainerTransactionCallback; public class TaskOrganizerMultiWindowTest extends Activity { - class SplitLayout extends LinearLayout implements View.OnTouchListener { + static class SplitLayout extends LinearLayout implements View.OnTouchListener { View mView1; View mView2; View mDividerView; @@ -94,8 +94,8 @@ public class TaskOrganizerMultiWindowTest extends Activity { class ResizingTaskView extends TaskView { final Intent mIntent; boolean launched = false; - ResizingTaskView(Context c, TaskOrganizer o, int windowingMode, Intent i) { - super(c, o, windowingMode); + ResizingTaskView(Context c, Intent i) { + super(c); mIntent = i; } @@ -120,9 +120,9 @@ public class TaskOrganizerMultiWindowTest extends Activity { } } - TaskView mTaskView1; - TaskView mTaskView2; - boolean gotFirstTask = false; + private TaskView mTaskView1; + private TaskView mTaskView2; + private boolean mGotFirstTask = false; class Organizer extends TaskOrganizer { private int receivedTransactions = 0; @@ -141,17 +141,17 @@ public class TaskOrganizerMultiWindowTest extends Activity { }; @Override - public void onTaskAppeared(ActivityManager.RunningTaskInfo ti) { - if (!gotFirstTask) { - mTaskView1.reparentTask(ti.token); - gotFirstTask = true; + public void onTaskAppeared(ActivityManager.RunningTaskInfo ti, SurfaceControl leash) { + if (!mGotFirstTask) { + mTaskView1.reparentTask(ti.token, leash); + mGotFirstTask = true; } else { - mTaskView2.reparentTask(ti.token); + mTaskView2.reparentTask(ti.token, leash); } } } - Organizer mOrganizer = new Organizer(); + private Organizer mOrganizer = new Organizer(); @Override protected void onCreate(Bundle savedInstanceState) { @@ -159,10 +159,8 @@ public class TaskOrganizerMultiWindowTest extends Activity { mOrganizer.registerOrganizer(WINDOWING_MODE_MULTI_WINDOW); - mTaskView1 = new ResizingTaskView(this, mOrganizer, WINDOWING_MODE_MULTI_WINDOW, - makeSettingsIntent()); - mTaskView2 = new ResizingTaskView(this, mOrganizer, WINDOWING_MODE_MULTI_WINDOW, - makeContactsIntent()); + mTaskView1 = new ResizingTaskView(this, makeSettingsIntent()); + mTaskView2 = new ResizingTaskView(this, makeContactsIntent()); View splitView = new SplitLayout(this, mTaskView1, mTaskView2); setContentView(splitView); @@ -178,14 +176,14 @@ public class TaskOrganizerMultiWindowTest extends Activity { intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); } - Intent makeSettingsIntent() { + private Intent makeSettingsIntent() { Intent intent = new Intent(); intent.setAction(android.provider.Settings.ACTION_SETTINGS); addFlags(intent); return intent; } - Intent makeContactsIntent() { + private Intent makeContactsIntent() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_APP_CONTACTS); @@ -193,14 +191,14 @@ public class TaskOrganizerMultiWindowTest extends Activity { return intent; } - Bundle makeLaunchOptions(int width, int height) { + private Bundle makeLaunchOptions(int width, int height) { ActivityOptions o = ActivityOptions.makeBasic(); o.setLaunchWindowingMode(WINDOWING_MODE_MULTI_WINDOW); o.setLaunchBounds(new Rect(0, 0, width, height)); return o.toBundle(); } - void launchOrganizedActivity(Intent i, int width, int height) { + private void launchOrganizedActivity(Intent i, int width, int height) { startActivity(i, makeLaunchOptions(width, height)); } } diff --git a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerPipTest.java b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerPipTest.java index 0a7a6d56249f7..8fc5c5d78b607 100644 --- a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerPipTest.java +++ b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskOrganizerPipTest.java @@ -23,6 +23,7 @@ import android.app.Service; import android.content.Intent; import android.graphics.Rect; import android.os.IBinder; +import android.view.SurfaceControl; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.FrameLayout; @@ -30,14 +31,14 @@ import android.window.TaskOrganizer; import android.window.WindowContainerTransaction; public class TaskOrganizerPipTest extends Service { - static final int PIP_WIDTH = 640; - static final int PIP_HEIGHT = 360; + private static final int PIP_WIDTH = 640; + private static final int PIP_HEIGHT = 360; - TaskView mTaskView; + private TaskView mTaskView; class Organizer extends TaskOrganizer { - public void onTaskAppeared(ActivityManager.RunningTaskInfo ti) { - mTaskView.reparentTask(ti.token); + public void onTaskAppeared(ActivityManager.RunningTaskInfo ti, SurfaceControl leash) { + mTaskView.reparentTask(ti.token, leash); final WindowContainerTransaction wct = new WindowContainerTransaction(); wct.scheduleFinishEnterPip(ti.token, new Rect(0, 0, PIP_WIDTH, PIP_HEIGHT)); @@ -45,7 +46,7 @@ public class TaskOrganizerPipTest extends Service { } } - Organizer mOrganizer = new Organizer(); + private Organizer mOrganizer = new Organizer(); @Override public IBinder onBind(Intent intent) { @@ -66,7 +67,7 @@ public class TaskOrganizerPipTest extends Service { FrameLayout layout = new FrameLayout(this); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(PIP_WIDTH, PIP_HEIGHT); - mTaskView = new TaskView(this, mOrganizer, WINDOWING_MODE_PINNED); + mTaskView = new TaskView(this); layout.addView(mTaskView, lp); WindowManager wm = getSystemService(WindowManager.class); diff --git a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskView.java b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskView.java index aa041f22a46ed..208018c2543a8 100644 --- a/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskView.java +++ b/tests/TaskOrganizerTest/src/com/android/test/taskembed/TaskView.java @@ -16,34 +16,27 @@ package com.android.test.taskembed; -import android.app.ActivityTaskManager; import android.content.Context; -import android.window.TaskOrganizer; -import android.window.WindowContainerToken; import android.view.SurfaceControl; import android.view.SurfaceHolder; import android.view.SurfaceView; -import android.window.ITaskOrganizer; +import android.window.WindowContainerToken; /** * Simple SurfaceView wrapper which registers a TaskOrganizer * after it's Surface is ready. */ class TaskView extends SurfaceView implements SurfaceHolder.Callback { - final TaskOrganizer mTaskOrganizer; - final int mWindowingMode; WindowContainerToken mWc; + private SurfaceControl mLeash; - boolean mSurfaceCreated = false; - boolean mNeedsReparent; + private boolean mSurfaceCreated = false; + private boolean mNeedsReparent; - TaskView(Context c, TaskOrganizer o, int windowingMode) { + TaskView(Context c) { super(c); getHolder().addCallback(this); setZOrderOnTop(true); - - mTaskOrganizer = o; - mWindowingMode = windowingMode; } @Override @@ -63,27 +56,25 @@ class TaskView extends SurfaceView implements SurfaceHolder.Callback { public void surfaceDestroyed(SurfaceHolder holder) { } - void reparentTask(WindowContainerToken wc) { + void reparentTask(WindowContainerToken wc, SurfaceControl leash) { mWc = wc; - if (mSurfaceCreated == false) { + mLeash = leash; + if (!mSurfaceCreated) { mNeedsReparent = true; } else { reparentLeash(); } } - void reparentLeash() { + private void reparentLeash() { SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - SurfaceControl leash = null; - try { - leash = mWc.getLeash(); - } catch (Exception e) { - // System server died.. oh well + if (mLeash == null) { + return; } - t.reparent(leash, getSurfaceControl()) - .setPosition(leash, 0, 0) - .show(leash) + t.reparent(mLeash, getSurfaceControl()) + .setPosition(mLeash, 0, 0) + .show(mLeash) .apply(); } }