OSDN Git Service

Add setIconContentDescription to EntityHeaderController
authorAntony Sargent <asargent@google.com>
Wed, 24 May 2017 23:45:18 +0000 (16:45 -0700)
committerAntony Sargent <asargent@google.com>
Thu, 25 May 2017 00:21:58 +0000 (17:21 -0700)
This lets us set a contentDescription on the icon in entity headers
for accessibility.

Bug: 62068874
Test: make RunSettingsRoboTests
Change-Id: I1af7aad34aa65b616cf4edb8b144f315040a9fdd

src/com/android/settings/widget/EntityHeaderController.java
tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java

index 70d3ce5..c9e0805 100644 (file)
@@ -78,6 +78,7 @@ public class EntityHeaderController {
     private Lifecycle mLifecycle;
     private RecyclerView mRecyclerView;
     private Drawable mIcon;
+    private String mIconContentDescription;
     private CharSequence mLabel;
     private CharSequence mSummary;
     private String mPackageName;
@@ -122,6 +123,10 @@ public class EntityHeaderController {
         return this;
     }
 
+    /**
+     * Set the icon in the header. Callers should also consider calling setIconContentDescription
+     * to provide a description of this icon for accessibility purposes.
+     */
     public EntityHeaderController setIcon(Drawable icon) {
         if (icon != null) {
             mIcon = icon.getConstantState().newDrawable(mAppContext.getResources());
@@ -129,6 +134,11 @@ public class EntityHeaderController {
         return this;
     }
 
+    /**
+     * Convenience method to set the header icon from an ApplicationsState.AppEntry. Callers should
+     * also consider calling setIconContentDescription to provide a description of this icon for
+     * accessibility purposes.
+     */
     public EntityHeaderController setIcon(ApplicationsState.AppEntry appEntry) {
         if (appEntry.icon != null) {
             mIcon = appEntry.icon.getConstantState().newDrawable(mAppContext.getResources());
@@ -136,6 +146,11 @@ public class EntityHeaderController {
         return this;
     }
 
+    public EntityHeaderController setIconContentDescription(String contentDescription) {
+        mIconContentDescription = contentDescription;
+        return this;
+    }
+
     public EntityHeaderController setLabel(CharSequence label) {
         mLabel = label;
         return this;
@@ -204,6 +219,7 @@ public class EntityHeaderController {
         ImageView iconView = mHeader.findViewById(R.id.entity_header_icon);
         if (iconView != null) {
             iconView.setImageDrawable(mIcon);
+            iconView.setContentDescription(mIconContentDescription);
         }
         setText(R.id.entity_header_title, mLabel);
         setText(R.id.entity_header_summary, mSummary);
index e386282..c29068f 100644 (file)
@@ -234,6 +234,33 @@ public class EntityHeaderControllerTest {
     }
 
     @Test
+    public void iconContentDescription_shouldWorkWithSetIcon() {
+        final View view = mLayoutInflater
+                .inflate(R.layout.settings_entity_header, null /* root */);
+        when(mFragment.getActivity()).thenReturn(mock(Activity.class));
+        mController = EntityHeaderController.newInstance(mActivity, mFragment, view);
+        String description = "Fake Description";
+        mController.setIcon(mShadowContext.getDrawable(R.drawable.ic_add));
+        mController.setIconContentDescription(description);
+        mController.done(mActivity);
+        assertThat(view.findViewById(R.id.entity_header_icon).getContentDescription().toString())
+                .isEqualTo(description);
+    }
+
+    @Test
+    public void iconContentDescription_shouldWorkWithoutSetIcon() {
+        final View view = mLayoutInflater
+                .inflate(R.layout.settings_entity_header, null /* root */);
+        when(mFragment.getActivity()).thenReturn(mock(Activity.class));
+        mController = EntityHeaderController.newInstance(mActivity, mFragment, view);
+        String description = "Fake Description";
+        mController.setIconContentDescription(description);
+        mController.done(mActivity);
+        assertThat(view.findViewById(R.id.entity_header_icon).getContentDescription().toString())
+                .isEqualTo(description);
+    }
+
+    @Test
     public void bindButton_hasAppNotifIntent_shouldShowButton() {
         final View appLinks = mLayoutInflater
                 .inflate(R.layout.settings_entity_header, null /* root */);