diff options
| -rw-r--r-- | core/java/android/widget/Magnifier.java | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java index 08799cfb5d4c..cb5dc5f88b3e 100644 --- a/core/java/android/widget/Magnifier.java +++ b/core/java/android/widget/Magnifier.java @@ -136,6 +136,8 @@ public final class Magnifier { // Lock to synchronize between the UI thread and the thread that handles pixel copy results. // Only sync mWindow writes from UI thread with mWindow reads from sPixelCopyHandlerThread. private final Object mLock = new Object(); + // The lock used to synchronize the UI and render threads when a #dismiss is performed. + private final Object mDestroyLock = new Object(); /** * Initializes a magnifier. @@ -275,7 +277,7 @@ public final class Magnifier { mWindowElevation, mWindowCornerRadius, mOverlay != null ? mOverlay : new ColorDrawable(Color.TRANSPARENT), Handler.getMain() /* draw the magnifier on the UI thread */, mLock, - mCallback); + mDestroyLock, mCallback); } } performPixelCopy(startX, startY, true /* update window position */); @@ -304,9 +306,11 @@ public final class Magnifier { */ public void dismiss() { if (mWindow != null) { - synchronized (mLock) { - mWindow.destroy(); - mWindow = null; + synchronized (mDestroyLock) { + synchronized (mLock) { + mWindow.destroy(); + mWindow = null; + } } mPrevShowSourceCoords.x = NONEXISTENT_PREVIOUS_CONFIG_VALUE; mPrevShowSourceCoords.y = NONEXISTENT_PREVIOUS_CONFIG_VALUE; @@ -819,7 +823,7 @@ public final class Magnifier { // is performed on the UI thread and a frame callback on the render thread. // When both mLock and mDestroyLock need to be held at the same time, // mDestroyLock should be acquired before mLock in order to avoid deadlocks. - private final Object mDestroyLock = new Object(); + private final Object mDestroyLock; // The current content of the magnifier. It is mBitmap + mOverlay, only used for testing. private Bitmap mCurrentContent; @@ -827,10 +831,12 @@ public final class Magnifier { InternalPopupWindow(final Context context, final Display display, final SurfaceControl parentSurfaceControl, final int width, final int height, final float elevation, final float cornerRadius, final Drawable overlay, - final Handler handler, final Object lock, final Callback callback) { + final Handler handler, final Object lock, final Object destroyLock, + final Callback callback) { mDisplay = display; mOverlay = overlay; mLock = lock; + mDestroyLock = destroyLock; mCallback = callback; mContentWidth = width; |