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

Commit 405ae936 authored by Gavin Williams's avatar Gavin Williams
Browse files

Autoclick: Make click type buttons TalkBack accessible

The existing buttons have two issues when focused by TalkBack. They
announced themselves as images and they were not selectable using
"Search + Enter" once hovered.

To fix this, update each button by removing its LinearLayout wrapper and
only referencing the ImageButton.

Demo: http://b/427586021#comment2

Bug: 427586021
Test: AutoclickTypePanelTest
Flag: com.android.server.accessibility.enable_autoclick_indicator
Change-Id: I738b27b9eb711c721a46db9dc2b1eb1d0906cb3f
parent 156b0ed8
Loading
Loading
Loading
Loading
+49 −97
Original line number Diff line number Diff line
@@ -43,83 +43,47 @@
            android:background="@drawable/accessibility_autoclick_button_group_rounded_background"
            android:orientation="horizontal">

            <LinearLayout
                android:id="@+id/accessibility_autoclick_long_press_layout"
                style="@style/AccessibilityAutoclickPanelButtonLayoutStyle"
                android:tooltipText="@string/accessibility_autoclick_long_press" >

            <ImageButton
                android:id="@+id/accessibility_autoclick_long_press_button"
                android:src="@drawable/accessibility_autoclick_long_press"
                style="@style/AccessibilityAutoclickPanelImageButtonStyle"
                android:contentDescription="@string/accessibility_autoclick_long_press"
                    android:src="@drawable/accessibility_autoclick_long_press"
                    android:clickable="false" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/accessibility_autoclick_drag_layout"
                style="@style/AccessibilityAutoclickPanelButtonLayoutStyle"
                android:tooltipText="@string/accessibility_autoclick_drag" >
                android:tooltipText="@string/accessibility_autoclick_long_press" />

            <ImageButton
                android:id="@+id/accessibility_autoclick_drag_button"
                android:src="@drawable/accessibility_autoclick_drag"
                style="@style/AccessibilityAutoclickPanelImageButtonStyle"
                android:contentDescription="@string/accessibility_autoclick_drag"
                    android:src="@drawable/accessibility_autoclick_drag"
                    android:clickable="false"/>
            </LinearLayout>

            <LinearLayout
                android:id="@+id/accessibility_autoclick_double_click_layout"
                style="@style/AccessibilityAutoclickPanelButtonLayoutStyle"
                android:tooltipText="@string/accessibility_autoclick_double_click" >
                android:tooltipText="@string/accessibility_autoclick_drag" />

            <ImageButton
                android:id="@+id/accessibility_autoclick_double_click_button"
                android:src="@drawable/accessibility_autoclick_double_click"
                style="@style/AccessibilityAutoclickPanelImageButtonStyle"
                android:contentDescription="@string/accessibility_autoclick_double_click"
                    android:src="@drawable/accessibility_autoclick_double_click"
                    android:clickable="false"/>
            </LinearLayout>

            <LinearLayout
                android:id="@+id/accessibility_autoclick_right_click_layout"
                style="@style/AccessibilityAutoclickPanelButtonLayoutStyle"
                android:tooltipText="@string/accessibility_autoclick_right_click" >
                android:tooltipText="@string/accessibility_autoclick_double_click" />

            <ImageButton
                android:id="@+id/accessibility_autoclick_right_click_button"
                android:src="@drawable/accessibility_autoclick_right_click"
                style="@style/AccessibilityAutoclickPanelImageButtonStyle"
                android:contentDescription="@string/accessibility_autoclick_right_click"
                    android:src="@drawable/accessibility_autoclick_right_click"
                    android:clickable="false"/>
            </LinearLayout>

            <LinearLayout
                android:id="@+id/accessibility_autoclick_scroll_layout"
                style="@style/AccessibilityAutoclickPanelButtonLayoutStyle"
                android:tooltipText="@string/accessibility_autoclick_scroll" >
                android:tooltipText="@string/accessibility_autoclick_right_click" />

            <ImageButton
                android:id="@+id/accessibility_autoclick_scroll_button"
                android:src="@drawable/accessibility_autoclick_scroll"
                style="@style/AccessibilityAutoclickPanelImageButtonStyle"
                android:contentDescription="@string/accessibility_autoclick_scroll"
                    android:src="@drawable/accessibility_autoclick_scroll"
                    android:clickable="false"/>
            </LinearLayout>

            <LinearLayout
                android:id="@+id/accessibility_autoclick_left_click_layout"
                style="@style/AccessibilityAutoclickPanelButtonLayoutStyle"
                android:tooltipText="@string/accessibility_autoclick_left_click" >
                android:tooltipText="@string/accessibility_autoclick_scroll" />

            <ImageButton
                android:id="@+id/accessibility_autoclick_left_click_button"
                android:src="@drawable/accessibility_autoclick_left_click"
                style="@style/AccessibilityAutoclickPanelImageButtonStyle"
                android:contentDescription="@string/accessibility_autoclick_left_click"
                    android:src="@drawable/accessibility_autoclick_left_click"
                    android:clickable="false"/>
            </LinearLayout>
                android:tooltipText="@string/accessibility_autoclick_left_click" />

        </LinearLayout>

