From f4372d914e5960ded577e9a3e8194294d708bf35 Mon Sep 17 00:00:00 2001 From: gaochong Date: Wed, 14 Jun 2017 21:51:11 +0800 Subject: [PATCH] Fix Screen Magnification recursive draw When invoke the method View#setLayoutParams(), ViewRootImpl will run method ViewRootImpl#performTraversals(). And OnGlobalLayoutListener#onGlobalLayout() will be invoked. When the method View#setLayoutParams() is invoked in OnGlobalLayoutListener#onGlobalLayout(), there will be recursive call. The view will be draw on and on. This situation happen in Screen Magnification. It should remove the listener after work completion. Bug: https://issuetracker.google.com/issues/62613000 Test: use systrace when enter Screen Magnification,and view the "traversal" times. Change-Id: I01b1fcccb8b915ec436fb95f1d30c8ec0c0de0a9 Signed-off-by: gaochong --- .../ToggleScreenMagnificationPreferenceFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index e6a8c1e829c..669d51eaa07 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -98,6 +98,8 @@ public class ToggleScreenMagnificationPreferenceFragment extends ToggleFeaturePr videoView.setLayoutParams(videoLp); videoView.invalidate(); videoView.start(); + mVideoBackgroundView.getViewTreeObserver() + .removeOnGlobalLayoutListener(mLayoutListener); } };