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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user