@@ -130,32 +94,20 @@
            android:layout_marginEnd="@dimen/accessibility_autoclick_type_panel_button_spacing"
            android:background="@color/materialColorSurfaceContainer" />

        <LinearLayout
            android:id="@+id/accessibility_autoclick_pause_layout"
            style="@style/AccessibilityAutoclickPanelButtonLayoutStyle"
            android:layout_marginEnd="@dimen/accessibility_autoclick_type_panel_button_spacing"
            android:tooltipText="@string/accessibility_autoclick_pause" >

        <ImageButton
            android:id="@+id/accessibility_autoclick_pause_button"
            android:src="@drawable/accessibility_autoclick_pause"
            style="@style/AccessibilityAutoclickPanelImageButtonStyle"
            android:layout_marginEnd="@dimen/accessibility_autoclick_type_panel_button_spacing"
            android:contentDescription="@string/accessibility_autoclick_pause"
                android:src="@drawable/accessibility_autoclick_pause"
                android:clickable="false"/>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/accessibility_autoclick_position_layout"
            style="@style/AccessibilityAutoclickPanelButtonLayoutStyle"
            android:tooltipText="@string/accessibility_autoclick_position" >
            android:tooltipText="@string/accessibility_autoclick_pause" />

        <ImageButton
            android:id="@+id/accessibility_autoclick_position_button"
            android:src="@drawable/accessibility_autoclick_position"
            style="@style/AccessibilityAutoclickPanelImageButtonStyle"
            android:contentDescription="@string/accessibility_autoclick_position"
                android:src="@drawable/accessibility_autoclick_position"
                android:clickable="false"/>
        </LinearLayout>
            android:tooltipText="@string/accessibility_autoclick_position" />

    </LinearLayout>

+7 −10
Original line number Diff line number Diff line
@@ -1752,19 +1752,16 @@ please see styles_device_defaults.xml.
        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
    </style>

    <style name="AccessibilityAutoclickPanelButtonLayoutStyle">
        <item name="android:gravity">center</item>
        <item name="android:background">@drawable/accessibility_autoclick_button_rounded_background</item>
        <item name="android:layout_width">@dimen/accessibility_autoclick_type_panel_button_size</item>
        <item name="android:layout_height">@dimen/accessibility_autoclick_type_panel_button_size</item>
    </style>

    <style name="AccessibilityAutoclickPanelImageButtonStyle">
        <item name="android:gravity">center</item>
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:background">
            @drawable/accessibility_autoclick_button_rounded_background
        </item>
        <item name="android:layout_width">@dimen/accessibility_autoclick_type_panel_button_size
        </item>
        <item name="android:layout_height">@dimen/accessibility_autoclick_type_panel_button_size
        </item>
        <item name="android:scaleType">center</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:tint">@color/accessibility_autoclick_type_button_color</item>
    </style>

