From 7a84eaef3ca804bcec92a6bfbd689d79676325d7 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Tue, 20 Jun 2017 14:58:18 -0700 Subject: [PATCH] DnD: Total silence doesn't suppress A11y When entering Total silence mode, text prompts from a11y were losing AppOpsManager.OP_PLAY_AUDIO, causing them to play muted (amplification of 0.0f) even though the STREAM_ACCESSIBILITY volume was not. The fix consists in adding another category of sound suppression behavior in AudioAttributes, for usage types that should never be suppressed (== muted), and using it for USAGE_ACCESSIBILITY. When ZenModeHelper iterates over usages to mute/unmute players, consider whether that usage's suppression behavior is SUPPRESSIBLE_NEVER. Test: turn Talkback on, then enter Total silence and verify Talkback is heard Bug 62827456 Change-Id: I48cae48797ef9bc6bcaee82484ba078ee445345c --- media/java/android/media/AudioAttributes.java | 7 +++++++ .../com/android/server/notification/ZenModeHelper.java | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index e36ceb8a3e131..c1e81c54f1174 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -194,6 +194,12 @@ public final class AudioAttributes implements Parcelable { * @see #SUPPRESSIBLE_USAGES */ public final static int SUPPRESSIBLE_CALL = 2; + /** + * @hide + * Denotes a usage that is never going to be muted, even in Total Silence. + * @see #SUPPRESSIBLE_USAGES + */ + public final static int SUPPRESSIBLE_NEVER = 3; /** * @hide @@ -211,6 +217,7 @@ public final class AudioAttributes implements Parcelable { SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_INSTANT,SUPPRESSIBLE_NOTIFICATION); SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_DELAYED,SUPPRESSIBLE_NOTIFICATION); SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_EVENT, SUPPRESSIBLE_NOTIFICATION); + SUPPRESSIBLE_USAGES.put(USAGE_ASSISTANCE_ACCESSIBILITY, SUPPRESSIBLE_NEVER); } /** diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index 75190f3e3e898..15e32ff6469e2 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -762,7 +762,9 @@ public class ZenModeHelper { for (int usage : AudioAttributes.SDK_USAGES) { final int suppressionBehavior = AudioAttributes.SUPPRESSIBLE_USAGES.get(usage); - if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NOTIFICATION) { + if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NEVER) { + applyRestrictions(false /*mute*/, usage); + } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NOTIFICATION) { applyRestrictions(muteNotifications || muteEverything, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_CALL) { applyRestrictions(muteCalls || muteEverything, usage);