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

Commit 2da6785c authored by Sergey Serokurov's avatar Sergey Serokurov Committed by Android (Google) Code Review
Browse files

Merge "Set correct bubble traversal order for a11y"

parents 86f682fd 721c2957
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1348,7 +1348,7 @@ public class BubbleController {

        mStackView.updateContentDescription();

        mStackView.updateBubblesClickableStates();
        mStackView.updateBubblesAcessibillityStates();
    }

    @VisibleForTesting
+55 −11
Original line number Diff line number Diff line
@@ -1486,19 +1486,63 @@ public class BubbleStackView extends FrameLayout
    }

    /**
     * Update bubbles' icon views clickable states.
     * Update bubbles' icon views accessibility states.
     */
    public void updateBubblesClickableStates() {
    public void updateBubblesAcessibillityStates() {
        for (int i = 0; i < mBubbleData.getBubbles().size(); i++) {
            final Bubble bubble = mBubbleData.getBubbles().get(i);
            if (bubble.getIconView() != null) {
            Bubble prevBubble = i > 0 ? mBubbleData.getBubbles().get(i - 1) : null;
            Bubble bubble = mBubbleData.getBubbles().get(i);

            View bubbleIconView = bubble.getIconView();
            if (bubbleIconView == null) {
                continue;
            }

            if (mIsExpanded) {
                    // when stack is expanded all bubbles are clickable
                    bubble.getIconView().setClickable(true);
                // when stack is expanded
                // all bubbles are important for accessibility
                bubbleIconView
                        .setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);

                View prevBubbleIconView = prevBubble != null ? prevBubble.getIconView() : null;

                if (prevBubbleIconView != null) {
                    bubbleIconView.setAccessibilityDelegate(new View.AccessibilityDelegate() {
                        @Override
                        public void onInitializeAccessibilityNodeInfo(View v,
                                AccessibilityNodeInfo info) {
                            super.onInitializeAccessibilityNodeInfo(v, info);
                            info.setTraversalAfter(prevBubbleIconView);
                        }
                    });
                }
            } else {
                    // when stack is collapsed, only the top bubble needs to be clickable,
                    // so that a11y ignores all the inaccessible bubbles in the stack
                    bubble.getIconView().setClickable(i == 0);
                // when stack is collapsed, only the top bubble is important for accessibility,
                bubbleIconView.setImportantForAccessibility(
                        i == 0 ? View.IMPORTANT_FOR_ACCESSIBILITY_YES :
                                View.IMPORTANT_FOR_ACCESSIBILITY_NO);
            }
        }

        if (mIsExpanded) {
            // make the overflow bubble last in the accessibility traversal order

            View bubbleOverflowIconView =
                    mBubbleOverflow != null ? mBubbleOverflow.getIconView() : null;
            if (bubbleOverflowIconView != null && !mBubbleData.getBubbles().isEmpty()) {
                Bubble lastBubble =
                        mBubbleData.getBubbles().get(mBubbleData.getBubbles().size() - 1);
                View lastBubbleIconView = lastBubble.getIconView();
                if (lastBubbleIconView != null) {
                    bubbleOverflowIconView.setAccessibilityDelegate(
                            new View.AccessibilityDelegate() {
                                @Override
                                public void onInitializeAccessibilityNodeInfo(View v,
                                        AccessibilityNodeInfo info) {
                                    super.onInitializeAccessibilityNodeInfo(v, info);
                                    info.setTraversalAfter(lastBubbleIconView);
                                }
                            });
                }
            }
        }