diff options
| -rw-r--r-- | core/java/android/provider/Settings.java | 2 | ||||
| -rwxr-xr-x | media/java/android/media/AudioService.java | 106 |
2 files changed, 68 insertions, 40 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index b13494f..2a9bf29 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1960,7 +1960,7 @@ public final class Settings { * Whether to prevent loud volume levels when headset is first plugged in. * @hide */ - public static final String SAFE_HEADSET_VOLUME_RESTORE = "safe_headset_volume_restore"; + public static final String SAFE_HEADSET_VOLUME = "safe_headset_volume"; /** * Master volume (float in the range 0.0f to 1.0f). diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index a7eb5fe..1b0675a 100755 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -46,6 +46,7 @@ import android.content.res.Resources; import android.database.ContentObserver; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; +import android.net.Uri; import android.os.Binder; import android.os.Bundle; import android.os.Environment; @@ -681,6 +682,15 @@ public class AudioService extends IAudioService.Stub implements OnFinished { 0); } + private boolean safeVolumeEnabled(ContentResolver cr) { + boolean safeMediaVolumeEnabled = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_safe_media_volume_enabled); + boolean safeHeadsetVolumeEnabled = Settings.System.getIntForUser(cr, + Settings.System.SAFE_HEADSET_VOLUME, safeMediaVolumeEnabled ? 1 : 0, + UserHandle.USER_CURRENT_OR_SELF) != 0; + return safeHeadsetVolumeEnabled; + } + private void readPersistedSettings() { final ContentResolver cr = mContentResolver; @@ -746,6 +756,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { UserHandle.USER_CURRENT); readDockAudioSettings(cr); + + mSafeVolumeEnabled = new Boolean(safeVolumeEnabled(cr)); } mLinkNotificationWithVolume = Settings.System.getIntForUser(cr, @@ -1844,7 +1856,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { checkAllAliasStreamVolumes(); synchronized (mSafeMediaVolumeState) { - if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) { + if (mSafeVolumeEnabled && + mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) { enforceSafeMediaVolume(); } } @@ -2305,7 +2318,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private void onCheckMusicActive() { synchronized (mSafeMediaVolumeState) { - if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE) { + if (mSafeVolumeEnabled && + mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE) { int device = getDeviceForStream(AudioSystem.STREAM_MUSIC); if ((device & mSafeMediaVolumeDevices) != 0) { @@ -2339,9 +2353,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished { if ((mMcc != mcc) || ((mMcc == 0) && force)) { mSafeMediaVolumeIndex = mContext.getResources().getInteger( com.android.internal.R.integer.config_safe_media_volume_index) * 10; - boolean safeMediaVolumeEnabled = mContext.getResources().getBoolean( - com.android.internal.R.bool.config_safe_media_volume_enabled); - if (safeMediaVolumeEnabled) { + if (mSafeVolumeEnabled) { mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE; enforceSafeMediaVolume(); } else { @@ -3480,49 +3492,61 @@ public class AudioService extends IAudioService.Stub implements OnFinished { Settings.System.MODE_RINGER_STREAMS_AFFECTED), false, this); mContentResolver.registerContentObserver(Settings.Global.getUriFor( Settings.Global.DOCK_AUDIO_MEDIA_ENABLED), false, this); + mContentResolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.VOLUME_LINK_NOTIFICATION), false, this); + mContentResolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.SAFE_HEADSET_VOLUME), false, this); } @Override - public void onChange(boolean selfChange) { - super.onChange(selfChange); + public void onChange(boolean selfChange, Uri uri) { + super.onChange(selfChange, uri); // FIXME This synchronized is not necessary if mSettingsLock only protects mRingerMode. // However there appear to be some missing locks around mRingerModeMutedStreams // and mRingerModeAffectedStreams, so will leave this synchronized for now. // mRingerModeMutedStreams and mMuteAffectedStreams are safe (only accessed once). synchronized (mSettingsLock) { - int ringerModeAffectedStreams = Settings.System.getIntForUser(mContentResolver, - Settings.System.MODE_RINGER_STREAMS_AFFECTED, - ((1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_NOTIFICATION)| - (1 << AudioSystem.STREAM_SYSTEM)|(1 << AudioSystem.STREAM_SYSTEM_ENFORCED)), - UserHandle.USER_CURRENT); - if (mVoiceCapable) { - ringerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_MUSIC); - } else { - ringerModeAffectedStreams |= (1 << AudioSystem.STREAM_MUSIC); - } - synchronized (mCameraSoundForced) { - if (mCameraSoundForced) { - ringerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_SYSTEM_ENFORCED); + if (uri.equals(Settings.System.getUriFor(Settings.System.MODE_RINGER_STREAMS_AFFECTED))) { + int ringerModeAffectedStreams = Settings.System.getIntForUser(mContentResolver, + Settings.System.MODE_RINGER_STREAMS_AFFECTED, + ((1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_NOTIFICATION)| + (1 << AudioSystem.STREAM_SYSTEM)|(1 << AudioSystem.STREAM_SYSTEM_ENFORCED)), + UserHandle.USER_CURRENT); + if (mVoiceCapable) { + ringerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_MUSIC); } else { - ringerModeAffectedStreams |= (1 << AudioSystem.STREAM_SYSTEM_ENFORCED); + ringerModeAffectedStreams |= (1 << AudioSystem.STREAM_MUSIC); + } + synchronized (mCameraSoundForced) { + if (mCameraSoundForced) { + ringerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_SYSTEM_ENFORCED); + } else { + ringerModeAffectedStreams |= (1 << AudioSystem.STREAM_SYSTEM_ENFORCED); + } + } + if (ringerModeAffectedStreams != mRingerModeAffectedStreams) { + /* + * Ensure all stream types that should be affected by ringer mode + * are in the proper state. + */ + mRingerModeAffectedStreams = ringerModeAffectedStreams; + setRingerModeInt(getRingerMode(), false); } - } - if (ringerModeAffectedStreams != mRingerModeAffectedStreams) { - /* - * Ensure all stream types that should be affected by ringer mode - * are in the proper state. - */ - mRingerModeAffectedStreams = ringerModeAffectedStreams; - setRingerModeInt(getRingerMode(), false); - } - readDockAudioSettings(mContentResolver); - mLinkNotificationWithVolume = Settings.System.getIntForUser(mContentResolver, - Settings.System.VOLUME_LINK_NOTIFICATION, 1, UserHandle.USER_CURRENT) == 1; - if (mLinkNotificationWithVolume) { - mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_RING; - } else { - mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_NOTIFICATION; + } else if (uri.equals(Settings.Global.getUriFor(Settings.Global.DOCK_AUDIO_MEDIA_ENABLED))) { + readDockAudioSettings(mContentResolver); + + } else if (uri.equals(Settings.System.getUriFor(Settings.System.VOLUME_LINK_NOTIFICATION))) { + mLinkNotificationWithVolume = Settings.System.getInt(mContentResolver, + Settings.System.VOLUME_LINK_NOTIFICATION, 1) == 1; + if (mLinkNotificationWithVolume) { + mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_RING; + } else { + mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_NOTIFICATION; + } + + } else if (uri.equals(Settings.System.getUriFor(Settings.System.SAFE_HEADSET_VOLUME))) { + mSafeVolumeEnabled = safeVolumeEnabled(mContentResolver); } } } @@ -6057,6 +6081,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private Integer mSafeMediaVolumeState; private int mMcc = 0; + // mSafeVolumeEnabled indicates whether to check the volume of media play via headset + private boolean mSafeVolumeEnabled; // mSafeMediaVolumeIndex is the cached value of config_safe_media_volume_index property private int mSafeMediaVolumeIndex; // mSafeMediaVolumeDevices lists the devices for which safe media volume is enforced, @@ -6072,7 +6098,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private void setSafeMediaVolumeEnabled(boolean on) { synchronized (mSafeMediaVolumeState) { - if ((mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_NOT_CONFIGURED) && + if (mSafeVolumeEnabled && + (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_NOT_CONFIGURED) && (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_DISABLED)) { if (on && (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE)) { mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE; @@ -6131,7 +6158,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private boolean checkSafeMediaVolume(int streamType, int index, int device) { synchronized (mSafeMediaVolumeState) { - if ((mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) && + if (mSafeVolumeEnabled && + (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) && (mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) && ((device & mSafeMediaVolumeDevices) != 0) && (index > mSafeMediaVolumeIndex)) { |
