Loading android/app/src/com/android/bluetooth/btservice/ActiveDeviceManager.java +37 −26 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ import com.android.bluetooth.hfp.HeadsetService; import com.android.bluetooth.le_audio.LeAudioService; import com.android.internal.annotations.VisibleForTesting; import java.util.LinkedList; import java.util.ArrayList; import java.util.List; import java.util.Objects; Loading Loading @@ -131,11 +131,12 @@ class ActiveDeviceManager { private final AudioManager mAudioManager; private final AudioManagerAudioDeviceCallback mAudioManagerAudioDeviceCallback; private final List<BluetoothDevice> mA2dpConnectedDevices = new LinkedList<>(); private final List<BluetoothDevice> mHfpConnectedDevices = new LinkedList<>(); private final List<BluetoothDevice> mHearingAidConnectedDevices = new LinkedList<>(); private final List<BluetoothDevice> mLeAudioConnectedDevices = new LinkedList<>(); private final List<BluetoothDevice> mLeHearingAidConnectedDevices = new LinkedList<>(); private final List<BluetoothDevice> mA2dpConnectedDevices = new ArrayList<>(); private final List<BluetoothDevice> mHfpConnectedDevices = new ArrayList<>(); private final List<BluetoothDevice> mHearingAidConnectedDevices = new ArrayList<>(); private final List<BluetoothDevice> mLeAudioConnectedDevices = new ArrayList<>(); private final List<BluetoothDevice> mLeHearingAidConnectedDevices = new ArrayList<>(); private List<BluetoothDevice> mPendingLeHearingAidActiveDevice = new ArrayList<>(); private BluetoothDevice mA2dpActiveDevice = null; private BluetoothDevice mHfpActiveDevice = null; private BluetoothDevice mHearingAidActiveDevice = null; Loading Loading @@ -432,11 +433,17 @@ class ActiveDeviceManager { break; // The device is already connected } mLeAudioConnectedDevices.add(device); if (mHearingAidActiveDevice == null && mLeHearingAidActiveDevice == null) { if (mHearingAidActiveDevice == null && mLeHearingAidActiveDevice == null && mPendingLeHearingAidActiveDevice.isEmpty()) { // New connected device: select it as active setLeAudioActiveDevice(device); setA2dpActiveDevice(null); setHfpActiveDevice(null); } else if (mPendingLeHearingAidActiveDevice.contains(device)) { setLeHearingAidActiveDevice(device); setHearingAidActiveDevice(null); setA2dpActiveDevice(null); setHfpActiveDevice(null); } break; } Loading @@ -447,6 +454,7 @@ class ActiveDeviceManager { + "_CHANGED): device " + device + " disconnected"); } mLeAudioConnectedDevices.remove(device); mLeHearingAidConnectedDevices.remove(device); if (Objects.equals(mLeAudioActiveDevice, device)) { if (mLeAudioConnectedDevices.isEmpty()) { setLeAudioActiveDevice(null); Loading Loading @@ -499,12 +507,16 @@ class ActiveDeviceManager { } mLeHearingAidConnectedDevices.add(device); if (!mLeAudioConnectedDevices.contains(device)) { mLeAudioConnectedDevices.add(device); } mPendingLeHearingAidActiveDevice.add(device); } else if (Objects.equals(mLeAudioActiveDevice, device)) { mLeHearingAidActiveDevice = device; } else { // New connected device: select it as active setLeHearingAidActiveDevice(device); setHearingAidActiveDevice(null); setA2dpActiveDevice(null); setHfpActiveDevice(null); } break; } if (prevState == BluetoothProfile.STATE_CONNECTED) { Loading @@ -514,15 +526,9 @@ class ActiveDeviceManager { + "_CHANGED): device " + device + " disconnected"); } mLeHearingAidConnectedDevices.remove(device); mLeAudioConnectedDevices.remove(device); // mLeAudioConnectedDevices should contain all of // mLeHearingAidConnectedDevices. Call setLeAudioActiveDevice(null) // only if there are no LE audio devices. mPendingLeHearingAidActiveDevice.remove(device); if (Objects.equals(mLeHearingAidActiveDevice, device)) { if (mLeAudioConnectedDevices.isEmpty()) { setLeAudioActiveDevice(null); } setFallbackDeviceActive(); mLeHearingAidActiveDevice = null; } } } Loading @@ -532,8 +538,8 @@ class ActiveDeviceManager { Intent intent = (Intent) msg.obj; BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device != null && !mLeAudioConnectedDevices.contains(device)) { mLeAudioConnectedDevices.add(device); if (device != null && !mLeHearingAidConnectedDevices.contains(device)) { mLeHearingAidConnectedDevices.add(device); } if (DBG) { Log.d(TAG, "handleMessage(MESSAGE_HAP_ACTION_ACTIVE_DEVICE_CHANGED): " Loading Loading @@ -711,14 +717,18 @@ class ActiveDeviceManager { mLeAudioActiveDevice = device; if (device == null) { mLeHearingAidActiveDevice = null; mPendingLeHearingAidActiveDevice.remove(device); } } private void setLeHearingAidActiveDevice(BluetoothDevice device) { if (!Objects.equals(mLeAudioActiveDevice, device)) { setLeAudioActiveDevice(device); if (mLeAudioActiveDevice == device) { } if (Objects.equals(mLeAudioActiveDevice, device)) { // setLeAudioActiveDevice succeed mLeHearingAidActiveDevice = device; mPendingLeHearingAidActiveDevice.remove(device); } } Loading @@ -730,7 +740,7 @@ class ActiveDeviceManager { if (dbManager == null) { return; } List<BluetoothDevice> connectedHearingAidDevices = new LinkedList<>(); List<BluetoothDevice> connectedHearingAidDevices = new ArrayList<>(); if (!mHearingAidConnectedDevices.isEmpty()) { connectedHearingAidDevices.addAll(mHearingAidConnectedDevices); } Loading Loading @@ -774,7 +784,7 @@ class ActiveDeviceManager { headsetFallbackDevice = headsetService.getFallbackDevice(); } List<BluetoothDevice> connectedDevices = new LinkedList<>(); List<BluetoothDevice> connectedDevices = new ArrayList<>(); connectedDevices.addAll(mLeAudioConnectedDevices); switch (mAudioManager.getMode()) { case AudioManager.MODE_NORMAL: Loading Loading @@ -849,6 +859,7 @@ class ActiveDeviceManager { mLeHearingAidConnectedDevices.clear(); mLeHearingAidActiveDevice = null; mPendingLeHearingAidActiveDevice.clear(); } @VisibleForTesting Loading android/app/tests/unit/src/com/android/bluetooth/btservice/ActiveDeviceManagerTest.java +8 −1 Original line number Diff line number Diff line Loading @@ -600,8 +600,12 @@ public class ActiveDeviceManagerTest { * One LE Hearing Aid is connected. */ @Test public void onlyLeHearingAIdConnected_setLeAudioActive() { public void onlyLeHearingAidConnected_setLeAudioActive() { leHearingAidConnected(mLeHearingAidDevice); TestUtils.waitForLooperToFinishScheduledTask(mActiveDeviceManager.getHandlerLooper()); verify(mLeAudioService, never()).setActiveDevice(mLeHearingAidDevice); leAudioConnected(mLeHearingAidDevice); verify(mLeAudioService, timeout(TIMEOUT_MS)).setActiveDevice(mLeHearingAidDevice); } Loading @@ -612,6 +616,7 @@ public class ActiveDeviceManagerTest { @Test public void leAudioConnectedAfterLeHearingAid_setLeAudioActiveShouldNotBeCalled() { leHearingAidConnected(mLeHearingAidDevice); leAudioConnected(mLeHearingAidDevice); verify(mLeAudioService, timeout(TIMEOUT_MS)).setActiveDevice(mLeHearingAidDevice); leAudioConnected(mLeAudioDevice); Loading @@ -632,6 +637,7 @@ public class ActiveDeviceManagerTest { verify(mHearingAidService, timeout(TIMEOUT_MS)).setActiveDevice(mHearingAidDevice); leHearingAidConnected(mLeHearingAidDevice); leAudioConnected(mLeHearingAidDevice); verify(mLeAudioService, timeout(TIMEOUT_MS)).setActiveDevice(mLeHearingAidDevice); a2dpConnected(mA2dpDevice); Loading @@ -640,6 +646,7 @@ public class ActiveDeviceManagerTest { Mockito.clearInvocations(mHearingAidService, mA2dpService); leHearingAidDisconnected(mLeHearingAidDevice); leAudioDisconnected(mLeHearingAidDevice); verify(mHearingAidService, timeout(TIMEOUT_MS)).setActiveDevice(mHearingAidDevice); verify(mA2dpService, timeout(TIMEOUT_MS)).setActiveDevice(isNull()); Loading Loading
android/app/src/com/android/bluetooth/btservice/ActiveDeviceManager.java +37 −26 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ import com.android.bluetooth.hfp.HeadsetService; import com.android.bluetooth.le_audio.LeAudioService; import com.android.internal.annotations.VisibleForTesting; import java.util.LinkedList; import java.util.ArrayList; import java.util.List; import java.util.Objects; Loading Loading @@ -131,11 +131,12 @@ class ActiveDeviceManager { private final AudioManager mAudioManager; private final AudioManagerAudioDeviceCallback mAudioManagerAudioDeviceCallback; private final List<BluetoothDevice> mA2dpConnectedDevices = new LinkedList<>(); private final List<BluetoothDevice> mHfpConnectedDevices = new LinkedList<>(); private final List<BluetoothDevice> mHearingAidConnectedDevices = new LinkedList<>(); private final List<BluetoothDevice> mLeAudioConnectedDevices = new LinkedList<>(); private final List<BluetoothDevice> mLeHearingAidConnectedDevices = new LinkedList<>(); private final List<BluetoothDevice> mA2dpConnectedDevices = new ArrayList<>(); private final List<BluetoothDevice> mHfpConnectedDevices = new ArrayList<>(); private final List<BluetoothDevice> mHearingAidConnectedDevices = new ArrayList<>(); private final List<BluetoothDevice> mLeAudioConnectedDevices = new ArrayList<>(); private final List<BluetoothDevice> mLeHearingAidConnectedDevices = new ArrayList<>(); private List<BluetoothDevice> mPendingLeHearingAidActiveDevice = new ArrayList<>(); private BluetoothDevice mA2dpActiveDevice = null; private BluetoothDevice mHfpActiveDevice = null; private BluetoothDevice mHearingAidActiveDevice = null; Loading Loading @@ -432,11 +433,17 @@ class ActiveDeviceManager { break; // The device is already connected } mLeAudioConnectedDevices.add(device); if (mHearingAidActiveDevice == null && mLeHearingAidActiveDevice == null) { if (mHearingAidActiveDevice == null && mLeHearingAidActiveDevice == null && mPendingLeHearingAidActiveDevice.isEmpty()) { // New connected device: select it as active setLeAudioActiveDevice(device); setA2dpActiveDevice(null); setHfpActiveDevice(null); } else if (mPendingLeHearingAidActiveDevice.contains(device)) { setLeHearingAidActiveDevice(device); setHearingAidActiveDevice(null); setA2dpActiveDevice(null); setHfpActiveDevice(null); } break; } Loading @@ -447,6 +454,7 @@ class ActiveDeviceManager { + "_CHANGED): device " + device + " disconnected"); } mLeAudioConnectedDevices.remove(device); mLeHearingAidConnectedDevices.remove(device); if (Objects.equals(mLeAudioActiveDevice, device)) { if (mLeAudioConnectedDevices.isEmpty()) { setLeAudioActiveDevice(null); Loading Loading @@ -499,12 +507,16 @@ class ActiveDeviceManager { } mLeHearingAidConnectedDevices.add(device); if (!mLeAudioConnectedDevices.contains(device)) { mLeAudioConnectedDevices.add(device); } mPendingLeHearingAidActiveDevice.add(device); } else if (Objects.equals(mLeAudioActiveDevice, device)) { mLeHearingAidActiveDevice = device; } else { // New connected device: select it as active setLeHearingAidActiveDevice(device); setHearingAidActiveDevice(null); setA2dpActiveDevice(null); setHfpActiveDevice(null); } break; } if (prevState == BluetoothProfile.STATE_CONNECTED) { Loading @@ -514,15 +526,9 @@ class ActiveDeviceManager { + "_CHANGED): device " + device + " disconnected"); } mLeHearingAidConnectedDevices.remove(device); mLeAudioConnectedDevices.remove(device); // mLeAudioConnectedDevices should contain all of // mLeHearingAidConnectedDevices. Call setLeAudioActiveDevice(null) // only if there are no LE audio devices. mPendingLeHearingAidActiveDevice.remove(device); if (Objects.equals(mLeHearingAidActiveDevice, device)) { if (mLeAudioConnectedDevices.isEmpty()) { setLeAudioActiveDevice(null); } setFallbackDeviceActive(); mLeHearingAidActiveDevice = null; } } } Loading @@ -532,8 +538,8 @@ class ActiveDeviceManager { Intent intent = (Intent) msg.obj; BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device != null && !mLeAudioConnectedDevices.contains(device)) { mLeAudioConnectedDevices.add(device); if (device != null && !mLeHearingAidConnectedDevices.contains(device)) { mLeHearingAidConnectedDevices.add(device); } if (DBG) { Log.d(TAG, "handleMessage(MESSAGE_HAP_ACTION_ACTIVE_DEVICE_CHANGED): " Loading Loading @@ -711,14 +717,18 @@ class ActiveDeviceManager { mLeAudioActiveDevice = device; if (device == null) { mLeHearingAidActiveDevice = null; mPendingLeHearingAidActiveDevice.remove(device); } } private void setLeHearingAidActiveDevice(BluetoothDevice device) { if (!Objects.equals(mLeAudioActiveDevice, device)) { setLeAudioActiveDevice(device); if (mLeAudioActiveDevice == device) { } if (Objects.equals(mLeAudioActiveDevice, device)) { // setLeAudioActiveDevice succeed mLeHearingAidActiveDevice = device; mPendingLeHearingAidActiveDevice.remove(device); } } Loading @@ -730,7 +740,7 @@ class ActiveDeviceManager { if (dbManager == null) { return; } List<BluetoothDevice> connectedHearingAidDevices = new LinkedList<>(); List<BluetoothDevice> connectedHearingAidDevices = new ArrayList<>(); if (!mHearingAidConnectedDevices.isEmpty()) { connectedHearingAidDevices.addAll(mHearingAidConnectedDevices); } Loading Loading @@ -774,7 +784,7 @@ class ActiveDeviceManager { headsetFallbackDevice = headsetService.getFallbackDevice(); } List<BluetoothDevice> connectedDevices = new LinkedList<>(); List<BluetoothDevice> connectedDevices = new ArrayList<>(); connectedDevices.addAll(mLeAudioConnectedDevices); switch (mAudioManager.getMode()) { case AudioManager.MODE_NORMAL: Loading Loading @@ -849,6 +859,7 @@ class ActiveDeviceManager { mLeHearingAidConnectedDevices.clear(); mLeHearingAidActiveDevice = null; mPendingLeHearingAidActiveDevice.clear(); } @VisibleForTesting Loading
android/app/tests/unit/src/com/android/bluetooth/btservice/ActiveDeviceManagerTest.java +8 −1 Original line number Diff line number Diff line Loading @@ -600,8 +600,12 @@ public class ActiveDeviceManagerTest { * One LE Hearing Aid is connected. */ @Test public void onlyLeHearingAIdConnected_setLeAudioActive() { public void onlyLeHearingAidConnected_setLeAudioActive() { leHearingAidConnected(mLeHearingAidDevice); TestUtils.waitForLooperToFinishScheduledTask(mActiveDeviceManager.getHandlerLooper()); verify(mLeAudioService, never()).setActiveDevice(mLeHearingAidDevice); leAudioConnected(mLeHearingAidDevice); verify(mLeAudioService, timeout(TIMEOUT_MS)).setActiveDevice(mLeHearingAidDevice); } Loading @@ -612,6 +616,7 @@ public class ActiveDeviceManagerTest { @Test public void leAudioConnectedAfterLeHearingAid_setLeAudioActiveShouldNotBeCalled() { leHearingAidConnected(mLeHearingAidDevice); leAudioConnected(mLeHearingAidDevice); verify(mLeAudioService, timeout(TIMEOUT_MS)).setActiveDevice(mLeHearingAidDevice); leAudioConnected(mLeAudioDevice); Loading @@ -632,6 +637,7 @@ public class ActiveDeviceManagerTest { verify(mHearingAidService, timeout(TIMEOUT_MS)).setActiveDevice(mHearingAidDevice); leHearingAidConnected(mLeHearingAidDevice); leAudioConnected(mLeHearingAidDevice); verify(mLeAudioService, timeout(TIMEOUT_MS)).setActiveDevice(mLeHearingAidDevice); a2dpConnected(mA2dpDevice); Loading @@ -640,6 +646,7 @@ public class ActiveDeviceManagerTest { Mockito.clearInvocations(mHearingAidService, mA2dpService); leHearingAidDisconnected(mLeHearingAidDevice); leAudioDisconnected(mLeHearingAidDevice); verify(mHearingAidService, timeout(TIMEOUT_MS)).setActiveDevice(mHearingAidDevice); verify(mA2dpService, timeout(TIMEOUT_MS)).setActiveDevice(isNull()); Loading