From a235e13a46c06741ee8634c5d8d1d4766e916ccc Mon Sep 17 00:00:00 2001 From: yueg Date: Wed, 13 Dec 2017 14:13:57 -0800 Subject: Bubble v2 accessibility. Add description and action for primary button and expanded view action buttons. Bug: 67605985 Test: manual PiperOrigin-RevId: 178955927 Change-Id: I43ad24334cb1e1676cbc390cdba5465ded1464b5 --- java/com/android/newbubble/NewBubble.java | 34 ++++++++++++++++++++++ .../newbubble/res/layout/new_bubble_base.xml | 1 + java/com/android/newbubble/res/values/strings.xml | 27 +++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 java/com/android/newbubble/res/values/strings.xml (limited to 'java') diff --git a/java/com/android/newbubble/NewBubble.java b/java/com/android/newbubble/NewBubble.java index 23c4411cf..34a9585c1 100644 --- a/java/com/android/newbubble/NewBubble.java +++ b/java/com/android/newbubble/NewBubble.java @@ -47,11 +47,14 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; +import android.view.View.AccessibilityDelegate; import android.view.ViewGroup; import android.view.ViewPropertyAnimator; import android.view.ViewTreeObserver.OnPreDrawListener; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.animation.AnticipateInterpolator; import android.view.animation.OvershootInterpolator; import android.widget.ImageView; @@ -228,6 +231,8 @@ public class NewBubble { if (isUserAction) { logBasicOrCallImpression(DialerImpression.Type.BUBBLE_PRIMARY_BUTTON_EXPAND); } + setPrimaryButtonAccessibilityAction( + context.getString(R.string.a11y_bubble_primary_button_collapse_action)); viewHolder.setDrawerVisibility(View.INVISIBLE); View expandedView = viewHolder.getExpandedView(); expandedView @@ -310,6 +315,8 @@ public class NewBubble { if (isUserAction && collapseEndAction == CollapseEnd.NOTHING) { logBasicOrCallImpression(DialerImpression.Type.BUBBLE_COLLAPSE_BY_USER); } + setPrimaryButtonAccessibilityAction( + context.getString(R.string.a11y_bubble_primary_button_expand_action)); // Animate expanded view to move from its position to above primary button and hide collapseAnimation = expandedView @@ -448,6 +455,9 @@ public class NewBubble { viewHolder.setChildClickable(true); visibility = Visibility.ENTERING; + setPrimaryButtonAccessibilityAction( + context.getString(R.string.a11y_bubble_primary_button_expand_action)); + // Show bubble animation: scale the whole bubble to 1, and change avatar+icon's alpha to 1 ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(viewHolder.getPrimaryButton(), "scaleX", 1); @@ -725,6 +735,11 @@ public class NewBubble { exitAnimatorSet.setInterpolator(new AnticipateInterpolator()); exitAnimatorSet.addListener( new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + viewHolder.getPrimaryButton().setAccessibilityDelegate(null); + } + @Override public void onAnimationEnd(Animator animation) { afterHiding.run(); @@ -793,6 +808,7 @@ public class NewBubble { button.setChecked(action.isChecked()); button.setEnabled(action.isEnabled()); button.setText(action.getName()); + button.setContentDescription(action.getName()); button.setOnClickListener(v -> doAction(action)); } @@ -822,6 +838,8 @@ public class NewBubble { viewHolder .getPrimaryIcon() .setTranslationX(isDrawingFromRight() ? -primaryIconMoveDistance : 0); + setPrimaryButtonAccessibilityAction( + context.getString(R.string.a11y_bubble_primary_button_expand_action)); update(); @@ -883,6 +901,22 @@ public class NewBubble { } } + private void setPrimaryButtonAccessibilityAction(String description) { + viewHolder + .getPrimaryButton() + .setAccessibilityDelegate( + new AccessibilityDelegate() { + @Override + public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(v, info); + + AccessibilityAction clickAction = + new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK, description); + info.addAction(clickAction); + } + }); + } + @VisibleForTesting class ViewHolder { diff --git a/java/com/android/newbubble/res/layout/new_bubble_base.xml b/java/com/android/newbubble/res/layout/new_bubble_base.xml index 8d4771631..216dce0d2 100644 --- a/java/com/android/newbubble/res/layout/new_bubble_base.xml +++ b/java/com/android/newbubble/res/layout/new_bubble_base.xml @@ -38,6 +38,7 @@ android:layout_marginEnd="@dimen/bubble_shadow_padding_size_horizontal" android:layout_marginTop="@dimen/bubble_shadow_padding_size_vertical" android:layout_marginBottom="@dimen/bubble_shadow_padding_size_vertical" + android:contentDescription="@string/a11y_bubble_description" android:background="@drawable/bubble_shape_circle" android:measureAllChildren="false" android:elevation="@dimen/bubble_elevation" diff --git a/java/com/android/newbubble/res/values/strings.xml b/java/com/android/newbubble/res/values/strings.xml new file mode 100644 index 000000000..5b82b181f --- /dev/null +++ b/java/com/android/newbubble/res/values/strings.xml @@ -0,0 +1,27 @@ + + + + + + Dialer bubble + + Expand call action menu + + Collapse call action menu + \ No newline at end of file -- cgit v1.2.3