From ff8e3e7bde9568972a867669a99974816062b6b0 Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Wed, 24 May 2017 16:45:18 -0700 Subject: [PATCH] Add setIconContentDescription to EntityHeaderController This lets us set a contentDescription on the icon in entity headers for accessibility. Bug: 62068874 Test: make RunSettingsRoboTests Change-Id: I1af7aad34aa65b616cf4edb8b144f315040a9fdd --- .../widget/EntityHeaderController.java | 16 +++++++++++ .../widget/EntityHeaderControllerTest.java | 27 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/com/android/settings/widget/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java index 70d3ce53f3c..c9e0805509f 100644 --- a/src/com/android/settings/widget/EntityHeaderController.java +++ b/src/com/android/settings/widget/EntityHeaderController.java @@ -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); diff --git a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java index e386282437f..c29068f6676 100644 --- a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java @@ -233,6 +233,33 @@ public class EntityHeaderControllerTest { .isEqualTo("App info"); } + @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