diff --git a/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml b/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml index 52cab72df1203..69e52c53808d2 100644 --- a/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml +++ b/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml @@ -53,5 +53,6 @@ android:layout_alignParentEnd="true" android:textSize="14sp" android:scrollHorizontally="false" - android:layout_centerVertical="true"/> + android:layout_centerVertical="true" + android:focusable="true"/> diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_key_icon_view.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_key_icon_view.xml index 5db678958ce13..a3901d084930d 100644 --- a/packages/SystemUI/res/layout/keyboard_shortcuts_key_icon_view.xml +++ b/packages/SystemUI/res/layout/keyboard_shortcuts_key_icon_view.xml @@ -21,4 +21,4 @@ android:padding="@dimen/ksh_item_padding" android:layout_marginStart="@dimen/ksh_item_margin_start" android:scaleType="fitXY" - android:background="@drawable/ksh_key_item_background"/> + android:background="@drawable/ksh_key_item_background" /> diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml index 31a87730a445e..b06f7fc3c69d3 100644 --- a/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml +++ b/packages/SystemUI/res/layout/keyboard_shortcuts_key_view.xml @@ -23,4 +23,5 @@ android:textColor="@color/ksh_key_item_color" android:singleLine="true" android:gravity="center" - android:textSize="@dimen/ksh_item_text_size"/> + android:textSize="@dimen/ksh_item_text_size" + android:textAllCaps="true"/> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java index 92115620a81bf..cc411f0540012 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.AlertDialog; import android.app.AppGlobals; import android.app.Dialog; @@ -45,9 +47,11 @@ import android.view.KeyboardShortcutGroup; import android.view.KeyboardShortcutInfo; import android.view.LayoutInflater; import android.view.View; +import android.view.View.AccessibilityDelegate; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager.KeyboardShortcutsReceiver; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; @@ -63,6 +67,7 @@ import java.util.Comparator; import java.util.List; import static android.content.Context.LAYOUT_INFLATER_SERVICE; +import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; /** @@ -591,7 +596,7 @@ public final class KeyboardShortcuts { final int itemsSize = group.getItems().size(); for (int j = 0; j < itemsSize; j++) { KeyboardShortcutInfo info = group.getItems().get(j); - List shortcutKeys = getHumanReadableShortcutKeys(info); + List shortcutKeys = getHumanReadableShortcutKeys(info); if (shortcutKeys == null) { // Ignore shortcuts we can't display keys for. Log.w(TAG, "Keyboard Shortcut contains unsupported keys, skipping."); @@ -621,25 +626,33 @@ public final class KeyboardShortcuts { .findViewById(R.id.keyboard_shortcuts_item_container); final int shortcutKeysSize = shortcutKeys.size(); for (int k = 0; k < shortcutKeysSize; k++) { - StringOrDrawable shortcutRepresentation = shortcutKeys.get(k); - if (shortcutRepresentation.drawable != null) { + StringDrawableContainer shortcutRepresentation = shortcutKeys.get(k); + if (shortcutRepresentation.mDrawable != null) { ImageView shortcutKeyIconView = (ImageView) inflater.inflate( R.layout.keyboard_shortcuts_key_icon_view, shortcutItemsContainer, false); Bitmap bitmap = Bitmap.createBitmap(shortcutKeyIconItemHeightWidth, shortcutKeyIconItemHeightWidth, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); - shortcutRepresentation.drawable.setBounds(0, 0, canvas.getWidth(), + shortcutRepresentation.mDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); - shortcutRepresentation.drawable.draw(canvas); + shortcutRepresentation.mDrawable.draw(canvas); shortcutKeyIconView.setImageBitmap(bitmap); + shortcutKeyIconView.setImportantForAccessibility( + IMPORTANT_FOR_ACCESSIBILITY_YES); + shortcutKeyIconView.setAccessibilityDelegate( + new ShortcutKeyAccessibilityDelegate( + shortcutRepresentation.mString)); shortcutItemsContainer.addView(shortcutKeyIconView); - } else if (shortcutRepresentation.string != null) { + } else if (shortcutRepresentation.mString != null) { TextView shortcutKeyTextView = (TextView) inflater.inflate( R.layout.keyboard_shortcuts_key_view, shortcutItemsContainer, false); shortcutKeyTextView.setMinimumWidth(shortcutKeyTextItemMinWidth); - shortcutKeyTextView.setText(shortcutRepresentation.string); + shortcutKeyTextView.setText(shortcutRepresentation.mString); + shortcutKeyTextView.setAccessibilityDelegate( + new ShortcutKeyAccessibilityDelegate( + shortcutRepresentation.mString)); shortcutItemsContainer.addView(shortcutKeyTextView); } } @@ -655,19 +668,20 @@ public final class KeyboardShortcuts { } } - private List getHumanReadableShortcutKeys(KeyboardShortcutInfo info) { - List shortcutKeys = getHumanReadableModifiers(info); + private List getHumanReadableShortcutKeys(KeyboardShortcutInfo info) { + List shortcutKeys = getHumanReadableModifiers(info); if (shortcutKeys == null) { return null; } - String displayLabelString = null; - Drawable displayLabelDrawable = null; + String shortcutKeyString = null; + Drawable shortcutKeyDrawable = null; if (info.getBaseCharacter() > Character.MIN_VALUE) { - displayLabelString = String.valueOf(info.getBaseCharacter()); + shortcutKeyString = String.valueOf(info.getBaseCharacter()); } else if (mSpecialCharacterDrawables.get(info.getKeycode()) != null) { - displayLabelDrawable = mSpecialCharacterDrawables.get(info.getKeycode()); + shortcutKeyDrawable = mSpecialCharacterDrawables.get(info.getKeycode()); + shortcutKeyString = mSpecialCharacterNames.get(info.getKeycode()); } else if (mSpecialCharacterNames.get(info.getKeycode()) != null) { - displayLabelString = mSpecialCharacterNames.get(info.getKeycode()); + shortcutKeyString = mSpecialCharacterNames.get(info.getKeycode()); } else { // Special case for shortcuts with no base key or keycode. if (info.getKeycode() == KeyEvent.KEYCODE_UNKNOWN) { @@ -675,22 +689,23 @@ public final class KeyboardShortcuts { } char displayLabel = mKeyCharacterMap.getDisplayLabel(info.getKeycode()); if (displayLabel != 0) { - displayLabelString = String.valueOf(displayLabel); + shortcutKeyString = String.valueOf(displayLabel); } else { return null; } } - if (displayLabelDrawable != null) { - shortcutKeys.add(new StringOrDrawable(displayLabelDrawable)); - } else if (displayLabelString != null) { - shortcutKeys.add(new StringOrDrawable(displayLabelString.toUpperCase())); + if (shortcutKeyString != null) { + shortcutKeys.add(new StringDrawableContainer(shortcutKeyString, shortcutKeyDrawable)); + } else { + Log.w(TAG, "Keyboard Shortcut does not have a text representation, skipping."); } + return shortcutKeys; } - private List getHumanReadableModifiers(KeyboardShortcutInfo info) { - final List shortcutKeys = new ArrayList<>(); + private List getHumanReadableModifiers(KeyboardShortcutInfo info) { + final List shortcutKeys = new ArrayList<>(); int modifiers = info.getModifiers(); if (modifiers == 0) { return shortcutKeys; @@ -698,13 +713,9 @@ public final class KeyboardShortcuts { for(int i = 0; i < mModifierNames.size(); ++i) { final int supportedModifier = mModifierNames.keyAt(i); if ((modifiers & supportedModifier) != 0) { - if (mModifierDrawables.get(supportedModifier) != null) { - shortcutKeys.add(new StringOrDrawable( - mModifierDrawables.get(supportedModifier))); - } else { - shortcutKeys.add(new StringOrDrawable( - mModifierNames.get(supportedModifier).toUpperCase())); - } + shortcutKeys.add(new StringDrawableContainer( + mModifierNames.get(supportedModifier), + mModifierDrawables.get(supportedModifier))); modifiers &= ~supportedModifier; } } @@ -715,16 +726,31 @@ public final class KeyboardShortcuts { return shortcutKeys; } - private static final class StringOrDrawable { - public String string; - public Drawable drawable; + private final class ShortcutKeyAccessibilityDelegate extends AccessibilityDelegate { + private String mContentDescription; - public StringOrDrawable(String string) { - this.string = string; + ShortcutKeyAccessibilityDelegate(String contentDescription) { + mContentDescription = contentDescription; } - public StringOrDrawable(Drawable drawable) { - this.drawable = drawable; + @Override + public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(host, info); + if (mContentDescription != null) { + info.setContentDescription(mContentDescription.toLowerCase()); + } + } + } + + private static final class StringDrawableContainer { + @NonNull + public String mString; + @Nullable + public Drawable mDrawable; + + StringDrawableContainer(String string, Drawable drawable) { + mString = string; + mDrawable = drawable; } } }