diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index f1561cab8fb47..7ad0f21c2f69e 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -297,6 +297,7 @@ public class AudioService extends IAudioService.Stub // these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(), // and not with sendMsg(..., ..., SENDMSG_QUEUE, ...) private static final int MSG_DISABLE_AUDIO_FOR_UID = 100; + private static final int MSG_INIT_STREAMS_VOLUMES = 101; // end of messages handled under wakelock // retry delay in case of failure to indicate system ready to AudioFlinger @@ -822,7 +823,34 @@ public class AudioService extends IAudioService.Stub updateStreamVolumeAlias(false /*updateVolumes*/, TAG); readPersistedSettings(); readUserRestrictions(); - mSettingsObserver = new SettingsObserver(); + + mPlaybackMonitor = + new PlaybackActivityMonitor(context, MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM]); + mMediaFocusControl = new MediaFocusControl(mContext, mPlaybackMonitor); + + readAndSetLowRamDevice(); + + mIsCallScreeningModeSupported = AudioSystem.isCallScreeningModeSupported(); + + if (mSystemServer.isPrivileged()) { + LocalServices.addService(AudioManagerInternal.class, new AudioServiceInternal()); + + mUserManagerInternal.addUserRestrictionsListener(mUserRestrictionsListener); + + mRecordMonitor.initMonitor(); + } + + mMonitorRotation = SystemProperties.getBoolean("ro.audio.monitorRotation", false); + + // done with service initialization, continue additional work in our Handler thread + queueMsgUnderWakeLock(mAudioHandler, MSG_INIT_STREAMS_VOLUMES, + 0 /* arg1 */, 0 /* arg2 */, null /* obj */, 0 /* delay */); + } + + /** + * Called by handling of MSG_INIT_STREAMS_VOLUMES + */ + private void onInitStreamsAndVolumes() { createStreamStates(); // must be called after createStreamStates() as it uses MUSIC volume as default if no @@ -833,53 +861,11 @@ public class AudioService extends IAudioService.Stub // relies on audio policy having correct ranges for volume indexes. mSafeUsbMediaVolumeIndex = getSafeUsbMediaVolumeIndex(); - mPlaybackMonitor = - new PlaybackActivityMonitor(context, MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM]); - - mMediaFocusControl = new MediaFocusControl(mContext, mPlaybackMonitor); - - readAndSetLowRamDevice(); - - mIsCallScreeningModeSupported = AudioSystem.isCallScreeningModeSupported(); - // Call setRingerModeInt() to apply correct mute // state on streams affected by ringer mode. mRingerAndZenModeMutedStreams = 0; setRingerModeInt(getRingerModeInternal(), false); - // Register for device connection intent broadcasts. - IntentFilter intentFilter = - new IntentFilter(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED); - intentFilter.addAction(BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED); - intentFilter.addAction(Intent.ACTION_DOCK_EVENT); - intentFilter.addAction(Intent.ACTION_SCREEN_ON); - intentFilter.addAction(Intent.ACTION_SCREEN_OFF); - intentFilter.addAction(Intent.ACTION_USER_SWITCHED); - intentFilter.addAction(Intent.ACTION_USER_BACKGROUND); - intentFilter.addAction(Intent.ACTION_USER_FOREGROUND); - intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); - intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); - intentFilter.addAction(Intent.ACTION_PACKAGES_SUSPENDED); - - intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); - mMonitorRotation = SystemProperties.getBoolean("ro.audio.monitorRotation", false); - if (mMonitorRotation) { - RotationHelper.init(mContext, mAudioHandler); - } - - intentFilter.addAction(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION); - intentFilter.addAction(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION); - - context.registerReceiverAsUser(mReceiver, UserHandle.ALL, intentFilter, null, null); - - if (mSystemServer.isPrivileged()) { - LocalServices.addService(AudioManagerInternal.class, new AudioServiceInternal()); - - mUserManagerInternal.addUserRestrictionsListener(mUserRestrictionsListener); - - mRecordMonitor.initMonitor(); - } - final float[] preScale = new float[3]; preScale[0] = mContext.getResources().getFraction( com.android.internal.R.fraction.config_prescaleAbsoluteVolume_index1, @@ -896,10 +882,47 @@ public class AudioService extends IAudioService.Stub } } + initExternalEventReceivers(); + // check on volume initialization checkVolumeRangeInitialization("AudioService()"); } + /** + * Initialize intent receives and settings observers for this service. + * Must be called after createStreamStates() as the handling of some events + * may affect or need volumes, e.g. BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED + * (for intent receiver), or Settings.Global.ZEN_MODE (for settings observer) + */ + private void initExternalEventReceivers() { + mSettingsObserver = new SettingsObserver(); + + // Register for device connection intent broadcasts. + IntentFilter intentFilter = + new IntentFilter(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED); + intentFilter.addAction(BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED); + intentFilter.addAction(Intent.ACTION_DOCK_EVENT); + intentFilter.addAction(Intent.ACTION_SCREEN_ON); + intentFilter.addAction(Intent.ACTION_SCREEN_OFF); + intentFilter.addAction(Intent.ACTION_USER_SWITCHED); + intentFilter.addAction(Intent.ACTION_USER_BACKGROUND); + intentFilter.addAction(Intent.ACTION_USER_FOREGROUND); + intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); + intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); + intentFilter.addAction(Intent.ACTION_PACKAGES_SUSPENDED); + + intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + if (mMonitorRotation) { + RotationHelper.init(mContext, mAudioHandler); + } + + intentFilter.addAction(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION); + intentFilter.addAction(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION); + + mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, intentFilter, null, null); + + } + public void systemReady() { sendMsg(mAudioHandler, MSG_SYSTEM_READY, SENDMSG_QUEUE, 0, 0, null, 0); @@ -2593,7 +2616,7 @@ public class AudioService extends IAudioService.Stub // StreamVolumeCommand contains the information needed to defer the process of // setStreamVolume() in case the user has to acknowledge the safe volume warning message. - class StreamVolumeCommand { + static class StreamVolumeCommand { public final int mStreamType; public final int mIndex; public final int mFlags; @@ -2612,7 +2635,7 @@ public class AudioService extends IAudioService.Stub .append(mIndex).append(",flags=").append(mFlags).append(",device=") .append(mDevice).append('}').toString(); } - }; + } private int getNewRingerMode(int stream, int index, int flags) { // setRingerMode does nothing if the device is single volume,so the value would be unchanged @@ -3321,7 +3344,7 @@ public class AudioService extends IAudioService.Stub } private int mRmtSbmxFullVolRefCount = 0; - private ArrayList mRmtSbmxFullVolDeathHandlers = + private final ArrayList mRmtSbmxFullVolDeathHandlers = new ArrayList(); public void forceRemoteSubmixFullVolume(boolean startForcing, IBinder cb) { @@ -5882,7 +5905,6 @@ public class AudioService extends IAudioService.Stub private final Intent mStreamDevicesChanged; private VolumeStreamState(String settingName, int streamType) { - mVolumeIndexSettingName = settingName; mStreamType = streamType; @@ -6658,6 +6680,11 @@ public class AudioService extends IAudioService.Stub mAudioEventWakeLock.release(); break; + case MSG_INIT_STREAMS_VOLUMES: + onInitStreamsAndVolumes(); + mAudioEventWakeLock.release(); + break; + case MSG_CHECK_MUSIC_ACTIVE: onCheckMusicActive((String) msg.obj); break; @@ -9216,7 +9243,7 @@ public class AudioService extends IAudioService.Stub } } - private HashMap mAudioServerStateListeners = + private final HashMap mAudioServerStateListeners = new HashMap(); private void checkMonitorAudioServerStatePermission() {