+0 −8
Original line number Diff line number Diff line
@@ -5912,21 +5912,13 @@
  <java-symbol type="id" name="accessibility_autoclick_type_panel" />
  <java-symbol type="id" name="accessibility_autoclick_button_group_container" />
  <java-symbol type="id" name="accessibility_autoclick_click_type_button_group_container" />
  <java-symbol type="id" name="accessibility_autoclick_left_click_layout" />
  <java-symbol type="id" name="accessibility_autoclick_left_click_button" />
  <java-symbol type="id" name="accessibility_autoclick_right_click_layout" />
  <java-symbol type="id" name="accessibility_autoclick_right_click_button" />
  <java-symbol type="id" name="accessibility_autoclick_double_click_layout" />
  <java-symbol type="id" name="accessibility_autoclick_double_click_button" />
  <java-symbol type="id" name="accessibility_autoclick_drag_layout" />
  <java-symbol type="id" name="accessibility_autoclick_drag_button" />
  <java-symbol type="id" name="accessibility_autoclick_scroll_layout" />
  <java-symbol type="id" name="accessibility_autoclick_scroll_button" />
  <java-symbol type="id" name="accessibility_autoclick_long_press_layout" />
  <java-symbol type="id" name="accessibility_autoclick_long_press_button" />
  <java-symbol type="id" name="accessibility_autoclick_pause_layout" />
  <java-symbol type="id" name="accessibility_autoclick_pause_button" />
  <java-symbol type="id" name="accessibility_autoclick_position_layout" />
  <java-symbol type="id" name="accessibility_autoclick_position_button" />
  <java-symbol type="drawable" name="accessibility_autoclick_pause" />
  <java-symbol type="drawable" name="accessibility_autoclick_resume" />
