diff --git a/packages/SystemUI/res/layout/people_space_initial_layout.xml b/packages/SystemUI/res/layout/people_space_initial_layout.xml index 98920417b0eff..a06a499b42f21 100644 --- a/packages/SystemUI/res/layout/people_space_initial_layout.xml +++ b/packages/SystemUI/res/layout/people_space_initial_layout.xml @@ -26,6 +26,7 @@ android:id="@android:id/background" android:orientation="horizontal" android:gravity="center" + android:contentDescription="@string/status_before_loading" android:layout_gravity="top" android:paddingVertical="16dp" android:paddingHorizontal="16dp" diff --git a/packages/SystemUI/res/layout/people_tile_medium_empty.xml b/packages/SystemUI/res/layout/people_tile_medium_empty.xml index 4a186831a2b09..80078e8940d8d 100644 --- a/packages/SystemUI/res/layout/people_tile_medium_empty.xml +++ b/packages/SystemUI/res/layout/people_tile_medium_empty.xml @@ -34,8 +34,8 @@ android:orientation="horizontal"> + android:layout_width="@dimen/avatar_size_for_medium_empty" + android:layout_height="@dimen/avatar_size_for_medium_empty" /> diff --git a/packages/SystemUI/res/layout/people_tile_small.xml b/packages/SystemUI/res/layout/people_tile_small.xml index 44e68e5442715..48a588a629ab0 100644 --- a/packages/SystemUI/res/layout/people_tile_small.xml +++ b/packages/SystemUI/res/layout/people_tile_small.xml @@ -44,7 +44,7 @@ android:tint="?android:attr/textColorSecondary" android:layout_gravity="center" android:layout_width="18dp" - android:layout_height="22dp" /> + android:layout_height="18dp" /> + android:layout_width="@dimen/avatar_size_for_medium_empty" + android:layout_height="@dimen/avatar_size_for_medium_empty"/> diff --git a/packages/SystemUI/res/layout/people_tile_with_suppression_detail_content_vertical.xml b/packages/SystemUI/res/layout/people_tile_with_suppression_detail_content_vertical.xml index c488d890986dc..25ee1096b1bc6 100644 --- a/packages/SystemUI/res/layout/people_tile_with_suppression_detail_content_vertical.xml +++ b/packages/SystemUI/res/layout/people_tile_with_suppression_detail_content_vertical.xml @@ -32,6 +32,7 @@ diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index d9010158d4424..18388a95fac60 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1462,6 +1462,7 @@ 168dp 146dp 92dp + 64dp 52dp 64dp 108dp @@ -1481,7 +1482,10 @@ 32dp 8dp 12dp + 4dp + 12dp 4dp + 4dp 8dp diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 11a2f7037d58f..52627c267edb8 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2951,9 +2951,11 @@ Paused by Do Not Disturb - %1$s sent a message + %1$s sent a message: %2$s %1$s sent an image + + %1$s has a status update: %2$s diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java index 8194adcd63e27..7ab4b6f200ed9 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java @@ -130,6 +130,8 @@ public class PeopleTileViewHelper { private static final Pattern ANY_DOUBLE_MARK_PATTERN = Pattern.compile("[!?][!?]+"); private static final Pattern MIXED_MARK_PATTERN = Pattern.compile("![?].*|.*[?]!"); + static final String BRIEF_PAUSE_ON_TALKBACK = "\n\n"; + // This regex can be used to match Unicode emoji characters and character sequences. It's from // the official Unicode site (https://unicode.org/reports/tr51/#EBNF_and_Regex) with minor // changes to fit our needs. It should be updated once new emoji categories are added. @@ -476,7 +478,7 @@ public class PeopleTileViewHelper { avatarSize = Math.min(avatarHeightSpace, avatarWidthSpace); } - if (isDndBlockingTileData(mTile)) { + if (isDndBlockingTileData(mTile) && mLayoutSize != LAYOUT_SMALL) { avatarSize = createDndRemoteViews().mAvatarSize; } @@ -493,14 +495,33 @@ public class PeopleTileViewHelper { boolean isAvailable = mTile.getStatuses() != null && mTile.getStatuses().stream().anyMatch( c -> c.getAvailability() == AVAILABILITY_AVAILABLE); + + int startPadding; if (isAvailable) { views.setViewVisibility(R.id.availability, View.VISIBLE); + startPadding = mContext.getResources().getDimensionPixelSize( + R.dimen.availability_dot_shown_padding); } else { views.setViewVisibility(R.id.availability, View.GONE); + startPadding = mContext.getResources().getDimensionPixelSize( + R.dimen.availability_dot_missing_padding); } + boolean isLeftToRight = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) + == View.LAYOUT_DIRECTION_LTR; + views.setViewPadding(R.id.padding_before_availability, + isLeftToRight ? startPadding : 0, 0, isLeftToRight ? 0 : startPadding, + 0); + boolean hasNewStory = getHasNewStory(mTile); views.setImageViewBitmap(R.id.person_icon, - getPersonIconBitmap(mContext, mTile, maxAvatarSize)); + getPersonIconBitmap(mContext, mTile, maxAvatarSize, hasNewStory)); + if (hasNewStory) { + views.setContentDescription(R.id.person_icon, + mContext.getString(R.string.new_story_status_content_description, + mTile.getUserName())); + } else { + views.setContentDescription(R.id.person_icon, null); + } return views; } catch (Exception e) { Log.e(TAG, "Failed to set common fields: " + e); @@ -508,6 +529,11 @@ public class PeopleTileViewHelper { return views; } + private static boolean getHasNewStory(PeopleSpaceTile tile) { + return tile.getStatuses() != null && tile.getStatuses().stream().anyMatch( + c -> c.getActivity() == ACTIVITY_NEW_STORY); + } + private RemoteViews setLaunchIntents(RemoteViews views) { if (!PeopleTileKey.isValid(mKey) || mTile == null) { if (DEBUG) Log.d(TAG, "Skipping launch intent, Null tile or invalid key: " + mKey); @@ -545,22 +571,9 @@ public class PeopleTileViewHelper { } private RemoteViewsAndSizes createDndRemoteViews() { - boolean isHorizontal = mLayoutSize == LAYOUT_MEDIUM; - int layoutId = isHorizontal - ? R.layout.people_tile_with_suppression_detail_content_horizontal - : R.layout.people_tile_with_suppression_detail_content_vertical; - RemoteViews views = new RemoteViews(mContext.getPackageName(), layoutId); + RemoteViews views = new RemoteViews(mContext.getPackageName(), getViewForDndRemoteViews()); - int outerPadding = mLayoutSize == LAYOUT_LARGE ? 16 : 8; - int outerPaddingPx = dpToPx(outerPadding); - views.setViewPadding( - android.R.id.background, - outerPaddingPx, - outerPaddingPx, - outerPaddingPx, - outerPaddingPx); - - int mediumAvatarSize = getSizeInDp(R.dimen.avatar_size_for_medium); + int mediumAvatarSize = getSizeInDp(R.dimen.avatar_size_for_medium_empty); int maxAvatarSize = getSizeInDp(R.dimen.max_people_avatar_size); String text = mContext.getString(R.string.paused_by_dnd); @@ -575,11 +588,15 @@ public class PeopleTileViewHelper { int lineHeight = getLineHeightFromResource(textSizeResId); int avatarSize; - if (isHorizontal) { - int maxTextHeight = mHeight - outerPadding; + if (mLayoutSize == LAYOUT_MEDIUM) { + int maxTextHeight = mHeight - 16; views.setInt(R.id.text_content, "setMaxLines", maxTextHeight / lineHeight); avatarSize = mediumAvatarSize; } else { + int outerPadding = 16; + int outerPaddingTop = outerPadding - 2; + int outerPaddingPx = dpToPx(outerPadding); + int outerPaddingTopPx = dpToPx(outerPaddingTop); int iconSize = getSizeInDp( mLayoutSize == LAYOUT_SMALL @@ -593,38 +610,47 @@ public class PeopleTileViewHelper { int availableAvatarHeight; int textHeight = estimateTextHeight(text, textSizeResId, maxTextWidth); - if (textHeight <= maxTextHeight) { + if (textHeight <= maxTextHeight && mLayoutSize == LAYOUT_LARGE) { // If the text will fit, then display it and deduct its height from the space we // have for the avatar. availableAvatarHeight = heightWithoutIcon - textHeight - paddingBetweenElements * 2; views.setViewVisibility(R.id.text_content, View.VISIBLE); views.setInt(R.id.text_content, "setMaxLines", maxTextHeight / lineHeight); views.setContentDescription(R.id.predefined_icon, null); + int availableAvatarWidth = mWidth - outerPadding * 2; + avatarSize = + MathUtils.clamp( + /* value= */ Math.min(availableAvatarWidth, availableAvatarHeight), + /* min= */ dpToPx(10), + /* max= */ maxAvatarSize); + views.setViewPadding( + android.R.id.background, + outerPaddingPx, + outerPaddingTopPx, + outerPaddingPx, + outerPaddingPx); + views.setViewLayoutWidth(R.id.predefined_icon, iconSize, COMPLEX_UNIT_DIP); + views.setViewLayoutHeight(R.id.predefined_icon, iconSize, COMPLEX_UNIT_DIP); } else { - // If the height doesn't fit, then hide it. The dnd icon will still show. - availableAvatarHeight = heightWithoutIcon - paddingBetweenElements; - views.setViewVisibility(R.id.text_content, View.GONE); + // If expected to use LAYOUT_LARGE, but we found we do not have space for the + // text as calculated above, re-assign the view to the small layout. + if (mLayoutSize != LAYOUT_SMALL) { + views = new RemoteViews(mContext.getPackageName(), R.layout.people_tile_small); + } + avatarSize = getMaxAvatarSize(views); + views.setViewVisibility(R.id.messages_count, View.GONE); + views.setViewVisibility(R.id.name, View.GONE); // If we don't show the dnd text, set it as the content description on the icon // for a11y. views.setContentDescription(R.id.predefined_icon, text); } - - int availableAvatarWidth = mWidth - outerPadding * 2; - avatarSize = - MathUtils.clamp( - /* value= */ Math.min(availableAvatarWidth, availableAvatarHeight), - /* min= */ dpToPx(10), - /* max= */ maxAvatarSize); - - views.setViewLayoutWidth(R.id.predefined_icon, iconSize, COMPLEX_UNIT_DIP); - views.setViewLayoutHeight(R.id.predefined_icon, iconSize, COMPLEX_UNIT_DIP); + views.setViewVisibility(R.id.predefined_icon, View.VISIBLE); views.setImageViewResource(R.id.predefined_icon, R.drawable.ic_qs_dnd_on); } return new RemoteViewsAndSizes(views, avatarSize); } - private RemoteViews createMissedCallRemoteViews() { RemoteViews views = setViewForContentLayout(new RemoteViews(mContext.getPackageName(), getLayoutForContent())); @@ -632,7 +658,9 @@ public class PeopleTileViewHelper { views.setViewVisibility(R.id.text_content, View.VISIBLE); views.setViewVisibility(R.id.messages_count, View.GONE); setMaxLines(views, false); - views.setTextViewText(R.id.text_content, mTile.getNotificationContent()); + CharSequence content = mTile.getNotificationContent(); + views.setTextViewText(R.id.text_content, content); + setContentDescriptionForNotificationTextContent(views, content, mTile.getUserName()); views.setColorAttr(R.id.text_content, "setTextColor", android.R.attr.colorError); views.setColorAttr(R.id.predefined_icon, "setColorFilter", android.R.attr.colorError); views.setImageViewResource(R.id.predefined_icon, R.drawable.ic_phone_missed); @@ -653,12 +681,16 @@ public class PeopleTileViewHelper { if (image != null) { // TODO: Use NotificationInlineImageCache views.setImageViewUri(R.id.image, image); + String newImageDescription = mContext.getString( + R.string.new_notification_image_content_description, mTile.getUserName()); + views.setContentDescription(R.id.image, newImageDescription); views.setViewVisibility(R.id.image, View.VISIBLE); views.setViewVisibility(R.id.text_content, View.GONE); - views.setImageViewResource(R.id.predefined_icon, R.drawable.ic_photo_camera); } else { setMaxLines(views, !TextUtils.isEmpty(sender)); CharSequence content = mTile.getNotificationContent(); + setContentDescriptionForNotificationTextContent(views, content, + sender != null ? sender : mTile.getUserName()); views = decorateBackground(views, content); views.setColorAttr(R.id.text_content, "setTextColor", android.R.attr.textColorPrimary); views.setTextViewText(R.id.text_content, mTile.getNotificationContent()); @@ -688,6 +720,16 @@ public class PeopleTileViewHelper { return views; } + private void setContentDescriptionForNotificationTextContent(RemoteViews views, + CharSequence content, CharSequence sender) { + String newTextDescriptionWithNotificationContent = mContext.getString( + R.string.new_notification_text_content_description, sender, content); + int idForContentDescription = + mLayoutSize == LAYOUT_SMALL ? R.id.predefined_icon : R.id.text_content; + views.setContentDescription(idForContentDescription, + newTextDescriptionWithNotificationContent); + } + // Some messaging apps only include up to 6 messages in their notifications. private String getMessagesCountText(int count) { if (count >= MESSAGES_COUNT_OVERFLOW) { @@ -717,7 +759,7 @@ public class PeopleTileViewHelper { views.setTextViewText(R.id.text_content, statusText); if (status.getActivity() == ACTIVITY_BIRTHDAY - || status.getActivity() == ACTIVITY_UPCOMING_BIRTHDAY) { + || status.getActivity() == ACTIVITY_UPCOMING_BIRTHDAY) { setEmojiBackground(views, EMOJI_CAKE); } @@ -745,9 +787,56 @@ public class PeopleTileViewHelper { } setAvailabilityDotPadding(views, R.dimen.availability_dot_status_padding); views.setImageViewResource(R.id.predefined_icon, getDrawableForStatus(status)); + CharSequence descriptionForStatus = + getContentDescriptionForStatus(status); + CharSequence customContentDescriptionForStatus = mContext.getString( + R.string.new_status_content_description, mTile.getUserName(), descriptionForStatus); + switch (mLayoutSize) { + case LAYOUT_LARGE: + views.setContentDescription(R.id.text_content, + customContentDescriptionForStatus); + break; + case LAYOUT_MEDIUM: + views.setContentDescription(statusIcon == null ? R.id.text_content : R.id.name, + customContentDescriptionForStatus); + break; + case LAYOUT_SMALL: + views.setContentDescription(R.id.predefined_icon, + customContentDescriptionForStatus); + break; + } return views; } + private CharSequence getContentDescriptionForStatus(ConversationStatus status) { + CharSequence name = mTile.getUserName(); + if (!TextUtils.isEmpty(status.getDescription())) { + return status.getDescription(); + } + switch (status.getActivity()) { + case ACTIVITY_NEW_STORY: + return mContext.getString(R.string.new_story_status_content_description, + name); + case ACTIVITY_ANNIVERSARY: + return mContext.getString(R.string.anniversary_status_content_description, name); + case ACTIVITY_UPCOMING_BIRTHDAY: + return mContext.getString(R.string.upcoming_birthday_status_content_description, + name); + case ACTIVITY_BIRTHDAY: + return mContext.getString(R.string.birthday_status_content_description, name); + case ACTIVITY_LOCATION: + return mContext.getString(R.string.location_status_content_description, name); + case ACTIVITY_GAME: + return mContext.getString(R.string.game_status); + case ACTIVITY_VIDEO: + return mContext.getString(R.string.video_status); + case ACTIVITY_AUDIO: + return mContext.getString(R.string.audio_status); + default: + return EMPTY_STRING; + } + } + private int getDrawableForStatus(ConversationStatus status) { switch (status.getActivity()) { case ACTIVITY_NEW_STORY: @@ -955,6 +1044,11 @@ public class PeopleTileViewHelper { private RemoteViews setViewForContentLayout(RemoteViews views) { views = decorateBackground(views, ""); + views.setContentDescription(R.id.predefined_icon, null); + views.setContentDescription(R.id.text_content, null); + views.setContentDescription(R.id.name, null); + views.setContentDescription(R.id.image, null); + views.setAccessibilityTraversalAfter(R.id.text_content, R.id.name); if (mLayoutSize == LAYOUT_SMALL) { views.setViewVisibility(R.id.predefined_icon, View.VISIBLE); views.setViewVisibility(R.id.name, View.GONE); @@ -1069,6 +1163,18 @@ public class PeopleTileViewHelper { } } + private int getViewForDndRemoteViews() { + switch (mLayoutSize) { + case LAYOUT_MEDIUM: + return R.layout.people_tile_with_suppression_detail_content_horizontal; + case LAYOUT_LARGE: + return R.layout.people_tile_with_suppression_detail_content_vertical; + case LAYOUT_SMALL: + default: + return getLayoutSmallByHeight(); + } + } + private int getLayoutSmallByHeight() { if (mHeight >= getSizeInDp(R.dimen.required_height_for_medium)) { return R.layout.people_tile_small; @@ -1077,12 +1183,15 @@ public class PeopleTileViewHelper { } /** Returns a bitmap with the user icon and package icon. */ - public static Bitmap getPersonIconBitmap( - Context context, PeopleSpaceTile tile, int maxAvatarSize) { - boolean hasNewStory = - tile.getStatuses() != null && tile.getStatuses().stream().anyMatch( - c -> c.getActivity() == ACTIVITY_NEW_STORY); + public static Bitmap getPersonIconBitmap(Context context, PeopleSpaceTile tile, + int maxAvatarSize) { + boolean hasNewStory = getHasNewStory(tile); + return getPersonIconBitmap(context, tile, maxAvatarSize, hasNewStory); + } + /** Returns a bitmap with the user icon and package icon. */ + private static Bitmap getPersonIconBitmap( + Context context, PeopleSpaceTile tile, int maxAvatarSize, boolean hasNewStory) { Icon icon = tile.getUserIcon(); if (icon == null) { Drawable placeholder = context.getDrawable(R.drawable.ic_avatar_with_badge); diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java index 21c592514489b..c818da8d029f7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java @@ -364,6 +364,9 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { assertEquals(View.VISIBLE, statusContent.getVisibility()); assertEquals(statusContent.getText(), mContext.getString(R.string.birthday_status)); assertThat(statusContent.getMaxLines()).isEqualTo(2); + assertThat(statusContent.getContentDescription().toString()).isEqualTo( + mContext.getString(R.string.new_status_content_description, NAME, + mContext.getString(R.string.birthday_status_content_description, NAME))); mWidth = getSizeInDp(R.dimen.required_width_for_medium) - 1; RemoteViews smallView = getPeopleTileViewHelper(tileWithStatusTemplate).getViews(); @@ -373,6 +376,10 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { assertEquals(View.GONE, smallResult.findViewById(R.id.name).getVisibility()); assertEquals(View.VISIBLE, smallResult.findViewById(R.id.predefined_icon).getVisibility()); + assertThat(smallResult.findViewById( + R.id.predefined_icon).getContentDescription().toString()).isEqualTo( + mContext.getString(R.string.new_status_content_description, NAME, + mContext.getString(R.string.birthday_status_content_description, NAME))); // Has person icon. assertEquals(View.VISIBLE, smallResult.findViewById(R.id.person_icon).getVisibility()); @@ -414,6 +421,9 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { assertEquals(View.VISIBLE, statusContent.getVisibility()); assertEquals(statusContent.getText(), mContext.getString(R.string.birthday_status)); assertThat(statusContent.getMaxLines()).isEqualTo(2); + assertThat(statusContent.getContentDescription().toString()).isEqualTo( + mContext.getString(R.string.new_status_content_description, NAME, + mContext.getString(R.string.birthday_status_content_description, NAME))); } @Test @@ -439,6 +449,9 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { TextView statusContent = (TextView) result.findViewById(R.id.text_content); assertEquals(statusContent.getText(), GAME_DESCRIPTION); assertThat(statusContent.getMaxLines()).isEqualTo(2); + assertThat(statusContent.getContentDescription().toString()).isEqualTo( + mContext.getString(R.string.new_status_content_description, NAME, + GAME_DESCRIPTION)); mWidth = getSizeInDp(R.dimen.required_width_for_medium) - 1; RemoteViews smallView = getPeopleTileViewHelper(tileWithStatusTemplate).getViews(); @@ -448,6 +461,10 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { assertEquals(View.GONE, smallResult.findViewById(R.id.name).getVisibility()); assertEquals(View.VISIBLE, smallResult.findViewById(R.id.predefined_icon).getVisibility()); + assertThat(smallResult.findViewById( + R.id.predefined_icon).getContentDescription().toString()).isEqualTo( + mContext.getString(R.string.new_status_content_description, NAME, + GAME_DESCRIPTION)); // Has person icon. assertEquals(View.VISIBLE, smallResult.findViewById(R.id.person_icon).getVisibility()); @@ -491,6 +508,9 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { assertEquals(View.VISIBLE, statusContent.getVisibility()); assertEquals(statusContent.getText(), GAME_DESCRIPTION); assertThat(statusContent.getMaxLines()).isEqualTo(2); + assertThat(statusContent.getContentDescription().toString()).isEqualTo( + mContext.getString(R.string.new_status_content_description, NAME, + GAME_DESCRIPTION)); } @Test @@ -515,6 +535,9 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { // Has status. TextView statusContent = (TextView) result.findViewById(R.id.name); assertEquals(statusContent.getText(), "Anniversary"); + // Since the image is showing which removes name, we need to manually include the name. + assertThat(statusContent.getContentDescription().toString()).isEqualTo( + mContext.getString(R.string.new_status_content_description, NAME, "Anniversary")); assertThat(statusContent.getMaxLines()).isEqualTo(1); mWidth = getSizeInDp(R.dimen.required_width_for_large); @@ -536,6 +559,9 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { statusContent = (TextView) largeResult.findViewById(R.id.text_content); assertEquals(View.VISIBLE, statusContent.getVisibility()); assertEquals(statusContent.getText(), "Anniversary"); + // Since the image is showing which removes name, we need to manually include the name. + assertThat(statusContent.getContentDescription().toString()).isEqualTo( + mContext.getString(R.string.new_status_content_description, NAME, "Anniversary")); assertThat(statusContent.getMaxLines()).isEqualTo(2); } @@ -684,6 +710,8 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { TextView statusContent = (TextView) result.findViewById(R.id.text_content); assertEquals(View.VISIBLE, statusContent.getVisibility()); assertEquals(statusContent.getText(), MISSED_CALL); + assertEquals(statusContent.getContentDescription(), mContext.getString( + R.string.new_notification_text_content_description, NAME, MISSED_CALL)); assertThat(statusContent.getMaxLines()).isEqualTo(2); mWidth = getSizeInDp(R.dimen.required_width_for_medium) - 1; @@ -695,6 +723,9 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { assertEquals(View.GONE, smallResult.findViewById(R.id.name).getVisibility()); assertEquals(View.VISIBLE, smallResult.findViewById(R.id.predefined_icon).getVisibility()); + assertEquals(smallResult.findViewById(R.id.predefined_icon).getContentDescription(), + mContext.getString( + R.string.new_notification_text_content_description, NAME, MISSED_CALL)); // Has person icon. assertEquals(View.VISIBLE, smallResult.findViewById(R.id.person_icon).getVisibility()); // No messages count. @@ -718,6 +749,8 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { statusContent = (TextView) largeResult.findViewById(R.id.text_content); assertEquals(View.VISIBLE, statusContent.getVisibility()); assertEquals(statusContent.getText(), MISSED_CALL); + assertEquals(statusContent.getContentDescription(), mContext.getString( + R.string.new_notification_text_content_description, NAME, MISSED_CALL)); assertThat(statusContent.getMaxLines()).isEqualTo(2); } @@ -744,6 +777,8 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { TextView statusContent = (TextView) result.findViewById(R.id.text_content); assertEquals(View.VISIBLE, statusContent.getVisibility()); assertEquals(statusContent.getText(), NOTIFICATION_CONTENT); + assertEquals(statusContent.getContentDescription(), mContext.getString( + R.string.new_notification_text_content_description, NAME, NOTIFICATION_CONTENT)); assertThat(statusContent.getMaxLines()).isEqualTo(2); // Has a single message, no count shown. @@ -758,6 +793,9 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { assertEquals(View.GONE, smallResult.findViewById(R.id.name).getVisibility()); assertEquals(View.VISIBLE, smallResult.findViewById(R.id.predefined_icon).getVisibility()); + assertEquals(smallResult.findViewById(R.id.predefined_icon).getContentDescription(), + mContext.getString(R.string.new_notification_text_content_description, NAME, + NOTIFICATION_CONTENT)); // Has person icon. assertEquals(View.VISIBLE, smallResult.findViewById(R.id.person_icon).getVisibility()); @@ -785,8 +823,9 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { statusContent = (TextView) largeResult.findViewById(R.id.text_content); assertEquals(View.VISIBLE, statusContent.getVisibility()); assertEquals(statusContent.getText(), NOTIFICATION_CONTENT); + assertEquals(statusContent.getContentDescription(), mContext.getString( + R.string.new_notification_text_content_description, NAME, NOTIFICATION_CONTENT)); assertThat(statusContent.getMaxLines()).isEqualTo(2); - // Has a single message, no count shown. assertEquals(View.GONE, largeResult.findViewById(R.id.messages_count).getVisibility()); @@ -816,6 +855,8 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { TextView statusContent = (TextView) result.findViewById(R.id.text_content); assertEquals(View.VISIBLE, statusContent.getVisibility()); assertEquals(statusContent.getText(), NOTIFICATION_CONTENT); + assertEquals(statusContent.getContentDescription(), mContext.getString( + R.string.new_notification_text_content_description, SENDER, NOTIFICATION_CONTENT)); // Subtract one from lines because sender is included. assertThat(statusContent.getMaxLines()).isEqualTo(1); @@ -832,6 +873,10 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { assertEquals(View.GONE, smallResult.findViewById(R.id.name).getVisibility()); assertEquals(View.VISIBLE, smallResult.findViewById(R.id.predefined_icon).getVisibility()); + assertEquals(smallResult.findViewById(R.id.predefined_icon).getContentDescription(), + mContext.getString( + R.string.new_notification_text_content_description, SENDER, + NOTIFICATION_CONTENT)); // Has person icon. assertEquals(View.VISIBLE, smallResult.findViewById(R.id.person_icon).getVisibility()); @@ -860,6 +905,8 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { statusContent = (TextView) largeResult.findViewById(R.id.text_content); assertEquals(View.VISIBLE, statusContent.getVisibility()); assertEquals(statusContent.getText(), NOTIFICATION_CONTENT); + assertEquals(statusContent.getContentDescription(), mContext.getString( + R.string.new_notification_text_content_description, SENDER, NOTIFICATION_CONTENT)); // Subtract one from lines because sender is included. assertThat(statusContent.getMaxLines()).isEqualTo(1);