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
diff --git a/core/java/android/window/DisplayAreaOrganizer.java b/core/java/android/window/DisplayAreaOrganizer.java
index f3ef5a0..a2fd128 100644
--- a/core/java/android/window/DisplayAreaOrganizer.java
+++ b/core/java/android/window/DisplayAreaOrganizer.java
@@ -21,6 +21,7 @@
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 void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) {}
+ public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo,
+ @NonNull SurfaceControl leash) {}
public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {}
@@ -76,8 +78,9 @@
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 39a9235..5e3e5e8 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 b4f0162..6746525 100644
--- a/core/java/android/window/ITaskOrganizer.aidl
+++ b/core/java/android/window/ITaskOrganizer.aidl
@@ -25,7 +25,14 @@
* {@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 57c7abf..81a04e9 100644
--- a/core/java/android/window/IWindowContainerToken.aidl
+++ b/core/java/android/window/IWindowContainerToken.aidl
@@ -24,9 +24,4 @@
* @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 f661d9a..1f5e533 100644
--- a/core/java/android/window/TaskOrganizer.java
+++ b/core/java/android/window/TaskOrganizer.java
@@ -24,6 +24,7 @@
import android.app.ActivityManager;
import android.os.RemoteException;
import android.util.Singleton;
+import android.view.SurfaceControl;
import java.util.List;
@@ -59,7 +60,8 @@
}
@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 @@
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 b63741e..2fb4650 100644
--- a/core/java/android/window/TaskOrganizerTaskEmbedder.java
+++ b/core/java/android/window/TaskOrganizerTaskEmbedder.java
@@ -21,7 +21,6 @@
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 @@
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 3316d0e..c92ccae 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 @@
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();