Merge "a11y edits to dnd dialog and volume ring toggle" into pi-dev

am: 478e0805a0

Change-Id: Iad1b606e04a9a27093eebfbce7eca8db1df87d4f
This commit is contained in:
android-build-team Robot
2018-05-07 11:18:12 -07:00
committed by android-build-merger
4 changed files with 53 additions and 26 deletions

View File

@@ -185,6 +185,7 @@ public class EnableZenModeDialog {
@VisibleForTesting @VisibleForTesting
protected void bind(final Condition condition, final View row, final int rowId) { protected void bind(final Condition condition, final View row, final int rowId) {
if (condition == null) throw new IllegalArgumentException("condition must not be null"); if (condition == null) throw new IllegalArgumentException("condition must not be null");
final boolean enabled = condition.state == Condition.STATE_TRUE; final boolean enabled = condition.state == Condition.STATE_TRUE;
final ConditionTag tag = row.getTag() != null ? (ConditionTag) row.getTag() : final ConditionTag tag = row.getTag() != null ? (ConditionTag) row.getTag() :
new ConditionTag(); new ConditionTag();
@@ -207,7 +208,6 @@ public class EnableZenModeDialog {
MetricsLogger.action(mContext, MetricsLogger.action(mContext,
MetricsProto.MetricsEvent.QS_DND_CONDITION_SELECT); MetricsProto.MetricsEvent.QS_DND_CONDITION_SELECT);
updateAlarmWarningText(tag.condition); updateAlarmWarningText(tag.condition);
announceConditionSelection(tag);
} }
} }
}); });
@@ -328,6 +328,7 @@ public class EnableZenModeDialog {
boolean enabled, int rowId, Uri conditionId) { boolean enabled, int rowId, Uri conditionId) {
if (tag.lines == null) { if (tag.lines == null) {
tag.lines = row.findViewById(android.R.id.content); tag.lines = row.findViewById(android.R.id.content);
tag.lines.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
} }
if (tag.line1 == null) { if (tag.line1 == null) {
tag.line1 = (TextView) row.findViewById(android.R.id.text1); tag.line1 = (TextView) row.findViewById(android.R.id.text1);
@@ -450,16 +451,6 @@ public class EnableZenModeDialog {
bind(newCondition, row, rowId); bind(newCondition, row, rowId);
updateAlarmWarningText(tag.condition); updateAlarmWarningText(tag.condition);
tag.rb.setChecked(true); tag.rb.setChecked(true);
announceConditionSelection(tag);
}
private void announceConditionSelection(ConditionTag tag) {
// condition will always be priority-only
String modeText = mContext.getString(R.string.zen_interruption_level_priority);
if (tag.line1 != null) {
mZenRadioGroupContent.announceForAccessibility(mContext.getString(
R.string.zen_mode_and_condition, modeText, tag.line1.getText()));
}
} }
private void updateAlarmWarningText(Condition condition) { private void updateAlarmWarningText(Condition condition) {

View File

@@ -203,8 +203,14 @@ public class ZenDurationDialog {
private void setupUi(ConditionTag tag, View row) { private void setupUi(ConditionTag tag, View row) {
tag.lines = row.findViewById(android.R.id.content); if (tag.lines == null) {
tag.line1 = (TextView) row.findViewById(android.R.id.text1); tag.lines = row.findViewById(android.R.id.content);
tag.lines.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
}
if (tag.line1 == null) {
tag.line1 = (TextView) row.findViewById(android.R.id.text1);
}
// text2 is not used in zen duration dialog // text2 is not used in zen duration dialog
row.findViewById(android.R.id.text2).setVisibility(View.GONE); row.findViewById(android.R.id.text2).setVisibility(View.GONE);

View File

@@ -1363,6 +1363,13 @@
<string name="volume_stream_content_description_vibrate_a11y">%1$s. Tap to set to vibrate.</string> <string name="volume_stream_content_description_vibrate_a11y">%1$s. Tap to set to vibrate.</string>
<string name="volume_stream_content_description_mute_a11y">%1$s. Tap to mute.</string> <string name="volume_stream_content_description_mute_a11y">%1$s. Tap to mute.</string>
<!-- Hint for accessibility. For example: double tap to mute [CHAR_LIMIT=NONE] -->
<string name="volume_ringer_hint_mute">mute</string>
<!-- Hint for accessibility. For example: double tap to unmute [CHAR_LIMIT=NONE] -->
<string name="volume_ringer_hint_unmute">unmute</string>
<!-- Hint for accessibility. For example: double tap to vibrate [CHAR_LIMIT=NONE] -->
<string name="volume_ringer_hint_vibrate">vibrate</string>
<string name="volume_dialog_title">%s volume controls</string> <string name="volume_dialog_title">%s volume controls</string>
<string name="volume_dialog_ringer_guidance_ring">Calls and notifications will ring (<xliff:g id="volume level" example="56">%1$s</xliff:g>)</string> <string name="volume_dialog_ringer_guidance_ring">Calls and notifications will ring (<xliff:g id="volume level" example="56">%1$s</xliff:g>)</string>

View File

@@ -71,6 +71,7 @@ import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener; import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.DecelerateInterpolator; import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageButton; import android.widget.ImageButton;
@@ -627,35 +628,32 @@ public class VolumeDialogImpl implements VolumeDialog {
switch (mState.ringerModeInternal) { switch (mState.ringerModeInternal) {
case AudioManager.RINGER_MODE_VIBRATE: case AudioManager.RINGER_MODE_VIBRATE:
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_vibrate); mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_vibrate);
addAccessibilityDescription(mRingerIcon, RINGER_MODE_VIBRATE,
mContext.getString(R.string.volume_ringer_hint_mute));
mRingerIcon.setTag(Events.ICON_STATE_VIBRATE); mRingerIcon.setTag(Events.ICON_STATE_VIBRATE);
break; break;
case AudioManager.RINGER_MODE_SILENT: case AudioManager.RINGER_MODE_SILENT:
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute); mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
mRingerIcon.setContentDescription(mContext.getString(
R.string.volume_stream_content_description_unmute,
getStreamLabelH(ss)));
mRingerIcon.setTag(Events.ICON_STATE_MUTE); mRingerIcon.setTag(Events.ICON_STATE_MUTE);
addAccessibilityDescription(mRingerIcon, RINGER_MODE_SILENT,
mContext.getString(R.string.volume_ringer_hint_unmute));
break; break;
case AudioManager.RINGER_MODE_NORMAL: case AudioManager.RINGER_MODE_NORMAL:
default: default:
boolean muted = (mAutomute && ss.level == 0) || ss.muted; boolean muted = (mAutomute && ss.level == 0) || ss.muted;
if (!isZenMuted && muted) { if (!isZenMuted && muted) {
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute); mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
mRingerIcon.setContentDescription(mContext.getString( addAccessibilityDescription(mRingerIcon, RINGER_MODE_NORMAL,
R.string.volume_stream_content_description_unmute, mContext.getString(R.string.volume_ringer_hint_unmute));
getStreamLabelH(ss)));
mRingerIcon.setTag(Events.ICON_STATE_MUTE); mRingerIcon.setTag(Events.ICON_STATE_MUTE);
} else { } else {
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer); mRingerIcon.setImageResource(R.drawable.ic_volume_ringer);
if (mController.hasVibrator()) { if (mController.hasVibrator()) {
mRingerIcon.setContentDescription(mContext.getString( addAccessibilityDescription(mRingerIcon, RINGER_MODE_NORMAL,
mShowA11yStream mContext.getString(R.string.volume_ringer_hint_vibrate));
? R.string.volume_stream_content_description_vibrate_a11y
: R.string.volume_stream_content_description_vibrate,
getStreamLabelH(ss)));
} else { } else {
mRingerIcon.setContentDescription(getStreamLabelH(ss)); addAccessibilityDescription(mRingerIcon, RINGER_MODE_NORMAL,
mContext.getString(R.string.volume_ringer_hint_mute));
} }
mRingerIcon.setTag(Events.ICON_STATE_UNMUTE); mRingerIcon.setTag(Events.ICON_STATE_UNMUTE);
} }
@@ -664,6 +662,31 @@ public class VolumeDialogImpl implements VolumeDialog {
} }
} }
private void addAccessibilityDescription(View view, int currState, String hintLabel) {
int currStateResId;
switch (currState) {
case RINGER_MODE_SILENT:
currStateResId = R.string.volume_ringer_status_silent;
break;
case RINGER_MODE_VIBRATE:
currStateResId = R.string.volume_ringer_status_vibrate;
break;
case RINGER_MODE_NORMAL:
default:
currStateResId = R.string.volume_ringer_status_normal;
}
view.setContentDescription(mContext.getString(currStateResId));
view.setAccessibilityDelegate(new AccessibilityDelegate() {
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
info.addAction(new AccessibilityNodeInfo.AccessibilityAction(
AccessibilityNodeInfo.ACTION_CLICK, hintLabel));
}
});
}
/** /**
* Toggles enable state of views in a VolumeRow (not including seekbar or icon) * Toggles enable state of views in a VolumeRow (not including seekbar or icon)
* Hides/shows zen icon * Hides/shows zen icon