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
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user