From ddcb7dfb5e8d304d9c87f5fb2c80fb7d0d507801 Mon Sep 17 00:00:00 2001 From: Amin Shaikh Date: Thu, 5 Apr 2018 14:05:56 -0400 Subject: [PATCH] Listen for bluetooth audio changes in system ui. Update the connected state of bluetooth devices upon audio state changes. This will increase the likelihood that the connected state of all bluetooth devices are up to date. Change-Id: I239626ca5241210b6ab82f60273a87c1863d1dbb Fixes: 77498698 Test: manual --- .../LocalBluetoothProfileManager.java | 52 +++++++++++++++++-- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java index 34a099cb7ea07..00ee575492c29 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java @@ -195,8 +195,10 @@ public class LocalBluetoothProfileManager { if (DEBUG) Log.d(TAG, "Adding local HEADSET profile"); mHeadsetProfile = new HeadsetProfile(mContext, mLocalAdapter, mDeviceManager, this); - addProfile(mHeadsetProfile, HeadsetProfile.NAME, - BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED); + addHeadsetProfile(mHeadsetProfile, HeadsetProfile.NAME, + BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED, + BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED, + BluetoothHeadset.STATE_AUDIO_DISCONNECTED); } } else if (mHeadsetProfile != null) { Log.w(TAG, "Warning: HEADSET profile was previously added but the UUID is now missing."); @@ -208,8 +210,10 @@ public class LocalBluetoothProfileManager { if(DEBUG) Log.d(TAG, "Adding local HfpClient profile"); mHfpClientProfile = new HfpClientProfile(mContext, mLocalAdapter, mDeviceManager, this); - addProfile(mHfpClientProfile, HfpClientProfile.NAME, - BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED); + addHeadsetProfile(mHfpClientProfile, HfpClientProfile.NAME, + BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED, + BluetoothHeadsetClient.ACTION_AUDIO_STATE_CHANGED, + BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED); } } else if (mHfpClientProfile != null) { Log.w(TAG, @@ -277,6 +281,15 @@ public class LocalBluetoothProfileManager { // There is no local SDP record for HID and Settings app doesn't control PBAP Server. } + private void addHeadsetProfile(LocalBluetoothProfile profile, String profileName, + String stateChangedAction, String audioStateChangedAction, int audioDisconnectedState) { + BluetoothEventManager.Handler handler = new HeadsetStateChangeHandler( + profile, audioStateChangedAction, audioDisconnectedState); + mEventManager.addProfileHandler(stateChangedAction, handler); + mEventManager.addProfileHandler(audioStateChangedAction, handler); + mProfileNameMap.put(profileName, profile); + } + private final Collection mServiceListeners = new ArrayList(); @@ -323,18 +336,47 @@ public class LocalBluetoothProfileManager { cachedDevice = mDeviceManager.addDevice(mLocalAdapter, LocalBluetoothProfileManager.this, device); } + onReceiveInternal(intent, cachedDevice); + } + + protected void onReceiveInternal(Intent intent, CachedBluetoothDevice cachedDevice) { int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, 0); int oldState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, 0); if (newState == BluetoothProfile.STATE_DISCONNECTED && oldState == BluetoothProfile.STATE_CONNECTING) { Log.i(TAG, "Failed to connect " + mProfile + " device"); } - cachedDevice.onProfileStateChanged(mProfile, newState); cachedDevice.refresh(); } } + /** Connectivity and audio state change handler for headset profiles. */ + private class HeadsetStateChangeHandler extends StateChangedHandler { + private final String mAudioChangeAction; + private final int mAudioDisconnectedState; + + HeadsetStateChangeHandler(LocalBluetoothProfile profile, String audioChangeAction, + int audioDisconnectedState) { + super(profile); + mAudioChangeAction = audioChangeAction; + mAudioDisconnectedState = audioDisconnectedState; + } + + @Override + public void onReceiveInternal(Intent intent, CachedBluetoothDevice cachedDevice) { + if (mAudioChangeAction.equals(intent.getAction())) { + int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, 0); + if (newState != mAudioDisconnectedState) { + cachedDevice.onProfileStateChanged(mProfile, BluetoothProfile.STATE_CONNECTED); + } + cachedDevice.refresh(); + } else { + super.onReceiveInternal(intent, cachedDevice); + } + } + } + /** State change handler for NAP and PANU profiles. */ private class PanStateChangedHandler extends StateChangedHandler {