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:
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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())));
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user