From 31951ca52aa007891b0be975318199e207c70e02 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Tue, 2 Mar 2010 18:54:45 -0800 Subject: [PATCH] Fix issue 2456968: Alarm rings in "silent mode and when Alarm in silent mode is turned off". The problem is that even if silent mode is active, changing the alarm volume will change current alarm stream volume. This is true for other stream types affected by ringer mode (ring, notification...) but the UI design is such that it is not possible to change these volumes while in silent mode. The fix consists in modifying AudioService.setStreamVolumeInt() so that when a stream is affected by ringer mode and we are in silent mode, only the saved volume value is modified, current value remaining to unchanged (0). --- media/java/android/media/AudioService.java | 36 +++++++++++++++------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index a36ee8534dc05..e586869d68dcb 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -450,10 +450,20 @@ public class AudioService extends IAudioService.Stub { VolumeStreamState streamState = mStreamStates[streamType]; if (streamState.setIndex(index, lastAudible) || force) { // Post message to set system volume (it in turn will post a message - // to persist). Do not change volume if stream is muted. - if (streamState.muteCount() == 0) { + // to persist). + // If stream is muted or we are in silent mode and stream is affected by ringer mode + // and the new volume is not 0, just persist the new volume but do not change + // current value + if (streamState.muteCount() == 0 && + (mRingerMode == AudioManager.RINGER_MODE_NORMAL || + !isStreamAffectedByRingerMode(streamType) || + index == 0)) { sendMsg(mAudioHandler, MSG_SET_SYSTEM_VOLUME, streamType, SENDMSG_NOOP, 0, 0, streamState, 0); + } else { + // Post a persist volume msg + sendMsg(mAudioHandler, MSG_PERSIST_VOLUME, streamType, + SENDMSG_REPLACE, 0, 1, streamState, PERSIST_DELAY); } } } @@ -512,7 +522,7 @@ public class AudioService extends IAudioService.Stub { if (!isStreamAffectedByRingerMode(streamType)) continue; // Bring back last audible volume setStreamVolumeInt(streamType, mStreamStates[streamType].mLastAudibleIndex, - false, false); + true, false); } } else { for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { @@ -524,7 +534,7 @@ public class AudioService extends IAudioService.Stub { // to non affected by ringer mode. Does not arm to do it for streams that // are not affected as well. setStreamVolumeInt(streamType, mStreamStates[streamType].mLastAudibleIndex, - false, false); + true, false); } } } @@ -1269,14 +1279,18 @@ public class AudioService extends IAudioService.Stub { // Post a persist volume msg sendMsg(mAudioHandler, MSG_PERSIST_VOLUME, streamState.mStreamType, - SENDMSG_REPLACE, 0, 0, streamState, PERSIST_DELAY); + SENDMSG_REPLACE, 1, 1, streamState, PERSIST_DELAY); } - private void persistVolume(VolumeStreamState streamState) { - System.putInt(mContentResolver, streamState.mVolumeIndexSettingName, - (streamState.mIndex + 5)/ 10); - System.putInt(mContentResolver, streamState.mLastAudibleVolumeIndexSettingName, + private void persistVolume(VolumeStreamState streamState, boolean current, boolean lastAudible) { + if (current) { + System.putInt(mContentResolver, streamState.mVolumeIndexSettingName, + (streamState.mIndex + 5)/ 10); + } + if (lastAudible) { + System.putInt(mContentResolver, streamState.mLastAudibleVolumeIndexSettingName, (streamState.mLastAudibleIndex + 5) / 10); + } } private void persistRingerMode() { @@ -1361,7 +1375,7 @@ public class AudioService extends IAudioService.Stub { break; case MSG_PERSIST_VOLUME: - persistVolume((VolumeStreamState) msg.obj); + persistVolume((VolumeStreamState) msg.obj, (msg.arg1 != 0), (msg.arg2 != 0)); break; case MSG_PERSIST_RINGER_MODE: @@ -1469,7 +1483,7 @@ public class AudioService extends IAudioService.Stub { // and persist with no delay as there might be registered observers of the persisted // notification volume. sendMsg(mAudioHandler, MSG_PERSIST_VOLUME, AudioSystem.STREAM_NOTIFICATION, - SENDMSG_REPLACE, 0, 0, mStreamStates[AudioSystem.STREAM_NOTIFICATION], 0); + SENDMSG_REPLACE, 1, 1, mStreamStates[AudioSystem.STREAM_NOTIFICATION], 0); } } }