summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java115
1 files changed, 71 insertions, 44 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 9331dd8cd92e..64c0891fde4f 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -689,6 +689,7 @@ public class AudioService extends IAudioService.Stub {
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_CONFIGURATION_CHANGED);
// TODO merge orientation and rotation
@@ -3164,57 +3165,18 @@ public class AudioService extends IAudioService.Stub {
}
}
public void onServiceDisconnected(int profile) {
- ArraySet<String> toRemove = null;
+
switch (profile) {
case BluetoothProfile.A2DP:
- synchronized (mConnectedDevices) {
- synchronized (mA2dpAvrcpLock) {
- // Disconnect ALL DEVICE_OUT_BLUETOOTH_A2DP devices
- for (int i = 0; i < mConnectedDevices.size(); i++) {
- DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i);
- if (deviceSpec.mDeviceType == AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) {
- toRemove = toRemove != null ? toRemove : new ArraySet<String>();
- toRemove.add(deviceSpec.mDeviceAddress);
- }
- }
- if (toRemove != null) {
- int delay = checkSendBecomingNoisyIntent(
- AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
- 0);
- for (int i = 0; i < toRemove.size(); i++) {
- makeA2dpDeviceUnavailableLater(toRemove.valueAt(i), delay);
- }
- }
- }
- }
+ disconnectA2dp();
break;
case BluetoothProfile.A2DP_SINK:
- synchronized (mConnectedDevices) {
- // Disconnect ALL DEVICE_IN_BLUETOOTH_A2DP devices
- for(int i = 0; i < mConnectedDevices.size(); i++) {
- DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i);
- if (deviceSpec.mDeviceType == AudioSystem.DEVICE_IN_BLUETOOTH_A2DP) {
- toRemove = toRemove != null ? toRemove : new ArraySet<String>();
- toRemove.add(deviceSpec.mDeviceAddress);
- }
- }
- if (toRemove != null) {
- for (int i = 0; i < toRemove.size(); i++) {
- makeA2dpSrcUnavailable(toRemove.valueAt(i));
- }
- }
- }
+ disconnectA2dpSink();
break;
case BluetoothProfile.HEADSET:
- synchronized (mScoClients) {
- if (mBluetoothHeadsetDevice != null) {
- setBtScoDeviceConnectionState(mBluetoothHeadsetDevice,
- BluetoothProfile.STATE_DISCONNECTED);
- }
- mBluetoothHeadset = null;
- }
+ disconnectHeadset();
break;
default:
@@ -3223,6 +3185,65 @@ public class AudioService extends IAudioService.Stub {
}
};
+ void disconnectAllBluetoothProfiles() {
+ disconnectA2dp();
+ disconnectA2dpSink();
+ disconnectHeadset();
+ }
+
+ void disconnectA2dp() {
+ synchronized (mConnectedDevices) {
+ synchronized (mA2dpAvrcpLock) {
+ ArraySet<String> toRemove = null;
+ // Disconnect ALL DEVICE_OUT_BLUETOOTH_A2DP devices
+ for (int i = 0; i < mConnectedDevices.size(); i++) {
+ DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i);
+ if (deviceSpec.mDeviceType == AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) {
+ toRemove = toRemove != null ? toRemove : new ArraySet<String>();
+ toRemove.add(deviceSpec.mDeviceAddress);
+ }
+ }
+ if (toRemove != null) {
+ int delay = checkSendBecomingNoisyIntent(
+ AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
+ 0);
+ for (int i = 0; i < toRemove.size(); i++) {
+ makeA2dpDeviceUnavailableLater(toRemove.valueAt(i), delay);
+ }
+ }
+ }
+ }
+ }
+
+ void disconnectA2dpSink() {
+ synchronized (mConnectedDevices) {
+ ArraySet<String> toRemove = null;
+ // Disconnect ALL DEVICE_IN_BLUETOOTH_A2DP devices
+ for(int i = 0; i < mConnectedDevices.size(); i++) {
+ DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i);
+ if (deviceSpec.mDeviceType == AudioSystem.DEVICE_IN_BLUETOOTH_A2DP) {
+ toRemove = toRemove != null ? toRemove : new ArraySet<String>();
+ toRemove.add(deviceSpec.mDeviceAddress);
+ }
+ }
+ if (toRemove != null) {
+ for (int i = 0; i < toRemove.size(); i++) {
+ makeA2dpSrcUnavailable(toRemove.valueAt(i));
+ }
+ }
+ }
+ }
+
+ void disconnectHeadset() {
+ synchronized (mScoClients) {
+ if (mBluetoothHeadsetDevice != null) {
+ setBtScoDeviceConnectionState(mBluetoothHeadsetDevice,
+ BluetoothProfile.STATE_DISCONNECTED);
+ }
+ mBluetoothHeadset = null;
+ }
+ }
+
private void onCheckMusicActive(String caller) {
synchronized (mSafeMediaVolumeState) {
if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE) {
@@ -5228,6 +5249,12 @@ public class AudioService extends IAudioService.Stub {
int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
UserManagerService.getInstance().setUserRestriction(
UserManager.DISALLOW_RECORD_AUDIO, false, userId);
+ } else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
+ state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
+ if (state == BluetoothAdapter.STATE_OFF ||
+ state == BluetoothAdapter.STATE_TURNING_OFF) {
+ disconnectAllBluetoothProfiles();
+ }
}
}
} // end class AudioServiceBroadcastReceiver
@@ -6317,4 +6344,4 @@ public class AudioService extends IAudioService.Stub {
if (DEBUG_VOL) Log.d(TAG, "Reloaded controller service: " + this);
}
}
-}
+} \ No newline at end of file