From e90ae66df0b65a07beefbeb00c036e457418f364 Mon Sep 17 00:00:00 2001 From: Candice Date: Mon, 13 Jan 2025 10:57:49 +0000 Subject: Check the magnification state before performing onAnimationEnd onAnimationEnd will be called when we call cancel() on the animator. Therefore, we need to confirm the the expected state in onAnimationEnd for the following actions. Bug: 389083496 Test: atest FullscreenMagnificationControllerTest Flag: EXEMPT bugfix Change-Id: I8379aadc140c00657e0b8ac8177da6961f6f2b09 --- .../FullscreenMagnificationController.java | 26 +++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java index caf043a1b1be..b2f3df60c82b 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java @@ -200,7 +200,15 @@ public class FullscreenMagnificationController implements ComponentCallbacks { valueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(@NonNull Animator animation) { - mHandler.post(() -> setState(ENABLED)); + // This could be called when the animation ends or is canceled. Therefore, we need + // to check the state of fullscreen magnification for the following actions. We only + // update the state to ENABLED when the previous state is ENABLING which implies + // fullscreen magnification is experiencing an ongoing create border process. + mHandler.post(() -> { + if (getState() == ENABLING) { + setState(ENABLED); + } + }); }}); return valueAnimator; } @@ -221,7 +229,14 @@ public class FullscreenMagnificationController implements ComponentCallbacks { valueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(@NonNull Animator animation) { - mHandler.post(() -> cleanUpBorder()); + // This could be called when the animation ends or is canceled. Therefore, we need + // to check the state of fullscreen magnification for the following actions. Border + // cleanup should only happens after a removal process. + mHandler.post(() -> { + if (getState() == DISABLING) { + cleanUpBorder(); + } + }); }}); return valueAnimator; } @@ -250,6 +265,8 @@ public class FullscreenMagnificationController implements ComponentCallbacks { // If there is an ongoing disable process or it is already disabled, return return; } + // The state should be updated as early as possible so others could check + // the ongoing process. setState(DISABLING); mShowHideBorderAnimator = createHideTargetAnimator(mFullscreenBorder); mShowHideBorderAnimator.start(); @@ -297,10 +314,13 @@ public class FullscreenMagnificationController implements ComponentCallbacks { // If there is an ongoing enable process or it is already enabled, return return; } + // The state should be updated as early as possible so others could check + // the ongoing process. + setState(ENABLING); + if (mShowHideBorderAnimator != null) { mShowHideBorderAnimator.cancel(); } - setState(ENABLING); onConfigurationChanged(mContext.getResources().getConfiguration()); mContext.registerComponentCallbacks(this); -- cgit v1.2.3-59-g8ed1b