Loading android/app/src/com/android/bluetooth/hearingaid/HearingAidService.java +26 −2 Original line number Diff line number Diff line Loading @@ -111,6 +111,10 @@ public class HearingAidService extends ProfileService { mStateMachinesThread = new HandlerThread("HearingAidService.StateMachines"); mStateMachinesThread.start(); // Clear HiSyncId map and capabilities map mDeviceHiSyncIdMap.clear(); mDeviceCapabilitiesMap.clear(); // Setup broadcast receivers IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); Loading Loading @@ -162,6 +166,10 @@ public class HearingAidService extends ProfileService { mStateMachines.clear(); } // Clear HiSyncId map and capabilities map mDeviceHiSyncIdMap.clear(); mDeviceCapabilitiesMap.clear(); if (mStateMachinesThread != null) { mStateMachinesThread.quitSafely(); mStateMachinesThread = null; Loading Loading @@ -227,13 +235,26 @@ public class HearingAidService extends ProfileService { long hiSyncId = mDeviceHiSyncIdMap.getOrDefault(device, BluetoothHearingAid.HI_SYNC_ID_INVALID); if (hiSyncId != mActiveDeviceHiSyncId) { if (hiSyncId != mActiveDeviceHiSyncId && hiSyncId != BluetoothHearingAid.HI_SYNC_ID_INVALID && mActiveDeviceHiSyncId != BluetoothHearingAid.HI_SYNC_ID_INVALID) { for (BluetoothDevice connectedDevice : getConnectedDevices()) { disconnect(connectedDevice); } } synchronized (mStateMachines) { HearingAidStateMachine smConnect = getOrCreateStateMachine(device); if (smConnect == null) { Log.e(TAG, "Cannot connect to " + device + " : no state machine"); } smConnect.sendMessage(HearingAidStateMachine.CONNECT); } for (BluetoothDevice storedDevice : mDeviceHiSyncIdMap.keySet()) { if (device.equals(storedDevice)) { continue; } if (mDeviceHiSyncIdMap.getOrDefault(storedDevice, BluetoothHearingAid.HI_SYNC_ID_INVALID) == hiSyncId) { synchronized (mStateMachines) { Loading @@ -243,7 +264,6 @@ public class HearingAidService extends ProfileService { continue; } sm.sendMessage(HearingAidStateMachine.CONNECT); } if (hiSyncId == BluetoothHearingAid.HI_SYNC_ID_INVALID && !device.equals(storedDevice)) { Loading Loading @@ -511,6 +531,10 @@ public class HearingAidService extends ProfileService { BluetoothDevice device = stackEvent.device; int capabilities = stackEvent.valueInt1; long hiSyncId = stackEvent.valueLong2; if (DBG) { Log.d(TAG, "Device available: device=" + device + " capabilities=" + capabilities + " hiSyncId=" + hiSyncId); } mDeviceCapabilitiesMap.put(device, capabilities); mDeviceHiSyncIdMap.put(device, hiSyncId); return; Loading android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidServiceTest.java +172 −20 Original line number Diff line number Diff line Loading @@ -115,19 +115,6 @@ public class HearingAidServiceTest { mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_UNDEFINED); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_UNDEFINED); mService.setPriority(mSingleDevice, BluetoothProfile.PRIORITY_UNDEFINED); HearingAidStackEvent event = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_DEVICE_AVAILABLE); event.device = mLeftDevice; event.valueInt1 = 0x02; event.valueLong2 = 0x0101; mService.messageFromNative(event); event.device = mRightDevice; event.valueInt1 = 0x03; mService.messageFromNative(event); event.device = mSingleDevice; event.valueInt1 = 0x00; event.valueLong2 = 0x0102; mService.messageFromNative(event); doReturn(BluetoothDevice.BOND_BONDED).when(mAdapterService) .getBondState(any(BluetoothDevice.class)); doReturn(new ParcelUuid[]{BluetoothUuid.HearingAid}).when(mAdapterService) Loading Loading @@ -408,8 +395,8 @@ public class HearingAidServiceTest { */ @Test public void testConnectAPair_connectBothDevices() { HearingAidStackEvent connCompletedEvent; // Update hiSyncId map getHiSyncIdFromNative(); // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); Loading @@ -436,8 +423,8 @@ public class HearingAidServiceTest { */ @Test public void testConnectAnotherPair_disconnectCurrentPair() { HearingAidStackEvent connCompletedEvent; // Update hiSyncId map getHiSyncIdFromNative(); // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); Loading @@ -454,7 +441,7 @@ public class HearingAidServiceTest { verifyConnectionStateIntent(TIMEOUT_MS, mRightDevice, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_DISCONNECTED); HearingAidStackEvent connCompletedEvent; // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); Loading Loading @@ -496,8 +483,8 @@ public class HearingAidServiceTest { */ @Test public void testAudioManagerConnectDisconnect() { HearingAidStackEvent connCompletedEvent; // Update hiSyncId map getHiSyncIdFromNative(); // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); Loading @@ -519,6 +506,7 @@ public class HearingAidServiceTest { Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, mService.getConnectionState(mRightDevice)); HearingAidStackEvent connCompletedEvent; // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); Loading Loading @@ -769,6 +757,8 @@ public class HearingAidServiceTest { @Test public void testConnectionStateChangedActiveDevice() { // Update hiSyncId map getHiSyncIdFromNative(); // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); Loading Loading @@ -797,6 +787,8 @@ public class HearingAidServiceTest { @Test public void testConnectionStateChangedAnotherActiveDevice() { // Update hiSyncId map getHiSyncIdFromNative(); // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); Loading @@ -819,6 +811,151 @@ public class HearingAidServiceTest { Assert.assertTrue(mService.getActiveDevices().contains(mSingleDevice)); } /** * Verify the correctness during first time connection. * Connect to left device -> Get left device hiSyncId -> Connect to right device -> * Get right device hiSyncId -> Both devices should be always connected */ @Test public void firstTimeConnection_shouldConnectToBothDevices() { // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); doReturn(true).when(mNativeInterface).connectHearingAid(any(BluetoothDevice.class)); doReturn(true).when(mNativeInterface).disconnectHearingAid(any(BluetoothDevice.class)); // Send a connect request for left device Assert.assertTrue("Connect failed", mService.connect(mLeftDevice)); // Verify the connection state broadcast, and that we are in Connecting state verifyConnectionStateIntent(TIMEOUT_MS, mLeftDevice, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_DISCONNECTED); Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, mService.getConnectionState(mLeftDevice)); HearingAidStackEvent connCompletedEvent; // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); connCompletedEvent.device = mLeftDevice; connCompletedEvent.valueInt1 = HearingAidStackEvent.CONNECTION_STATE_CONNECTED; mService.messageFromNative(connCompletedEvent); // Verify the connection state broadcast, and that we are in Connected state verifyConnectionStateIntent(TIMEOUT_MS, mLeftDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); // Get hiSyncId for left device HearingAidStackEvent hiSyncIdEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_DEVICE_AVAILABLE); hiSyncIdEvent.device = mLeftDevice; hiSyncIdEvent.valueInt1 = 0x02; hiSyncIdEvent.valueLong2 = 0x0101; mService.messageFromNative(hiSyncIdEvent); // Send a connect request for right device Assert.assertTrue("Connect failed", mService.connect(mRightDevice)); // Verify the connection state broadcast, and that we are in Connecting state verifyConnectionStateIntent(TIMEOUT_MS, mRightDevice, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_DISCONNECTED); Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, mService.getConnectionState(mRightDevice)); // Verify the left device is still connected Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); connCompletedEvent.device = mRightDevice; connCompletedEvent.valueInt1 = HearingAidStackEvent.CONNECTION_STATE_CONNECTED; mService.messageFromNative(connCompletedEvent); // Verify the connection state broadcast, and that we are in Connected state verifyConnectionStateIntent(TIMEOUT_MS, mRightDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mRightDevice)); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); // Get hiSyncId for right device hiSyncIdEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_DEVICE_AVAILABLE); hiSyncIdEvent.device = mRightDevice; hiSyncIdEvent.valueInt1 = 0x02; hiSyncIdEvent.valueLong2 = 0x0101; mService.messageFromNative(hiSyncIdEvent); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mRightDevice)); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); } /** * Get the HiSyncId from native stack after connecting to left device, then connect right */ @Test public void getHiSyncId_afterFirstDeviceConnected() { // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mSingleDevice, BluetoothProfile.PRIORITY_ON); doReturn(true).when(mNativeInterface).connectHearingAid(any(BluetoothDevice.class)); doReturn(true).when(mNativeInterface).disconnectHearingAid(any(BluetoothDevice.class)); // Send a connect request Assert.assertTrue("Connect failed", mService.connect(mLeftDevice)); // Verify the connection state broadcast, and that we are in Connecting state verifyConnectionStateIntent(TIMEOUT_MS, mLeftDevice, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_DISCONNECTED); Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, mService.getConnectionState(mLeftDevice)); Assert.assertEquals(BluetoothProfile.STATE_DISCONNECTED, mService.getConnectionState(mRightDevice)); HearingAidStackEvent connCompletedEvent; // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); connCompletedEvent.device = mLeftDevice; connCompletedEvent.valueInt1 = HearingAidStackEvent.CONNECTION_STATE_CONNECTED; mService.messageFromNative(connCompletedEvent); // Verify the connection state broadcast, and that we are in Connected state verifyConnectionStateIntent(TIMEOUT_MS, mLeftDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); // Get hiSyncId update from native stack getHiSyncIdFromNative(); // Send a connect request for right Assert.assertTrue("Connect failed", mService.connect(mRightDevice)); // Verify the connection state broadcast, and that we are in Connecting state verifyConnectionStateIntent(TIMEOUT_MS, mRightDevice, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_DISCONNECTED); Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, mService.getConnectionState(mRightDevice)); // Verify the left device is still connected Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); connCompletedEvent.device = mRightDevice; connCompletedEvent.valueInt1 = HearingAidStackEvent.CONNECTION_STATE_CONNECTED; mService.messageFromNative(connCompletedEvent); // Verify the connection state broadcast, and that we are in Connected state verifyConnectionStateIntent(TIMEOUT_MS, mRightDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mRightDevice)); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); } private void connectDevice(BluetoothDevice device) { HearingAidStackEvent connCompletedEvent; Loading Loading @@ -896,4 +1033,19 @@ public class HearingAidServiceTest { Assert.assertEquals(expected, mService.okToConnect(device)); } private void getHiSyncIdFromNative() { HearingAidStackEvent event = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_DEVICE_AVAILABLE); event.device = mLeftDevice; event.valueInt1 = 0x02; event.valueLong2 = 0x0101; mService.messageFromNative(event); event.device = mRightDevice; event.valueInt1 = 0x03; mService.messageFromNative(event); event.device = mSingleDevice; event.valueInt1 = 0x00; event.valueLong2 = 0x0102; mService.messageFromNative(event); } } Loading
android/app/src/com/android/bluetooth/hearingaid/HearingAidService.java +26 −2 Original line number Diff line number Diff line Loading @@ -111,6 +111,10 @@ public class HearingAidService extends ProfileService { mStateMachinesThread = new HandlerThread("HearingAidService.StateMachines"); mStateMachinesThread.start(); // Clear HiSyncId map and capabilities map mDeviceHiSyncIdMap.clear(); mDeviceCapabilitiesMap.clear(); // Setup broadcast receivers IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); Loading Loading @@ -162,6 +166,10 @@ public class HearingAidService extends ProfileService { mStateMachines.clear(); } // Clear HiSyncId map and capabilities map mDeviceHiSyncIdMap.clear(); mDeviceCapabilitiesMap.clear(); if (mStateMachinesThread != null) { mStateMachinesThread.quitSafely(); mStateMachinesThread = null; Loading Loading @@ -227,13 +235,26 @@ public class HearingAidService extends ProfileService { long hiSyncId = mDeviceHiSyncIdMap.getOrDefault(device, BluetoothHearingAid.HI_SYNC_ID_INVALID); if (hiSyncId != mActiveDeviceHiSyncId) { if (hiSyncId != mActiveDeviceHiSyncId && hiSyncId != BluetoothHearingAid.HI_SYNC_ID_INVALID && mActiveDeviceHiSyncId != BluetoothHearingAid.HI_SYNC_ID_INVALID) { for (BluetoothDevice connectedDevice : getConnectedDevices()) { disconnect(connectedDevice); } } synchronized (mStateMachines) { HearingAidStateMachine smConnect = getOrCreateStateMachine(device); if (smConnect == null) { Log.e(TAG, "Cannot connect to " + device + " : no state machine"); } smConnect.sendMessage(HearingAidStateMachine.CONNECT); } for (BluetoothDevice storedDevice : mDeviceHiSyncIdMap.keySet()) { if (device.equals(storedDevice)) { continue; } if (mDeviceHiSyncIdMap.getOrDefault(storedDevice, BluetoothHearingAid.HI_SYNC_ID_INVALID) == hiSyncId) { synchronized (mStateMachines) { Loading @@ -243,7 +264,6 @@ public class HearingAidService extends ProfileService { continue; } sm.sendMessage(HearingAidStateMachine.CONNECT); } if (hiSyncId == BluetoothHearingAid.HI_SYNC_ID_INVALID && !device.equals(storedDevice)) { Loading Loading @@ -511,6 +531,10 @@ public class HearingAidService extends ProfileService { BluetoothDevice device = stackEvent.device; int capabilities = stackEvent.valueInt1; long hiSyncId = stackEvent.valueLong2; if (DBG) { Log.d(TAG, "Device available: device=" + device + " capabilities=" + capabilities + " hiSyncId=" + hiSyncId); } mDeviceCapabilitiesMap.put(device, capabilities); mDeviceHiSyncIdMap.put(device, hiSyncId); return; Loading
android/app/tests/unit/src/com/android/bluetooth/hearingaid/HearingAidServiceTest.java +172 −20 Original line number Diff line number Diff line Loading @@ -115,19 +115,6 @@ public class HearingAidServiceTest { mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_UNDEFINED); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_UNDEFINED); mService.setPriority(mSingleDevice, BluetoothProfile.PRIORITY_UNDEFINED); HearingAidStackEvent event = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_DEVICE_AVAILABLE); event.device = mLeftDevice; event.valueInt1 = 0x02; event.valueLong2 = 0x0101; mService.messageFromNative(event); event.device = mRightDevice; event.valueInt1 = 0x03; mService.messageFromNative(event); event.device = mSingleDevice; event.valueInt1 = 0x00; event.valueLong2 = 0x0102; mService.messageFromNative(event); doReturn(BluetoothDevice.BOND_BONDED).when(mAdapterService) .getBondState(any(BluetoothDevice.class)); doReturn(new ParcelUuid[]{BluetoothUuid.HearingAid}).when(mAdapterService) Loading Loading @@ -408,8 +395,8 @@ public class HearingAidServiceTest { */ @Test public void testConnectAPair_connectBothDevices() { HearingAidStackEvent connCompletedEvent; // Update hiSyncId map getHiSyncIdFromNative(); // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); Loading @@ -436,8 +423,8 @@ public class HearingAidServiceTest { */ @Test public void testConnectAnotherPair_disconnectCurrentPair() { HearingAidStackEvent connCompletedEvent; // Update hiSyncId map getHiSyncIdFromNative(); // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); Loading @@ -454,7 +441,7 @@ public class HearingAidServiceTest { verifyConnectionStateIntent(TIMEOUT_MS, mRightDevice, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_DISCONNECTED); HearingAidStackEvent connCompletedEvent; // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); Loading Loading @@ -496,8 +483,8 @@ public class HearingAidServiceTest { */ @Test public void testAudioManagerConnectDisconnect() { HearingAidStackEvent connCompletedEvent; // Update hiSyncId map getHiSyncIdFromNative(); // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); Loading @@ -519,6 +506,7 @@ public class HearingAidServiceTest { Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, mService.getConnectionState(mRightDevice)); HearingAidStackEvent connCompletedEvent; // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); Loading Loading @@ -769,6 +757,8 @@ public class HearingAidServiceTest { @Test public void testConnectionStateChangedActiveDevice() { // Update hiSyncId map getHiSyncIdFromNative(); // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); Loading Loading @@ -797,6 +787,8 @@ public class HearingAidServiceTest { @Test public void testConnectionStateChangedAnotherActiveDevice() { // Update hiSyncId map getHiSyncIdFromNative(); // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); Loading @@ -819,6 +811,151 @@ public class HearingAidServiceTest { Assert.assertTrue(mService.getActiveDevices().contains(mSingleDevice)); } /** * Verify the correctness during first time connection. * Connect to left device -> Get left device hiSyncId -> Connect to right device -> * Get right device hiSyncId -> Both devices should be always connected */ @Test public void firstTimeConnection_shouldConnectToBothDevices() { // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); doReturn(true).when(mNativeInterface).connectHearingAid(any(BluetoothDevice.class)); doReturn(true).when(mNativeInterface).disconnectHearingAid(any(BluetoothDevice.class)); // Send a connect request for left device Assert.assertTrue("Connect failed", mService.connect(mLeftDevice)); // Verify the connection state broadcast, and that we are in Connecting state verifyConnectionStateIntent(TIMEOUT_MS, mLeftDevice, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_DISCONNECTED); Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, mService.getConnectionState(mLeftDevice)); HearingAidStackEvent connCompletedEvent; // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); connCompletedEvent.device = mLeftDevice; connCompletedEvent.valueInt1 = HearingAidStackEvent.CONNECTION_STATE_CONNECTED; mService.messageFromNative(connCompletedEvent); // Verify the connection state broadcast, and that we are in Connected state verifyConnectionStateIntent(TIMEOUT_MS, mLeftDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); // Get hiSyncId for left device HearingAidStackEvent hiSyncIdEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_DEVICE_AVAILABLE); hiSyncIdEvent.device = mLeftDevice; hiSyncIdEvent.valueInt1 = 0x02; hiSyncIdEvent.valueLong2 = 0x0101; mService.messageFromNative(hiSyncIdEvent); // Send a connect request for right device Assert.assertTrue("Connect failed", mService.connect(mRightDevice)); // Verify the connection state broadcast, and that we are in Connecting state verifyConnectionStateIntent(TIMEOUT_MS, mRightDevice, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_DISCONNECTED); Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, mService.getConnectionState(mRightDevice)); // Verify the left device is still connected Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); connCompletedEvent.device = mRightDevice; connCompletedEvent.valueInt1 = HearingAidStackEvent.CONNECTION_STATE_CONNECTED; mService.messageFromNative(connCompletedEvent); // Verify the connection state broadcast, and that we are in Connected state verifyConnectionStateIntent(TIMEOUT_MS, mRightDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mRightDevice)); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); // Get hiSyncId for right device hiSyncIdEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_DEVICE_AVAILABLE); hiSyncIdEvent.device = mRightDevice; hiSyncIdEvent.valueInt1 = 0x02; hiSyncIdEvent.valueLong2 = 0x0101; mService.messageFromNative(hiSyncIdEvent); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mRightDevice)); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); } /** * Get the HiSyncId from native stack after connecting to left device, then connect right */ @Test public void getHiSyncId_afterFirstDeviceConnected() { // Update the device priority so okToConnect() returns true mService.setPriority(mLeftDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mRightDevice, BluetoothProfile.PRIORITY_ON); mService.setPriority(mSingleDevice, BluetoothProfile.PRIORITY_ON); doReturn(true).when(mNativeInterface).connectHearingAid(any(BluetoothDevice.class)); doReturn(true).when(mNativeInterface).disconnectHearingAid(any(BluetoothDevice.class)); // Send a connect request Assert.assertTrue("Connect failed", mService.connect(mLeftDevice)); // Verify the connection state broadcast, and that we are in Connecting state verifyConnectionStateIntent(TIMEOUT_MS, mLeftDevice, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_DISCONNECTED); Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, mService.getConnectionState(mLeftDevice)); Assert.assertEquals(BluetoothProfile.STATE_DISCONNECTED, mService.getConnectionState(mRightDevice)); HearingAidStackEvent connCompletedEvent; // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); connCompletedEvent.device = mLeftDevice; connCompletedEvent.valueInt1 = HearingAidStackEvent.CONNECTION_STATE_CONNECTED; mService.messageFromNative(connCompletedEvent); // Verify the connection state broadcast, and that we are in Connected state verifyConnectionStateIntent(TIMEOUT_MS, mLeftDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); // Get hiSyncId update from native stack getHiSyncIdFromNative(); // Send a connect request for right Assert.assertTrue("Connect failed", mService.connect(mRightDevice)); // Verify the connection state broadcast, and that we are in Connecting state verifyConnectionStateIntent(TIMEOUT_MS, mRightDevice, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_DISCONNECTED); Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, mService.getConnectionState(mRightDevice)); // Verify the left device is still connected Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); // Send a message to trigger connection completed connCompletedEvent = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); connCompletedEvent.device = mRightDevice; connCompletedEvent.valueInt1 = HearingAidStackEvent.CONNECTION_STATE_CONNECTED; mService.messageFromNative(connCompletedEvent); // Verify the connection state broadcast, and that we are in Connected state verifyConnectionStateIntent(TIMEOUT_MS, mRightDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mRightDevice)); Assert.assertEquals(BluetoothProfile.STATE_CONNECTED, mService.getConnectionState(mLeftDevice)); } private void connectDevice(BluetoothDevice device) { HearingAidStackEvent connCompletedEvent; Loading Loading @@ -896,4 +1033,19 @@ public class HearingAidServiceTest { Assert.assertEquals(expected, mService.okToConnect(device)); } private void getHiSyncIdFromNative() { HearingAidStackEvent event = new HearingAidStackEvent( HearingAidStackEvent.EVENT_TYPE_DEVICE_AVAILABLE); event.device = mLeftDevice; event.valueInt1 = 0x02; event.valueLong2 = 0x0101; mService.messageFromNative(event); event.device = mRightDevice; event.valueInt1 = 0x03; mService.messageFromNative(event); event.device = mSingleDevice; event.valueInt1 = 0x00; event.valueLong2 = 0x0102; mService.messageFromNative(event); } }