Loading packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java +9 −3 Original line number Diff line number Diff line Loading @@ -212,15 +212,21 @@ public class BluetoothEventManager { } private void dispatchAudioModeChanged() { mDeviceManager.dispatchAudioModeChanged(); for (CachedBluetoothDevice cachedDevice : mDeviceManager.getCachedDevicesCopy()) { cachedDevice.onAudioModeChanged(); } for (BluetoothCallback callback : mCallbacks) { callback.onAudioModeChanged(); } } private void dispatchActiveDeviceChanged(CachedBluetoothDevice activeDevice, @VisibleForTesting void dispatchActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) { mDeviceManager.onActiveDeviceChanged(activeDevice, bluetoothProfile); for (CachedBluetoothDevice cachedDevice : mDeviceManager.getCachedDevicesCopy()) { boolean isActive = Objects.equals(cachedDevice, activeDevice); cachedDevice.onActiveDeviceChanged(isActive, bluetoothProfile); } for (BluetoothCallback callback : mCallbacks) { callback.onActiveDeviceChanged(activeDevice, bluetoothProfile); } Loading packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +0 −15 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; /** * CachedBluetoothDeviceManager manages the set of remote Bluetooth devices. Loading Loading @@ -229,14 +228,6 @@ public class CachedBluetoothDeviceManager { } } public synchronized void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) { for (CachedBluetoothDevice cachedDevice : mCachedDevices) { boolean isActive = Objects.equals(cachedDevice, activeDevice); cachedDevice.onActiveDeviceChanged(isActive, bluetoothProfile); } } public synchronized boolean onProfileConnectionStateChangedIfProcessed(CachedBluetoothDevice cachedDevice, int state) { return mHearingAidDeviceManager.onProfileConnectionStateChangedIfProcessed(cachedDevice, Loading @@ -257,12 +248,6 @@ public class CachedBluetoothDeviceManager { } } public synchronized void dispatchAudioModeChanged() { for (CachedBluetoothDevice cachedDevice : mCachedDevices) { cachedDevice.onAudioModeChanged(); } } private void log(String msg) { if (DEBUG) { Log.d(TAG, msg); Loading packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java +150 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ */ package com.android.settingslib.bluetooth; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; Loading @@ -41,6 +43,9 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) public class BluetoothEventManagerTest { Loading @@ -54,10 +59,24 @@ public class BluetoothEventManagerTest { private CachedBluetoothDevice mCachedBluetoothDevice; @Mock private BluetoothDevice mBluetoothDevice; @Mock private HeadsetProfile mHfpProfile; @Mock private A2dpProfile mA2dpProfile; @Mock private HearingAidProfile mHearingAidProfile; @Mock private BluetoothDevice mDevice1; @Mock private BluetoothDevice mDevice2; @Mock private LocalBluetoothProfileManager mLocalProfileManager; private Context mContext; private Intent mIntent; private BluetoothEventManager mBluetoothEventManager; private CachedBluetoothDevice mCachedDevice1; private CachedBluetoothDevice mCachedDevice2; @Before public void setUp() { Loading @@ -67,6 +86,12 @@ public class BluetoothEventManagerTest { mBluetoothEventManager = new BluetoothEventManager(mLocalAdapter, mCachedDeviceManager, mContext, /* handler= */ null, /* userHandle= */ null); when(mCachedDeviceManager.findDevice(mBluetoothDevice)).thenReturn(mCachedBluetoothDevice); when(mHfpProfile.isProfileReady()).thenReturn(true); when(mA2dpProfile.isProfileReady()).thenReturn(true); when(mHearingAidProfile.isProfileReady()).thenReturn(true); mCachedDevice1 = new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice1); mCachedDevice2 = new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice2); } @Test Loading Loading @@ -194,4 +219,129 @@ public class BluetoothEventManagerTest { verify(mBluetoothCallback, never()).onAclConnectionStateChanged(mCachedBluetoothDevice, BluetoothAdapter.STATE_CONNECTED); } /** * Test to verify onActiveDeviceChanged(). */ @Test public void dispatchActiveDeviceChanged_connectedDevices_activeDeviceChanged() { final List<CachedBluetoothDevice> cachedDevices = new ArrayList<>(); cachedDevices.add(mCachedDevice1); cachedDevices.add(mCachedDevice2); when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(cachedDevices); // Connect both devices for A2DP and HFP mCachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice2.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice2.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); // Verify that both devices are connected and none is Active assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); // The first device is active for A2DP, the second device is active for HFP mBluetoothEventManager.dispatchActiveDeviceChanged(mCachedDevice1, BluetoothProfile.A2DP); mBluetoothEventManager .dispatchActiveDeviceChanged(mCachedDevice2, BluetoothProfile.HEADSET); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // The first device is active for A2DP and HFP mBluetoothEventManager .dispatchActiveDeviceChanged(mCachedDevice1, BluetoothProfile.HEADSET); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); // The second device is active for A2DP and HFP mBluetoothEventManager.dispatchActiveDeviceChanged(mCachedDevice2, BluetoothProfile.A2DP); mBluetoothEventManager .dispatchActiveDeviceChanged(mCachedDevice2, BluetoothProfile.HEADSET); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // No active device for A2DP mBluetoothEventManager.dispatchActiveDeviceChanged(null, BluetoothProfile.A2DP); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // No active device for HFP mBluetoothEventManager.dispatchActiveDeviceChanged(null, BluetoothProfile.HEADSET); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); } /** * Test to verify onActiveDeviceChanged() with A2DP and Hearing Aid. */ @Test public void dispatchActiveDeviceChanged_withA2dpAndHearingAid() { final List<CachedBluetoothDevice> cachedDevices = new ArrayList<>(); cachedDevices.add(mCachedDevice1); cachedDevices.add(mCachedDevice2); when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(cachedDevices); // Connect device1 for A2DP and HFP and device2 for Hearing Aid mCachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice2.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED); // Verify that both devices are connected and none is Active assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); // The first device is active for A2DP and HFP mBluetoothEventManager.dispatchActiveDeviceChanged(mCachedDevice1, BluetoothProfile.A2DP); mBluetoothEventManager .dispatchActiveDeviceChanged(mCachedDevice1, BluetoothProfile.HEADSET); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); // The second device is active for Hearing Aid and the first device is not active mBluetoothEventManager.dispatchActiveDeviceChanged(null, BluetoothProfile.A2DP); mBluetoothEventManager.dispatchActiveDeviceChanged(null, BluetoothProfile.HEADSET); mBluetoothEventManager .dispatchActiveDeviceChanged(mCachedDevice2, BluetoothProfile.HEARING_AID); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isTrue(); // No active device for Hearing Aid mBluetoothEventManager.dispatchActiveDeviceChanged(null, BluetoothProfile.HEARING_AID); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); } } packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java +0 −123 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import static org.mockito.Mockito.when; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; import org.junit.Before; Loading @@ -50,8 +49,6 @@ public class CachedBluetoothDeviceManagerTest { private final static String DEVICE_ADDRESS_1 = "AA:BB:CC:DD:EE:11"; private final static String DEVICE_ADDRESS_2 = "AA:BB:CC:DD:EE:22"; private final static String DEVICE_ADDRESS_3 = "AA:BB:CC:DD:EE:33"; private final static String DEVICE_SUMMARY_1 = "summary 1"; private final static String DEVICE_SUMMARY_2 = "summary 2"; private final static long HISYNCID1 = 10; private final static long HISYNCID2 = 11; private final BluetoothClass DEVICE_CLASS_1 = Loading Loading @@ -401,124 +398,4 @@ public class CachedBluetoothDeviceManagerTest { when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); assertThat(mCachedDeviceManager.onDeviceDisappeared(cachedDevice1)).isTrue(); } /** * Test to verify onActiveDeviceChanged(). */ @Test public void onActiveDeviceChanged_connectedDevices_activeDeviceChanged() { CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); assertThat(cachedDevice1).isNotNull(); CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); assertThat(cachedDevice2).isNotNull(); when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); // Connect both devices for A2DP and HFP cachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); cachedDevice2.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); cachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); cachedDevice2.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); // Verify that both devices are connected and none is Active assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); // The first device is active for A2DP, the second device is active for HFP mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.A2DP); mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEADSET); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // The first device is active for A2DP and HFP mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.HEADSET); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); // The second device is active for A2DP and HFP mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.A2DP); mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEADSET); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // No active device for A2DP mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.A2DP); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // No active device for HFP mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.HEADSET); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); } /** * Test to verify onActiveDeviceChanged() with A2DP and Hearing Aid. */ @Test public void onActiveDeviceChanged_withA2dpAndHearingAid() { CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); assertThat(cachedDevice1).isNotNull(); CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); assertThat(cachedDevice2).isNotNull(); when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); // Connect device1 for A2DP and HFP and device2 for Hearing Aid cachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); cachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); cachedDevice2.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED); // Verify that both devices are connected and none is Active assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); // The first device is active for A2DP and HFP mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.A2DP); mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.HEADSET); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); // The second device is active for Hearing Aid and the first device is not active mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.A2DP); mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.HEADSET); mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEARING_AID); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isTrue(); // No active device for Hearing Aid mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.HEARING_AID); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); } } Loading
packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java +9 −3 Original line number Diff line number Diff line Loading @@ -212,15 +212,21 @@ public class BluetoothEventManager { } private void dispatchAudioModeChanged() { mDeviceManager.dispatchAudioModeChanged(); for (CachedBluetoothDevice cachedDevice : mDeviceManager.getCachedDevicesCopy()) { cachedDevice.onAudioModeChanged(); } for (BluetoothCallback callback : mCallbacks) { callback.onAudioModeChanged(); } } private void dispatchActiveDeviceChanged(CachedBluetoothDevice activeDevice, @VisibleForTesting void dispatchActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) { mDeviceManager.onActiveDeviceChanged(activeDevice, bluetoothProfile); for (CachedBluetoothDevice cachedDevice : mDeviceManager.getCachedDevicesCopy()) { boolean isActive = Objects.equals(cachedDevice, activeDevice); cachedDevice.onActiveDeviceChanged(isActive, bluetoothProfile); } for (BluetoothCallback callback : mCallbacks) { callback.onActiveDeviceChanged(activeDevice, bluetoothProfile); } Loading
packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +0 −15 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; /** * CachedBluetoothDeviceManager manages the set of remote Bluetooth devices. Loading Loading @@ -229,14 +228,6 @@ public class CachedBluetoothDeviceManager { } } public synchronized void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) { for (CachedBluetoothDevice cachedDevice : mCachedDevices) { boolean isActive = Objects.equals(cachedDevice, activeDevice); cachedDevice.onActiveDeviceChanged(isActive, bluetoothProfile); } } public synchronized boolean onProfileConnectionStateChangedIfProcessed(CachedBluetoothDevice cachedDevice, int state) { return mHearingAidDeviceManager.onProfileConnectionStateChangedIfProcessed(cachedDevice, Loading @@ -257,12 +248,6 @@ public class CachedBluetoothDeviceManager { } } public synchronized void dispatchAudioModeChanged() { for (CachedBluetoothDevice cachedDevice : mCachedDevices) { cachedDevice.onAudioModeChanged(); } } private void log(String msg) { if (DEBUG) { Log.d(TAG, msg); Loading
packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java +150 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ */ package com.android.settingslib.bluetooth; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; Loading @@ -41,6 +43,9 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) public class BluetoothEventManagerTest { Loading @@ -54,10 +59,24 @@ public class BluetoothEventManagerTest { private CachedBluetoothDevice mCachedBluetoothDevice; @Mock private BluetoothDevice mBluetoothDevice; @Mock private HeadsetProfile mHfpProfile; @Mock private A2dpProfile mA2dpProfile; @Mock private HearingAidProfile mHearingAidProfile; @Mock private BluetoothDevice mDevice1; @Mock private BluetoothDevice mDevice2; @Mock private LocalBluetoothProfileManager mLocalProfileManager; private Context mContext; private Intent mIntent; private BluetoothEventManager mBluetoothEventManager; private CachedBluetoothDevice mCachedDevice1; private CachedBluetoothDevice mCachedDevice2; @Before public void setUp() { Loading @@ -67,6 +86,12 @@ public class BluetoothEventManagerTest { mBluetoothEventManager = new BluetoothEventManager(mLocalAdapter, mCachedDeviceManager, mContext, /* handler= */ null, /* userHandle= */ null); when(mCachedDeviceManager.findDevice(mBluetoothDevice)).thenReturn(mCachedBluetoothDevice); when(mHfpProfile.isProfileReady()).thenReturn(true); when(mA2dpProfile.isProfileReady()).thenReturn(true); when(mHearingAidProfile.isProfileReady()).thenReturn(true); mCachedDevice1 = new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice1); mCachedDevice2 = new CachedBluetoothDevice(mContext, mLocalProfileManager, mDevice2); } @Test Loading Loading @@ -194,4 +219,129 @@ public class BluetoothEventManagerTest { verify(mBluetoothCallback, never()).onAclConnectionStateChanged(mCachedBluetoothDevice, BluetoothAdapter.STATE_CONNECTED); } /** * Test to verify onActiveDeviceChanged(). */ @Test public void dispatchActiveDeviceChanged_connectedDevices_activeDeviceChanged() { final List<CachedBluetoothDevice> cachedDevices = new ArrayList<>(); cachedDevices.add(mCachedDevice1); cachedDevices.add(mCachedDevice2); when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(cachedDevices); // Connect both devices for A2DP and HFP mCachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice2.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice2.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); // Verify that both devices are connected and none is Active assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); // The first device is active for A2DP, the second device is active for HFP mBluetoothEventManager.dispatchActiveDeviceChanged(mCachedDevice1, BluetoothProfile.A2DP); mBluetoothEventManager .dispatchActiveDeviceChanged(mCachedDevice2, BluetoothProfile.HEADSET); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // The first device is active for A2DP and HFP mBluetoothEventManager .dispatchActiveDeviceChanged(mCachedDevice1, BluetoothProfile.HEADSET); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); // The second device is active for A2DP and HFP mBluetoothEventManager.dispatchActiveDeviceChanged(mCachedDevice2, BluetoothProfile.A2DP); mBluetoothEventManager .dispatchActiveDeviceChanged(mCachedDevice2, BluetoothProfile.HEADSET); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // No active device for A2DP mBluetoothEventManager.dispatchActiveDeviceChanged(null, BluetoothProfile.A2DP); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // No active device for HFP mBluetoothEventManager.dispatchActiveDeviceChanged(null, BluetoothProfile.HEADSET); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); } /** * Test to verify onActiveDeviceChanged() with A2DP and Hearing Aid. */ @Test public void dispatchActiveDeviceChanged_withA2dpAndHearingAid() { final List<CachedBluetoothDevice> cachedDevices = new ArrayList<>(); cachedDevices.add(mCachedDevice1); cachedDevices.add(mCachedDevice2); when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(cachedDevices); // Connect device1 for A2DP and HFP and device2 for Hearing Aid mCachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice2.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED); // Verify that both devices are connected and none is Active assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); // The first device is active for A2DP and HFP mBluetoothEventManager.dispatchActiveDeviceChanged(mCachedDevice1, BluetoothProfile.A2DP); mBluetoothEventManager .dispatchActiveDeviceChanged(mCachedDevice1, BluetoothProfile.HEADSET); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); // The second device is active for Hearing Aid and the first device is not active mBluetoothEventManager.dispatchActiveDeviceChanged(null, BluetoothProfile.A2DP); mBluetoothEventManager.dispatchActiveDeviceChanged(null, BluetoothProfile.HEADSET); mBluetoothEventManager .dispatchActiveDeviceChanged(mCachedDevice2, BluetoothProfile.HEARING_AID); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isTrue(); // No active device for Hearing Aid mBluetoothEventManager.dispatchActiveDeviceChanged(null, BluetoothProfile.HEARING_AID); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); } }
packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java +0 −123 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import static org.mockito.Mockito.when; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; import org.junit.Before; Loading @@ -50,8 +49,6 @@ public class CachedBluetoothDeviceManagerTest { private final static String DEVICE_ADDRESS_1 = "AA:BB:CC:DD:EE:11"; private final static String DEVICE_ADDRESS_2 = "AA:BB:CC:DD:EE:22"; private final static String DEVICE_ADDRESS_3 = "AA:BB:CC:DD:EE:33"; private final static String DEVICE_SUMMARY_1 = "summary 1"; private final static String DEVICE_SUMMARY_2 = "summary 2"; private final static long HISYNCID1 = 10; private final static long HISYNCID2 = 11; private final BluetoothClass DEVICE_CLASS_1 = Loading Loading @@ -401,124 +398,4 @@ public class CachedBluetoothDeviceManagerTest { when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); assertThat(mCachedDeviceManager.onDeviceDisappeared(cachedDevice1)).isTrue(); } /** * Test to verify onActiveDeviceChanged(). */ @Test public void onActiveDeviceChanged_connectedDevices_activeDeviceChanged() { CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); assertThat(cachedDevice1).isNotNull(); CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); assertThat(cachedDevice2).isNotNull(); when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); // Connect both devices for A2DP and HFP cachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); cachedDevice2.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); cachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); cachedDevice2.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); // Verify that both devices are connected and none is Active assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); // The first device is active for A2DP, the second device is active for HFP mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.A2DP); mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEADSET); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // The first device is active for A2DP and HFP mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.HEADSET); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); // The second device is active for A2DP and HFP mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.A2DP); mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEADSET); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // No active device for A2DP mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.A2DP); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); // No active device for HFP mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.HEADSET); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); } /** * Test to verify onActiveDeviceChanged() with A2DP and Hearing Aid. */ @Test public void onActiveDeviceChanged_withA2dpAndHearingAid() { CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); assertThat(cachedDevice1).isNotNull(); CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); assertThat(cachedDevice2).isNotNull(); when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); // Connect device1 for A2DP and HFP and device2 for Hearing Aid cachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); cachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); cachedDevice2.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED); // Verify that both devices are connected and none is Active assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); // The first device is active for A2DP and HFP mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.A2DP); mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.HEADSET); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); // The second device is active for Hearing Aid and the first device is not active mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.A2DP); mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.HEADSET); mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEARING_AID); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isTrue(); // No active device for Hearing Aid mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.HEARING_AID); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); } }