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
This commit is contained in:
mincheli
2020-11-10 19:23:27 +08:00
committed by Minche Li
parent 0f3b7c0823
commit 3a0b55820c
5 changed files with 42 additions and 10 deletions

View File

@@ -19,8 +19,8 @@
<shape android:shape="rectangle">
<solid android:color="@color/magnification_switch_button_color" />
<size
android:width="40dp"
android:height="40dp" />
android:width="48dp"
android:height="48dp" />
</shape>
</item>

View File

@@ -19,8 +19,8 @@
<shape android:shape="rectangle">
<solid android:color="@color/magnification_switch_button_color" />
<size
android:width="40dp"
android:height="40dp" />
android:width="48dp"
android:height="48dp" />
</shape>
</item>

View File

@@ -1194,8 +1194,8 @@
<dimen name="magnification_frame_move_long">25dp</dimen>
<dimen name="magnification_drag_view_size">38dp</dimen>
<dimen name="magnification_controls_size">90dp</dimen>
<dimen name="magnification_switch_button_size">32dp</dimen>
<dimen name="magnification_switch_button_padding">8dp</dimen>
<dimen name="magnification_switch_button_size">60dp</dimen>
<dimen name="magnification_switch_button_padding">12dp</dimen>
<dimen name="magnifier_left_right_controls_width">35dp</dimen>
<dimen name="magnifier_left_right_controls_height">45dp</dimen>
<dimen name="magnifier_up_down_controls_width">45dp</dimen>

View File

@@ -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())));
});
}
}

View File

@@ -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();
}