From e0daa2e7eef5e29a1ad168fc7dd8500c2ae8fec8 Mon Sep 17 00:00:00 2001 From: chaviw Date: Tue, 29 Sep 2020 14:29:58 -0700 Subject: [PATCH] Fix some blast issues with SurfaceViews 1. When calling reparentChildren, we want to move children from old view root surface to new view root surface. If blast was enabled, the current code would mvoe children from old view root surface to the layer above the new view root surface. This would cause the SurfaceView to be parented to the wrong layer 2. When the view root surface is changed, VRI is supposed to notify the SurfaceViews so they can call setRelativeLayer to the new view root surface. This wasn't getting called when blast was enabled because the logic to check if it was a new surface is different when using a blast layer. In addition the checking the sequence id that we do now, also check the relayout flag RELAYOUT_RES_SURFACE_CHANGED since that should indicate that the surface was changed. Test: Split screen with Youtube. Change-Id: I1012678b60cec87a702e4d0ffe3e197eda66cff6 --- core/java/android/view/ViewRootImpl.java | 9 ++++++++- .../com/android/server/wm/WindowStateAnimator.java | 11 +++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 778ebb056c8f8..eedf008e5f495 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -78,6 +78,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; +import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ClientSideProto.IME_FOCUS_CONTROLLER; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ClientSideProto.INSETS_CONTROLLER; @@ -2707,7 +2708,13 @@ public final class ViewRootImpl implements ViewParent, updateColorModeIfNeeded(lp.getColorMode()); surfaceCreated = !hadSurface && mSurface.isValid(); surfaceDestroyed = hadSurface && !mSurface.isValid(); - surfaceReplaced = (surfaceGenerationId != mSurface.getGenerationId()) + // When using Blast, the surface generation id may not change when there's a new + // SurfaceControl. In that case, we also check relayout flag + // RELAYOUT_RES_SURFACE_CHANGED since it should indicate that WMS created a new + // SurfaceControl. + surfaceReplaced = (surfaceGenerationId != mSurface.getGenerationId() + || (relayoutResult & RELAYOUT_RES_SURFACE_CHANGED) + == RELAYOUT_RES_SURFACE_CHANGED) && mSurface.isValid(); if (cutoutChanged) { diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 2ace23f24788a..c2f6a579bdb11 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -23,12 +23,10 @@ import static android.graphics.Matrix.MSKEW_Y; import static android.graphics.Matrix.MTRANS_X; import static android.graphics.Matrix.MTRANS_Y; import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; -import static android.view.WindowManager.LayoutParams.FLAG_SCALED; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; -import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManager.TRANSIT_NONE; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_DRAW; @@ -46,19 +44,16 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW_VERBOSE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; -import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_CROP; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER; import static com.android.server.wm.WindowManagerService.logWithStack; import static com.android.server.wm.WindowStateAnimatorProto.DRAW_STATE; -import static com.android.server.wm.WindowStateAnimatorProto.LAST_CLIP_RECT; import static com.android.server.wm.WindowStateAnimatorProto.SURFACE; import static com.android.server.wm.WindowStateAnimatorProto.SYSTEM_DECOR_RECT; import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE; -import android.app.WindowConfiguration; import android.content.Context; import android.graphics.Matrix; import android.graphics.PixelFormat; @@ -365,7 +360,7 @@ class WindowStateAnimator { if (mSurfaceController != null && mPendingDestroySurface != null) { mPostDrawTransaction.reparentChildren( mSurfaceController.getClientViewRootSurface(), - mPendingDestroySurface.mSurfaceControl).apply(); + mPendingDestroySurface.getClientViewRootSurface()).apply(); } destroySurfaceLocked(); mSurfaceDestroyDeferred = true; @@ -399,7 +394,7 @@ class WindowStateAnimator { && (mWin.mActivityRecord == null || !mWin.mActivityRecord.isRelaunching())) { mPostDrawTransaction.reparentChildren( mPendingDestroySurface.getClientViewRootSurface(), - mSurfaceController.mSurfaceControl).apply(); + mSurfaceController.getClientViewRootSurface()).apply(); } destroyDeferredSurfaceLocked(); @@ -988,7 +983,7 @@ class WindowStateAnimator { if (!mPendingDestroySurface.mChildrenDetached) { mPostDrawTransaction.reparentChildren( mPendingDestroySurface.getClientViewRootSurface(), - mSurfaceController.mSurfaceControl); + mSurfaceController.getClientViewRootSurface()); } }