Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a0b5582 authored by mincheli's avatar mincheli Committed by Minche Li
Browse files

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
parent 0f3b7c08
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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>

+2 −2
Original line number Diff line number Diff line
@@ -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>

+2 −2
Original line number Diff line number Diff line
@@ -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>
+20 −3
Original line number Diff line number Diff line
@@ -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())));
        });
    }

}
+16 −1
Original line number Diff line number Diff line
@@ -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();
    }