diff options
author | Eric Laurent <elaurent@google.com> | 2012-09-28 18:01:48 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2012-10-02 08:46:26 -0700 |
commit | d640bd325c3be9a350058c835b880a7e0b40dc60 (patch) | |
tree | c1d50f4e2bd48b666e6f062fc4ae1c77fbfd5fd1 /media | |
parent | bd27ea2e125efd57676d34b4d6f24445f139c2e7 (diff) | |
download | frameworks_base-d640bd325c3be9a350058c835b880a7e0b40dc60.zip frameworks_base-d640bd325c3be9a350058c835b880a7e0b40dc60.tar.gz frameworks_base-d640bd325c3be9a350058c835b880a7e0b40dc60.tar.bz2 |
enable safe media volume according to country
Enable safe headphone volume feature for all countries that
do not opt otherwise in their mmc configuration.
Opt out for US.
Bug 7231029.
Change-Id: I2619d627508eb2cd1f73db9242e0cb5efa839a2a
Diffstat (limited to 'media')
-rw-r--r-- | media/java/android/media/AudioService.java | 135 |
1 files changed, 96 insertions, 39 deletions
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index a754ef3..fdb6818 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -63,6 +63,7 @@ import android.provider.Settings; import android.provider.Settings.System; import android.speech.RecognizerIntent; import android.telephony.PhoneStateListener; +import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; @@ -155,6 +156,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private static final int MSG_SET_FORCE_RSX_USE = 24; // force remote submix audio routing private static final int MSG_CHECK_MUSIC_ACTIVE = 25; private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 26; + private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 27; + private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 28; // flags for MSG_PERSIST_VOLUME indicating if current and/or last audible volume should be // persisted @@ -429,6 +432,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET | AudioSystem.DEVICE_OUT_ALL_USB; + private final boolean mMonitorOrientation; + /////////////////////////////////////////////////////////////////////////// // Construction /////////////////////////////////////////////////////////////////////////// @@ -439,8 +444,6 @@ public class AudioService extends IAudioService.Stub implements OnFinished { mContentResolver = context.getContentResolver(); mVoiceCapable = mContext.getResources().getBoolean( com.android.internal.R.bool.config_voice_capable); - mSafeMediaVolumeIndex = mContext.getResources().getInteger( - com.android.internal.R.integer.config_safe_media_volume_index) * 10; PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent"); @@ -465,13 +468,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished { updateStreamVolumeAlias(false /*updateVolumes*/); createStreamStates(); - mSafeMediaVolumeEnabled = new Boolean(true); - synchronized (mSafeMediaVolumeEnabled) { - enforceSafeMediaVolume(); - } - mMediaServerOk = true; + mSafeMediaVolumeState = new Integer(SAFE_MEDIA_VOLUME_NOT_CONFIGURED); + // Call setRingerModeInt() to apply correct mute // state on streams affected by ringer mode. mRingerModeMutedStreams = 0; @@ -491,11 +491,12 @@ public class AudioService extends IAudioService.Stub implements OnFinished { intentFilter.addAction(Intent.ACTION_SCREEN_OFF); intentFilter.addAction(Intent.ACTION_USER_SWITCHED); + intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); // Register a configuration change listener only if requested by system properties // to monitor orientation changes (off by default) - if (SystemProperties.getBoolean("ro.audio.monitorOrientation", false)) { + mMonitorOrientation = SystemProperties.getBoolean("ro.audio.monitorOrientation", false); + if (mMonitorOrientation) { Log.v(TAG, "monitoring device orientation"); - intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); // initialize orientation in AudioSystem setOrientationForAudioSystem(); } @@ -1748,8 +1749,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { checkAllAliasStreamVolumes(); - synchronized (mSafeMediaVolumeEnabled) { - if (mSafeMediaVolumeEnabled) { + synchronized (mSafeMediaVolumeState) { + if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) { enforceSafeMediaVolume(); } } @@ -2212,8 +2213,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } private void onCheckMusicActive() { - synchronized (mSafeMediaVolumeEnabled) { - if (!mSafeMediaVolumeEnabled) { + synchronized (mSafeMediaVolumeState) { + if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE) { int device = getDeviceForStream(AudioSystem.STREAM_MUSIC); if ((device & mSafeMediaVolumeDevices) != 0) { @@ -2241,6 +2242,25 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } } + private void onConfigureSafeVolume(boolean force) { + synchronized (mSafeMediaVolumeState) { + int mcc = mContext.getResources().getConfiguration().mcc; + 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) { + mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE; + enforceSafeMediaVolume(); + } else { + mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_DISABLED; + } + mMcc = mcc; + } + } + } + /////////////////////////////////////////////////////////////////////////// // Internal methods /////////////////////////////////////////////////////////////////////////// @@ -3185,7 +3205,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished { restoreMasterVolume(); // Reset device orientation (if monitored for this device) - if (SystemProperties.getBoolean("ro.audio.monitorOrientation", false)) { + if (mMonitorOrientation) { setOrientationForAudioSystem(); } @@ -3290,6 +3310,11 @@ public class AudioService extends IAudioService.Stub implements OnFinished { case MSG_BROADCAST_AUDIO_BECOMING_NOISY: onSendBecomingNoisyIntent(); break; + + case MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED: + case MSG_CONFIGURE_SAFE_MEDIA_VOLUME: + onConfigureSafeVolume((msg.what == MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED)); + break; } } } @@ -3739,6 +3764,14 @@ public class AudioService extends IAudioService.Stub implements OnFinished { adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener, BluetoothProfile.A2DP); } + + sendMsg(mAudioHandler, + MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED, + SENDMSG_REPLACE, + 0, + 0, + null, + SAFE_VOLUME_CONFIGURE_TIMEOUT_MS); } else if (action.equals(Intent.ACTION_PACKAGE_REMOVED)) { if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) { // a package is being removed, not replaced @@ -5512,11 +5545,21 @@ public class AudioService extends IAudioService.Stub implements OnFinished { try { // reading new orientation "safely" (i.e. under try catch) in case anything // goes wrong when obtaining resources and configuration - int newOrientation = context.getResources().getConfiguration().orientation; - if (newOrientation != mDeviceOrientation) { - mDeviceOrientation = newOrientation; - setOrientationForAudioSystem(); + Configuration config = context.getResources().getConfiguration(); + if (mMonitorOrientation) { + int newOrientation = config.orientation; + if (newOrientation != mDeviceOrientation) { + mDeviceOrientation = newOrientation; + setOrientationForAudioSystem(); + } } + sendMsg(mAudioHandler, + MSG_CONFIGURE_SAFE_MEDIA_VOLUME, + SENDMSG_REPLACE, + 0, + 0, + null, + 0); } catch (Exception e) { Log.e(TAG, "Error retrieving device orientation: " + e); } @@ -5587,12 +5630,21 @@ public class AudioService extends IAudioService.Stub implements OnFinished { // overlay. //========================================================================================== - // mSafeMediaVolumeEnabled indicates whether the media volume is limited over headphones. - // It is true by default when headphones or a headset are inserted and can be overriden by - // calling AudioService.disableSafeMediaVolume() (when user opts out). - private Boolean mSafeMediaVolumeEnabled; + // mSafeMediaVolumeState indicates whether the media volume is limited over headphones. + // It is SAFE_MEDIA_VOLUME_NOT_CONFIGURED at boot time until a network service is connected + // or the configure time is elapsed. It is then set to SAFE_MEDIA_VOLUME_ACTIVE or + // SAFE_MEDIA_VOLUME_DISABLED according to country option. If not SAFE_MEDIA_VOLUME_DISABLED, it + // can be set to SAFE_MEDIA_VOLUME_INACTIVE by calling AudioService.disableSafeMediaVolume() + // (when user opts out). + private final int SAFE_MEDIA_VOLUME_NOT_CONFIGURED = 0; + private final int SAFE_MEDIA_VOLUME_DISABLED = 1; + private final int SAFE_MEDIA_VOLUME_INACTIVE = 2; + private final int SAFE_MEDIA_VOLUME_ACTIVE = 3; + private Integer mSafeMediaVolumeState; + + private int mMcc = 0; // mSafeMediaVolumeIndex is the cached value of config_safe_media_volume_index property - private final int mSafeMediaVolumeIndex; + private int mSafeMediaVolumeIndex; // mSafeMediaVolumeDevices lists the devices for which safe media volume is enforced, private final int mSafeMediaVolumeDevices = AudioSystem.DEVICE_OUT_WIRED_HEADSET | AudioSystem.DEVICE_OUT_WIRED_HEADPHONE; @@ -5602,22 +5654,27 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private int mMusicActiveMs; private static final int UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX = (20 * 3600 * 1000); // 20 hours private static final int MUSIC_ACTIVE_POLL_PERIOD_MS = 60000; // 1 minute polling interval + private static final int SAFE_VOLUME_CONFIGURE_TIMEOUT_MS = 30000; // 30s after boot completed private void setSafeMediaVolumeEnabled(boolean on) { - synchronized (mSafeMediaVolumeEnabled) { - if (on && !mSafeMediaVolumeEnabled) { - enforceSafeMediaVolume(); - } else if (!on && mSafeMediaVolumeEnabled) { - mMusicActiveMs = 0; - sendMsg(mAudioHandler, - MSG_CHECK_MUSIC_ACTIVE, - SENDMSG_REPLACE, - 0, - 0, - null, - MUSIC_ACTIVE_POLL_PERIOD_MS); + synchronized (mSafeMediaVolumeState) { + if ((mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_NOT_CONFIGURED) && + (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_DISABLED)) { + if (on && (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE)) { + mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE; + enforceSafeMediaVolume(); + } else if (!on && (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE)) { + mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_INACTIVE; + mMusicActiveMs = 0; + sendMsg(mAudioHandler, + MSG_CHECK_MUSIC_ACTIVE, + SENDMSG_REPLACE, + 0, + 0, + null, + MUSIC_ACTIVE_POLL_PERIOD_MS); + } } - mSafeMediaVolumeEnabled = on; } } @@ -5659,8 +5716,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } private boolean checkSafeMediaVolume(int streamType, int index, int device) { - synchronized (mSafeMediaVolumeEnabled) { - if (mSafeMediaVolumeEnabled && + synchronized (mSafeMediaVolumeState) { + if ((mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) && (mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) && ((device & mSafeMediaVolumeDevices) != 0) && (index > mSafeMediaVolumeIndex)) { @@ -5672,7 +5729,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } public void disableSafeMediaVolume() { - synchronized (mSafeMediaVolumeEnabled) { + synchronized (mSafeMediaVolumeState) { setSafeMediaVolumeEnabled(false); } } |