From 32f2817bbdca2e8b1953aec7ef6784ae94d50775 Mon Sep 17 00:00:00 2001 From: chaviw Date: Mon, 25 Jan 2021 14:32:26 -0800 Subject: Remove preserve surfaces When using blast, there's no need to call preserve surfaces since the client can synchronize layer changes with the incoming buffer in the new size. If the client uses the WindowOrganizer.applySync call they can ensure they only update the layer geometry in the same transaction that the new buffer is submitted in. When removing preserveSurfaces, we can also remove reparentChildren since that was the only caller of reparentChildren Test: Split with SurfaceView Bug: 177557720 Change-Id: I4574ac0d3b8a63b13ac44846e729b73ca0f88f23 --- core/java/android/view/SurfaceControl.java | 11 -- core/java/android/view/WindowManagerGlobal.java | 8 -- core/jni/android_view_SurfaceControl.cpp | 12 -- .../java/com/android/server/wm/ActivityRecord.java | 1 - .../com/android/server/wm/RootWindowContainer.java | 1 - .../java/com/android/server/wm/WindowAnimator.java | 2 - .../android/server/wm/WindowManagerService.java | 17 --- .../java/com/android/server/wm/WindowState.java | 22 --- .../com/android/server/wm/WindowStateAnimator.java | 156 ++------------------- .../android/server/wm/WindowSurfaceController.java | 14 +- .../src/com/android/server/wm/StubTransaction.java | 6 - 11 files changed, 13 insertions(+), 237 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index acd25077fb5a..98b4acd302cb 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -188,8 +188,6 @@ public final class SurfaceControl implements Parcelable { IBinder displayToken, int mode); private static native void nativeDeferTransactionUntil(long transactionObj, long nativeObject, long barrierObject, long frame); - private static native void nativeReparentChildren(long transactionObj, long nativeObject, - long newParentObject); private static native void nativeReparent(long transactionObj, long nativeObject, long newParentNativeObject); @@ -2969,15 +2967,6 @@ public final class SurfaceControl implements Parcelable { return this; } - /** - * @hide - */ - public Transaction reparentChildren(SurfaceControl sc, SurfaceControl newParent) { - checkPreconditions(sc); - nativeReparentChildren(mNativeObject, sc.mNativeObject, newParent.mNativeObject); - return this; - } - /** * 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 diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java index dd0ab6503a8a..170124e348c9 100644 --- a/core/java/android/view/WindowManagerGlobal.java +++ b/core/java/android/view/WindowManagerGlobal.java @@ -116,14 +116,6 @@ public final class WindowManagerGlobal { */ public static final int RELAYOUT_INSETS_PENDING = 0x1; - /** - * Flag for relayout: the client may be currently using the current surface, - * so if it is to be destroyed as a part of the relayout the destroy must - * be deferred until later. The client will call performDeferredDestroy() - * when it is okay. - */ - public static final int RELAYOUT_DEFER_SURFACE_DESTROY = 0x2; - public static final int ADD_FLAG_IN_TOUCH_MODE = 0x1; public static final int ADD_FLAG_APP_VISIBLE = 0x2; public static final int ADD_FLAG_USE_TRIPLE_BUFFERING = 0x4; diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 05fcaec82f84..859730872e8c 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -1409,16 +1409,6 @@ static void nativeDeferTransactionUntil(JNIEnv* env, jclass clazz, jlong transac transaction->deferTransactionUntil_legacy(ctrl, barrier, frameNumber); } -static void nativeReparentChildren(JNIEnv* env, jclass clazz, jlong transactionObj, - jlong nativeObject, - jlong newParentObject) { - - auto ctrl = reinterpret_cast(nativeObject); - auto newParent = reinterpret_cast(newParentObject); - auto transaction = reinterpret_cast(transactionObj); - transaction->reparentChildren(ctrl, newParent); -} - static void nativeReparent(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, jlong newParentObject) { @@ -1838,8 +1828,6 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeGetProtectedContentSupport }, {"nativeDeferTransactionUntil", "(JJJJ)V", (void*)nativeDeferTransactionUntil }, - {"nativeReparentChildren", "(JJJ)V", - (void*)nativeReparentChildren } , {"nativeReparent", "(JJJ)V", (void*)nativeReparent }, {"nativeCaptureDisplay", diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 36c503703b9c..3b2515e5dbb1 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -1365,7 +1365,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; } final boolean surfaceReady = w.isDrawn() // Regular case - || w.mWinAnimator.mSurfaceDestroyDeferred // The preserved surface is still ready. || w.isDragResizeChanged(); // Waiting for relayoutWindow to call preserveSurface. final boolean needsLetterbox = surfaceReady && isLetterboxed(w); updateRoundedCorners(w); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index bbf6c7616d46..16323e9aecf6 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -932,7 +932,6 @@ class RootWindowContainer extends WindowContainer displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; } win.destroySurfaceUnchecked(); - win.mWinAnimator.destroyPreservedSurfaceLocked(win.getSyncTransaction()); } while (i > 0); mWmService.mDestroySurface.clear(); } diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 52ed2788d795..1a0e16b9c771 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -220,8 +220,6 @@ public class WindowAnimator { mRemoveReplacedWindows = false; } - mService.destroyPreservedSurfaceLocked(); - mService.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); executeAfterPrepareSurfacesRunnables(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 09fbce034639..f3d52b7d6276 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -83,7 +83,6 @@ import static android.view.WindowManager.TRANSIT_NONE; import static android.view.WindowManager.TRANSIT_RELAUNCH; import static android.view.WindowManagerGlobal.ADD_OKAY; import static android.view.WindowManagerGlobal.ADD_TOO_MANY_TOKENS; -import static android.view.WindowManagerGlobal.RELAYOUT_DEFER_SURFACE_DESTROY; import static android.view.WindowManagerGlobal.RELAYOUT_RES_BLAST_SYNC; import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED; import static android.view.WindowManagerPolicyConstants.NAV_BAR_INVALID; @@ -625,13 +624,6 @@ public class WindowManagerService extends IWindowManager.Stub */ final ArrayList mDestroySurface = new ArrayList<>(); - /** - * Windows with a preserved surface waiting to be destroyed. These windows - * are going through a surface change. We keep the old surface around until - * the first frame on the new surface finishes drawing. - */ - final ArrayList mDestroyPreservedSurface = new ArrayList<>(); - /** * This is set when we have run out of memory, and will either be an empty * list or contain windows that need to be force removed. @@ -2328,7 +2320,6 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_LAYOUT) Slog.v(TAG_WM, "Relayout " + win + ": viewVisibility=" + viewVisibility + " req=" + requestedWidth + "x" + requestedHeight + " " + win.mAttrs); - winAnimator.mSurfaceDestroyDeferred = (flags & RELAYOUT_DEFER_SURFACE_DESTROY) != 0; if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) { winAnimator.mAlpha = attrs.alpha; } @@ -5490,14 +5481,6 @@ public class WindowManagerService extends IWindowManager.Stub } } - void destroyPreservedSurfaceLocked() { - for (int i = mDestroyPreservedSurface.size() - 1; i >= 0 ; i--) { - final WindowState w = mDestroyPreservedSurface.get(i); - w.mWinAnimator.destroyPreservedSurfaceLocked(w.getSyncTransaction()); - } - mDestroyPreservedSurface.clear(); - } - // ------------------------------------------------------------- // IWindowManager API // ------------------------------------------------------------- diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index c6985915de68..bad359af96d9 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -103,7 +103,6 @@ import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType; import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_DOCKED; import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_FREEFORM; import static android.view.WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME; -import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS; @@ -2242,7 +2241,6 @@ class WindowState extends WindowContainer implements WindowManagerP disposeInputChannel(); - mWinAnimator.destroyDeferredSurfaceLocked(mTmpTransaction); mWinAnimator.destroySurfaceLocked(mTmpTransaction); mTmpTransaction.apply(); mSession.windowRemovedLocked(); @@ -3308,11 +3306,6 @@ class WindowState extends WindowContainer implements WindowManagerP return destroyedSomething; } - if (appStopped || mWindowRemovalAllowed) { - mWinAnimator.destroyPreservedSurfaceLocked(mTmpTransaction); - mTmpTransaction.apply(); - } - if (mDestroying) { ProtoLog.e(WM_DEBUG_ADD_REMOVE, "win=%s" + " destroySurfaces: appStopped=%b" @@ -5000,23 +4993,8 @@ class WindowState extends WindowContainer implements WindowManagerP Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } - // When we change the Surface size, in scenarios which may require changing - // the surface position in sync with the resize, we use a preserved surface - // so we can freeze it while waiting for the client to report draw on the newly - // sized surface. At the moment this logic is only in place for switching - // in and out of the big surface for split screen resize. if (isDragResizeChanged()) { setDragResizing(); - // We can only change top level windows to the full-screen surface when - // resizing (as we only have one full-screen surface). So there is no need - // to preserve and destroy windows which are attached to another, they - // will keep their surface and its size may change over time. - if (mHasSurface && !isChildWindow()) { - mWinAnimator.preserveSurfaceLocked(getSyncTransaction()); - result |= RELAYOUT_RES_SURFACE_CHANGED | - RELAYOUT_RES_FIRST_TIME; - scheduleAnimation(); - } } final boolean freeformResizing = isDragResizing() && getResizeMode() == DRAG_RESIZE_MODE_FREEFORM; diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index c8b940a831a8..d164f30fde2c 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -116,15 +116,7 @@ class WindowStateAnimator { boolean mAnimationIsEntrance; WindowSurfaceController mSurfaceController; - private WindowSurfaceController mPendingDestroySurface; - /** - * Set if the client has asked that the destroy of its surface be delayed - * until it explicitly says it is okay. - */ - boolean mSurfaceDestroyDeferred; - - private boolean mDestroyPreservedSurfaceUponRedraw; float mShownAlpha = 0; float mAlpha = 0; float mLastAlpha = 0; @@ -257,11 +249,6 @@ class WindowStateAnimator { //dump(); mLastHidden = true; - // We may have a preserved surface which we no longer need. If there was a quick - // VISIBLE, GONE, VISIBLE, GONE sequence, the surface may never draw, so we don't mark - // it to be destroyed in prepareSurfaceLocked. - markPreservedSurfaceForDestroy(); - if (mSurfaceController != null) { mSurfaceController.hide(transaction, reason); } @@ -323,70 +310,6 @@ class WindowStateAnimator { return result; } - void preserveSurfaceLocked(SurfaceControl.Transaction t) { - if (mDestroyPreservedSurfaceUponRedraw) { - // This could happen when switching the surface mode very fast. For example, - // we preserved a surface when dragResizing changed to true. Then before the - // preserved surface is removed, dragResizing changed to false again. - // In this case, we need to leave the preserved surface alone, and destroy - // the actual surface, so that the createSurface call could create a surface - // of the proper size. The preserved surface will still be removed when client - // finishes drawing to the new surface. - mSurfaceDestroyDeferred = false; - - // Make sure to reparent any children of the new surface back to the preserved - // surface before destroying it. - if (mSurfaceController != null && mPendingDestroySurface != null) { - mPostDrawTransaction.reparentChildren( - mSurfaceController.mSurfaceControl, - mPendingDestroySurface.mSurfaceControl).apply(); - } - destroySurfaceLocked(t); - mSurfaceDestroyDeferred = true; - return; - } - ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE SET FREEZE LAYER: %s", mWin); - if (mSurfaceController != null) { - // Our SurfaceControl is always at layer 0 within the parent Surface managed by - // window-state. We want this old Surface to stay on top of the new one - // until we do the swap, so we place it at a positive layer. - t.setLayer(mSurfaceController.mSurfaceControl, PRESERVED_SURFACE_LAYER); - } - mDestroyPreservedSurfaceUponRedraw = true; - mSurfaceDestroyDeferred = true; - destroySurfaceLocked(t); - } - - void destroyPreservedSurfaceLocked(SurfaceControl.Transaction t) { - if (!mDestroyPreservedSurfaceUponRedraw) { - return; - } - - // If we are preserving a surface but we aren't relaunching that means - // we are just doing an in-place switch. In that case any SurfaceFlinger side - // child layers need to be reparented to the new surface to make this - // transparent to the app. - // If the children are detached, we don't want to reparent them to the new surface. - // Instead let the children get removed when the old surface is deleted. - if (mSurfaceController != null && mPendingDestroySurface != null - && !mPendingDestroySurface.mChildrenDetached - && (mWin.mActivityRecord == null || !mWin.mActivityRecord.isRelaunching())) { - mPostDrawTransaction.reparentChildren( - mPendingDestroySurface.mSurfaceControl, - mSurfaceController.mSurfaceControl).apply(); - } - - destroyDeferredSurfaceLocked(t); - mDestroyPreservedSurfaceUponRedraw = false; - } - - private void markPreservedSurfaceForDestroy() { - if (mDestroyPreservedSurfaceUponRedraw - && !mService.mDestroyPreservedSurface.contains(mWin)) { - mService.mDestroyPreservedSurface.add(mWin); - } - } - void resetDrawState() { mDrawState = DRAW_PENDING; @@ -508,39 +431,23 @@ class WindowStateAnimator { return; } - // When destroying a surface we want to make sure child windows are hidden. If we are - // preserving the surface until redraw though we intend to swap it out with another surface - // for resizing. In this case the window always remains visible to the user and the child - // windows should likewise remain visible. - if (!mDestroyPreservedSurfaceUponRedraw) { - mWin.mHidden = true; - } + mWin.mHidden = true; try { - if (DEBUG_VISIBILITY) logWithStack(TAG, "Window " + this + " destroying surface " - + mSurfaceController + ", session " + mSession); - if (mSurfaceDestroyDeferred) { - if (mSurfaceController != null && mPendingDestroySurface != mSurfaceController) { - if (mPendingDestroySurface != null) { - ProtoLog.i(WM_SHOW_SURFACE_ALLOC, "SURFACE DESTROY PENDING: %s. %s", - mWin, new RuntimeException().fillInStackTrace()); - mPendingDestroySurface.destroy(t); - } - mPendingDestroySurface = mSurfaceController; - } - } else { - ProtoLog.i(WM_SHOW_SURFACE_ALLOC, "SURFACE DESTROY: %s. %s", - mWin, new RuntimeException().fillInStackTrace()); - destroySurface(t); + if (DEBUG_VISIBILITY) { + logWithStack(TAG, "Window " + this + " destroying surface " + + mSurfaceController + ", session " + mSession); } + ProtoLog.i(WM_SHOW_SURFACE_ALLOC, "SURFACE DESTROY: %s. %s", + mWin, new RuntimeException().fillInStackTrace()); + destroySurface(t); // Don't hide wallpaper if we're deferring the surface destroy // because of a surface change. - if (!mDestroyPreservedSurfaceUponRedraw) { - mWallpaperControllerLocked.hideWallpapers(mWin); - } + mWallpaperControllerLocked.hideWallpapers(mWin); } catch (RuntimeException e) { Slog.w(TAG, "Exception thrown when destroying Window " + this - + " surface " + mSurfaceController + " session " + mSession + ": " + e.toString()); + + " surface " + mSurfaceController + " session " + mSession + ": " + + e.toString()); } // Whether the surface was preserved (and copied to mPendingDestroySurface) or not, it @@ -554,27 +461,6 @@ class WindowStateAnimator { mDrawState = NO_SURFACE; } - void destroyDeferredSurfaceLocked(SurfaceControl.Transaction t) { - try { - if (mPendingDestroySurface != null) { - ProtoLog.i(WM_SHOW_SURFACE_ALLOC, "SURFACE DESTROY PENDING: %s. %s", - mWin, new RuntimeException().fillInStackTrace()); - mPendingDestroySurface.destroy(t); - // Don't hide wallpaper if we're destroying a deferred surface - // after a surface mode change. - if (!mDestroyPreservedSurfaceUponRedraw) { - mWallpaperControllerLocked.hideWallpapers(mWin); - } - } - } catch (RuntimeException e) { - Slog.w(TAG, "Exception thrown when destroying Window " - + this + " surface " + mPendingDestroySurface - + " session " + mSession + ": " + e.toString()); - } - mSurfaceDestroyDeferred = false; - mPendingDestroySurface = null; - } - void computeShownFrameLocked() { if (mIsWallpaper && mService.mRoot.mWallpaperActionPending) { return; @@ -744,7 +630,6 @@ class WindowStateAnimator { if (prepared && mDrawState == HAS_DRAWN) { if (mLastHidden) { if (showSurfaceRobustlyLocked(t)) { - markPreservedSurfaceForDestroy(); mAnimator.requestRemovalOfReplacedWindows(w); mLastHidden = false; if (mIsWallpaper) { @@ -905,20 +790,6 @@ class WindowStateAnimator { if (!shown) return false; - // If we had a preserved surface it's no longer needed, and it may be harmful - // if we are transparent. - if (mPendingDestroySurface != null && mDestroyPreservedSurfaceUponRedraw) { - final SurfaceControl pendingSurfaceControl = mPendingDestroySurface.mSurfaceControl; - mPostDrawTransaction.reparent(pendingSurfaceControl, null); - // If the children are detached, we don't want to reparent them to the new surface. - // Instead let the children get removed when the old surface is deleted. - if (!mPendingDestroySurface.mChildrenDetached) { - mPostDrawTransaction.reparentChildren( - mPendingDestroySurface.mSurfaceControl, - mSurfaceController.mSurfaceControl); - } - } - t.merge(mPostDrawTransaction); return true; } @@ -1058,13 +929,6 @@ class WindowStateAnimator { pw.println(); } - if (mPendingDestroySurface != null) { - pw.print(prefix); pw.print("mPendingDestroySurface="); - pw.println(mPendingDestroySurface); - } - if (mSurfaceDestroyDeferred) { - pw.print(" mSurfaceDestroyDeferred="); pw.println(mSurfaceDestroyDeferred); - } if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) { pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha); pw.print(" mAlpha="); pw.print(mAlpha); diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index 5f4477df021c..82ba3c188b76 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -55,8 +55,6 @@ class WindowSurfaceController { private boolean mSurfaceShown = false; private float mSurfaceX = 0; private float mSurfaceY = 0; - private int mSurfaceW = 0; - private int mSurfaceH = 0; // Initialize to the identity matrix. private float mLastDsdx = 1; @@ -82,9 +80,6 @@ class WindowSurfaceController { int flags, WindowStateAnimator animator, int windowType) { mAnimator = animator; - mSurfaceW = w; - mSurfaceH = h; - title = name; mService = animator.mService; @@ -104,8 +99,8 @@ class WindowSurfaceController { .setMetadata(METADATA_OWNER_PID, mWindowSession.mPid) .setCallsite("WindowSurfaceController"); - final boolean useBLAST = mService.mUseBLAST && ((win.getAttrs().privateFlags & - WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST) != 0); + final boolean useBLAST = mService.mUseBLAST && ((win.getAttrs().privateFlags + & WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST) != 0); if (useBLAST) { b.setBLASTLayer(); @@ -119,7 +114,6 @@ class WindowSurfaceController { void hide(SurfaceControl.Transaction transaction, String reason) { ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE HIDE ( %s ): %s", reason, title); - mAnimator.destroyPreservedSurfaceLocked(transaction); if (mSurfaceShown) { hideSurface(transaction); } @@ -335,9 +329,7 @@ class WindowSurfaceController { pw.print(" layer="); pw.print(mSurfaceLayer); pw.print(" alpha="); pw.print(mSurfaceAlpha); pw.print(" rect=("); pw.print(mSurfaceX); - pw.print(","); pw.print(mSurfaceY); - pw.print(") "); pw.print(mSurfaceW); - pw.print(" x "); pw.print(mSurfaceH); + pw.print(","); pw.print(mSurfaceY); pw.print(") "); pw.print(" transform=("); pw.print(mLastDsdx); pw.print(", "); pw.print(mLastDtdx); pw.print(", "); pw.print(mLastDsdy); pw.print(", "); pw.print(mLastDtdy); pw.println(")"); diff --git a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java index b8d44f605bca..6c722499da4b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java +++ b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java @@ -151,12 +151,6 @@ public class StubTransaction extends SurfaceControl.Transaction { return this; } - @Override - public SurfaceControl.Transaction reparentChildren(SurfaceControl sc, - SurfaceControl newParent) { - return this; - } - @Override public SurfaceControl.Transaction reparent(SurfaceControl sc, SurfaceControl newParent) { return this; -- cgit v1.2.3-59-g8ed1b