Create Surfaces, Transactions and SurfaceControls in Window Manager via a factory
Prevent unit tests from calling native code. This will remove some SurfaceControl and Surface
finalizer error logs when running tests. Remaining accesses to Surface are in the Display package.
Test: presubmit
Change-Id: I7e257b03cd6411423885a0bd94ec846fc8afbdf7
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index 30a3aef..f90f7e4 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -808,7 +808,7 @@
private final Paint mPaint = new Paint();
private final SurfaceControl mSurfaceControl;
- private final Surface mSurface = new Surface();
+ private final Surface mSurface = mService.mSurfaceFactory.get();
private final AnimationController mAnimationController;
@@ -961,7 +961,7 @@
}
public void releaseSurface() {
- mService.mTransactionFactory.make().remove(mSurfaceControl).apply();
+ mService.mTransactionFactory.get().remove(mSurfaceControl).apply();
mSurface.release();
}
diff --git a/services/core/java/com/android/server/wm/AppWindowThumbnail.java b/services/core/java/com/android/server/wm/AppWindowThumbnail.java
index 4ceae72..b52ade4 100644
--- a/services/core/java/com/android/server/wm/AppWindowThumbnail.java
+++ b/services/core/java/com/android/server/wm/AppWindowThumbnail.java
@@ -41,6 +41,8 @@
import com.android.server.wm.SurfaceAnimator.Animatable;
+import java.util.function.Supplier;
+
/**
* Represents a surface that is displayed over an {@link AppWindowToken}
*/
@@ -55,8 +57,9 @@
private final int mHeight;
private final boolean mRelative;
- AppWindowThumbnail(Transaction t, AppWindowToken appToken, GraphicBuffer thumbnailHeader) {
- this(t, appToken, thumbnailHeader, false /* relative */);
+ AppWindowThumbnail(Supplier<Surface> surfaceFactory, Transaction t, AppWindowToken appToken,
+ GraphicBuffer thumbnailHeader) {
+ this(surfaceFactory, t, appToken, thumbnailHeader, false /* relative */);
}
/**
@@ -66,9 +69,9 @@
* @param relative Whether this thumbnail will be a child of appToken (and thus positioned
* relative to it) or not.
*/
- AppWindowThumbnail(Transaction t, AppWindowToken appToken, GraphicBuffer thumbnailHeader,
- boolean relative) {
- this(t, appToken, thumbnailHeader, relative, new Surface(), null);
+ AppWindowThumbnail(Supplier<Surface> surfaceFactory, Transaction t, AppWindowToken appToken,
+ GraphicBuffer thumbnailHeader, boolean relative) {
+ this(t, appToken, thumbnailHeader, relative, surfaceFactory.get(), null);
}
AppWindowThumbnail(Transaction t, AppWindowToken appToken, GraphicBuffer thumbnailHeader,
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 7e0d9a0..ffd9021 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -1793,8 +1793,8 @@
mWmService.mTaskSnapshotController.createTaskSnapshot(
task, 1 /* scaleFraction */);
if (snapshot != null) {
- mThumbnail = new AppWindowThumbnail(t, this, snapshot.getGraphicBuffer(),
- true /* relative */);
+ mThumbnail = new AppWindowThumbnail(mWmService.mSurfaceFactory, t, this,
+ snapshot.getGraphicBuffer(), true /* relative */);
}
}
}
@@ -2033,7 +2033,8 @@
final boolean needsLetterbox = surfaceReady && w.isLetterboxedAppWindow() && fillsParent();
if (needsLetterbox) {
if (mLetterbox == null) {
- mLetterbox = new Letterbox(() -> makeChildSurface(null));
+ mLetterbox = new Letterbox(() -> makeChildSurface(null),
+ mWmService.mTransactionFactory);
mLetterbox.attachInput(w);
}
getPosition(mTmpPoint);
@@ -2981,7 +2982,8 @@
return;
}
clearThumbnail();
- mThumbnail = new AppWindowThumbnail(getPendingTransaction(), this, thumbnailHeader);
+ mThumbnail = new AppWindowThumbnail(mWmService.mSurfaceFactory, getPendingTransaction(),
+ this, thumbnailHeader);
mThumbnail.startAnimation(getPendingTransaction(), loadThumbnailAnimation(thumbnailHeader));
}
@@ -3009,7 +3011,8 @@
if (thumbnail == null) {
return;
}
- mThumbnail = new AppWindowThumbnail(getPendingTransaction(), this, thumbnail);
+ mThumbnail = new AppWindowThumbnail(mWmService.mSurfaceFactory,
+ getPendingTransaction(), this, thumbnail);
final Animation animation =
getDisplayContent().mAppTransition.createCrossProfileAppsThumbnailAnimationLocked(
win.getFrameLw());
diff --git a/services/core/java/com/android/server/wm/BlackFrame.java b/services/core/java/com/android/server/wm/BlackFrame.java
index 7fc17e1..7557271a 100644
--- a/services/core/java/com/android/server/wm/BlackFrame.java
+++ b/services/core/java/com/android/server/wm/BlackFrame.java
@@ -27,6 +27,7 @@
import android.view.SurfaceControl;
import java.io.PrintWriter;
+import java.util.function.Supplier;
/**
* Four black surfaces put together to make a black frame.
@@ -97,7 +98,7 @@
final BlackSurface[] mBlackSurfaces = new BlackSurface[4];
final boolean mForceDefaultOrientation;
- private final TransactionFactory mTransactionFactory;
+ private final Supplier<SurfaceControl.Transaction> mTransactionFactory;
public void printTo(String prefix, PrintWriter pw) {
pw.print(prefix); pw.print("Outer: "); mOuterRect.printShortString(pw);
@@ -112,8 +113,8 @@
}
}
- public BlackFrame(TransactionFactory factory, SurfaceControl.Transaction t, Rect outer,
- Rect inner, int layer, DisplayContent dc, boolean forceDefaultOrientation)
+ public BlackFrame(Supplier<SurfaceControl.Transaction> factory, SurfaceControl.Transaction t,
+ Rect outer, Rect inner, int layer, DisplayContent dc, boolean forceDefaultOrientation)
throws OutOfResourcesException {
boolean success = false;
@@ -151,7 +152,7 @@
public void kill() {
if (mBlackSurfaces != null) {
- SurfaceControl.Transaction t = mTransactionFactory.make();
+ SurfaceControl.Transaction t = mTransactionFactory.get();
for (int i=0; i<mBlackSurfaces.length; i++) {
if (mBlackSurfaces[i] != null) {
if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
diff --git a/services/core/java/com/android/server/wm/CircularDisplayMask.java b/services/core/java/com/android/server/wm/CircularDisplayMask.java
index c3d6211..c1ca816 100644
--- a/services/core/java/com/android/server/wm/CircularDisplayMask.java
+++ b/services/core/java/com/android/server/wm/CircularDisplayMask.java
@@ -34,6 +34,8 @@
import android.view.Surface.OutOfResourcesException;
import android.view.SurfaceControl;
+import java.util.function.Supplier;
+
class CircularDisplayMask {
private static final String TAG = TAG_WITH_CLASS_NAME ? "CircularDisplayMask" : TAG_WM;
@@ -43,7 +45,7 @@
private Point mScreenSize;
private final SurfaceControl mSurfaceControl;
- private final Surface mSurface = new Surface();
+ private final Surface mSurface;
private int mLastDW;
private int mLastDH;
private boolean mDrawNeeded;
@@ -53,10 +55,10 @@
private boolean mDimensionsUnequal = false;
private int mMaskThickness;
- public CircularDisplayMask(DisplayContent dc, int zOrder,
+ CircularDisplayMask(Supplier<Surface> surfaceFactory, DisplayContent dc, int zOrder,
int screenOffset, int maskThickness) {
final Display display = dc.getDisplay();
-
+ mSurface = surfaceFactory.get();
mScreenSize = new Point();
display.getSize(mScreenSize);
if (mScreenSize.x != mScreenSize.y + screenOffset) {
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 71a0126..0b8cfec 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -4388,7 +4388,7 @@
.show(mSplitScreenDividerAnchor);
scheduleAnimation();
} else {
- mWmService.mTransactionFactory.make()
+ mWmService.mTransactionFactory.get()
.remove(mAppAnimationLayer)
.remove(mBoostedAppAnimationLayer)
.remove(mHomeAppAnimationLayer)
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index c48f07c..17daabf 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -140,7 +140,7 @@
mFlags = flags;
mLocalWin = localWin;
mNotifiedWindows = new ArrayList<WindowState>();
- mTransaction = service.mTransactionFactory.make();
+ mTransaction = service.mTransactionFactory.get();
}
boolean isClosing() {
@@ -695,7 +695,8 @@
implements ValueAnimator.AnimatorUpdateListener, Animator.AnimatorListener {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
- try (final SurfaceControl.Transaction transaction = new SurfaceControl.Transaction()) {
+ try (SurfaceControl.Transaction transaction =
+ mService.mTransactionFactory.get()) {
transaction.setPosition(
mSurfaceControl,
(float) animation.getAnimatedValue(ANIMATED_PROPERTY_X),
diff --git a/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java b/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java
index 7cb4a43..f64592f 100644
--- a/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java
+++ b/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java
@@ -32,6 +32,8 @@
import android.view.Surface.OutOfResourcesException;
import android.view.SurfaceControl;
+import java.util.function.Supplier;
+
class EmulatorDisplayOverlay {
private static final String TAG = TAG_WITH_CLASS_NAME ? "EmulatorDisplayOverlay" : TAG_WM;
@@ -39,7 +41,7 @@
private Point mScreenSize;
private final SurfaceControl mSurfaceControl;
- private final Surface mSurface = new Surface();
+ private final Surface mSurface;
private int mLastDW;
private int mLastDH;
private boolean mDrawNeeded;
@@ -47,8 +49,9 @@
private int mRotation;
private boolean mVisible;
- public EmulatorDisplayOverlay(Context context, DisplayContent dc,
+ EmulatorDisplayOverlay(Supplier<Surface> surfaceFactory, Context context, DisplayContent dc,
int zOrder) {
+ mSurface = surfaceFactory.get();
final Display display = dc.getDisplay();
mScreenSize = new Point();
display.getSize(mScreenSize);
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 2eec926..dd9000e 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -153,7 +153,7 @@
mService = service;
mDisplayContent = mService.mRoot.getDisplayContent(displayId);
mDisplayId = displayId;
- mInputTransaction = mService.mTransactionFactory.make();
+ mInputTransaction = mService.mTransactionFactory.get();
mHandler = AnimationThread.getHandler();
mUpdateInputForAllWindowsConsumer = new UpdateInputForAllWindowsConsumer();
}
diff --git a/services/core/java/com/android/server/wm/Letterbox.java b/services/core/java/com/android/server/wm/Letterbox.java
index bb035d5..1bd2493 100644
--- a/services/core/java/com/android/server/wm/Letterbox.java
+++ b/services/core/java/com/android/server/wm/Letterbox.java
@@ -41,7 +41,8 @@
private static final Rect EMPTY_RECT = new Rect();
private static final Point ZERO_POINT = new Point(0, 0);
- private final Supplier<SurfaceControl.Builder> mFactory;
+ private final Supplier<SurfaceControl.Builder> mSurfaceControlFactory;
+ private final Supplier<SurfaceControl.Transaction> mTransactionFactory;
private final Rect mOuter = new Rect();
private final Rect mInner = new Rect();
private final LetterboxSurface mTop = new LetterboxSurface("top");
@@ -55,8 +56,10 @@
*
* @param surfaceControlFactory a factory for creating the managed {@link SurfaceControl}s
*/
- public Letterbox(Supplier<SurfaceControl.Builder> surfaceControlFactory) {
- mFactory = surfaceControlFactory;
+ public Letterbox(Supplier<SurfaceControl.Builder> surfaceControlFactory,
+ Supplier<SurfaceControl.Transaction> transactionFactory) {
+ mSurfaceControlFactory = surfaceControlFactory;
+ mTransactionFactory = transactionFactory;
}
/**
@@ -245,7 +248,7 @@
}
private void createSurface() {
- mSurface = mFactory.get().setName("Letterbox - " + mType)
+ mSurface = mSurfaceControlFactory.get().setName("Letterbox - " + mType)
.setFlags(HIDDEN).setColorLayer().build();
mSurface.setLayer(-1);
mSurface.setColor(new float[]{0, 0, 0});
@@ -261,7 +264,7 @@
public void remove() {
if (mSurface != null) {
- new SurfaceControl.Transaction().remove(mSurface).apply();
+ mTransactionFactory.get().remove(mSurface).apply();
mSurface = null;
}
if (mInputInterceptor != null) {
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 8752f37..f4280a2 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -592,7 +592,7 @@
return null;
}
- final TaskScreenshotAnimatable animatable = new TaskScreenshotAnimatable(task,
+ final TaskScreenshotAnimatable animatable = new TaskScreenshotAnimatable(mService.mSurfaceControlFactory, task,
new SurfaceControl.ScreenshotGraphicBuffer(taskSnapshot.getSnapshot(),
taskSnapshot.getColorSpace(), false /* containsSecureLayers */));
mRecentScreenshotAnimator = new SurfaceAnimator(
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 968d02b..d0b6fc8 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -134,7 +134,7 @@
// Only a separate transaction until we separate the apply surface changes
// transaction from the global transaction.
- private final SurfaceControl.Transaction mDisplayTransaction = new SurfaceControl.Transaction();
+ private final SurfaceControl.Transaction mDisplayTransaction;
private final Consumer<WindowState> mCloseSystemDialogsConsumer = w -> {
if (w.mHasSurface) {
@@ -154,6 +154,7 @@
RootWindowContainer(WindowManagerService service) {
super(service);
+ mDisplayTransaction = service.mTransactionFactory.get();
mHandler = new MyHandler(service.mH.getLooper());
}
diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
index 82dde0d..cbaf098 100644
--- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -127,7 +127,7 @@
mOriginalWidth = originalWidth;
mOriginalHeight = originalHeight;
- final SurfaceControl.Transaction t = mService.mTransactionFactory.make();
+ final SurfaceControl.Transaction t = mService.mTransactionFactory.get();
try {
mSurfaceControl = displayContent.makeOverlay()
.setName("ScreenshotSurface")
@@ -137,13 +137,13 @@
// In case display bounds change, screenshot buffer and surface may mismatch so set a
// scaling mode.
- SurfaceControl.Transaction t2 = mService.mTransactionFactory.make();
+ SurfaceControl.Transaction t2 = mService.mTransactionFactory.get();
t2.setOverrideScalingMode(mSurfaceControl, Surface.SCALING_MODE_SCALE_TO_WINDOW);
t2.apply(true /* sync */);
// Capture a screenshot into the surface we just created.
final int displayId = display.getDisplayId();
- final Surface surface = mService.mSurfaceFactory.make();
+ final Surface surface = mService.mSurfaceFactory.get();
surface.copyFrom(mSurfaceControl);
SurfaceControl.ScreenshotGraphicBuffer gb =
mService.mDisplayManagerInternal.screenshot(displayId);
@@ -427,7 +427,7 @@
Slog.i(TAG_WM,
" FREEZE " + mSurfaceControl + ": DESTROY");
}
- mService.mTransactionFactory.make().remove(mSurfaceControl).apply();
+ mService.mTransactionFactory.get().remove(mSurfaceControl).apply();
mSurfaceControl = null;
}
if (mExitingBlackFrame != null) {
diff --git a/services/core/java/com/android/server/wm/StrictModeFlash.java b/services/core/java/com/android/server/wm/StrictModeFlash.java
index 82f2ad8..9e5d9ca 100644
--- a/services/core/java/com/android/server/wm/StrictModeFlash.java
+++ b/services/core/java/com/android/server/wm/StrictModeFlash.java
@@ -27,17 +27,20 @@
import android.view.Surface.OutOfResourcesException;
import android.view.SurfaceControl;
+import java.util.function.Supplier;
+
class StrictModeFlash {
private static final String TAG = TAG_WITH_CLASS_NAME ? "StrictModeFlash" : TAG_WM;
private final SurfaceControl mSurfaceControl;
- private final Surface mSurface = new Surface();
+ private final Surface mSurface;
private int mLastDW;
private int mLastDH;
private boolean mDrawNeeded;
private final int mThickness = 20;
- public StrictModeFlash(DisplayContent dc) {
+ StrictModeFlash(Supplier<Surface> surfaceFactory, DisplayContent dc) {
+ mSurface = surfaceFactory.get();
SurfaceControl ctrl = null;
try {
ctrl = dc.makeOverlay()
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
index 85176be..bbd986f 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
@@ -39,6 +39,8 @@
import com.android.server.AnimationThread;
import com.android.server.wm.LocalAnimationAdapter.AnimationSpec;
+import java.util.function.Supplier;
+
/**
* Class to run animations without holding the window manager lock.
*/
@@ -73,9 +75,10 @@
@GuardedBy("mLock")
private boolean mAnimationStartDeferred;
- SurfaceAnimationRunner(PowerManagerInternal powerManagerInternal) {
- this(null /* callbackProvider */, null /* animatorFactory */, new Transaction(),
- powerManagerInternal);
+ SurfaceAnimationRunner(Supplier<Transaction> transactionFactory,
+ PowerManagerInternal powerManagerInternal) {
+ this(null /* callbackProvider */, null /* animatorFactory */,
+ transactionFactory.get(), powerManagerInternal);
}
@VisibleForTesting
diff --git a/services/core/java/com/android/server/wm/SurfaceBuilderFactory.java b/services/core/java/com/android/server/wm/SurfaceBuilderFactory.java
deleted file mode 100644
index 5390e5a..0000000
--- a/services/core/java/com/android/server/wm/SurfaceBuilderFactory.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import android.view.SurfaceSession;
-import android.view.SurfaceControl;
-
-interface SurfaceBuilderFactory {
- SurfaceControl.Builder make(SurfaceSession s);
-};
-
diff --git a/services/core/java/com/android/server/wm/SurfaceFactory.java b/services/core/java/com/android/server/wm/SurfaceFactory.java
deleted file mode 100644
index 076b7df..0000000
--- a/services/core/java/com/android/server/wm/SurfaceFactory.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import android.view.Surface;
-
-/**
- * Helper class to inject custom {@link Surface} objects into window manager.
- */
-interface SurfaceFactory {
- Surface make();
-};
-
diff --git a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java
index d6c2f66..d36ebf0 100644
--- a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java
+++ b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java
@@ -23,6 +23,8 @@
import android.view.SurfaceControl;
import android.view.SurfaceSession;
+import java.util.function.Function;
+
/**
* Class used by {@link RecentsAnimationController} to create a surface control with taking
* screenshot of task when canceling recents animation.
@@ -36,7 +38,7 @@
private int mWidth;
private int mHeight;
- TaskScreenshotAnimatable(Task task,
+ TaskScreenshotAnimatable(Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory, Task task,
SurfaceControl.ScreenshotGraphicBuffer screenshotBuffer) {
GraphicBuffer buffer = screenshotBuffer == null
? null : screenshotBuffer.getGraphicBuffer();
@@ -47,7 +49,7 @@
Slog.d(TAG, "Creating TaskScreenshotAnimatable: task: " + task
+ "width: " + mWidth + "height: " + mHeight);
}
- mSurfaceControl = new SurfaceControl.Builder(new SurfaceSession())
+ mSurfaceControl = surfaceControlFactory.apply(new SurfaceSession())
.setName("RecentTaskScreenshotSurface")
.setBufferSize(mWidth, mHeight)
.build();
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index 1b3e4c1..7456f0d 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -237,7 +237,7 @@
int sysUiVis, int windowFlags, int windowPrivateFlags, Rect taskBounds,
int currentOrientation) {
mService = service;
- mSurface = new Surface();
+ mSurface = service.mSurfaceFactory.get();
mHandler = new Handler(mService.mH.getLooper());
mSession = WindowManagerGlobal.getWindowSession();
mWindow = window;
@@ -325,13 +325,13 @@
- ((float) mFrame.width() / mFrame.height())) > 0.01f;
// Keep a reference to it such that it doesn't get destroyed when finalized.
- mChildSurfaceControl = new SurfaceControl.Builder(session)
+ mChildSurfaceControl = mService.mSurfaceControlFactory.apply(session)
.setName(mTitle + " - task-snapshot-surface")
.setBufferSize(buffer.getWidth(), buffer.getHeight())
.setFormat(buffer.getFormat())
.setParent(mSurfaceControl)
.build();
- Surface surface = new Surface();
+ Surface surface = mService.mSurfaceFactory.get();
surface.copyFrom(mChildSurfaceControl);
final Rect frame;
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index cc2112e..814bec6 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -1009,7 +1009,7 @@
EventLog.writeEvent(EventLogTags.WM_STACK_REMOVED, mStackId);
if (mAnimationBackgroundSurface != null) {
- mWmService.mTransactionFactory.make().remove(mAnimationBackgroundSurface).apply();
+ mWmService.mTransactionFactory.get().remove(mAnimationBackgroundSurface).apply();
mAnimationBackgroundSurface = null;
}
diff --git a/services/core/java/com/android/server/wm/TransactionFactory.java b/services/core/java/com/android/server/wm/TransactionFactory.java
deleted file mode 100644
index 067f083..0000000
--- a/services/core/java/com/android/server/wm/TransactionFactory.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.wm;
-
-import android.view.SurfaceControl.Transaction;
-
-/**
- * Helper class to inject custom transaction objects into window manager.
- */
-interface TransactionFactory {
- Transaction make();
-};
-
diff --git a/services/core/java/com/android/server/wm/Watermark.java b/services/core/java/com/android/server/wm/Watermark.java
index e6ac059..729cfc0 100644
--- a/services/core/java/com/android/server/wm/Watermark.java
+++ b/services/core/java/com/android/server/wm/Watermark.java
@@ -33,6 +33,8 @@
import android.view.Surface.OutOfResourcesException;
import android.view.SurfaceControl;
+import java.util.function.Supplier;
+
/**
* Displays a watermark on top of the window manager's windows.
*/
@@ -47,19 +49,20 @@
private final int mDeltaY;
private final SurfaceControl mSurfaceControl;
- private final Surface mSurface = new Surface();
+ private final Surface mSurface;
private int mLastDW;
private int mLastDH;
private boolean mDrawNeeded;
- Watermark(DisplayContent dc, DisplayMetrics dm, String[] tokens) {
+ Watermark(Supplier<Surface> surfaceFactory, DisplayContent dc, DisplayMetrics dm,
+ String[] tokens) {
if (false) {
Log.i(TAG_WM, "*********************** WATERMARK");
for (int i=0; i<tokens.length; i++) {
Log.i(TAG_WM, " TOKEN #" + i + ": " + tokens[i]);
}
}
-
+ mSurface = surfaceFactory.get();
mDisplay = dc.getDisplay();
mTokens = tokens;
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index b8db98b..4fce46b 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -83,12 +83,13 @@
private final ArrayList<Runnable> mAfterPrepareSurfacesRunnables = new ArrayList<>();
private boolean mInExecuteAfterPrepareSurfacesRunnables;
- private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();
+ private final SurfaceControl.Transaction mTransaction;
WindowAnimator(final WindowManagerService service) {
mService = service;
mContext = service.mContext;
mPolicy = service.mPolicy;
+ mTransaction = service.mTransactionFactory.get();
AnimationThread.getHandler().runWithScissors(
() -> mChoreographer = Choreographer.getSfInstance(), 0 /* timeout */);
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 29d232f..e280a663 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -139,7 +139,7 @@
WindowContainer(WindowManagerService wms) {
mWmService = wms;
- mPendingTransaction = wms.mTransactionFactory.make();
+ mPendingTransaction = wms.mTransactionFactory.get();
mSurfaceAnimator = new SurfaceAnimator(this, this::onAnimationFinished, wms);
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index d49d245..9b88c18 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -283,6 +283,8 @@
import java.util.Arrays;
import java.util.Date;
import java.util.List;
+import java.util.function.Function;
+import java.util.function.Supplier;
/** {@hide} */
public class WindowManagerService extends IWindowManager.Stub
@@ -855,9 +857,9 @@
static WindowManagerThreadPriorityBooster sThreadPriorityBooster =
new WindowManagerThreadPriorityBooster();
- SurfaceBuilderFactory mSurfaceBuilderFactory = SurfaceControl.Builder::new;
- TransactionFactory mTransactionFactory = SurfaceControl.Transaction::new;
- SurfaceFactory mSurfaceFactory = Surface::new;
+ Function<SurfaceSession, SurfaceControl.Builder> mSurfaceControlFactory;
+ Supplier<SurfaceControl.Transaction> mTransactionFactory;
+ final Supplier<Surface> mSurfaceFactory;
private final SurfaceControl.Transaction mTransaction;
@@ -957,20 +959,22 @@
final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy,
ActivityTaskManagerService atm) {
return main(context, im, showBootMsgs, onlyCore, policy, atm,
- SurfaceControl.Transaction::new);
+ SurfaceControl.Transaction::new, Surface::new, SurfaceControl.Builder::new);
}
/**
* Creates and returns an instance of the WindowManagerService. This call allows the caller
- * to override the {@link TransactionFactory} to stub functionality under test.
+ * to override factories that can be used to stub native calls during test.
*/
@VisibleForTesting
public static WindowManagerService main(final Context context, final InputManagerService im,
final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy,
- ActivityTaskManagerService atm, TransactionFactory transactionFactory) {
+ ActivityTaskManagerService atm, Supplier<SurfaceControl.Transaction> transactionFactory,
+ Supplier<Surface> surfaceFactory,
+ Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {
DisplayThread.getHandler().runWithScissors(() ->
sInstance = new WindowManagerService(context, im, showBootMsgs, onlyCore, policy,
- atm, transactionFactory), 0);
+ atm, transactionFactory, surfaceFactory, surfaceControlFactory), 0);
return sInstance;
}
@@ -992,7 +996,9 @@
private WindowManagerService(Context context, InputManagerService inputManager,
boolean showBootMsgs, boolean onlyCore, WindowManagerPolicy policy,
- ActivityTaskManagerService atm, TransactionFactory transactionFactory) {
+ ActivityTaskManagerService atm, Supplier<SurfaceControl.Transaction> transactionFactory,
+ Supplier<Surface> surfaceFactory,
+ Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {
installLock(this, INDEX_WINDOW);
mGlobalLock = atm.getGlobalLock();
mAtmService = atm;
@@ -1020,10 +1026,13 @@
com.android.internal.R.bool.config_lowRamTaskSnapshotsAndRecents);
mInputManager = inputManager; // Must be before createDisplayContentLocked.
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
- mDisplayWindowSettings = new DisplayWindowSettings(this);
+ mSurfaceControlFactory = surfaceControlFactory;
mTransactionFactory = transactionFactory;
- mTransaction = mTransactionFactory.make();
+ mSurfaceFactory = surfaceFactory;
+ mTransaction = mTransactionFactory.get();
+
+ mDisplayWindowSettings = new DisplayWindowSettings(this);
mPolicy = policy;
mAnimator = new WindowAnimator(this);
mRoot = new RootWindowContainer(this);
@@ -1127,7 +1136,8 @@
PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG_WM);
mHoldingScreenWakeLock.setReferenceCounted(false);
- mSurfaceAnimationRunner = new SurfaceAnimationRunner(mPowerManagerInternal);
+ mSurfaceAnimationRunner = new SurfaceAnimationRunner(mTransactionFactory,
+ mPowerManagerInternal);
mAllowTheaterModeWakeFromLayout = context.getResources().getBoolean(
com.android.internal.R.bool.config_allowTheaterModeWakeFromWindowLayout);
@@ -3404,7 +3414,7 @@
int maskThickness = mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.circular_display_mask_thickness);
- mCircularDisplayMask = new CircularDisplayMask(
+ mCircularDisplayMask = new CircularDisplayMask(mSurfaceFactory,
getDefaultDisplayContentLocked(),
mPolicy.getWindowLayerFromTypeLw(
WindowManager.LayoutParams.TYPE_POINTER)
@@ -3432,6 +3442,7 @@
try {
if (mEmulatorDisplayOverlay == null) {
mEmulatorDisplayOverlay = new EmulatorDisplayOverlay(
+ mSurfaceFactory,
mContext,
getDefaultDisplayContentLocked(),
mPolicy.getWindowLayerFromTypeLw(
@@ -3480,7 +3491,7 @@
try {
// TODO(multi-display): support multiple displays
if (mStrictModeFlash == null) {
- mStrictModeFlash = new StrictModeFlash(
+ mStrictModeFlash = new StrictModeFlash(mSurfaceFactory,
getDefaultDisplayContentLocked());
}
mStrictModeFlash.setVisibility(on);
@@ -5497,7 +5508,8 @@
if (toks != null && toks.length > 0) {
// TODO(multi-display): Show watermarks on secondary displays.
final DisplayContent displayContent = getDefaultDisplayContentLocked();
- mWatermark = new Watermark(displayContent, displayContent.mRealDisplayMetrics,
+ mWatermark = new Watermark(mSurfaceFactory, displayContent,
+ displayContent.mRealDisplayMetrics,
toks);
}
}
@@ -7488,7 +7500,7 @@
}
SurfaceControl.Builder makeSurfaceBuilder(SurfaceSession s) {
- return mSurfaceBuilderFactory.make(s);
+ return mSurfaceControlFactory.apply(s);
}
/**
@@ -7560,7 +7572,8 @@
mRoot.forAllDisplays(displayContent ->
displayContent.getInputMonitor().updateInputWindowsImmediately());
}
- new SurfaceControl.Transaction().syncInputWindows().apply(true);
+
+ mTransactionFactory.get().syncInputWindows().apply(true);
}
private void waitForAnimationsToComplete() {
@@ -7682,7 +7695,7 @@
h.replaceTouchableRegionWithCrop(null);
SurfaceSession s = new SurfaceSession();
- SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+ SurfaceControl.Transaction t = mTransactionFactory.get();
t.setInputWindowInfo(surface, h);
t.apply();
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index ae3a10a..8e679d4 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -159,7 +159,7 @@
* window is first added or shown, cleared when the callback has been made. */
boolean mEnteringAnimation;
- private final SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction();
+ private final SurfaceControl.Transaction mTmpTransaction;
/** The pixel format of the underlying SurfaceControl */
int mSurfaceFormat;
@@ -246,6 +246,7 @@
final WindowManagerService service = win.mWmService;
mService = service;
+ mTmpTransaction = service.mTransactionFactory.get();
mAnimator = service.mAnimator;
mPolicy = service.mPolicy;
mContext = service.mContext;
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index bcefa8f..8cede6c 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -81,7 +81,7 @@
private final int mWindowType;
private final Session mWindowSession;
- private final SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction();
+ private final SurfaceControl.Transaction mTmpTransaction;
public WindowSurfaceController(SurfaceSession s, String name, int w, int h, int format,
int flags, WindowStateAnimator animator, int windowType, int ownerUid) {
@@ -96,6 +96,7 @@
final WindowState win = animator.mWin;
mWindowType = windowType;
mWindowSession = win.mSession;
+ mTmpTransaction = mService.mTransactionFactory.get();
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "new SurfaceControl");
final SurfaceControl.Builder b = win.makeSurface()
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 c52c8d7..2d0416d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
@@ -48,7 +48,7 @@
@Before
public void setUp() throws Exception {
mSurfaces = new SurfaceControlMocker();
- mLetterbox = new Letterbox(mSurfaces);
+ mLetterbox = new Letterbox(mSurfaces, () -> mock(SurfaceControl.Transaction.class));
mTransaction = mock(SurfaceControl.Transaction.class);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
index 1ad0e00..1be598b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
@@ -254,17 +254,14 @@
mWMPolicy = new TestWindowManagerPolicy(this::getWindowManagerService,
mPowerManagerWrapper);
mWmService = WindowManagerService.main(
- mContext, mImService, false, false, mWMPolicy, mAtmService, StubTransaction::new);
+ mContext, mImService, false, false, mWMPolicy, mAtmService, StubTransaction::new,
+ () -> mock(Surface.class), (unused) -> new MockSurfaceControlBuilder());
spyOn(mWmService);
// Setup factory classes to prevent calls to native code.
mTransaction = spy(StubTransaction.class);
// Return a spied Transaction class than can be used to verify calls.
mWmService.mTransactionFactory = () -> mTransaction;
- // Return a SurfaceControl.Builder class that creates mocked SurfaceControl instances.
- mWmService.mSurfaceBuilderFactory = (unused) -> new MockSurfaceControlBuilder();
- // Return mocked Surface instances.
- mWmService.mSurfaceFactory = () -> mock(Surface.class);
mWmService.mSurfaceAnimationRunner = new SurfaceAnimationRunner(
null, null, mTransaction, mWmService.mPowerManagerInternal);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
index 7d7c3985..2105ab0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
@@ -51,6 +51,7 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
+import java.util.function.Function;
/**
* Tests for the {@link DisplayContent#assignChildLayers(SurfaceControl.Transaction)} method.
@@ -131,7 +132,8 @@
}
}
- private static class HierarchyRecordingBuilderFactory implements SurfaceBuilderFactory {
+ private static class HierarchyRecordingBuilderFactory implements Function<SurfaceSession,
+ SurfaceControl.Builder> {
private LayerRecordingTransaction mTransaction;
HierarchyRecordingBuilderFactory(LayerRecordingTransaction transaction) {
@@ -139,7 +141,7 @@
}
@Override
- public SurfaceControl.Builder make(SurfaceSession s) {
+ public SurfaceControl.Builder apply(SurfaceSession s) {
final LayerRecordingTransaction transaction = mTransaction;
return new HierarchyRecorder(s, transaction);
}
@@ -153,7 +155,7 @@
// which is after construction of the DisplayContent, meaning the HierarchyRecorder
// would miss construction of the top-level layers.
mTransaction = new LayerRecordingTransaction();
- mWm.mSurfaceBuilderFactory = new HierarchyRecordingBuilderFactory(mTransaction);
+ mWm.mSurfaceControlFactory = new HierarchyRecordingBuilderFactory(mTransaction);
mWm.mTransactionFactory = () -> mTransaction;
}