From 5b6d99e87ad32e59ff2665e81e9d40fe349d8bba Mon Sep 17 00:00:00 2001 From: Masaaki Iwaguchi Date: Fri, 6 Nov 2015 12:38:27 +0100 Subject: [PATCH] System crash fixed when turn off MagnificationGesture Symptom: WindowManagerService throws exception and system crashes. Root cause: When the MagnificationGesture is turned off during animation of scale up/down, WindowManagerService.mAccessibilityController can be null so exception is thrown. Solution: Cancel ongoing animation before turning off MagnificationGesture. Change-Id: I469d84e024bdd453e3729a69229398233ed2eb61 --- .../server/accessibility/ScreenMagnifier.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/ScreenMagnifier.java b/services/accessibility/java/com/android/server/accessibility/ScreenMagnifier.java index b4613d6d811ac..a8e27a809e732 100644 --- a/services/accessibility/java/com/android/server/accessibility/ScreenMagnifier.java +++ b/services/accessibility/java/com/android/server/accessibility/ScreenMagnifier.java @@ -372,6 +372,9 @@ public final class ScreenMagnifier implements WindowManagerInternal.Magnificatio @Override public void onDestroy() { + if (mMagnificationController != null) { + mMagnificationController.cancelAnimation(); + } mScreenStateObserver.destroy(); mWindowManager.setMagnificationCallbacks(null); } @@ -988,10 +991,14 @@ public final class ScreenMagnifier implements WindowManagerInternal.Magnificatio return mCurrentMagnificationSpec.scale > 1.0f; } - public void reset(boolean animate) { + public void cancelAnimation() { if (mTransformationAnimator.isRunning()) { mTransformationAnimator.cancel(); } + } + + public void reset(boolean animate) { + cancelAnimation(); mCurrentMagnificationSpec.clear(); if (animate) { animateMangificationSpec(mSentMagnificationSpec, @@ -1056,9 +1063,7 @@ public final class ScreenMagnifier implements WindowManagerInternal.Magnificatio centerY) == 0) { return; } - if (mTransformationAnimator.isRunning()) { - mTransformationAnimator.cancel(); - } + cancelAnimation(); if (DEBUG_MAGNIFICATION_CONTROLLER) { Slog.i(LOG_TAG, "scale: " + scale + " offsetX: " + centerX + " offsetY: " + centerY);