@@ -157,6 +157,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
157157 private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 25 ;
158158 private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 26 ;
159159 private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 27 ;
160+ private static final int MSG_PERSIST_SAFE_VOLUME_STATE = 28 ;
160161
161162 // flags for MSG_PERSIST_VOLUME indicating if current and/or last audible volume should be
162163 // persisted
@@ -481,15 +482,21 @@ public AudioService(Context context) {
481482 null ,
482483 0 );
483484
485+ mSafeMediaVolumeState = new Integer (Settings .Global .getInt (mContentResolver ,
486+ Settings .Global .AUDIO_SAFE_VOLUME_STATE ,
487+ SAFE_MEDIA_VOLUME_NOT_CONFIGURED ));
488+ // The default safe volume index read here will be replaced by the actual value when
489+ // the mcc is read by onConfigureSafeVolume()
490+ mSafeMediaVolumeIndex = mContext .getResources ().getInteger (
491+ com .android .internal .R .integer .config_safe_media_volume_index ) * 10 ;
492+
484493 readPersistedSettings ();
485494 mSettingsObserver = new SettingsObserver ();
486495 updateStreamVolumeAlias (false /*updateVolumes*/ );
487496 createStreamStates ();
488497
489498 mMediaServerOk = true ;
490499
491- mSafeMediaVolumeState = new Integer (SAFE_MEDIA_VOLUME_NOT_CONFIGURED );
492-
493500 // Call setRingerModeInt() to apply correct mute
494501 // state on streams affected by ringer mode.
495502 mRingerModeMutedStreams = 0 ;
@@ -822,70 +829,72 @@ public void adjustStreamVolume(int streamType, int direction, int flags) {
822829 // convert one UI step (+/-1) into a number of internal units on the stream alias
823830 int step = rescaleIndex (10 , streamType , streamTypeAlias );
824831
825- if ((direction == AudioManager .ADJUST_RAISE ) &&
826- !checkSafeMediaVolume (streamTypeAlias , aliasIndex + step , device )) {
827- return ;
828- }
829-
830832 int index ;
831833 int oldIndex ;
832834
833- flags &= ~AudioManager .FLAG_FIXED_VOLUME ;
834- if ((streamTypeAlias == AudioSystem .STREAM_MUSIC ) &&
835- ((device & mFixedVolumeDevices ) != 0 )) {
836- flags |= AudioManager .FLAG_FIXED_VOLUME ;
837- index = mStreamStates [streamType ].getMaxIndex ();
835+ if ((direction == AudioManager .ADJUST_RAISE ) &&
836+ !checkSafeMediaVolume (streamTypeAlias , aliasIndex + step , device )) {
837+ index = mStreamStates [streamType ].getIndex (device ,
838+ (streamState .muteCount () != 0 ) /* lastAudible */ );
838839 oldIndex = index ;
839840 } else {
840- // If either the client forces allowing ringer modes for this adjustment,
841- // or the stream type is one that is affected by ringer modes
842- if (((flags & AudioManager .FLAG_ALLOW_RINGER_MODES ) != 0 ) ||
843- (streamTypeAlias == getMasterStreamType ())) {
844- int ringerMode = getRingerMode ();
845- // do not vibrate if already in vibrate mode
846- if (ringerMode == AudioManager .RINGER_MODE_VIBRATE ) {
847- flags &= ~AudioManager .FLAG_VIBRATE ;
848- }
849- // Check if the ringer mode changes with this volume adjustment. If
850- // it does, it will handle adjusting the volume, so we won't below
851- adjustVolume = checkForRingerModeChange (aliasIndex , direction , step );
852- if ((streamTypeAlias == getMasterStreamType ()) &&
853- (mRingerMode == AudioManager .RINGER_MODE_SILENT )) {
854- streamState .setLastAudibleIndex (0 , device );
855- }
856- }
857-
858- // If stream is muted, adjust last audible index only
859- oldIndex = mStreamStates [streamType ].getIndex (device ,
860- (mStreamStates [streamType ].muteCount () != 0 ) /* lastAudible */ );
861-
862- if (streamState .muteCount () != 0 ) {
863- if (adjustVolume ) {
864- // Post a persist volume msg
865- // no need to persist volume on all streams sharing the same alias
866- streamState .adjustLastAudibleIndex (direction * step , device );
867- sendMsg (mAudioHandler ,
868- MSG_PERSIST_VOLUME ,
869- SENDMSG_QUEUE ,
870- PERSIST_LAST_AUDIBLE ,
871- device ,
872- streamState ,
873- PERSIST_DELAY );
874- }
875- index = mStreamStates [streamType ].getIndex (device , true /* lastAudible */ );
841+ flags &= ~AudioManager .FLAG_FIXED_VOLUME ;
842+ if ((streamTypeAlias == AudioSystem .STREAM_MUSIC ) &&
843+ ((device & mFixedVolumeDevices ) != 0 )) {
844+ flags |= AudioManager .FLAG_FIXED_VOLUME ;
845+ index = mStreamStates [streamType ].getMaxIndex ();
846+ oldIndex = index ;
876847 } else {
877- if (adjustVolume && streamState .adjustIndex (direction * step , device )) {
878- // Post message to set system volume (it in turn will post a message
879- // to persist). Do not change volume if stream is muted.
880- sendMsg (mAudioHandler ,
881- MSG_SET_DEVICE_VOLUME ,
882- SENDMSG_QUEUE ,
883- device ,
884- 0 ,
885- streamState ,
886- 0 );
848+ // If either the client forces allowing ringer modes for this adjustment,
849+ // or the stream type is one that is affected by ringer modes
850+ if (((flags & AudioManager .FLAG_ALLOW_RINGER_MODES ) != 0 ) ||
851+ (streamTypeAlias == getMasterStreamType ())) {
852+ int ringerMode = getRingerMode ();
853+ // do not vibrate if already in vibrate mode
854+ if (ringerMode == AudioManager .RINGER_MODE_VIBRATE ) {
855+ flags &= ~AudioManager .FLAG_VIBRATE ;
856+ }
857+ // Check if the ringer mode changes with this volume adjustment. If
858+ // it does, it will handle adjusting the volume, so we won't below
859+ adjustVolume = checkForRingerModeChange (aliasIndex , direction , step );
860+ if ((streamTypeAlias == getMasterStreamType ()) &&
861+ (mRingerMode == AudioManager .RINGER_MODE_SILENT )) {
862+ streamState .setLastAudibleIndex (0 , device );
863+ }
864+ }
865+
866+ // If stream is muted, adjust last audible index only
867+ oldIndex = mStreamStates [streamType ].getIndex (device ,
868+ (mStreamStates [streamType ].muteCount () != 0 ) /* lastAudible */ );
869+
870+ if (streamState .muteCount () != 0 ) {
871+ if (adjustVolume ) {
872+ // Post a persist volume msg
873+ // no need to persist volume on all streams sharing the same alias
874+ streamState .adjustLastAudibleIndex (direction * step , device );
875+ sendMsg (mAudioHandler ,
876+ MSG_PERSIST_VOLUME ,
877+ SENDMSG_QUEUE ,
878+ PERSIST_LAST_AUDIBLE ,
879+ device ,
880+ streamState ,
881+ PERSIST_DELAY );
882+ }
883+ index = mStreamStates [streamType ].getIndex (device , true /* lastAudible */ );
884+ } else {
885+ if (adjustVolume && streamState .adjustIndex (direction * step , device )) {
886+ // Post message to set system volume (it in turn will post a message
887+ // to persist). Do not change volume if stream is muted.
888+ sendMsg (mAudioHandler ,
889+ MSG_SET_DEVICE_VOLUME ,
890+ SENDMSG_QUEUE ,
891+ device ,
892+ 0 ,
893+ streamState ,
894+ 0 );
895+ }
896+ index = mStreamStates [streamType ].getIndex (device , false /* lastAudible */ );
887897 }
888- index = mStreamStates [streamType ].getIndex (device , false /* lastAudible */ );
889898 }
890899 }
891900 sendVolumeUpdate (streamType , oldIndex , index , flags );
@@ -2306,13 +2315,31 @@ private void onConfigureSafeVolume(boolean force) {
23062315 com .android .internal .R .integer .config_safe_media_volume_index ) * 10 ;
23072316 boolean safeMediaVolumeEnabled = mContext .getResources ().getBoolean (
23082317 com .android .internal .R .bool .config_safe_media_volume_enabled );
2318+
2319+ // The persisted state is either "disabled" or "active": this is the state applied
2320+ // next time we boot and cannot be "inactive"
2321+ int persistedState ;
23092322 if (safeMediaVolumeEnabled ) {
2310- mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE ;
2311- enforceSafeMediaVolume ();
2323+ persistedState = SAFE_MEDIA_VOLUME_ACTIVE ;
2324+ // The state can already be "inactive" here if the user has forced it before
2325+ // the 30 seconds timeout for forced configuration. In this case we don't reset
2326+ // it to "active".
2327+ if (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_INACTIVE ) {
2328+ mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE ;
2329+ enforceSafeMediaVolume ();
2330+ }
23122331 } else {
2332+ persistedState = SAFE_MEDIA_VOLUME_DISABLED ;
23132333 mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_DISABLED ;
23142334 }
23152335 mMcc = mcc ;
2336+ sendMsg (mAudioHandler ,
2337+ MSG_PERSIST_SAFE_VOLUME_STATE ,
2338+ SENDMSG_QUEUE ,
2339+ persistedState ,
2340+ 0 ,
2341+ null ,
2342+ 0 );
23162343 }
23172344 }
23182345 }
@@ -3224,6 +3251,12 @@ private void setForceUse(int usage, int config) {
32243251 AudioSystem .setForceUse (usage , config );
32253252 }
32263253
3254+ private void onPersistSafeVolumeState (int state ) {
3255+ Settings .Global .putInt (mContentResolver ,
3256+ Settings .Global .AUDIO_SAFE_VOLUME_STATE ,
3257+ state );
3258+ }
3259+
32273260 @ Override
32283261 public void handleMessage (Message msg ) {
32293262
@@ -3433,6 +3466,9 @@ public void handleMessage(Message msg) {
34333466 case MSG_CONFIGURE_SAFE_MEDIA_VOLUME :
34343467 onConfigureSafeVolume ((msg .what == MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED ));
34353468 break ;
3469+ case MSG_PERSIST_SAFE_VOLUME_STATE :
3470+ onPersistSafeVolumeState (msg .arg1 );
3471+ break ;
34363472 }
34373473 }
34383474 }
0 commit comments