summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author ryanlwlin <ryanlwlin@google.com> 2020-12-09 20:29:37 +0800
committer ryanlwlin <ryanlwlin@google.com> 2020-12-10 12:49:01 +0800
commitd245501a5c9972b6ee948361aaa1eb743ed9e840 (patch)
treebbdb402313ad7b59cae37517ce9b897276092542
parent7bd311cf7a957729c5d6f95975654358bcedc4b7 (diff)
Fix button is gone after dragging over 5 secs
The pending fading out animation is not canceled while dragging. It should be canceled when the users touchs the button. If it is fading out when the user touchs it, we should cancel the animation and set the alpha value to 1. Bug: 175194712 Test: atest MagnificationModeSwitchTest manually test Change-Id: I3dec8520e90db7aff1050924be4e3bab1e27f23d
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java13
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java58
2 files changed, 55 insertions, 16 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java
index e40185c279a8..c3d437d329ca 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java
@@ -146,7 +146,7 @@ class MagnificationModeSwitch {
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
- mImageView.animate().cancel();
+ stopFadeOutAnimation();
mLastDown.set(event.getRawX(), event.getRawY());
mLastDrag.set(event.getRawX(), event.getRawY());
return true;
@@ -212,13 +212,18 @@ class MagnificationModeSwitch {
AccessibilityManager.FLAG_CONTENT_ICONS
| AccessibilityManager.FLAG_CONTENT_CONTROLS);
}
+ // Refresh the time slot of the fade-out task whenever this method is called.
+ stopFadeOutAnimation();
+ mImageView.postOnAnimationDelayed(mFadeOutAnimationTask, mUiTimeout);
+ }
+
+ private void stopFadeOutAnimation() {
+ mImageView.removeCallbacks(mFadeOutAnimationTask);
if (mIsFadeOutAnimating) {
mImageView.animate().cancel();
mImageView.setAlpha(1f);
+ mIsFadeOutAnimating = false;
}
- // Refresh the time slot of the fade-out task whenever this method is called.
- mImageView.removeCallbacks(mFadeOutAnimationTask);
- mImageView.postOnAnimationDelayed(mFadeOutAnimationTask, mUiTimeout);
}
void onConfigurationChanged(int configDiff) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
index 11150432f757..d13fd86818f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
@@ -33,6 +33,7 @@ import static junit.framework.Assert.assertNotNull;
import static org.hamcrest.CoreMatchers.hasItems;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
@@ -91,6 +92,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
private MagnificationModeSwitch mMagnificationModeSwitch;
private View.OnTouchListener mTouchListener;
private List<MotionEvent> mMotionEvents = new ArrayList<>();
+ private Runnable mFadeOutAnimation;
@Before
public void setUp() throws Exception {
@@ -119,6 +121,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
event.recycle();
}
mMotionEvents.clear();
+ mFadeOutAnimation = null;
}
@Test
@@ -157,15 +160,9 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
}
@Test
- public void showMagnificationButton_windowMode_verifyAnimationEndAction() {
- // Execute the runnable immediately to run the animation.
- doAnswer((invocation) -> {
- final Runnable action = invocation.getArgument(0);
- action.run();
- return null;
- }).when(mSpyImageView).postOnAnimationDelayed(any(Runnable.class), anyLong());
-
+ public void showMagnificationButton_windowModeAndFadingOut_verifyAnimationEndAction() {
mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
+ executeFadeOutAnimation();
// Verify the end action after fade-out.
final ArgumentCaptor<Runnable> endActionCaptor = ArgumentCaptor.forClass(Runnable.class);
@@ -197,9 +194,6 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
final long downTime = SystemClock.uptimeMillis();
mTouchListener.onTouch(mSpyImageView,
obtainMotionEvent(downTime, 0, ACTION_DOWN, 100, 100));
-
- verify(mViewPropertyAnimator).cancel();
-
resetAndStubMockImageViewAndAnimator();
mTouchListener.onTouch(mSpyImageView,
obtainMotionEvent(downTime, downTime, ACTION_UP, 100, 100));
@@ -208,6 +202,31 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
}
@Test
+ public void sendDownEvent_fullscreenMode_fadeOutAnimationIsNull() {
+ mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
+ resetAndStubMockImageViewAndAnimator();
+
+ final long downTime = SystemClock.uptimeMillis();
+ mTouchListener.onTouch(mSpyImageView,
+ obtainMotionEvent(downTime, 0, ACTION_DOWN, 100, 100));
+
+ assertNull(mFadeOutAnimation);
+ }
+
+ @Test
+ public void sendDownEvent_fullscreenModeAndFadingOut_cancelAnimation() {
+ mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
+ executeFadeOutAnimation();
+ resetAndStubMockImageViewAndAnimator();
+
+ final long downTime = SystemClock.uptimeMillis();
+ mTouchListener.onTouch(mSpyImageView,
+ obtainMotionEvent(downTime, 0, ACTION_DOWN, 100, 100));
+
+ verify(mViewPropertyAnimator).cancel();
+ }
+
+ @Test
public void performDragging_showMagnificationButton_updateViewLayout() {
mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
resetAndStubMockImageViewAndAnimator();
@@ -219,7 +238,6 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
final long downTime = SystemClock.uptimeMillis();
mTouchListener.onTouch(mSpyImageView, obtainMotionEvent(
downTime, 0, ACTION_DOWN, 100, 100));
- verify(mViewPropertyAnimator).cancel();
mTouchListener.onTouch(mSpyImageView,
obtainMotionEvent(downTime, downTime, ACTION_MOVE, 100 + offset,
@@ -369,6 +387,16 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
resetAndStubMockAnimator();
Mockito.reset(mSpyImageView);
doReturn(mViewPropertyAnimator).when(mSpyImageView).animate();
+ doAnswer((invocation) -> {
+ mFadeOutAnimation = invocation.getArgument(0);
+ return null;
+ }).when(mSpyImageView).postOnAnimationDelayed(any(Runnable.class), anyLong());
+ doAnswer((invocation) -> {
+ if (mFadeOutAnimation == invocation.getArgument(0)) {
+ mFadeOutAnimation = null;
+ }
+ return null;
+ }).when(mSpyImageView).removeCallbacks(any(Runnable.class));
}
private void resetAndStubMockAnimator() {
@@ -397,4 +425,10 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
mMotionEvents.add(event);
return event;
}
+
+ private void executeFadeOutAnimation() {
+ assertNotNull(mFadeOutAnimation);
+ mFadeOutAnimation.run();
+ mFadeOutAnimation = null;
+ }
}