diff --git a/services/java/com/android/server/wm/DisplayMagnifier.java b/services/java/com/android/server/wm/DisplayMagnifier.java index d3c01f08079d6..6e876f6511fa3 100644 --- a/services/java/com/android/server/wm/DisplayMagnifier.java +++ b/services/java/com/android/server/wm/DisplayMagnifier.java @@ -228,6 +228,10 @@ final class DisplayMagnifier { return spec; } + public void destroyLocked() { + mMagnifedViewport.destroyWindow(); + } + /** NOTE: This has to be called within a surface transaction. */ public void drawMagnifiedRegionBorderIfNeededLocked() { mMagnifedViewport.drawWindowIfNeededLocked(); @@ -258,7 +262,7 @@ final class DisplayMagnifier { private final int mBorderWidth; private final int mHalfBorderWidth; - private ViewportWindow mWindow; + private final ViewportWindow mWindow; private boolean mFullRedrawNeeded; @@ -459,6 +463,10 @@ final class DisplayMagnifier { mWindow.drawIfNeeded(); } + public void destroyWindow() { + mWindow.releaseSurface(); + } + private final class ViewportWindow { private static final String SURFACE_TITLE = "Magnification Overlay"; @@ -640,6 +648,10 @@ final class DisplayMagnifier { } } } + + public void releaseSurface() { + mSurface.release(); + } } } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 8d44f366b0033..1e5cd548c42b6 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -3039,7 +3039,10 @@ public class WindowManagerService extends IWindowManager.Stub mDisplayMagnifier = new DisplayMagnifier(this, callbacks); } else { if (callbacks == null) { - mDisplayMagnifier = null; + if (mDisplayMagnifier != null) { + mDisplayMagnifier.destroyLocked(); + mDisplayMagnifier = null; + } } else { throw new IllegalStateException("Magnification callbacks already set!"); }