From 64660bedad0dad36fa9ca9c1544701383c1f5f32 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 26 Aug 2019 16:20:55 -0700 Subject: [PATCH] Avoid global transaction in magnifier It's not good to use the global transaction from the render thread like this as the UI thread could also be using it from SurfaceView. Transaction objects require external synchronization so we could be corrupting them. Bug: 140070297 Test: Builds Change-Id: I17b4c1417d45cc825fca380350c326ed6b3edcf6 --- core/java/android/widget/Magnifier.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java index d3c69725b45b6..f58b6d192fde9 100644 --- a/core/java/android/widget/Magnifier.java +++ b/core/java/android/widget/Magnifier.java @@ -800,6 +800,7 @@ public final class Magnifier { // The surface we allocate for the magnifier content + shadow. private final SurfaceSession mSurfaceSession; private final SurfaceControl mSurfaceControl; + private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction(); private final Surface mSurface; // The renderer used for the allocated surface. private final ThreadedRenderer.SimpleRenderer mRenderer; @@ -1081,16 +1082,16 @@ public final class Magnifier { return; } // Show or move the window at the content draw frame. - SurfaceControl.openTransaction(); - mSurfaceControl.deferTransactionUntil(mSurface, frame); + mTransaction.deferTransactionUntilSurface(mSurfaceControl, mSurface, frame); if (updateWindowPosition) { - mSurfaceControl.setPosition(pendingX, pendingY); + mTransaction.setPosition(mSurfaceControl, pendingX, pendingY); } if (firstDraw) { - mSurfaceControl.setLayer(SURFACE_Z); - mSurfaceControl.show(); + mTransaction.setLayer(mSurfaceControl, SURFACE_Z) + .show(mSurfaceControl); + } - SurfaceControl.closeTransaction(); + mTransaction.apply(); }; mRenderer.setLightCenter(mDisplay, pendingX, pendingY); } else {