diff options
| author | 2019-01-14 15:55:19 -0800 | |
|---|---|---|
| committer | 2019-01-22 07:55:10 -0800 | |
| commit | 10584fa98a822e74e8265ae3f29187844055375b (patch) | |
| tree | 1b00d9ef26fbe1e26674b17d8c98623011472b61 | |
| parent | c2888cbc48c98297360356fa13ecdd9afe102ad9 (diff) | |
SurfaceControl: Accept instance rather than handle for reparent
In preparation for public API.
Bug: 111297488
Test: Builds.
Change-Id: I80da54d92989ec0afe9fcdde324847f0de0c5083
10 files changed, 45 insertions, 34 deletions
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index ab8f234766d6..4d3711ae7ff5 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -328,7 +328,7 @@ public class ActivityView extends ViewGroup { } } else { mTmpTransaction.reparent(mRootSurfaceControl, - mSurfaceView.getSurfaceControl().getHandle()).apply(); + mSurfaceView.getSurfaceControl()).apply(); } if (mVirtualDisplay != null) { @@ -390,7 +390,7 @@ public class ActivityView extends ViewGroup { .build(); try { - wm.reparentDisplayContent(displayId, mRootSurfaceControl.getHandle()); + wm.reparentDisplayContent(displayId, mRootSurfaceControl); wm.dontOverrideDisplayInfo(displayId); if (mSingleTaskInstance) { mActivityTaskManager.setDisplayToSingleTaskInstance(displayId); diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 330d72f139db..42ac8801629f 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -51,6 +51,7 @@ import android.view.IInputFilter; import android.view.AppTransitionAnimationSpec; import android.view.WindowContentFrameStats; import android.view.WindowManager; +import android.view.SurfaceControl; /** * System private interface to the window manager. @@ -555,8 +556,8 @@ interface IWindowManager * display content info to any SurfaceControl, as this would be a security issue. * * @param displayId The id of the display. - * @param surfaceControlHandle The SurfaceControl handle that the top level layers for the + * @param surfaceControlHandle The SurfaceControl that the top level layers for the * display should be re-parented to. */ - void reparentDisplayContent(int displayId, in IBinder surfaceControlHandle); + void reparentDisplayContent(int displayId, in SurfaceControl sc); } diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 5e98236f7535..2636c884b11c 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -156,7 +156,7 @@ public class SurfaceControl implements Parcelable { private static native void nativeReparentChildren(long transactionObj, long nativeObject, IBinder handle); private static native void nativeReparent(long transactionObj, long nativeObject, - IBinder parentHandle); + long newParentNativeObject); private static native void nativeSeverChildren(long transactionObj, long nativeObject); private static native void nativeSetOverrideScalingMode(long transactionObj, long nativeObject, int scalingMode); @@ -962,9 +962,9 @@ public class SurfaceControl implements Parcelable { /** * @hide */ - public void reparent(IBinder newParentHandle) { + public void reparent(SurfaceControl newParent) { synchronized(SurfaceControl.class) { - sGlobalTransaction.reparent(this, newParentHandle); + sGlobalTransaction.reparent(this, newParent); } } @@ -2071,13 +2071,23 @@ public class SurfaceControl implements Parcelable { return this; } - /** Re-parents a specific child layer to a new parent - * @hide + /** + * Re-parents a given layer to a new parent. Children inherit transform (position, scaling) + * crop, visibility, and Z-ordering from their parents, as if the children were pixels within the + * parent Surface. + * + * @param sc The SurfaceControl to reparent + * @param newParent The new parent for the given control. + * @return This Transaction */ - public Transaction reparent(SurfaceControl sc, IBinder newParentHandle) { + public Transaction reparent(SurfaceControl sc, SurfaceControl newParent) { sc.checkNotReleased(); - nativeReparent(mNativeObject, sc.mNativeObject, - newParentHandle); + long otherObject = 0; + if (newParent != null) { + newParent.checkNotReleased(); + otherObject = newParent.mNativeObject; + } + nativeReparent(mNativeObject, sc.mNativeObject, otherObject); return this; } diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 897427fd8787..7e0f497ad501 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -868,13 +868,13 @@ static void nativeReparentChildren(JNIEnv* env, jclass clazz, jlong transactionO static void nativeReparent(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, - jobject newParentObject) { + jlong newParentObject) { auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); - sp<IBinder> parentHandle = ibinderForJavaObject(env, newParentObject); + auto newParent = reinterpret_cast<SurfaceControl *>(newParentObject); { auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); - transaction->reparent(ctrl, parentHandle); + transaction->reparent(ctrl, newParent != NULL ? newParent->getHandle() : NULL); } } @@ -1063,7 +1063,7 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeDeferTransactionUntilSurface }, {"nativeReparentChildren", "(JJLandroid/os/IBinder;)V", (void*)nativeReparentChildren } , - {"nativeReparent", "(JJLandroid/os/IBinder;)V", + {"nativeReparent", "(JJJ)V", (void*)nativeReparent }, {"nativeSeverChildren", "(JJ)V", (void*)nativeSeverChildren } , diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 780eda49faf4..2da435d4609f 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -2407,7 +2407,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree @Override protected void reparentSurfaceControl(Transaction t, SurfaceControl newParent) { if (!mSurfaceAnimator.hasLeash()) { - t.reparent(mSurfaceControl, newParent.getHandle()); + t.reparent(mSurfaceControl, newParent); } } @@ -2453,7 +2453,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree t.setWindowCrop(mAnimationBoundsLayer, mTmpRect); // Reparent leash to animation bounds layer. - t.reparent(leash, mAnimationBoundsLayer.getHandle()); + t.reparent(leash, mAnimationBoundsLayer); } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 8026a04ce862..d3aa1a49aeb0 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -4590,7 +4590,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * Reparents the given surface to mOverlayLayer. */ void reparentToOverlay(Transaction transaction, SurfaceControl surface) { - transaction.reparent(surface, mOverlayLayer.getHandle()); + transaction.reparent(surface, mOverlayLayer); } void applyMagnificationSpec(MagnificationSpec spec) { @@ -4833,11 +4833,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * Re-parent the DisplayContent's top surfaces, {@link #mWindowingLayer} and * {@link #mOverlayLayer} to the specified surfaceControl. * - * @param surfaceControlHandle The handle for the new SurfaceControl, where the DisplayContent's + * @param surfaceControlHandle The new SurfaceControl, where the DisplayContent's * surfaces will be re-parented to. */ - void reparentDisplayContent(IBinder surfaceControlHandle) { - mPendingTransaction.reparent(mWindowingLayer, surfaceControlHandle) - .reparent(mOverlayLayer, surfaceControlHandle); + void reparentDisplayContent(SurfaceControl sc) { + mPendingTransaction.reparent(mWindowingLayer, sc) + .reparent(mOverlayLayer, sc); } } diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java index 9d9b48a5b36a..1a8a9110c649 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimator.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java @@ -199,7 +199,7 @@ class SurfaceAnimator { * @see #setLayer */ void reparent(Transaction t, SurfaceControl newParent) { - t.reparent(mLeash != null ? mLeash : mAnimatable.getSurfaceControl(), newParent.getHandle()); + t.reparent(mLeash != null ? mLeash : mAnimatable.getSurfaceControl(), newParent); } /** @@ -228,8 +228,8 @@ class SurfaceAnimator { // Cancel source animation, but don't let animation runner cancel the animation. from.cancelAnimation(t, false /* restarting */, false /* forwardCancel */); - t.reparent(surface, mLeash.getHandle()); - t.reparent(mLeash, parent.getHandle()); + t.reparent(surface, mLeash); + t.reparent(mLeash, parent); mAnimatable.onAnimationLeashCreated(t, mLeash); mService.mAnimationTransferMap.put(mAnimation, this); } @@ -275,7 +275,7 @@ class SurfaceAnimator { final boolean destroy = mLeash != null && surface != null && parent != null; if (destroy) { if (DEBUG_ANIM) Slog.i(TAG, "Reparenting to original parent"); - t.reparent(surface, parent.getHandle()); + t.reparent(surface, parent); scheduleAnim = true; } mService.mAnimationTransferMap.remove(mAnimation); @@ -308,7 +308,7 @@ class SurfaceAnimator { if (!hidden) { t.show(leash); } - t.reparent(surface, leash.getHandle()); + t.reparent(surface, leash); return leash; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index fda7a85c1270..3dc02d271505 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7326,7 +7326,7 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void reparentDisplayContent(int displayId, IBinder surfaceControlHandle) { + public void reparentDisplayContent(int displayId, SurfaceControl sc) { final Display display = mDisplayManager.getDisplay(displayId); if (display == null) { throw new IllegalArgumentException( @@ -7343,7 +7343,7 @@ public class WindowManagerService extends IWindowManager.Stub long token = Binder.clearCallingIdentity(); try { DisplayContent displayContent = getDisplayContentOrCreate(displayId, null); - displayContent.reparentDisplayContent(surfaceControlHandle); + displayContent.reparentDisplayContent(sc); } finally { Binder.restoreCallingIdentity(token); } 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 d0b9225715c4..ea5ab7bf0621 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenAnimationTests.java @@ -70,9 +70,9 @@ public class AppWindowTokenAnimationTests extends WindowTestsBase { mToken.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */); verify(mTransaction).reparent(eq(mToken.getSurfaceControl()), - eq(mToken.mSurfaceAnimator.mLeash.getHandle())); + eq(mToken.mSurfaceAnimator.mLeash)); verify(mTransaction).reparent(eq(mToken.mSurfaceAnimator.mLeash), - eq(mToken.mAnimationBoundsLayer.getHandle())); + eq(mToken.mAnimationBoundsLayer)); } @Test @@ -111,7 +111,7 @@ public class AppWindowTokenAnimationTests extends WindowTestsBase { mToken.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */); verify(mTransaction).reparent(eq(mToken.getSurfaceControl()), - eq(mToken.mSurfaceAnimator.mLeash.getHandle())); + eq(mToken.mSurfaceAnimator.mLeash)); assertThat(mToken.mAnimationBoundsLayer).isNull(); } } 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 ad80cd6ddfb7..9b84215a8f3b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java @@ -90,7 +90,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase { final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass( OnAnimationFinishedCallback.class); assertAnimating(mAnimatable); - verify(mTransaction).reparent(eq(mAnimatable.mSurface), eq(mAnimatable.mLeash.getHandle())); + verify(mTransaction).reparent(eq(mAnimatable.mSurface), eq(mAnimatable.mLeash)); verify(mSpec).startAnimation(any(), any(), callbackCaptor.capture()); callbackCaptor.getValue().onAnimationFinished(mSpec); |