summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java13
-rw-r--r--services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java52
2 files changed, 59 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index f2830090e7db..3feffeec78db 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -781,7 +781,8 @@ public class AudioService extends IAudioService.Stub
private int mRingerModeExternal = -1; // reported ringer mode to outside clients (AudioManager)
/** @see System#MODE_RINGER_STREAMS_AFFECTED */
- private int mRingerModeAffectedStreams = 0;
+ @VisibleForTesting
+ protected int mRingerModeAffectedStreams = 0;
private int mZenModeAffectedStreams = 0;
@@ -6315,17 +6316,15 @@ public class AudioService extends IAudioService.Stub
}
}
sRingerAndZenModeMutedStreams &= ~(1 << streamType);
- sMuteLogger.enqueue(new AudioServiceEvents.RingerZenMutedStreamsEvent(
- sRingerAndZenModeMutedStreams, "muteRingerModeStreams"));
vss.mute(false, "muteRingerModeStreams");
} else {
// mute
sRingerAndZenModeMutedStreams |= (1 << streamType);
- sMuteLogger.enqueue(new AudioServiceEvents.RingerZenMutedStreamsEvent(
- sRingerAndZenModeMutedStreams, "muteRingerModeStreams"));
vss.mute(true, "muteRingerModeStreams");
}
}
+ sMuteLogger.enqueue(new AudioServiceEvents.RingerZenMutedStreamsEvent(
+ sRingerAndZenModeMutedStreams, "muteRingerModeStreams"));
}
private boolean isAlarm(int streamType) {
@@ -10045,12 +10044,14 @@ public class AudioService extends IAudioService.Stub
new AudioServiceEvents.StreamMuteEvent(mStreamType, state, src));
// check to see if unmuting should not have happened due to ringer muted streams
if (!state && isStreamMutedByRingerOrZenMode(mStreamType)) {
- Log.e(TAG, "Unmuting stream " + mStreamType
+ Slog.e(TAG, "Attempt to unmute stream " + mStreamType
+ " despite ringer-zen muted stream 0x"
+ Integer.toHexString(AudioService.sRingerAndZenModeMutedStreams),
new Exception()); // this will put a stack trace in the logs
sMuteLogger.enqueue(new AudioServiceEvents.StreamUnmuteErrorEvent(
mStreamType, AudioService.sRingerAndZenModeMutedStreams));
+ // do not change mute state
+ return false;
}
mIsMuted = state;
if (apply) {
diff --git a/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java b/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java
index 0bbae247d8bb..2d81f72e3319 100644
--- a/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java
@@ -117,6 +117,12 @@ public class VolumeHelperTest {
/** Choose a default stream volume value which does not depend on min/max. */
private static final int DEFAULT_STREAM_VOLUME = 2;
+ /**
+ * The default ringer mode affected stream value since the ringer mode delegate is not used
+ * for unit testing.
+ */
+ private static final int DEFAULT_RINGER_MODE_AFFECTED_STREAMS = 0x1a6;
+
@Rule
public final MockitoRule mockito = MockitoJUnit.rule();
@@ -186,6 +192,10 @@ public class VolumeHelperTest {
public void setMuteAffectedStreams(int muteAffectedStreams) {
mMuteAffectedStreams = muteAffectedStreams;
}
+
+ public void setRingerModeAffectedStreams(int ringerModeAffectedStreams) {
+ mRingerModeAffectedStreams = ringerModeAffectedStreams;
+ }
}
private static class TestDeviceVolumeBehaviorDispatcherStub
@@ -550,6 +560,48 @@ public class VolumeHelperTest {
assertEquals(RINGER_MODE_VIBRATE, mAudioService.getRingerModeInternal());
}
+ @Test
+ public void setStreamVolume_doesNotUnmuteStreamAffectedByRingerMode() throws Exception {
+ assumeFalse("Skipping ringer mode test on automotive", mIsAutomotive);
+ mAudioService.setRingerModeAffectedStreams(DEFAULT_RINGER_MODE_AFFECTED_STREAMS);
+ mAudioService.setRingerModeInternal(RINGER_MODE_VIBRATE, mContext.getOpPackageName());
+
+ mAudioService.setStreamVolume(STREAM_NOTIFICATION, /*index=*/1, /*flags=*/0,
+ mContext.getOpPackageName());
+ mTestLooper.dispatchAll();
+
+ assertEquals(0, mAudioService.getStreamVolume(STREAM_NOTIFICATION));
+ }
+
+ @Test
+ public void adjustUnmuteStreamVolume_doesNotUnmuteStreamAffectedByRingerMode()
+ throws Exception {
+ assumeFalse("Skipping ringer mode test on automotive", mIsAutomotive);
+ mAudioService.setRingerModeAffectedStreams(DEFAULT_RINGER_MODE_AFFECTED_STREAMS);
+ mAudioService.setRingerModeInternal(RINGER_MODE_VIBRATE, mContext.getOpPackageName());
+
+ mAudioService.adjustStreamVolume(STREAM_NOTIFICATION, ADJUST_UNMUTE, /*flags=*/0,
+ mContext.getOpPackageName());
+ mTestLooper.dispatchAll();
+
+ assertEquals(0, mAudioService.getStreamVolume(STREAM_NOTIFICATION));
+ }
+
+ @Test
+ public void adjustRaiseStreamVolume_doesNotUnmuteStreamAffectedByRingerMode()
+ throws Exception {
+ assumeFalse("Skipping ringer mode test on automotive", mIsAutomotive);
+ mAudioService.setRingerModeAffectedStreams(DEFAULT_RINGER_MODE_AFFECTED_STREAMS);
+ mAudioService.setRingerModeInternal(RINGER_MODE_VIBRATE, mContext.getOpPackageName());
+
+ mAudioService.adjustStreamVolume(STREAM_NOTIFICATION, ADJUST_RAISE, /*flags=*/0,
+ mContext.getOpPackageName());
+ mTestLooper.dispatchAll();
+
+ assertEquals(0, mAudioService.getStreamVolume(STREAM_NOTIFICATION));
+ }
+
+
// --------------------- Permission tests ---------------------
@Test