Merge "Applies Accessibility UI timeout for showing duration of magnification button"
This commit is contained in:
@@ -31,6 +31,7 @@ import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewConfiguration;
|
||||
import android.view.WindowManager;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
|
||||
import android.widget.ImageView;
|
||||
@@ -48,15 +49,16 @@ class MagnificationModeSwitch {
|
||||
|
||||
@VisibleForTesting
|
||||
static final long FADING_ANIMATION_DURATION_MS = 300;
|
||||
private static final int DEFAULT_FADE_OUT_ANIMATION_DELAY_MS = 3000;
|
||||
// The button visible duration starting from the last showButton() called.
|
||||
private int mVisibleDuration = DEFAULT_FADE_OUT_ANIMATION_DELAY_MS;
|
||||
@VisibleForTesting
|
||||
static final int DEFAULT_FADE_OUT_ANIMATION_DELAY_MS = 3000;
|
||||
private int mUiTimeout;
|
||||
private final Runnable mFadeInAnimationTask;
|
||||
private final Runnable mFadeOutAnimationTask;
|
||||
@VisibleForTesting
|
||||
boolean mIsFadeOutAnimating = false;
|
||||
|
||||
private final Context mContext;
|
||||
private final AccessibilityManager mAccessibilityManager;
|
||||
private final WindowManager mWindowManager;
|
||||
private final ImageView mImageView;
|
||||
private final PointF mLastDown = new PointF();
|
||||
@@ -74,6 +76,7 @@ class MagnificationModeSwitch {
|
||||
@VisibleForTesting
|
||||
MagnificationModeSwitch(Context context, @NonNull ImageView imageView) {
|
||||
mContext = context;
|
||||
mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class);
|
||||
mWindowManager = (WindowManager) mContext.getSystemService(
|
||||
Context.WINDOW_SERVICE);
|
||||
mParams = createLayoutParams();
|
||||
@@ -202,6 +205,10 @@ class MagnificationModeSwitch {
|
||||
mWindowManager.addView(mImageView, mParams);
|
||||
mIsVisible = true;
|
||||
mImageView.postOnAnimation(mFadeInAnimationTask);
|
||||
mUiTimeout = mAccessibilityManager.getRecommendedTimeoutMillis(
|
||||
DEFAULT_FADE_OUT_ANIMATION_DELAY_MS,
|
||||
AccessibilityManager.FLAG_CONTENT_ICONS
|
||||
| AccessibilityManager.FLAG_CONTENT_CONTROLS);
|
||||
}
|
||||
if (mIsFadeOutAnimating) {
|
||||
mImageView.animate().cancel();
|
||||
@@ -209,7 +216,7 @@ class MagnificationModeSwitch {
|
||||
}
|
||||
// Refresh the time slot of the fade-out task whenever this method is called.
|
||||
mImageView.removeCallbacks(mFadeOutAnimationTask);
|
||||
mImageView.postOnAnimationDelayed(mFadeOutAnimationTask, mVisibleDuration);
|
||||
mImageView.postOnAnimationDelayed(mFadeOutAnimationTask, mUiTimeout);
|
||||
}
|
||||
|
||||
void onConfigurationChanged(int configDiff) {
|
||||
|
||||
@@ -72,8 +72,7 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall
|
||||
super(context);
|
||||
mHandler = mainHandler;
|
||||
mLastConfiguration = new Configuration(context.getResources().getConfiguration());
|
||||
mAccessibilityManager = (AccessibilityManager) mContext.getSystemService(
|
||||
Context.ACCESSIBILITY_SERVICE);
|
||||
mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class);
|
||||
mCommandQueue = commandQueue;
|
||||
mModeSwitchesController = modeSwitchesController;
|
||||
final WindowMagnificationController controller = new WindowMagnificationController(mContext,
|
||||
|
||||
@@ -24,6 +24,7 @@ import static android.view.MotionEvent.ACTION_MOVE;
|
||||
import static android.view.MotionEvent.ACTION_UP;
|
||||
import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK;
|
||||
|
||||
import static com.android.systemui.accessibility.MagnificationModeSwitch.DEFAULT_FADE_OUT_ANIMATION_DELAY_MS;
|
||||
import static com.android.systemui.accessibility.MagnificationModeSwitch.FADING_ANIMATION_DURATION_MS;
|
||||
import static com.android.systemui.accessibility.MagnificationModeSwitch.getIconResId;
|
||||
|
||||
@@ -33,6 +34,7 @@ import static org.hamcrest.CoreMatchers.hasItems;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyFloat;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.anyLong;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
@@ -48,6 +50,7 @@ import android.view.View;
|
||||
import android.view.ViewConfiguration;
|
||||
import android.view.ViewPropertyAnimator;
|
||||
import android.view.WindowManager;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import android.widget.ImageView;
|
||||
|
||||
@@ -74,6 +77,8 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
|
||||
|
||||
private ImageView mSpyImageView;
|
||||
@Mock
|
||||
private AccessibilityManager mAccessibilityManager;
|
||||
@Mock
|
||||
private WindowManager mWindowManager;
|
||||
@Mock
|
||||
private ViewPropertyAnimator mViewPropertyAnimator;
|
||||
@@ -89,6 +94,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
|
||||
wm.getMaximumWindowMetrics()
|
||||
).when(mWindowManager).getMaximumWindowMetrics();
|
||||
mContext.addMockSystemService(Context.WINDOW_SERVICE, mWindowManager);
|
||||
mContext.addMockSystemService(Context.ACCESSIBILITY_SERVICE, mAccessibilityManager);
|
||||
mSpyImageView = Mockito.spy(new ImageView(mContext));
|
||||
resetMockImageViewAndAnimator();
|
||||
|
||||
@@ -108,16 +114,37 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void showWindowModeButton_fullscreenMode_addViewAndSetImageResource() {
|
||||
mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
|
||||
|
||||
verify(mSpyImageView).setImageResource(
|
||||
getIconResId(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW));
|
||||
verify(mWindowManager).addView(eq(mSpyImageView), any(WindowManager.LayoutParams.class));
|
||||
assertShowFadingAnimation(FADE_IN_ALPHA);
|
||||
assertShowFadingAnimation(FADE_OUT_ALPHA);
|
||||
}
|
||||
|
||||
ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class);
|
||||
verify(mViewPropertyAnimator).withEndAction(captor.capture());
|
||||
verify(mWindowManager).addView(eq(mSpyImageView), any(WindowManager.LayoutParams.class));
|
||||
@Test
|
||||
public void showMagnificationButton_a11yTimeout_autoFadeOut() {
|
||||
final int a11yTimeout = 12345;
|
||||
when(mAccessibilityManager.getRecommendedTimeoutMillis(anyInt(), anyInt())).thenReturn(
|
||||
a11yTimeout);
|
||||
|
||||
captor.getValue().run();
|
||||
mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
|
||||
|
||||
verify(mAccessibilityManager).getRecommendedTimeoutMillis(
|
||||
DEFAULT_FADE_OUT_ANIMATION_DELAY_MS, AccessibilityManager.FLAG_CONTENT_ICONS
|
||||
| AccessibilityManager.FLAG_CONTENT_CONTROLS);
|
||||
final ArgumentCaptor<Runnable> fadeOutCaptor = ArgumentCaptor.forClass(Runnable.class);
|
||||
final ArgumentCaptor<Long> fadeOutDelay = ArgumentCaptor.forClass(Long.class);
|
||||
verify(mSpyImageView).postOnAnimationDelayed(fadeOutCaptor.capture(),
|
||||
fadeOutDelay.capture());
|
||||
assertEquals(a11yTimeout, (long) fadeOutDelay.getValue());
|
||||
|
||||
// Verify the end action after fade-out.
|
||||
fadeOutCaptor.getValue().run();
|
||||
final ArgumentCaptor<Runnable> endActionCaptor = ArgumentCaptor.forClass(Runnable.class);
|
||||
verify(mViewPropertyAnimator).withEndAction(endActionCaptor.capture());
|
||||
|
||||
endActionCaptor.getValue().run();
|
||||
|
||||
verify(mViewPropertyAnimator).cancel();
|
||||
verify(mWindowManager).removeView(mSpyImageView);
|
||||
|
||||
Reference in New Issue
Block a user