diff --git a/core/java/android/view/DragEvent.java b/core/java/android/view/DragEvent.java index bda707b486275..1898407c83dbc 100644 --- a/core/java/android/view/DragEvent.java +++ b/core/java/android/view/DragEvent.java @@ -619,10 +619,11 @@ public class DragEvent implements Parcelable { } if (in.readInt() != 0) { event.mDragSurface = SurfaceControl.CREATOR.createFromParcel(in); + event.mDragSurface.setUnreleasedWarningCallSite("DragEvent"); } if (in.readInt() != 0) { event.mDragAndDropPermissions = - IDragAndDropPermissions.Stub.asInterface(in.readStrongBinder());; + IDragAndDropPermissions.Stub.asInterface(in.readStrongBinder()); } return event; } diff --git a/core/java/android/view/RemoteAnimationTarget.java b/core/java/android/view/RemoteAnimationTarget.java index 8d8ddb930c231..5ea640c66f22a 100644 --- a/core/java/android/view/RemoteAnimationTarget.java +++ b/core/java/android/view/RemoteAnimationTarget.java @@ -296,6 +296,9 @@ public class RemoteAnimationTarget implements Parcelable { taskId = in.readInt(); mode = in.readInt(); leash = in.readTypedObject(SurfaceControl.CREATOR); + if (leash != null) { + leash.setUnreleasedWarningCallSite("RemoteAnimationTarget[leash]"); + } isTranslucent = in.readBoolean(); clipRect = in.readTypedObject(Rect.CREATOR); contentInsets = in.readTypedObject(Rect.CREATOR); @@ -307,6 +310,9 @@ public class RemoteAnimationTarget implements Parcelable { windowConfiguration = in.readTypedObject(WindowConfiguration.CREATOR); isNotInRecents = in.readBoolean(); startLeash = in.readTypedObject(SurfaceControl.CREATOR); + if (startLeash != null) { + startLeash.setUnreleasedWarningCallSite("RemoteAnimationTarget[startLeash]"); + } startBounds = in.readTypedObject(Rect.CREATOR); taskInfo = in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR); allowEnterPip = in.readBoolean(); diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 7da141bc392ad..62c99c6939f30 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -1289,6 +1289,20 @@ public final class SurfaceControl implements Parcelable { sDebugUsageAfterRelease = debug; } + /** + * Provides more information to show about the source of this SurfaceControl if it is finalized + * without being released. This is primarily intended for callers to update the call site after + * receiving a SurfaceControl from another process, which would otherwise get a generic default + * call site. + * @hide + */ + public void setUnreleasedWarningCallSite(@NonNull String callsite) { + if (!isValid()) { + return; + } + mCloseGuard.openWithCallSite("release", callsite); + } + /** * Checks whether two {@link SurfaceControl} objects represent the same surface. * diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index f7bdd094ff2c6..52b96de0ba5ba 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -170,6 +170,7 @@ public class SurfaceControlViewHost { private SurfacePackage(Parcel in) { mSurfaceControl = new SurfaceControl(); mSurfaceControl.readFromParcel(in); + mSurfaceControl.setUnreleasedWarningCallSite("SurfacePackage(Parcel)"); mAccessibilityEmbeddedConnection = IAccessibilityEmbeddedConnection.Stub.asInterface( in.readStrongBinder()); mInputToken = in.readStrongBinder(); diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java index c8a69e274e819..e277b49ee508f 100644 --- a/core/java/android/window/TransitionInfo.java +++ b/core/java/android/window/TransitionInfo.java @@ -198,6 +198,7 @@ public final class TransitionInfo implements Parcelable { in.readTypedList(mChanges, Change.CREATOR); mRootLeash = new SurfaceControl(); mRootLeash.readFromParcel(in); + mRootLeash.setUnreleasedWarningCallSite("TransitionInfo"); mRootOffset.readFromParcel(in); mOptions = in.readTypedObject(AnimationOptions.CREATOR); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/RootDisplayAreaOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/RootDisplayAreaOrganizer.java index b085b73d78ce9..34bf9e0dd98fb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/RootDisplayAreaOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/RootDisplayAreaOrganizer.java @@ -76,6 +76,7 @@ public class RootDisplayAreaOrganizer extends DisplayAreaOrganizer { + " mDisplayAreasInfo.get():" + mDisplayAreasInfo.get(displayId)); } + leash.setUnreleasedWarningCallSite("RootDisplayAreaOrganizer.onDisplayAreaAppeared"); mDisplayAreasInfo.put(displayId, displayAreaInfo); mLeashes.put(displayId, leash); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java index ca977ed2cb94c..544d75739547e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java @@ -122,6 +122,8 @@ public class RootTaskDisplayAreaOrganizer extends DisplayAreaOrganizer { + " mDisplayAreasInfo.get():" + mDisplayAreasInfo.get(displayId)); } + leash.setUnreleasedWarningCallSite( + "RootTaskDisplayAreaOrganizer.onDisplayAreaAppeared"); mDisplayAreasInfo.put(displayId, displayAreaInfo); mLeashes.put(displayId, leash); 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 b5ef72aec6aac..585f81c81a36b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java @@ -464,6 +464,9 @@ public class ShellTaskOrganizer extends TaskOrganizer implements @Override public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { + if (leash != null) { + leash.setUnreleasedWarningCallSite("ShellTaskOrganizer.onTaskAppeared"); + } synchronized (mLock) { onTaskAppeared(new TaskAppearedInfo(taskInfo, leash)); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java index f376e1fd6174c..32894cdc5aece 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java @@ -117,6 +117,7 @@ class HideDisplayCutoutOrganizer extends DisplayAreaOrganizer { @Override public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo, @NonNull SurfaceControl leash) { + leash.setUnreleasedWarningCallSite("HideDisplayCutoutOrganizer.onDisplayAreaAppeared"); if (!addDisplayAreaInfoAndLeashToMap(displayAreaInfo, leash)) { return; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java index 451afa08040cc..38ce16489b062 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java @@ -154,6 +154,8 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer { @Override public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo, @NonNull SurfaceControl leash) { + leash.setUnreleasedWarningCallSite( + "OneHandedSiaplyAreaOrganizer.onDisplayAreaAppeared"); mDisplayAreaTokenMap.put(displayAreaInfo.token, leash); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index d86468a838d95..fdc74961a2624 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -1203,6 +1203,9 @@ public class PipController implements PipTransitionController.PipTransitionCallb @Override public void stopSwipePipToHome(int taskId, ComponentName componentName, Rect destinationBounds, SurfaceControl overlay) { + if (overlay != null) { + overlay.setUnreleasedWarningCallSite("PipController.stopSwipePipToHome"); + } executeRemoteCallWithTaskPermission(mController, "stopSwipePipToHome", (controller) -> { controller.stopSwipePipToHome(taskId, componentName, destinationBounds,