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).
This commit is contained in:
Eric Laurent
2010-03-02 18:54:45 -08:00
parent dbc96e18a7
commit 31951ca52a

View File

@@ -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);
}
}
}