diff --git a/src/com/android/settings/notification/modes/ZenModesListItemPreference.java b/src/com/android/settings/notification/modes/ZenModesListItemPreference.java index 0909c6f5f2e..4b1ffd095f0 100644 --- a/src/com/android/settings/notification/modes/ZenModesListItemPreference.java +++ b/src/com/android/settings/notification/modes/ZenModesListItemPreference.java @@ -15,6 +15,8 @@ */ package com.android.settings.notification.modes; +import static com.android.settings.Utils.createAccessibleSequence; + import android.app.settings.SettingsEnums; import android.content.Context; import android.widget.TextView; @@ -28,6 +30,7 @@ import com.android.settingslib.RestrictedPreference; import com.android.settingslib.Utils; import com.android.settingslib.notification.modes.ZenIconLoader; import com.android.settingslib.notification.modes.ZenMode; +import com.android.settingslib.notification.modes.ZenModeDescriptions; import com.google.common.base.Strings; @@ -42,6 +45,7 @@ class ZenModesListItemPreference extends RestrictedPreference { private final Context mContext; private final ZenIconLoader mIconLoader; private final Executor mUiExecutor; + private final ZenModeDescriptions mDescriptions; private ZenMode mZenMode; private TextView mTitleView; @@ -58,6 +62,7 @@ class ZenModesListItemPreference extends RestrictedPreference { mContext = context; mIconLoader = iconLoader; mUiExecutor = uiExecutor; + mDescriptions = new ZenModeDescriptions(context); setZenMode(zenMode); setKey(zenMode.getId()); } @@ -89,20 +94,17 @@ class ZenModesListItemPreference extends RestrictedPreference { } setTitle(mZenMode.getName()); - String dynamicDescription = zenMode.getDynamicDescription(mContext); - CharSequence statusText = switch (mZenMode.getStatus()) { - case ENABLED_AND_ACTIVE -> - Strings.isNullOrEmpty(dynamicDescription) - ? mContext.getString(R.string.zen_mode_active_text) - : mContext.getString( - R.string.zen_mode_format_status_and_trigger, - mContext.getString(R.string.zen_mode_active_text), - dynamicDescription); - case ENABLED -> dynamicDescription; - case DISABLED_BY_USER -> mContext.getString(R.string.zen_mode_disabled_by_user); - case DISABLED_BY_OTHER -> mContext.getString(R.string.zen_mode_disabled_needs_setup); - }; - setSummary(statusText); + ZenMode.Status status = zenMode.getStatus(); + String statusText = getStatusText(status, mDescriptions.getTriggerDescription(zenMode)); + String triggerDescriptionForA11y = mDescriptions.getTriggerDescriptionForAccessibility( + zenMode); + + if (triggerDescriptionForA11y != null) { + setSummary(createAccessibleSequence(statusText, + getStatusText(status, triggerDescriptionForA11y))); + } else { + setSummary(statusText); + } setIconSize(ICON_SIZE_SMALL); FutureUtil.whenDone( @@ -116,6 +118,21 @@ class ZenModesListItemPreference extends RestrictedPreference { updateTextColor(zenMode); } + private String getStatusText(ZenMode.Status status, String triggerDescription) { + return switch (status) { + case ENABLED_AND_ACTIVE -> + Strings.isNullOrEmpty(triggerDescription) + ? mContext.getString(R.string.zen_mode_active_text) + : mContext.getString( + R.string.zen_mode_format_status_and_trigger, + mContext.getString(R.string.zen_mode_active_text), + triggerDescription); + case ENABLED -> Strings.nullToEmpty(triggerDescription); + case DISABLED_BY_USER -> mContext.getString(R.string.zen_mode_disabled_by_user); + case DISABLED_BY_OTHER -> mContext.getString(R.string.zen_mode_disabled_needs_setup); + }; + } + private void updateTextColor(@Nullable ZenMode zenMode) { boolean isActive = zenMode != null && zenMode.isActive(); if (mTitleView != null) { diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java index 3722e416061..4f96bf6da7a 100644 --- a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java @@ -16,12 +16,19 @@ package com.android.settings.notification.modes; +import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME; +import static android.service.notification.SystemZenRules.PACKAGE_ANDROID; + import static com.google.common.truth.Truth.assertThat; import android.app.Flags; import android.content.Context; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; +import android.service.notification.SystemZenRules; +import android.service.notification.ZenModeConfig; +import android.text.Spanned; +import android.text.style.TtsSpan; import com.android.settingslib.notification.modes.TestModeBuilder; import com.android.settingslib.notification.modes.ZenIconLoader; @@ -37,6 +44,8 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import java.util.Calendar; + @RunWith(RobolectricTestRunner.class) @EnableFlags(Flags.FLAG_MODES_UI) public class ZenModesListItemPreferenceTest { @@ -122,6 +131,31 @@ public class ZenModesListItemPreferenceTest { assertThat(preference.getIcon()).isNotNull(); } + @Test + public void setZenMode_scheduleTime_hasCustomTtsInSummary() { + ZenModeConfig.ScheduleInfo scheduleInfo = new ZenModeConfig.ScheduleInfo(); + scheduleInfo.days = new int[] { Calendar.MONDAY, Calendar.TUESDAY, Calendar.WEDNESDAY }; + scheduleInfo.startHour = 11; + scheduleInfo.endHour = 15; + ZenMode mode = new TestModeBuilder() + .setPackage(PACKAGE_ANDROID) + .setType(TYPE_SCHEDULE_TIME) + .setConditionId(ZenModeConfig.toScheduleConditionId(scheduleInfo)) + .setTriggerDescription( + SystemZenRules.getTriggerDescriptionForScheduleTime(mContext, scheduleInfo)) + .build(); + + ZenModesListItemPreference preference = newPreference(mode); + + assertThat(preference.getSummary()).isInstanceOf(Spanned.class); + Spanned summary = (Spanned) preference.getSummary(); + TtsSpan[] ttsSpans = summary.getSpans(0, summary.length(), TtsSpan.class); + assertThat(ttsSpans).hasLength(1); + assertThat(ttsSpans[0].getType()).isEqualTo(TtsSpan.TYPE_TEXT); + assertThat(ttsSpans[0].getArgs().getString(TtsSpan.ARG_TEXT)).isEqualTo( + "Monday to Wednesday, 11:00 AM - 3:00 PM"); + } + private ZenModesListItemPreference newPreference(ZenMode zenMode) { return new ZenModesListItemPreference(mContext, mIconLoader, MoreExecutors.directExecutor(), zenMode);