+32 −34
Original line number Diff line number Diff line
@@ -160,16 +160,16 @@ public class AutoclickTypePanel {
    // The current corner position of the panel, default to bottom right.
    private @Corner int mCurrentCorner = CORNER_BOTTOM_RIGHT;

    private LinearLayout mLeftClickButton;
    private LinearLayout mRightClickButton;
    private LinearLayout mDoubleClickButton;
    private LinearLayout mDragButton;
    private LinearLayout mScrollButton;
    private LinearLayout mPauseButton;
    private LinearLayout mPositionButton;
    private LinearLayout mLongPressButton;

    private LinearLayout mSelectedButton;
    private ImageButton mLeftClickButton;
    private ImageButton mRightClickButton;
    private ImageButton mDoubleClickButton;
    private ImageButton mDragButton;
    private ImageButton mScrollButton;
    private ImageButton mPauseButton;
    private ImageButton mPositionButton;
    private ImageButton mLongPressButton;

    private ImageButton mSelectedButton;
    private int mSelectedClickType = AUTOCLICK_TYPE_LEFT_CLICK;

    private Drawable mPauseButtonDrawable;
@@ -214,17 +214,17 @@ public class AutoclickTypePanel {
                        .inflate(R.layout.accessibility_autoclick_type_panel, null);
        mContentView.setOnHoverChangedListener(mClickPanelController::onHoverChange);
        mLeftClickButton =
                mContentView.findViewById(R.id.accessibility_autoclick_left_click_layout);
                mContentView.findViewById(R.id.accessibility_autoclick_left_click_button);
        mRightClickButton =
                mContentView.findViewById(R.id.accessibility_autoclick_right_click_layout);
                mContentView.findViewById(R.id.accessibility_autoclick_right_click_button);
        mDoubleClickButton =
                mContentView.findViewById(R.id.accessibility_autoclick_double_click_layout);
        mScrollButton = mContentView.findViewById(R.id.accessibility_autoclick_scroll_layout);
        mDragButton = mContentView.findViewById(R.id.accessibility_autoclick_drag_layout);
        mPauseButton = mContentView.findViewById(R.id.accessibility_autoclick_pause_layout);
        mPositionButton = mContentView.findViewById(R.id.accessibility_autoclick_position_layout);
                mContentView.findViewById(R.id.accessibility_autoclick_double_click_button);
        mScrollButton = mContentView.findViewById(R.id.accessibility_autoclick_scroll_button);
        mDragButton = mContentView.findViewById(R.id.accessibility_autoclick_drag_button);
        mPauseButton = mContentView.findViewById(R.id.accessibility_autoclick_pause_button);
        mPositionButton = mContentView.findViewById(R.id.accessibility_autoclick_position_button);
        mLongPressButton =
                mContentView.findViewById(R.id.accessibility_autoclick_long_press_layout);
                mContentView.findViewById(R.id.accessibility_autoclick_long_press_button);

        // Get status bar height.
        mStatusBarHeight = SystemBarUtils.getStatusBarHeight(mContext);
@@ -360,7 +360,7 @@ public class AutoclickTypePanel {
    /** Reset panel as collapsed state and only displays selected button. */
    public void collapsePanelWithClickType(@AutoclickType int clickType) {
        hideAllClickTypeButtons();
        final LinearLayout selectedButton = getButtonFromClickType(clickType);
        final ImageButton selectedButton = getButtonFromClickType(clickType);
        selectedButton.setVisibility(View.VISIBLE);

        // Sets the newly selected button.
@@ -374,7 +374,7 @@ public class AutoclickTypePanel {

    /** Sets the selected button and updates the newly and previously selected button styling. */
    private void setSelectedClickType(@AutoclickType int clickType) {
        final LinearLayout selectedButton = getButtonFromClickType(clickType);
        final ImageButton selectedButton = getButtonFromClickType(clickType);

        // Updates the previously selected button styling.
        if (mSelectedButton != null) {
@@ -389,7 +389,7 @@ public class AutoclickTypePanel {
        toggleSelectedButtonStyle(selectedButton, /* isSelected= */ true);
    }

    private void toggleSelectedButtonStyle(@NonNull LinearLayout button, boolean isSelected) {
    private void toggleSelectedButtonStyle(@NonNull ImageButton button, boolean isSelected) {
        button.setSelected(isSelected);
    }

@@ -500,17 +500,16 @@ public class AutoclickTypePanel {
     * without changing the state itself.
     */
    private void updatePauseButtonAppearance() {
        ImageButton imageButton = (ImageButton) mPauseButton.getChildAt(0);
        if (mPaused) {
            String resumeText = mContext.getString(R.string.accessibility_autoclick_resume);
            mPauseButton.setTooltipText(resumeText);
            imageButton.setContentDescription(resumeText);
            imageButton.setImageDrawable(mResumeButtonDrawable);
            mPauseButton.setContentDescription(resumeText);
            mPauseButton.setImageDrawable(mResumeButtonDrawable);
        } else {
            String pauseText = mContext.getString(R.string.accessibility_autoclick_pause);
            mPauseButton.setTooltipText(pauseText);
            imageButton.setContentDescription(pauseText);
            imageButton.setImageDrawable(mPauseButtonDrawable);
            mPauseButton.setContentDescription(pauseText);
            mPauseButton.setImageDrawable(mPauseButtonDrawable);
        }
    }

@@ -535,11 +534,11 @@ public class AutoclickTypePanel {
    }

    /**
     * Retrieves the LinearLayout corresponding to the given autoclick type.
     * Retrieves the ImageButton corresponding to the given autoclick type.
     * @param clickType The autoclick type.
     * @return The LinearLayout for the specified click type.
     * @return The ImageButton for the specified click type.
     */
    private LinearLayout getButtonFromClickType(@AutoclickType int clickType) {
    private ImageButton getButtonFromClickType(@AutoclickType int clickType) {
        return switch (clickType) {
            case AUTOCLICK_TYPE_LEFT_CLICK -> mLeftClickButton;
            case AUTOCLICK_TYPE_RIGHT_CLICK -> mRightClickButton;
@@ -699,20 +698,19 @@ public class AutoclickTypePanel {
     * @param corner The corner to set the icon for.
     */
    private void updatePositionButtonIcon(@Corner int corner) {
        ImageButton imageButton = (ImageButton) mPositionButton.getChildAt(/* index= */ 0);
        switch (corner) {
            case CORNER_TOP_LEFT:
                imageButton.setImageDrawable(mPositionTopLeftDrawable);
                mPositionButton.setImageDrawable(mPositionTopLeftDrawable);
                break;
            case CORNER_TOP_RIGHT:
                imageButton.setImageDrawable(mPositionTopRightDrawable);
                mPositionButton.setImageDrawable(mPositionTopRightDrawable);
                break;
            case CORNER_BOTTOM_LEFT:
                imageButton.setImageDrawable(mPositionBottomLeftDrawable);
                mPositionButton.setImageDrawable(mPositionBottomLeftDrawable);
                break;
            case CORNER_BOTTOM_RIGHT:
            default:
                imageButton.setImageDrawable(mPositionBottomRightDrawable);
                mPositionButton.setImageDrawable(mPositionBottomRightDrawable);
                break;
        }
    }
+19 −21
Original line number Diff line number Diff line
@@ -45,7 +45,6 @@ import android.view.PointerIcon;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.LinearLayout;

import androidx.annotation.NonNull;

@@ -72,14 +71,14 @@ public class AutoclickTypePanelTest {

    private AutoclickTypePanel mAutoclickTypePanel;
    @Mock private WindowManager mMockWindowManager;
    private LinearLayout mLeftClickButton;
    private LinearLayout mRightClickButton;
    private LinearLayout mDoubleClickButton;
    private LinearLayout mDragButton;
    private LinearLayout mScrollButton;
    private LinearLayout mPauseButton;
    private LinearLayout mPositionButton;
    private LinearLayout mLongPressButton;
    private ImageButton mLeftClickButton;
    private ImageButton mRightClickButton;
    private ImageButton mDoubleClickButton;
    private ImageButton mDragButton;
    private ImageButton mScrollButton;
    private ImageButton mPauseButton;
    private ImageButton mPositionButton;
    private ImageButton mLongPressButton;

    private @AutoclickType int mActiveClickType = AUTOCLICK_TYPE_LEFT_CLICK;
    private boolean mPaused;
@@ -111,16 +110,16 @@ public class AutoclickTypePanelTest {
                new AutoclickTypePanel(mTestableContext, mMockWindowManager,
                        mTestableContext.getUserId(), clickPanelController);
        View contentView = mAutoclickTypePanel.getContentViewForTesting();
        mLeftClickButton = contentView.findViewById(R.id.accessibility_autoclick_left_click_layout);
        mLeftClickButton = contentView.findViewById(R.id.accessibility_autoclick_left_click_button);
        mRightClickButton =
                contentView.findViewById(R.id.accessibility_autoclick_right_click_layout);
                contentView.findViewById(R.id.accessibility_autoclick_right_click_button);
        mDoubleClickButton =
                contentView.findViewById(R.id.accessibility_autoclick_double_click_layout);
        mScrollButton = contentView.findViewById(R.id.accessibility_autoclick_scroll_layout);
        mDragButton = contentView.findViewById(R.id.accessibility_autoclick_drag_layout);
        mPauseButton = contentView.findViewById(R.id.accessibility_autoclick_pause_layout);
        mPositionButton = contentView.findViewById(R.id.accessibility_autoclick_position_layout);
        mLongPressButton = contentView.findViewById(R.id.accessibility_autoclick_long_press_layout);
                contentView.findViewById(R.id.accessibility_autoclick_double_click_button);
        mScrollButton = contentView.findViewById(R.id.accessibility_autoclick_scroll_button);
        mDragButton = contentView.findViewById(R.id.accessibility_autoclick_drag_button);
        mPauseButton = contentView.findViewById(R.id.accessibility_autoclick_pause_button);
        mPositionButton = contentView.findViewById(R.id.accessibility_autoclick_position_button);
        mLongPressButton = contentView.findViewById(R.id.accessibility_autoclick_long_press_button);

        // Set panel to default bottom-right corner.
        mAutoclickTypePanel.show();
@@ -311,18 +310,17 @@ public class AutoclickTypePanelTest {
                .accessibility_autoclick_resume);
        String pauseText = mTestableContext.getString(R.string
                .accessibility_autoclick_pause);
        ImageButton imageButton = (ImageButton) mPauseButton.getChildAt(/* index= */ 0);

        mPauseButton.callOnClick();
        assertThat(mPaused).isTrue();
        assertThat(mAutoclickTypePanel.isPaused()).isTrue();
        assertThat(imageButton.getContentDescription().toString()).isEqualTo(resumeText);
        assertThat(mPauseButton.getContentDescription().toString()).isEqualTo(resumeText);
        assertThat(mPauseButton.getTooltipText().toString()).isEqualTo(resumeText);

        mPauseButton.callOnClick();
        assertThat(mPaused).isFalse();
        assertThat(mAutoclickTypePanel.isPaused()).isFalse();
        assertThat(imageButton.getContentDescription().toString()).isEqualTo(pauseText);
        assertThat(mPauseButton.getContentDescription().toString()).isEqualTo(pauseText);
        assertThat(mPauseButton.getTooltipText().toString()).isEqualTo(pauseText);
    }

@@ -595,7 +593,7 @@ public class AutoclickTypePanelTest {
        assertThat(afterDragCursor.getType()).isEqualTo(PointerIcon.TYPE_GRAB);
    }

    private void verifyButtonHasSelectedStyle(@NonNull LinearLayout button) {
    private void verifyButtonHasSelectedStyle(@NonNull ImageButton button) {
        GradientDrawable gradientDrawable = (GradientDrawable) button.getBackground();
        // Get the ColorStateList from the background.
        ColorStateList colorStateList = gradientDrawable.getColor();
Loading