diff options
| author | 2019-10-09 20:59:48 +0000 | |
|---|---|---|
| committer | 2019-10-09 20:59:48 +0000 | |
| commit | ca80d5b65bc2fbc0bcc640a1f3f625d4d17f9f01 (patch) | |
| tree | 020e8b285eadb550571f44e9c2cfe503698a07bc | |
| parent | cd7610e1b1dde17aca53da8cdcd04ed9cd5886da (diff) | |
| parent | 619da69f9ea8db750a3275c9c02ca1657364914e (diff) | |
Merge "Replace SurfaceControl call points with Transaction calls (1/n)"
23 files changed, 271 insertions, 394 deletions
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index b685cf098b33..6637c5b06a1b 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -181,7 +181,6 @@ public final 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 boolean nativeGetTransformToDisplayInverse(long nativeObject); private static native Display.HdrCapabilities nativeGetHdrCapabilities(IBinder displayToken); @@ -303,8 +302,8 @@ public final class SurfaceControl implements Parcelable { /** * Surface creation flag: Creates a Dim surface. * Everything behind this surface is dimmed by the amount specified - * in {@link #setAlpha}. It is an error to lock a Dim surface, since it - * doesn't have a backing store. + * in {@link Transaction#setAlpha(SurfaceControl, float)}. It is an error to lock a Dim + * surface, since it doesn't have a backing store. * * @hide */ @@ -740,20 +739,20 @@ public final class SurfaceControl implements Parcelable { * <p> * Good practice is to first create the surface with the {@link #HIDDEN} flag * specified, open a transaction, set the surface layer, layer stack, alpha, - * and position, call {@link #show} if appropriate, and close the transaction. + * and position, call {@link Transaction#show(SurfaceControl)} if appropriate, and close the + * transaction. * <p> * Bounds of the surface is determined by its crop and its buffer size. If the * surface has no buffer or crop, the surface is boundless and only constrained * by the size of its parent bounds. * - * @param session The surface session, must not be null. - * @param name The surface name, must not be null. - * @param w The surface initial width. - * @param h The surface initial height. - * @param flags The surface creation flags. Should always include {@link #HIDDEN} - * in the creation flags. + * @param session The surface session, must not be null. + * @param name The surface name, must not be null. + * @param w The surface initial width. + * @param h The surface initial height. + * @param flags The surface creation flags. Should always include {@link #HIDDEN} + * in the creation flags. * @param metadata Initial metadata. - * * @throws throws OutOfResourcesException If the SurfaceControl cannot be created. */ private SurfaceControl(SurfaceSession session, String name, int w, int h, int format, int flags, @@ -1014,15 +1013,6 @@ public final class SurfaceControl implements Parcelable { /** * @hide */ - public void deferTransactionUntil(Surface barrier, long frame) { - synchronized(SurfaceControl.class) { - sGlobalTransaction.deferTransactionUntilSurface(this, barrier, frame); - } - } - - /** - * @hide - */ public void reparentChildren(SurfaceControl newParent) { synchronized(SurfaceControl.class) { sGlobalTransaction.reparentChildren(this, newParent); @@ -1032,15 +1022,6 @@ public final class SurfaceControl implements Parcelable { /** * @hide */ - public void reparent(SurfaceControl newParent) { - synchronized(SurfaceControl.class) { - sGlobalTransaction.reparent(this, newParent); - } - } - - /** - * @hide - */ public void detachChildren() { synchronized(SurfaceControl.class) { sGlobalTransaction.detachChildren(this); @@ -1060,15 +1041,6 @@ public final class SurfaceControl implements Parcelable { /** * @hide */ - public static void setAnimationTransaction() { - synchronized (SurfaceControl.class) { - sGlobalTransaction.setAnimationTransaction(); - } - } - - /** - * @hide - */ @UnsupportedAppUsage public void setLayer(int zorder) { checkNotReleased(); @@ -1080,16 +1052,6 @@ public final class SurfaceControl implements Parcelable { /** * @hide */ - public void setRelativeLayer(SurfaceControl relativeTo, int zorder) { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.setRelativeLayer(this, relativeTo, zorder); - } - } - - /** - * @hide - */ @UnsupportedAppUsage public void setPosition(float x, float y) { checkNotReleased(); @@ -1183,16 +1145,6 @@ public final class SurfaceControl implements Parcelable { /** * @hide */ - public void setColor(@Size(3) float[] color) { - checkNotReleased(); - synchronized (SurfaceControl.class) { - sGlobalTransaction.setColor(this, color); - } - } - - /** - * @hide - */ public void setMatrix(float dsdx, float dtdx, float dtdy, float dsdy) { checkNotReleased(); synchronized(SurfaceControl.class) { @@ -1201,36 +1153,6 @@ public final class SurfaceControl implements Parcelable { } /** - * Sets the transform and position of a {@link SurfaceControl} from a 3x3 transformation matrix. - * - * @param matrix The matrix to apply. - * @param float9 An array of 9 floats to be used to extract the values from the matrix. - * @hide - */ - public void setMatrix(Matrix matrix, float[] float9) { - checkNotReleased(); - matrix.getValues(float9); - synchronized (SurfaceControl.class) { - sGlobalTransaction.setMatrix(this, float9[MSCALE_X], float9[MSKEW_Y], - float9[MSKEW_X], float9[MSCALE_Y]); - sGlobalTransaction.setPosition(this, float9[MTRANS_X], float9[MTRANS_Y]); - } - } - - /** - * Sets the color transform for the Surface. - * @param matrix A float array with 9 values represents a 3x3 transform matrix - * @param translation A float array with 3 values represents a translation vector - * @hide - */ - public void setColorTransform(@Size(9) float[] matrix, @Size(3) float[] translation) { - checkNotReleased(); - synchronized (SurfaceControl.class) { - sGlobalTransaction.setColorTransform(this, matrix, translation); - } - } - - /** * Sets the Surface to be color space agnostic. If a surface is color space agnostic, * the color can be interpreted in any color space. * @param agnostic A boolean to indicate whether the surface is color space agnostic @@ -1260,43 +1182,6 @@ public final class SurfaceControl implements Parcelable { } /** - * Same as {@link SurfaceControl#setWindowCrop(Rect)} but sets the crop rect top left at 0, 0. - * - * @param width width of crop rect - * @param height height of crop rect - * @hide - */ - public void setWindowCrop(int width, int height) { - checkNotReleased(); - synchronized (SurfaceControl.class) { - sGlobalTransaction.setWindowCrop(this, width, height); - } - } - - /** - * Sets the corner radius of a {@link SurfaceControl}. - * - * @param cornerRadius Corner radius in pixels. - * @hide - */ - public void setCornerRadius(float cornerRadius) { - checkNotReleased(); - synchronized (SurfaceControl.class) { - sGlobalTransaction.setCornerRadius(this, cornerRadius); - } - } - - /** - * @hide - */ - public void setLayerStack(int layerStack) { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.setLayerStack(this, layerStack); - } - } - - /** * @hide */ public void setOpaque(boolean isOpaque) { @@ -2302,6 +2187,12 @@ public final class SurfaceControl implements Parcelable { } /** + * Sets the transform and position of a {@link SurfaceControl} from a 3x3 transformation + * matrix. + * + * @param sc SurfaceControl to set matrix of + * @param matrix The matrix to apply. + * @param float9 An array of 9 floats to be used to extract the values from the matrix. * @hide */ @UnsupportedAppUsage @@ -2315,7 +2206,9 @@ public final class SurfaceControl implements Parcelable { /** * Sets the color transform for the Surface. - * @param matrix A float array with 9 values represents a 3x3 transform matrix + * + * @param sc SurfaceControl to set color transform of + * @param matrix A float array with 9 values represents a 3x3 transform matrix * @param translation A float array with 3 values represents a translation vector * @hide */ @@ -2339,6 +2232,13 @@ public final class SurfaceControl implements Parcelable { } /** + * Bounds the surface and its children to the bounds specified. Size of the surface will be + * ignored and only the crop and buffer size will be used to determine the bounds of the + * surface. If no crop is specified and the surface has no buffer, the surface bounds is + * only constrained by the size of its parent bounds. + * + * @param sc SurfaceControl to set crop of. + * @param crop Bounds of the crop to apply. * @hide */ @UnsupportedAppUsage @@ -2355,6 +2255,12 @@ public final class SurfaceControl implements Parcelable { } /** + * Same as {@link Transaction#setWindowCrop(SurfaceControl, Rect)} but sets the crop rect + * top left at 0, 0. + * + * @param sc SurfaceControl to set crop of. + * @param width width of crop rect + * @param height height of crop rect * @hide */ public Transaction setWindowCrop(SurfaceControl sc, int width, int height) { diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index a85830009f58..2f0a4ebb84f8 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -418,12 +418,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall Log.d(TAG, System.identityHashCode(this) + " updateSurfaceAlpha: set alpha=" + alpha); } - SurfaceControl.openTransaction(); - try { - mSurfaceControl.setAlpha(alpha); - } finally { - SurfaceControl.closeTransaction(); - } + mTmpTransaction.setAlpha(mSurfaceControl, alpha).apply(); } mSurfaceAlpha = alpha; } @@ -701,17 +696,18 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } } - private void updateBackgroundVisibilityInTransaction() { + private void updateBackgroundVisibility(Transaction t) { if (mBackgroundControl == null) { return; } if ((mSubLayer < 0) && ((mSurfaceFlags & SurfaceControl.OPAQUE) != 0)) { - mBackgroundControl.show(); + t.show(mBackgroundControl); } else { - mBackgroundControl.hide(); + t.hide(mBackgroundControl); } } + private void releaseSurfaces() { mSurfaceAlpha = 1f; @@ -853,61 +849,61 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall if (DEBUG) Log.i(TAG, System.identityHashCode(this) + " " + "Cur surface: " + mSurface); - SurfaceControl.openTransaction(); - try { - // If we are creating the surface control or the parent surface has not - // changed, then set relative z. Otherwise allow the parent - // SurfaceChangedCallback to update the relative z. This is needed so that - // we do not change the relative z before the server is ready to swap the - // parent surface. - if (creating || (mParentSurfaceGenerationId - == viewRoot.mSurface.getGenerationId())) { - SurfaceControl.mergeToGlobalTransaction(updateRelativeZ()); - } - mParentSurfaceGenerationId = viewRoot.mSurface.getGenerationId(); + // If we are creating the surface control or the parent surface has not + // changed, then set relative z. Otherwise allow the parent + // SurfaceChangedCallback to update the relative z. This is needed so that + // we do not change the relative z before the server is ready to swap the + // parent surface. + if (creating || (mParentSurfaceGenerationId + == viewRoot.mSurface.getGenerationId())) { + updateRelativeZ(mTmpTransaction); + } + mParentSurfaceGenerationId = viewRoot.mSurface.getGenerationId(); - if (mViewVisibility) { - mSurfaceControl.show(); - } else { - mSurfaceControl.hide(); - } - updateBackgroundVisibilityInTransaction(); - if (mUseAlpha) { - mSurfaceControl.setAlpha(alpha); - mSurfaceAlpha = alpha; - } + if (mViewVisibility) { + mTmpTransaction.show(mSurfaceControl); + } else { + mTmpTransaction.hide(mSurfaceControl); + } + updateBackgroundVisibility(mTmpTransaction); + if (mUseAlpha) { + mTmpTransaction.setAlpha(mSurfaceControl, alpha); + mSurfaceAlpha = alpha; + } - // While creating the surface, we will set it's initial - // geometry. Outside of that though, we should generally - // leave it to the RenderThread. - // - // There is one more case when the buffer size changes we aren't yet - // prepared to sync (as even following the transaction applying - // we still need to latch a buffer). - // b/28866173 - if (sizeChanged || creating || !mRtHandlingPositionUpdates) { - mSurfaceControl.setPosition(mScreenRect.left, mScreenRect.top); - mSurfaceControl.setMatrix(mScreenRect.width() / (float) mSurfaceWidth, - 0.0f, 0.0f, - mScreenRect.height() / (float) mSurfaceHeight); - // Set a window crop when creating the surface or changing its size to - // crop the buffer to the surface size since the buffer producer may - // use SCALING_MODE_SCALE and submit a larger size than the surface - // size. - if (mClipSurfaceToBounds && mClipBounds != null) { - mSurfaceControl.setWindowCrop(mClipBounds); - } else { - mSurfaceControl.setWindowCrop(mSurfaceWidth, mSurfaceHeight); - } - } - mSurfaceControl.setCornerRadius(mCornerRadius); - if (sizeChanged && !creating) { - mSurfaceControl.setBufferSize(mSurfaceWidth, mSurfaceHeight); + // While creating the surface, we will set it's initial + // geometry. Outside of that though, we should generally + // leave it to the RenderThread. + // + // There is one more case when the buffer size changes we aren't yet + // prepared to sync (as even following the transaction applying + // we still need to latch a buffer). + // b/28866173 + if (sizeChanged || creating || !mRtHandlingPositionUpdates) { + mTmpTransaction.setPosition(mSurfaceControl, mScreenRect.left, + mScreenRect.top); + mTmpTransaction.setMatrix(mSurfaceControl, + mScreenRect.width() / (float) mSurfaceWidth, 0.0f, 0.0f, + mScreenRect.height() / (float) mSurfaceHeight); + // Set a window crop when creating the surface or changing its size to + // crop the buffer to the surface size since the buffer producer may + // use SCALING_MODE_SCALE and submit a larger size than the surface + // size. + if (mClipSurfaceToBounds && mClipBounds != null) { + mTmpTransaction.setWindowCrop(mSurfaceControl, mClipBounds); + } else { + mTmpTransaction.setWindowCrop(mSurfaceControl, mSurfaceWidth, + mSurfaceHeight); } - } finally { - SurfaceControl.closeTransaction(); + } + mTmpTransaction.setCornerRadius(mSurfaceControl, mCornerRadius); + if (sizeChanged && !creating) { + mTmpTransaction.setBufferSize(mSurfaceControl, mSurfaceWidth, + mSurfaceHeight); } + mTmpTransaction.apply(); + if (sizeChanged || creating) { redrawNeeded = true; } @@ -1260,12 +1256,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall final float[] colorComponents = new float[] { Color.red(bgColor) / 255.f, Color.green(bgColor) / 255.f, Color.blue(bgColor) / 255.f }; - SurfaceControl.openTransaction(); - try { - mBackgroundControl.setColor(colorComponents); - } finally { - SurfaceControl.closeTransaction(); - } + mTmpTransaction.setColor(mBackgroundControl, colorComponents).apply(); } @UnsupportedAppUsage @@ -1480,15 +1471,13 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall @Override public void surfaceReplaced(Transaction t) { if (mSurfaceControl != null && mBackgroundControl != null) { - t.merge(updateRelativeZ()); + updateRelativeZ(t); } } - private Transaction updateRelativeZ() { - Transaction t = new Transaction(); + private void updateRelativeZ(Transaction t) { SurfaceControl viewRoot = getViewRootImpl().getSurfaceControl(); t.setRelativeLayer(mBackgroundControl, viewRoot, Integer.MIN_VALUE); t.setRelativeLayer(mSurfaceControl, viewRoot, mSubLayer); - return t; } } diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java index c46fc20b3cc8..29026e8affcf 100644 --- a/services/core/java/com/android/server/display/ColorFade.java +++ b/services/core/java/com/android/server/display/ColorFade.java @@ -114,6 +114,8 @@ final class ColorFade { private final FloatBuffer mVertexBuffer = createNativeFloatBuffer(8); private final FloatBuffer mTexCoordBuffer = createNativeFloatBuffer(8); + private final Transaction mTransaction = new Transaction(); + /** * Animates an color fade warming up. */ @@ -659,14 +661,10 @@ final class ColorFade { private boolean showSurface(float alpha) { if (!mSurfaceVisible || mSurfaceAlpha != alpha) { - SurfaceControl.openTransaction(); - try { - mSurfaceControl.setLayer(COLOR_FADE_LAYER); - mSurfaceControl.setAlpha(alpha); - mSurfaceControl.show(); - } finally { - SurfaceControl.closeTransaction(); - } + mTransaction.setLayer(mSurfaceControl, COLOR_FADE_LAYER) + .setAlpha(mSurfaceControl, alpha) + .show(mSurfaceControl) + .apply(); mSurfaceVisible = true; mSurfaceAlpha = alpha; } diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index 59f051bc76a6..10415f58db80 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -271,11 +271,11 @@ final class AccessibilityController { } } - /** NOTE: This has to be called within a surface transaction. */ - public void drawMagnifiedRegionBorderIfNeededLocked(int displayId) { + public void drawMagnifiedRegionBorderIfNeededLocked(int displayId, + SurfaceControl.Transaction t) { final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId); if (displayMagnifier != null) { - displayMagnifier.drawMagnifiedRegionBorderIfNeededLocked(); + displayMagnifier.drawMagnifiedRegionBorderIfNeededLocked(t); } // Not relevant for the window observer. } @@ -431,7 +431,7 @@ final class AccessibilityController { Slog.i(LOG_TAG, "Rotation: " + Surface.rotationToString(rotation) + " displayId: " + displayContent.getDisplayId()); } - mMagnifedViewport.onRotationChangedLocked(); + mMagnifedViewport.onRotationChangedLocked(displayContent.getPendingTransaction()); mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_ROTATION_CHANGED); } @@ -536,9 +536,8 @@ final class AccessibilityController { .sendToTarget(); } - /** NOTE: This has to be called within a surface transaction. */ - public void drawMagnifiedRegionBorderIfNeededLocked() { - mMagnifedViewport.drawWindowIfNeededLocked(); + public void drawMagnifiedRegionBorderIfNeededLocked(SurfaceControl.Transaction t) { + mMagnifedViewport.drawWindowIfNeededLocked(t); } private final class MagnifiedViewport { @@ -744,7 +743,7 @@ final class AccessibilityController { return letterboxBounds; } - public void onRotationChangedLocked() { + public void onRotationChangedLocked(SurfaceControl.Transaction t) { // If we are showing the magnification border, hide it immediately so // the user does not see strange artifacts during rotation. The screenshot // used for rotation already has the border. After the rotation is complete @@ -758,7 +757,7 @@ final class AccessibilityController { mHandler.sendMessageDelayed(message, delay); } recomputeBoundsLocked(); - mWindow.updateSize(); + mWindow.updateSize(t); } public void setMagnifiedRegionBorderShownLocked(boolean shown, boolean animate) { @@ -784,10 +783,9 @@ final class AccessibilityController { return mMagnificationSpec; } - /** NOTE: This has to be called within a surface transaction. */ - public void drawWindowIfNeededLocked() { + public void drawWindowIfNeededLocked(SurfaceControl.Transaction t) { recomputeBoundsLocked(); - mWindow.drawIfNeeded(); + mWindow.drawIfNeeded(t); } public void destroyWindow() { @@ -837,10 +835,11 @@ final class AccessibilityController { /* ignore */ } mSurfaceControl = surfaceControl; - mSurfaceControl.setLayer(mService.mPolicy.getWindowLayerFromTypeLw( - TYPE_MAGNIFICATION_OVERLAY) - * WindowManagerService.TYPE_LAYER_MULTIPLIER); - mSurfaceControl.setPosition(0, 0); + mService.mTransactionFactory.get().setLayer(mSurfaceControl, + mService.mPolicy.getWindowLayerFromTypeLw(TYPE_MAGNIFICATION_OVERLAY) + * WindowManagerService.TYPE_LAYER_MULTIPLIER) + .setPosition(mSurfaceControl, 0, 0) + .apply(); mSurface.copyFrom(mSurfaceControl); mAnimationController = new AnimationController(context, @@ -905,10 +904,10 @@ final class AccessibilityController { } } - public void updateSize() { + public void updateSize(SurfaceControl.Transaction t) { synchronized (mService.mGlobalLock) { mWindowManager.getDefaultDisplay().getRealSize(mTempPoint); - mSurfaceControl.setBufferSize(mTempPoint.x, mTempPoint.y); + t.setBufferSize(mSurfaceControl, mTempPoint.x, mTempPoint.y); invalidate(mDirtyRect); } } @@ -923,8 +922,7 @@ final class AccessibilityController { mService.scheduleAnimationLocked(); } - /** NOTE: This has to be called within a surface transaction. */ - public void drawIfNeeded() { + public void drawIfNeeded(SurfaceControl.Transaction t) { synchronized (mService.mGlobalLock) { if (!mInvalidated) { return; @@ -959,9 +957,9 @@ final class AccessibilityController { canvas.drawPath(path, mPaint); mSurface.unlockCanvasAndPost(canvas); - mSurfaceControl.show(); + t.show(mSurfaceControl); } else { - mSurfaceControl.hide(); + t.hide(mSurfaceControl); } } } diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index b1ef60185d8d..a261341cfa53 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -2930,7 +2930,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree layer += Z_BOOST_BASE; } if (!mNeedsAnimationBoundsLayer) { - leash.setLayer(layer); + t.setLayer(leash, layer); } final DisplayContent dc = getDisplayContent(); diff --git a/services/core/java/com/android/server/wm/CircularDisplayMask.java b/services/core/java/com/android/server/wm/CircularDisplayMask.java index c1ca816d788a..b73b481075ae 100644 --- a/services/core/java/com/android/server/wm/CircularDisplayMask.java +++ b/services/core/java/com/android/server/wm/CircularDisplayMask.java @@ -56,7 +56,7 @@ class CircularDisplayMask { private int mMaskThickness; CircularDisplayMask(Supplier<Surface> surfaceFactory, DisplayContent dc, int zOrder, - int screenOffset, int maskThickness) { + int screenOffset, int maskThickness, SurfaceControl.Transaction t) { final Display display = dc.getDisplay(); mSurface = surfaceFactory.get(); mScreenSize = new Point(); @@ -75,10 +75,10 @@ class CircularDisplayMask { .setFormat(PixelFormat.TRANSLUCENT) .build(); - ctrl.setLayerStack(display.getLayerStack()); - ctrl.setLayer(zOrder); - ctrl.setPosition(0, 0); - ctrl.show(); + t.setLayerStack(ctrl, display.getLayerStack()); + t.setLayer(ctrl, zOrder); + t.setPosition(ctrl, 0, 0); + t.show(ctrl); mSurface.copyFrom(ctrl); } catch (OutOfResourcesException e) { } @@ -91,7 +91,7 @@ class CircularDisplayMask { mMaskThickness = maskThickness; } - private void drawIfNeeded() { + private void drawIfNeeded(SurfaceControl.Transaction t) { if (!mDrawNeeded || !mVisible || mDimensionsUnequal) { return; } @@ -108,45 +108,46 @@ class CircularDisplayMask { return; } switch (mRotation) { - case Surface.ROTATION_0: - case Surface.ROTATION_90: - // chin bottom or right - mSurfaceControl.setPosition(0, 0); - break; - case Surface.ROTATION_180: - // chin top - mSurfaceControl.setPosition(0, -mScreenOffset); - break; - case Surface.ROTATION_270: - // chin left - mSurfaceControl.setPosition(-mScreenOffset, 0); - break; + case Surface.ROTATION_0: + case Surface.ROTATION_90: + // chin bottom or right + t.setPosition(mSurfaceControl, 0, 0); + break; + case Surface.ROTATION_180: + // chin top + t.setPosition(mSurfaceControl, 0, -mScreenOffset); + break; + case Surface.ROTATION_270: + // chin left + t.setPosition(mSurfaceControl, -mScreenOffset, 0); + break; } int circleRadius = mScreenSize.x / 2; c.drawColor(Color.BLACK); - // The radius is reduced by mMaskThickness to provide an anti aliasing effect on the display edges. + // The radius is reduced by mMaskThickness to provide an anti aliasing effect on the + // display edges. c.drawCircle(circleRadius, circleRadius, circleRadius - mMaskThickness, mPaint); mSurface.unlockCanvasAndPost(c); } // Note: caller responsible for being inside // Surface.openTransaction() / closeTransaction() - public void setVisibility(boolean on) { + public void setVisibility(boolean on, SurfaceControl.Transaction t) { if (mSurfaceControl == null) { return; } mVisible = on; - drawIfNeeded(); + drawIfNeeded(t); if (on) { - mSurfaceControl.show(); + t.show(mSurfaceControl); } else { - mSurfaceControl.hide(); + t.hide(mSurfaceControl); } } - void positionSurface(int dw, int dh, int rotation) { + void positionSurface(int dw, int dh, int rotation, SurfaceControl.Transaction t) { if (mLastDW == dw && mLastDH == dh && mRotation == rotation) { return; } @@ -154,7 +155,7 @@ class CircularDisplayMask { mLastDH = dh; mDrawNeeded = true; mRotation = rotation; - drawIfNeeded(); + drawIfNeeded(t); } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index f592ac6957cb..ac910cde79b0 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -331,7 +331,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo /** * For default display it contains real metrics, empty for others. - * @see WindowManagerService#createWatermarkInTransaction() + * @see WindowManagerService#createWatermark() */ final DisplayMetrics mRealDisplayMetrics = new DisplayMetrics(); diff --git a/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java b/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java index f64592fd46bd..2165b0e8b593 100644 --- a/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java +++ b/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java @@ -50,7 +50,7 @@ class EmulatorDisplayOverlay { private boolean mVisible; EmulatorDisplayOverlay(Supplier<Surface> surfaceFactory, Context context, DisplayContent dc, - int zOrder) { + int zOrder, SurfaceControl.Transaction t) { mSurface = surfaceFactory.get(); final Display display = dc.getDisplay(); mScreenSize = new Point(); @@ -63,9 +63,9 @@ class EmulatorDisplayOverlay { .setBufferSize(mScreenSize.x, mScreenSize.y) .setFormat(PixelFormat.TRANSLUCENT) .build(); - ctrl.setLayer(zOrder); - ctrl.setPosition(0, 0); - ctrl.show(); + t.setLayer(ctrl, zOrder); + t.setPosition(ctrl, 0, 0); + t.show(ctrl); mSurface.copyFrom(ctrl); } catch (OutOfResourcesException e) { } @@ -75,7 +75,7 @@ class EmulatorDisplayOverlay { com.android.internal.R.drawable.emulator_circular_window_overlay); } - private void drawIfNeeded() { + private void drawIfNeeded(SurfaceControl.Transaction t) { if (!mDrawNeeded || !mVisible) { return; } @@ -92,7 +92,7 @@ class EmulatorDisplayOverlay { return; } c.drawColor(Color.TRANSPARENT, PorterDuff.Mode.SRC); - mSurfaceControl.setPosition(0, 0); + t.setPosition(mSurfaceControl, 0, 0); // Always draw the overlay with square dimensions int size = Math.max(mScreenSize.x, mScreenSize.y); mOverlay.setBounds(0, 0, size, size); @@ -102,20 +102,20 @@ class EmulatorDisplayOverlay { // Note: caller responsible for being inside // Surface.openTransaction() / closeTransaction() - public void setVisibility(boolean on) { + public void setVisibility(boolean on, SurfaceControl.Transaction t) { if (mSurfaceControl == null) { return; } mVisible = on; - drawIfNeeded(); + drawIfNeeded(t); if (on) { - mSurfaceControl.show(); + t.show(mSurfaceControl); } else { - mSurfaceControl.hide(); + t.hide(mSurfaceControl); } } - void positionSurface(int dw, int dh, int rotation) { + void positionSurface(int dw, int dh, int rotation, SurfaceControl.Transaction t) { if (mLastDW == dw && mLastDH == dh && mRotation == rotation) { return; } @@ -123,7 +123,7 @@ class EmulatorDisplayOverlay { mLastDH = dh; mDrawNeeded = true; mRotation = rotation; - drawIfNeeded(); + drawIfNeeded(t); } } diff --git a/services/core/java/com/android/server/wm/Letterbox.java b/services/core/java/com/android/server/wm/Letterbox.java index 1bd2493e9a07..94d010e846f5 100644 --- a/services/core/java/com/android/server/wm/Letterbox.java +++ b/services/core/java/com/android/server/wm/Letterbox.java @@ -247,12 +247,12 @@ public class Letterbox { mLayoutFrameRelative.offset(-surfaceOrigin.x, -surfaceOrigin.y); } - private void createSurface() { + private void createSurface(SurfaceControl.Transaction t) { mSurface = mSurfaceControlFactory.get().setName("Letterbox - " + mType) .setFlags(HIDDEN).setColorLayer().build(); - mSurface.setLayer(-1); - mSurface.setColor(new float[]{0, 0, 0}); - mSurface.setColorSpaceAgnostic(true); + t.setLayer(mSurface, -1) + .setColor(mSurface, new float[]{0, 0, 0}) + .setColorSpaceAgnostic(mSurface, true); } void attachInput(WindowState win) { @@ -300,7 +300,7 @@ public class Letterbox { mSurfaceFrameRelative.set(mLayoutFrameRelative); if (!mSurfaceFrameRelative.isEmpty()) { if (mSurface == null) { - createSurface(); + createSurface(t); } t.setPosition(mSurface, mSurfaceFrameRelative.left, mSurfaceFrameRelative.top); t.setWindowCrop(mSurface, mSurfaceFrameRelative.width(), diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 6f10d3d291b1..b6a05d1b9608 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -813,18 +813,18 @@ class RootWindowContainer extends WindowContainer<DisplayContent> final int defaultDw = defaultInfo.logicalWidth; final int defaultDh = defaultInfo.logicalHeight; if (mWmService.mWatermark != null) { - mWmService.mWatermark.positionSurface(defaultDw, defaultDh); + mWmService.mWatermark.positionSurface(defaultDw, defaultDh, mDisplayTransaction); } if (mWmService.mStrictModeFlash != null) { - mWmService.mStrictModeFlash.positionSurface(defaultDw, defaultDh); + mWmService.mStrictModeFlash.positionSurface(defaultDw, defaultDh, mDisplayTransaction); } if (mWmService.mCircularDisplayMask != null) { mWmService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh, - mWmService.getDefaultDisplayRotation()); + mWmService.getDefaultDisplayRotation(), mDisplayTransaction); } if (mWmService.mEmulatorDisplayOverlay != null) { mWmService.mEmulatorDisplayOverlay.positionSurface(defaultDw, defaultDh, - mWmService.getDefaultDisplayRotation()); + mWmService.getDefaultDisplayRotation(), mDisplayTransaction); } final int count = mChildren.size(); diff --git a/services/core/java/com/android/server/wm/SeamlessRotator.java b/services/core/java/com/android/server/wm/SeamlessRotator.java index bcd90a14ac96..ba31818d6331 100644 --- a/services/core/java/com/android/server/wm/SeamlessRotator.java +++ b/services/core/java/com/android/server/wm/SeamlessRotator.java @@ -20,9 +20,10 @@ import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; import android.graphics.Matrix; +import android.os.IBinder; import android.view.DisplayInfo; -import android.view.Surface; import android.view.Surface.Rotation; +import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import com.android.server.wm.utils.CoordinateTransforms; @@ -35,7 +36,7 @@ import java.io.StringWriter; * * Works by transforming the {@link WindowState} back into the old display rotation. * - * Uses {@link android.view.SurfaceControl#deferTransactionUntil(Surface, long)} instead of + * Uses {@link Transaction#deferTransactionUntil(SurfaceControl, IBinder, long)} instead of * latching on the buffer size to allow for seamless 180 degree rotations. */ public class SeamlessRotator { diff --git a/services/core/java/com/android/server/wm/StrictModeFlash.java b/services/core/java/com/android/server/wm/StrictModeFlash.java index 9e5d9cab7669..f537005c955c 100644 --- a/services/core/java/com/android/server/wm/StrictModeFlash.java +++ b/services/core/java/com/android/server/wm/StrictModeFlash.java @@ -39,7 +39,8 @@ class StrictModeFlash { private boolean mDrawNeeded; private final int mThickness = 20; - StrictModeFlash(Supplier<Surface> surfaceFactory, DisplayContent dc) { + StrictModeFlash(Supplier<Surface> surfaceFactory, DisplayContent dc, + SurfaceControl.Transaction t) { mSurface = surfaceFactory.get(); SurfaceControl ctrl = null; try { @@ -48,9 +49,11 @@ class StrictModeFlash { .setBufferSize(1, 1) .setFormat(PixelFormat.TRANSLUCENT) .build(); - ctrl.setLayer(WindowManagerService.TYPE_LAYER_MULTIPLIER * 101); // one more than Watermark? arbitrary. - ctrl.setPosition(0, 0); - ctrl.show(); + + // one more than Watermark? arbitrary. + t.setLayer(ctrl, WindowManagerService.TYPE_LAYER_MULTIPLIER * 101); + t.setPosition(ctrl, 0, 0); + t.show(ctrl); mSurface.copyFrom(ctrl); } catch (OutOfResourcesException e) { } @@ -103,25 +106,25 @@ class StrictModeFlash { // Note: caller responsible for being inside // Surface.openTransaction() / closeTransaction() - public void setVisibility(boolean on) { + public void setVisibility(boolean on, SurfaceControl.Transaction t) { if (mSurfaceControl == null) { return; } drawIfNeeded(); if (on) { - mSurfaceControl.show(); + t.show(mSurfaceControl); } else { - mSurfaceControl.hide(); + t.hide(mSurfaceControl); } } - void positionSurface(int dw, int dh) { + void positionSurface(int dw, int dh, SurfaceControl.Transaction t) { if (mLastDW == dw && mLastDH == dh) { return; } mLastDW = dw; mLastDH = dh; - mSurfaceControl.setBufferSize(dw, dh); + t.setBufferSize(mSurfaceControl, dw, dh); mDrawNeeded = true; } diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index d070850a895f..172ebce33668 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -134,6 +134,7 @@ class TaskSnapshotSurface implements StartingSurface { private final int mStatusBarColor; @VisibleForTesting final SystemBarBackgroundPainter mSystemBarBackgroundPainter; private final int mOrientationOnCreation; + private final SurfaceControl.Transaction mTransaction; static TaskSnapshotSurface create(WindowManagerService service, AppWindowToken token, TaskSnapshot snapshot) { @@ -252,6 +253,7 @@ class TaskSnapshotSurface implements StartingSurface { windowPrivateFlags, sysUiVis, taskDescription, 1f); mStatusBarColor = taskDescription.getStatusBarColor(); mOrientationOnCreation = currentOrientation; + mTransaction = mService.mTransactionFactory.get(); } @Override @@ -336,27 +338,23 @@ class TaskSnapshotSurface implements StartingSurface { surface.copyFrom(mChildSurfaceControl); final Rect frame; - SurfaceControl.openTransaction(); - try { - // We can just show the surface here as it will still be hidden as the parent is - // still hidden. - mChildSurfaceControl.show(); - if (aspectRatioMismatch) { - // Clip off ugly navigation bar. - final Rect crop = calculateSnapshotCrop(); - frame = calculateSnapshotFrame(crop); - mChildSurfaceControl.setWindowCrop(crop); - mChildSurfaceControl.setPosition(frame.left, frame.top); - } else { - frame = null; - } - - // Scale the mismatch dimensions to fill the task bounds - final float scale = 1 / mSnapshot.getScale(); - mChildSurfaceControl.setMatrix(scale, 0, 0, scale); - } finally { - SurfaceControl.closeTransaction(); + // We can just show the surface here as it will still be hidden as the parent is + // still hidden. + mTransaction.show(mChildSurfaceControl); + if (aspectRatioMismatch) { + // Clip off ugly navigation bar. + final Rect crop = calculateSnapshotCrop(); + frame = calculateSnapshotFrame(crop); + mTransaction.setWindowCrop(mChildSurfaceControl, crop); + mTransaction.setPosition(mChildSurfaceControl, frame.left, frame.top); + } else { + frame = null; } + + // Scale the mismatch dimensions to fill the task bounds + final float scale = 1 / mSnapshot.getScale(); + mTransaction.setMatrix(mChildSurfaceControl, scale, 0, 0, scale); + mTransaction.apply(); surface.attachAndQueueBufferWithColorSpace(buffer, mSnapshot.getColorSpace()); surface.release(); diff --git a/services/core/java/com/android/server/wm/Watermark.java b/services/core/java/com/android/server/wm/Watermark.java index 729cfc04e36c..725aaa48c645 100644 --- a/services/core/java/com/android/server/wm/Watermark.java +++ b/services/core/java/com/android/server/wm/Watermark.java @@ -55,7 +55,7 @@ class Watermark { private boolean mDrawNeeded; Watermark(Supplier<Surface> surfaceFactory, DisplayContent dc, DisplayMetrics dm, - String[] tokens) { + String[] tokens, SurfaceControl.Transaction t) { if (false) { Log.i(TAG_WM, "*********************** WATERMARK"); for (int i=0; i<tokens.length; i++) { @@ -121,21 +121,21 @@ class Watermark { .setBufferSize(1, 1) .setFormat(PixelFormat.TRANSLUCENT) .build(); - ctrl.setLayerStack(mDisplay.getLayerStack()); - ctrl.setLayer(WindowManagerService.TYPE_LAYER_MULTIPLIER*100); - ctrl.setPosition(0, 0); - ctrl.show(); + t.setLayerStack(ctrl, mDisplay.getLayerStack()) + .setLayer(ctrl, WindowManagerService.TYPE_LAYER_MULTIPLIER * 100) + .setPosition(ctrl, 0, 0) + .show(ctrl); mSurface.copyFrom(ctrl); } catch (OutOfResourcesException e) { } mSurfaceControl = ctrl; } - void positionSurface(int dw, int dh) { + void positionSurface(int dw, int dh, SurfaceControl.Transaction t) { if (mLastDW != dw || mLastDH != dh) { mLastDW = dw; mLastDH = dh; - mSurfaceControl.setBufferSize(dw, dh); + t.setBufferSize(mSurfaceControl, dw, dh); mDrawNeeded = true; } } diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index f437b284637b..3a1d6e047fa8 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -161,7 +161,8 @@ public class WindowAnimator { dc.checkAppWindowsReadyToShow(); orAnimating(dc.getDockedDividerController().animate(mCurrentTime)); if (accessibilityController != null) { - accessibilityController.drawMagnifiedRegionBorderIfNeededLocked(displayId); + accessibilityController.drawMagnifiedRegionBorderIfNeededLocked(displayId, + mTransaction); } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 0f4d0a8662f4..6f9f2c0f9708 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1269,14 +1269,7 @@ public class WindowManagerService extends IWindowManager.Stub // Add ourself to the Watchdog monitors. Watchdog.getInstance().addMonitor(this); - - openSurfaceTransaction(); - try { - createWatermarkInTransaction(); - } finally { - closeSurfaceTransaction("createWatermarkInTransaction"); - } - + createWatermark(); showEmulatorDisplayOverlayIfNeeded(); } @@ -3435,60 +3428,45 @@ public class WindowManagerService extends IWindowManager.Stub public void showCircularMask(boolean visible) { synchronized (mGlobalLock) { + if (visible) { + // TODO(multi-display): support multiple displays + if (mCircularDisplayMask == null) { + int screenOffset = mContext.getResources().getInteger( + com.android.internal.R.integer.config_windowOutsetBottom); + int maskThickness = mContext.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.circular_display_mask_thickness); - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, - ">>> OPEN TRANSACTION showCircularMask(visible=" + visible + ")"); - openSurfaceTransaction(); - try { - if (visible) { - // TODO(multi-display): support multiple displays - if (mCircularDisplayMask == null) { - int screenOffset = mContext.getResources().getInteger( - com.android.internal.R.integer.config_windowOutsetBottom); - int maskThickness = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.circular_display_mask_thickness); - - mCircularDisplayMask = new CircularDisplayMask(mSurfaceFactory, - getDefaultDisplayContentLocked(), - mPolicy.getWindowLayerFromTypeLw( - WindowManager.LayoutParams.TYPE_POINTER) - * TYPE_LAYER_MULTIPLIER + 10, screenOffset, maskThickness); + + if (SHOW_LIGHT_TRANSACTIONS) { + Slog.i(TAG_WM, + ">>> showCircularMask(visible=" + visible + ")"); } - mCircularDisplayMask.setVisibility(true); - } else if (mCircularDisplayMask != null) { - mCircularDisplayMask.setVisibility(false); - mCircularDisplayMask = null; + mCircularDisplayMask = new CircularDisplayMask(mSurfaceFactory, + getDefaultDisplayContentLocked(), mPolicy.getWindowLayerFromTypeLw( + WindowManager.LayoutParams.TYPE_POINTER) * TYPE_LAYER_MULTIPLIER + + 10, screenOffset, maskThickness, mTransaction); } - } finally { - closeSurfaceTransaction("showCircularMask"); - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, - "<<< CLOSE TRANSACTION showCircularMask(visible=" + visible + ")"); + mCircularDisplayMask.setVisibility(true, mTransaction); + } else if (mCircularDisplayMask != null) { + mCircularDisplayMask.setVisibility(false, mTransaction); + mCircularDisplayMask = null; } + mTransaction.apply(); } } public void showEmulatorDisplayOverlay() { synchronized (mGlobalLock) { - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, - ">>> OPEN TRANSACTION showEmulatorDisplayOverlay"); - openSurfaceTransaction(); - try { - if (mEmulatorDisplayOverlay == null) { - mEmulatorDisplayOverlay = new EmulatorDisplayOverlay( - mSurfaceFactory, - mContext, - getDefaultDisplayContentLocked(), - mPolicy.getWindowLayerFromTypeLw( - WindowManager.LayoutParams.TYPE_POINTER) - * TYPE_LAYER_MULTIPLIER + 10); - } - mEmulatorDisplayOverlay.setVisibility(true); - } finally { - closeSurfaceTransaction("showEmulatorDisplayOverlay"); - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, - "<<< CLOSE TRANSACTION showEmulatorDisplayOverlay"); + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, ">>> showEmulatorDisplayOverlay"); + if (mEmulatorDisplayOverlay == null) { + mEmulatorDisplayOverlay = new EmulatorDisplayOverlay(mSurfaceFactory, mContext, + getDefaultDisplayContentLocked(), + mPolicy.getWindowLayerFromTypeLw(WindowManager.LayoutParams.TYPE_POINTER) + * TYPE_LAYER_MULTIPLIER + 10, mTransaction); } + mEmulatorDisplayOverlay.setVisibility(true, mTransaction); + mTransaction.apply(); } } @@ -3517,23 +3495,16 @@ public class WindowManagerService extends IWindowManager.Stub return; } - if (SHOW_VERBOSE_TRANSACTIONS) Slog.i(TAG_WM, - ">>> OPEN TRANSACTION showStrictModeViolation"); + if (SHOW_VERBOSE_TRANSACTIONS) Slog.i(TAG_WM, ">>> showStrictModeViolation"); // TODO: Modify this to use the surface trace once it is not going crazy. // b/31532461 - SurfaceControl.openTransaction(); - try { - // TODO(multi-display): support multiple displays - if (mStrictModeFlash == null) { - mStrictModeFlash = new StrictModeFlash(mSurfaceFactory, - getDefaultDisplayContentLocked()); - } - mStrictModeFlash.setVisibility(on); - } finally { - SurfaceControl.closeTransaction(); - if (SHOW_VERBOSE_TRANSACTIONS) Slog.i(TAG_WM, - "<<< CLOSE TRANSACTION showStrictModeViolation"); + // TODO(multi-display): support multiple displays + if (mStrictModeFlash == null) { + mStrictModeFlash = new StrictModeFlash(mSurfaceFactory, + getDefaultDisplayContentLocked(), mTransaction); } + mStrictModeFlash.setVisibility(on, mTransaction); + mTransaction.apply(); } } @@ -5520,7 +5491,7 @@ public class WindowManagerService extends IWindowManager.Stub return val; } - void createWatermarkInTransaction() { + void createWatermark() { if (mWatermark != null) { return; } @@ -5538,8 +5509,8 @@ public class WindowManagerService extends IWindowManager.Stub // TODO(multi-display): Show watermarks on secondary displays. final DisplayContent displayContent = getDefaultDisplayContentLocked(); mWatermark = new Watermark(mSurfaceFactory, displayContent, - displayContent.mRealDisplayMetrics, - toks); + displayContent.mRealDisplayMetrics, toks, mTransaction); + mTransaction.apply(); } } } catch (FileNotFoundException e) { diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 3dcf6ecb5124..1328273c9560 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -506,9 +506,8 @@ class WindowStateAnimator { flags |= SurfaceControl.OPAQUE; } - mSurfaceController = new WindowSurfaceController(mSession.mSurfaceSession, - attrs.getTitle().toString(), width, height, format, flags, this, - windowType, ownerUid); + mSurfaceController = new WindowSurfaceController(attrs.getTitle().toString(), width, + height, format, flags, this, windowType, ownerUid); mSurfaceController.setColorSpaceAgnostic((attrs.privateFlags & WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC) != 0); diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index 49f27a1b495d..7f68c48e473f 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -37,7 +37,6 @@ import android.os.Trace; import android.util.Slog; import android.util.proto.ProtoOutputStream; import android.view.SurfaceControl; -import android.view.SurfaceSession; import android.view.WindowContentFrameStats; import com.android.server.protolog.common.ProtoLog; @@ -85,7 +84,7 @@ class WindowSurfaceController { private final SurfaceControl.Transaction mTmpTransaction; - public WindowSurfaceController(SurfaceSession s, String name, int w, int h, int format, + WindowSurfaceController(String name, int w, int h, int format, int flags, WindowStateAnimator animator, int windowType, int ownerUid) { mAnimator = animator; 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 a98f79cb5369..73420a095cad 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java @@ -46,7 +46,7 @@ public class DimmerTests extends WindowTestsBase { private static class TestWindowContainer extends WindowContainer<TestWindowContainer> { final SurfaceControl mControl = mock(SurfaceControl.class); - final SurfaceControl.Transaction mTransaction = mock(SurfaceControl.Transaction.class); + final SurfaceControl.Transaction mTransaction = spy(StubTransaction.class); TestWindowContainer(WindowManagerService wm) { super(wm); @@ -66,7 +66,7 @@ public class DimmerTests extends WindowTestsBase { private static class MockSurfaceBuildingContainer extends WindowContainer<TestWindowContainer> { final SurfaceSession mSession = new SurfaceSession(); final SurfaceControl mHostControl = mock(SurfaceControl.class); - final SurfaceControl.Transaction mHostTransaction = mock(SurfaceControl.Transaction.class); + final SurfaceControl.Transaction mHostTransaction = spy(StubTransaction.class); MockSurfaceBuildingContainer(WindowManagerService wm) { super(wm); @@ -118,7 +118,7 @@ public class DimmerTests extends WindowTestsBase { public void setUp() throws Exception { mHost = new MockSurfaceBuildingContainer(mWm); mSurfaceAnimatorStarter = spy(new SurfaceAnimatorStarterImpl()); - mTransaction = mock(SurfaceControl.Transaction.class); + mTransaction = spy(StubTransaction.class); mDimmer = new Dimmer(mHost, mSurfaceAnimatorStarter); } diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java index 2d0416d6f5bc..15417d73bd02 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java @@ -21,6 +21,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -48,8 +49,8 @@ public class LetterboxTest { @Before public void setUp() throws Exception { mSurfaces = new SurfaceControlMocker(); - mLetterbox = new Letterbox(mSurfaces, () -> mock(SurfaceControl.Transaction.class)); - mTransaction = mock(SurfaceControl.Transaction.class); + mLetterbox = new Letterbox(mSurfaces, StubTransaction::new); + mTransaction = spy(StubTransaction.class); } @Test 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 2ad40f2dc577..f5d08dcfcb77 100644 --- a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java +++ b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java @@ -239,4 +239,15 @@ public class StubTransaction extends SurfaceControl.Transaction { public SurfaceControl.Transaction remove(SurfaceControl sc) { return this; } + + @Override + public SurfaceControl.Transaction syncInputWindows() { + return this; + } + + @Override + public SurfaceControl.Transaction setColorSpaceAgnostic(SurfaceControl sc, boolean agnostic) { + return this; + } + } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java index 0330de8d2c63..bfc07419fd46 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java @@ -27,6 +27,7 @@ import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.graphics.Point; @@ -50,7 +51,7 @@ import org.junit.Test; @Presubmit public class WindowAnimationSpecTest { private final SurfaceControl mSurfaceControl = mock(SurfaceControl.class); - private final SurfaceControl.Transaction mTransaction = mock(SurfaceControl.Transaction.class); + private final SurfaceControl.Transaction mTransaction = spy(StubTransaction.class); private final Animation mAnimation = mock(Animation.class); private final Rect mStackBounds = new Rect(0, 0, 10, 10); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index e5fb28d51fed..a09253ab31f0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -452,7 +452,7 @@ public class WindowStateTests extends WindowTestsBase { @Test public void testSeamlesslyRotateWindow() { final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class); + final SurfaceControl.Transaction t = spy(StubTransaction.class); app.mHasSurface = true; app.mSurfaceControl = mock(SurfaceControl.class); @@ -536,7 +536,7 @@ public class WindowStateTests extends WindowTestsBase { final float[] values = new float[9]; final Matrix matrix = new Matrix(); - final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class); + final SurfaceControl.Transaction t = spy(StubTransaction.class); final WindowState win1 = createWindow(null, TYPE_APPLICATION, dc, "win1"); win1.mHasSurface = true; win1.mSurfaceControl = mock(SurfaceControl.class); |