From 3a0b55820c8bbf4874885e0179ae073721f3da06 Mon Sep 17 00:00:00 2001 From: mincheli Date: Tue, 10 Nov 2020 19:23:27 +0800 Subject: [PATCH] Excludes magnification switch button from system gesture area When magnification switch button locates near to the system gesture area, a user would feel hard to drag the button because the touch event is dispatch to system gesture in priority. To make the switch button easier to be dragged, we exclude the button from system gesture area and adjust the layout size and the padding. Bug: 172899084 Test: atest MagnificationModeSwitchTest Change-Id: Ida99289ec63e6dc95d93eab979d9f8e985c3b889 --- .../drawable/ic_open_in_new_fullscreen.xml | 4 ++-- .../res/drawable/ic_open_in_new_window.xml | 4 ++-- packages/SystemUI/res/values/dimens.xml | 4 ++-- .../MagnificationModeSwitch.java | 23 ++++++++++++++++--- .../MagnificationModeSwitchTest.java | 17 +++++++++++++- 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/packages/SystemUI/res/drawable/ic_open_in_new_fullscreen.xml b/packages/SystemUI/res/drawable/ic_open_in_new_fullscreen.xml index 55116c6e549a3..9f66581d8053c 100644 --- a/packages/SystemUI/res/drawable/ic_open_in_new_fullscreen.xml +++ b/packages/SystemUI/res/drawable/ic_open_in_new_fullscreen.xml @@ -19,8 +19,8 @@ + android:width="48dp" + android:height="48dp" /> diff --git a/packages/SystemUI/res/drawable/ic_open_in_new_window.xml b/packages/SystemUI/res/drawable/ic_open_in_new_window.xml index 5f571cfa01974..659b02048c739 100644 --- a/packages/SystemUI/res/drawable/ic_open_in_new_window.xml +++ b/packages/SystemUI/res/drawable/ic_open_in_new_window.xml @@ -19,8 +19,8 @@ + android:width="48dp" + android:height="48dp" /> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 57e1d43bc6ef0..b4481a157e487 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1194,8 +1194,8 @@ 25dp 38dp 90dp - 32dp - 8dp + 60dp + 12dp 35dp 45dp 45dp diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java index e40185c279a87..026856db5cc72 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java @@ -23,6 +23,7 @@ import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.PixelFormat; import android.graphics.PointF; +import android.graphics.Rect; import android.os.Bundle; import android.os.UserHandle; import android.provider.Settings; @@ -41,6 +42,8 @@ import android.widget.ImageView; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; +import java.util.Collections; + /** * Shows/hides a {@link android.widget.ImageView} on the screen and changes the values of * {@link Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE} when the UI is toggled. @@ -85,7 +88,6 @@ class MagnificationModeSwitch { mImageView = imageView; mTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); applyResourcesValues(); - mImageView.setImageResource(getIconResId(mMagnificationMode)); mImageView.setOnTouchListener(this::onTouch); mImageView.setAccessibilityDelegate(new View.AccessibilityDelegate() { @Override @@ -138,6 +140,7 @@ class MagnificationModeSwitch { final int padding = mContext.getResources().getDimensionPixelSize( R.dimen.magnification_switch_button_padding); mImageView.setPadding(padding, padding, padding, padding); + mImageView.setImageResource(getIconResId(mMagnificationMode)); } private boolean onTouch(View v, MotionEvent event) { @@ -205,6 +208,8 @@ class MagnificationModeSwitch { } if (!mIsVisible) { mWindowManager.addView(mImageView, mParams); + // Exclude magnification switch button from system gesture area. + setSystemGestureExclusion(); mIsVisible = true; mImageView.postOnAnimation(mFadeInAnimationTask); mUiTimeout = mAccessibilityManager.getRecommendedTimeoutMillis( @@ -224,7 +229,11 @@ class MagnificationModeSwitch { void onConfigurationChanged(int configDiff) { if ((configDiff & ActivityInfo.CONFIG_DENSITY) != 0) { applyResourcesValues(); - mImageView.setImageResource(getIconResId(mMagnificationMode)); + if (mIsVisible) { + mWindowManager.updateViewLayout(mImageView, mParams); + // Exclude magnification switch button from system gesture area. + setSystemGestureExclusion(); + } return; } if ((configDiff & ActivityInfo.CONFIG_LOCALE) != 0) { @@ -261,7 +270,6 @@ class MagnificationModeSwitch { ImageView imageView = new ImageView(context); imageView.setClickable(true); imageView.setFocusable(true); - imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); imageView.setAlpha(0f); return imageView; } @@ -288,4 +296,13 @@ class MagnificationModeSwitch { private static String getAccessibilityWindowTitle(Context context) { return context.getString(com.android.internal.R.string.android_system_label); } + + private void setSystemGestureExclusion() { + mImageView.post(() -> { + mImageView.setSystemGestureExclusionRects( + Collections.singletonList( + new Rect(0, 0, mImageView.getWidth(), mImageView.getHeight()))); + }); + } + } 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 11150432f757d..0451d45a628bc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java @@ -142,6 +142,13 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { assertShowFadingAnimation(FADE_OUT_ALPHA); } + @Test + public void showButton_excludeSystemGestureArea() { + mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + + verify(mSpyImageView).setSystemGestureExclusionRects(any(List.class)); + } + @Test public void showMagnificationButton_setA11yTimeout_postDelayedAnimationWithA11yTimeout() { final int a11yTimeout = 12345; @@ -178,14 +185,17 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { } @Test - public void onConfigurationChanged_buttonIsShowing_setImageResource() { + public void onConfigurationChanged_buttonIsShowing_updateResourcesAndLayout() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); resetAndStubMockImageViewAndAnimator(); mMagnificationModeSwitch.onConfigurationChanged(ActivityInfo.CONFIG_DENSITY); + verify(mSpyImageView).setPadding(anyInt(), anyInt(), anyInt(), anyInt()); verify(mSpyImageView).setImageResource( getIconResId(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN)); + verify(mWindowManager).updateViewLayout(eq(mSpyImageView), any()); + verify(mSpyImageView).setSystemGestureExclusionRects(any(List.class)); } @Test @@ -368,6 +378,11 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { private void resetAndStubMockImageViewAndAnimator() { resetAndStubMockAnimator(); Mockito.reset(mSpyImageView); + doAnswer(invocation -> { + final Runnable runnable = invocation.getArgument(0); + runnable.run(); + return null; + }).when(mSpyImageView).post(any(Runnable.class)); doReturn(mViewPropertyAnimator).when(mSpyImageView).animate(); }