diff options
9 files changed, 29 insertions, 58 deletions
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 0b6beba06555..acad5d76f0b5 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -158,7 +158,6 @@ public class SurfaceControl implements Parcelable { private static native void nativeSeverChildren(long transactionObj, long nativeObject); private static native void nativeSetOverrideScalingMode(long transactionObj, long nativeObject, int scalingMode); - private static native void nativeDestroy(long transactionObj, long nativeObject); private static native IBinder nativeGetHandle(long nativeObject); private static native boolean nativeGetTransformToDisplayInverse(long nativeObject); @@ -360,11 +359,18 @@ public class SurfaceControl implements Parcelable { */ public static final int WINDOW_TYPE_DONT_SCREENSHOT = 441731; + private void assignNativeObject(long nativeObject) { + if (mNativeObject != 0) { + release(); + } + mNativeObject = nativeObject; + } + public void copyFrom(SurfaceControl other) { mName = other.mName; mWidth = other.mWidth; mHeight = other.mHeight; - mNativeObject = nativeCopyFromSurfaceControl(other.mNativeObject); + assignNativeObject(nativeCopyFromSurfaceControl(other.mNativeObject)); } /** @@ -685,12 +691,11 @@ public class SurfaceControl implements Parcelable { mWidth = in.readInt(); mHeight = in.readInt(); - release(); + long object = 0; if (in.readInt() != 0) { - mNativeObject = nativeReadFromParcel(in); - } else { - mNativeObject = 0; + object = nativeReadFromParcel(in); } + assignNativeObject(object); } @Override @@ -1765,30 +1770,6 @@ public class SurfaceControl implements Parcelable { return this; } - /** - * Same as {@link #destroy()} except this is invoked in a transaction instead of - * immediately. - */ - public Transaction destroy(SurfaceControl sc) { - sc.checkNotReleased(); - - /** - * Perhaps it's safer to transfer the close guard to the Transaction - * but then we have a whole wonky scenario regarding merging, multiple - * close-guards per transaction etc...the whole scenario is kind of wonky - * and it seems really we'd like to just be able to call release here - * but the WindowManager has some code that looks like - * --- destroyInTransaction(a) - * --- reparentChildrenInTransaction(a) - * so we need to ensure the SC remains valid until the transaction - * is applied. - */ - sc.mCloseGuard.close(); - - nativeDestroy(mNativeObject, sc.mNativeObject); - return this; - } - public Transaction setDisplaySurface(IBinder displayToken, Surface surface) { if (displayToken == null) { throw new IllegalArgumentException("displayToken must not be null"); diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index f292d25c15fe..9ce6df1832a6 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -870,14 +870,6 @@ static void nativeSetOverrideScalingMode(JNIEnv* env, jclass clazz, jlong transa transaction->setOverrideScalingMode(ctrl, scalingMode); } -static void nativeDestroyInTransaction(JNIEnv* env, jclass clazz, - jlong transactionObj, - jlong nativeObject) { - auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); - auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject); - transaction->destroySurface(ctrl); -} - static jobject nativeGetHandle(JNIEnv* env, jclass clazz, jlong nativeObject) { auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); return javaObjectForIBinder(env, ctrl->getHandle()); @@ -1048,8 +1040,6 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeSeverChildren } , {"nativeSetOverrideScalingMode", "(JJI)V", (void*)nativeSetOverrideScalingMode }, - {"nativeDestroy", "(JJ)V", - (void*)nativeDestroyInTransaction }, {"nativeGetHandle", "(J)Landroid/os/IBinder;", (void*)nativeGetHandle }, {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/graphics/Rect;IIZI)Landroid/graphics/GraphicBuffer;", diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 2157ef65da4c..801c1e727483 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -2356,7 +2356,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree public void onAnimationLeashDestroyed(Transaction t) { super.onAnimationLeashDestroyed(t); if (mAnimationBoundsLayer != null) { - t.destroy(mAnimationBoundsLayer); + t.reparent(mAnimationBoundsLayer, null); mAnimationBoundsLayer = null; } diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java index aea071f94ba2..c39060ee1922 100644 --- a/services/core/java/com/android/server/wm/Dimmer.java +++ b/services/core/java/com/android/server/wm/Dimmer.java @@ -129,7 +129,7 @@ class Dimmer { final DimAnimatable dimAnimatable = new DimAnimatable(dimLayer); mSurfaceAnimator = new SurfaceAnimator(dimAnimatable, () -> { if (!mDimming) { - dimAnimatable.getPendingTransaction().destroy(mDimLayer); + dimAnimatable.getPendingTransaction().reparent(mDimLayer, null); } }, mHost.mWmService); } @@ -300,7 +300,7 @@ class Dimmer { if (!mDimState.mDimming) { if (!mDimState.mAnimateExit) { - t.destroy(mDimState.mDimLayer); + t.reparent(mDimState.mDimLayer, null); } else { startDimExit(mLastRequestedDimContainer, mDimState.mSurfaceAnimator, t); } diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java index 11068ce8bace..9d9b48a5b36a 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimator.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java @@ -280,7 +280,7 @@ class SurfaceAnimator { } mService.mAnimationTransferMap.remove(mAnimation); if (mLeash != null && destroyLeash) { - t.destroy(mLeash); + t.reparent(mLeash, null); scheduleAnim = true; } mLeash = null; diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 32c5a3b8688e..25e61f876722 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -326,7 +326,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< } if (mSurfaceControl != null) { - mPendingTransaction.destroy(mSurfaceControl); + mPendingTransaction.reparent(mSurfaceControl, null); // Merge to parent transaction to ensure the transactions on this WindowContainer are // applied in native even if WindowContainer is removed. diff --git a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java index dcfb8797eaba..d0b9225715c4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java @@ -87,8 +87,8 @@ public class AppWindowTokenAnimationTests extends WindowTestsBase { verify(mSpec).startAnimation(any(), any(), callbackCaptor.capture()); callbackCaptor.getValue().onAnimationFinished(mSpec); - verify(mTransaction).destroy(eq(leash)); - verify(mTransaction).destroy(eq(animationBoundsLayer)); + verify(mTransaction).reparent(eq(leash), eq(null)); + verify(mTransaction).reparent(eq(animationBoundsLayer), eq(null)); assertThat(mToken.mNeedsAnimationBoundsLayer).isFalse(); } @@ -100,8 +100,8 @@ public class AppWindowTokenAnimationTests extends WindowTestsBase { final SurfaceControl animationBoundsLayer = mToken.mAnimationBoundsLayer; mToken.mSurfaceAnimator.cancelAnimation(); - verify(mTransaction).destroy(eq(leash)); - verify(mTransaction).destroy(eq(animationBoundsLayer)); + verify(mTransaction).reparent(eq(leash), eq(null)); + verify(mTransaction).reparent(eq(animationBoundsLayer), eq(null)); assertThat(mToken.mNeedsAnimationBoundsLayer).isFalse(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java index ee1c8dfdd319..f99cd4b18647 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java @@ -212,7 +212,7 @@ public class DimmerTests extends WindowTestsBase { mDimmer.updateDims(mTransaction, new Rect()); verify(mSurfaceAnimatorStarter).startAnimation(any(SurfaceAnimator.class), any( SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean()); - verify(mHost.getPendingTransaction()).destroy(dimLayer); + verify(mHost.getPendingTransaction()).reparent(dimLayer, null); } @Test @@ -269,7 +269,7 @@ public class DimmerTests extends WindowTestsBase { mDimmer.updateDims(mTransaction, new Rect()); verify(mSurfaceAnimatorStarter, never()).startAnimation(any(SurfaceAnimator.class), any( SurfaceControl.Transaction.class), any(AnimationAdapter.class), anyBoolean()); - verify(mTransaction).destroy(dimLayer); + verify(mTransaction).reparent(dimLayer, null); } private SurfaceControl getDimLayer() { diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java index d14f30db8e9f..ad80cd6ddfb7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java @@ -96,7 +96,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase { callbackCaptor.getValue().onAnimationFinished(mSpec); assertNotAnimating(mAnimatable); assertTrue(mAnimatable.mFinishedCallbackCalled); - verify(mTransaction).destroy(eq(mAnimatable.mLeash)); + verify(mTransaction).reparent(eq(mAnimatable.mLeash), eq(null)); // TODO: Verify reparenting once we use mPendingTransaction to reparent it back } @@ -106,7 +106,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase { final SurfaceControl firstLeash = mAnimatable.mLeash; mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec2, true /* hidden */); - verify(mTransaction).destroy(eq(firstLeash)); + verify(mTransaction).reparent(eq(firstLeash), eq(null)); assertFalse(mAnimatable.mFinishedCallbackCalled); final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass( @@ -133,7 +133,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase { assertNotAnimating(mAnimatable); verify(mSpec).onAnimationCancelled(any()); assertTrue(mAnimatable.mFinishedCallbackCalled); - verify(mTransaction).destroy(eq(mAnimatable.mLeash)); + verify(mTransaction).reparent(eq(mAnimatable.mLeash), eq(null)); } @Test @@ -155,7 +155,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase { verifyZeroInteractions(mSpec); assertNotAnimating(mAnimatable); assertTrue(mAnimatable.mFinishedCallbackCalled); - verify(mTransaction).destroy(eq(mAnimatable.mLeash)); + verify(mTransaction).reparent(eq(mAnimatable.mLeash), eq(null)); } @Test @@ -171,11 +171,11 @@ public class SurfaceAnimatorTest extends WindowTestsBase { assertNotAnimating(mAnimatable); assertAnimating(mAnimatable2); assertEquals(leash, mAnimatable2.mSurfaceAnimator.mLeash); - verify(mTransaction, never()).destroy(eq(leash)); + verify(mTransaction, never()).reparent(eq(leash), eq(null)); callbackCaptor.getValue().onAnimationFinished(mSpec); assertNotAnimating(mAnimatable2); assertTrue(mAnimatable2.mFinishedCallbackCalled); - verify(mTransaction).destroy(eq(leash)); + verify(mTransaction).reparent(eq(leash), eq(null)); } @Test @@ -198,7 +198,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase { mDeferFinishAnimatable.mEndDeferFinishCallback.run(); assertNotAnimating(mAnimatable2); assertTrue(mDeferFinishAnimatable.mFinishedCallbackCalled); - verify(mTransaction).destroy(eq(mDeferFinishAnimatable.mLeash)); + verify(mTransaction).reparent(eq(mDeferFinishAnimatable.mLeash), eq(null)); } private void assertAnimating(MyAnimatable animatable) { |