Loading android/app/src/com/android/bluetooth/le_audio/LeAudioNativeInterface.java +14 −7 Original line number Diff line number Diff line Loading @@ -111,7 +111,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onConnectionStateChanged(int state, byte[] address) { @VisibleForTesting void onConnectionStateChanged(int state, byte[] address) { LeAudioStackEvent event = new LeAudioStackEvent(LeAudioStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); event.device = getDevice(address); Loading @@ -123,7 +124,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onGroupStatus(int groupId, int groupStatus) { @VisibleForTesting void onGroupStatus(int groupId, int groupStatus) { LeAudioStackEvent event = new LeAudioStackEvent(LeAudioStackEvent.EVENT_TYPE_GROUP_STATUS_CHANGED); event.valueInt1 = groupId; Loading @@ -135,7 +137,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onGroupNodeStatus(byte[] address, int groupId, int nodeStatus) { @VisibleForTesting void onGroupNodeStatus(byte[] address, int groupId, int nodeStatus) { LeAudioStackEvent event = new LeAudioStackEvent(LeAudioStackEvent.EVENT_TYPE_GROUP_NODE_STATUS_CHANGED); event.valueInt1 = groupId; Loading @@ -148,7 +151,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onAudioConf(int direction, int groupId, int sinkAudioLocation, @VisibleForTesting void onAudioConf(int direction, int groupId, int sinkAudioLocation, int sourceAudioLocation, int availableContexts) { LeAudioStackEvent event = new LeAudioStackEvent(LeAudioStackEvent.EVENT_TYPE_AUDIO_CONF_CHANGED); Loading @@ -164,7 +168,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onSinkAudioLocationAvailable(byte[] address, int sinkAudioLocation) { @VisibleForTesting void onSinkAudioLocationAvailable(byte[] address, int sinkAudioLocation) { LeAudioStackEvent event = new LeAudioStackEvent(LeAudioStackEvent.EVENT_TYPE_SINK_AUDIO_LOCATION_AVAILABLE); event.device = getDevice(address); Loading @@ -176,7 +181,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onAudioLocalCodecCapabilities( @VisibleForTesting void onAudioLocalCodecCapabilities( BluetoothLeAudioCodecConfig[] localInputCodecCapabilities, BluetoothLeAudioCodecConfig[] localOutputCodecCapabilities) { LeAudioStackEvent event = Loading @@ -192,7 +198,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onAudioGroupCodecConf(int groupId, BluetoothLeAudioCodecConfig inputCodecConfig, @VisibleForTesting void onAudioGroupCodecConf(int groupId, BluetoothLeAudioCodecConfig inputCodecConfig, BluetoothLeAudioCodecConfig outputCodecConfig, BluetoothLeAudioCodecConfig [] inputSelectableCodecConfig, BluetoothLeAudioCodecConfig [] outputSelectableCodecConfig) { Loading android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +2 −1 Original line number Diff line number Diff line Loading @@ -406,7 +406,8 @@ public class LeAudioService extends ProfileService { return sLeAudioService; } private static synchronized void setLeAudioService(LeAudioService instance) { @VisibleForTesting static synchronized void setLeAudioService(LeAudioService instance) { if (DBG) { Log.d(TAG, "setLeAudioService(): set to: " + instance); } Loading android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioNativeInterfaceTest.java 0 → 100644 +158 −0 Original line number Diff line number Diff line /* * Copyright 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.bluetooth.le_audio; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.bluetooth.BluetoothLeAudio; import android.bluetooth.BluetoothLeAudioCodecConfig; import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public class LeAudioNativeInterfaceTest { @Mock private LeAudioService mMockService; private LeAudioNativeInterface mNativeInterface; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); when(mMockService.isAvailable()).thenReturn(true); LeAudioService.setLeAudioService(mMockService); mNativeInterface = LeAudioNativeInterface.getInstance(); } @After public void tearDown() { LeAudioService.setLeAudioService(null); } @Test public void onConnectionStateChanged() { int state = LeAudioStackEvent.CONNECTION_STATE_CONNECTED; byte[] address = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; mNativeInterface.onConnectionStateChanged(state, address); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); } @Test public void onGroupNodeStatus() { byte[] address = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; int groupId = 1; int nodeStatus = LeAudioStackEvent.GROUP_NODE_ADDED; mNativeInterface.onGroupNodeStatus(address, groupId, nodeStatus); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_GROUP_NODE_STATUS_CHANGED); } @Test public void onAudioConf() { int direction = 0; int groupId = 1; int sinkAudioLocation = BluetoothLeAudio.AUDIO_LOCATION_INVALID; int sourceAudioLocation = BluetoothLeAudio.AUDIO_LOCATION_INVALID; int availableContexts = 2; mNativeInterface.onAudioConf( direction, groupId, sinkAudioLocation, sourceAudioLocation, availableContexts); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_AUDIO_CONF_CHANGED); } @Test public void onSinkAudioLocationAvailable() { byte[] address = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; int sinkAudioLocation = BluetoothLeAudio.AUDIO_LOCATION_INVALID; mNativeInterface.onSinkAudioLocationAvailable(address, sinkAudioLocation); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_SINK_AUDIO_LOCATION_AVAILABLE); } @Test public void onAudioLocalCodecCapabilities() { BluetoothLeAudioCodecConfig emptyConfig = new BluetoothLeAudioCodecConfig.Builder().build(); BluetoothLeAudioCodecConfig[] localInputCodecCapabilities = new BluetoothLeAudioCodecConfig[] { emptyConfig }; BluetoothLeAudioCodecConfig[] localOutputCodecCapabilities = new BluetoothLeAudioCodecConfig[] { emptyConfig }; mNativeInterface.onAudioLocalCodecCapabilities( localInputCodecCapabilities, localOutputCodecCapabilities); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_AUDIO_LOCAL_CODEC_CONFIG_CAPA_CHANGED); } @Test public void onAudioGroupCodecConf() { int groupId = 1; BluetoothLeAudioCodecConfig inputConfig = new BluetoothLeAudioCodecConfig.Builder().build(); BluetoothLeAudioCodecConfig outputConfig = new BluetoothLeAudioCodecConfig.Builder().build(); BluetoothLeAudioCodecConfig[] inputSelectableCodecConfig = new BluetoothLeAudioCodecConfig[] { inputConfig }; BluetoothLeAudioCodecConfig[] outputSelectableCodecConfig = new BluetoothLeAudioCodecConfig[] { outputConfig }; mNativeInterface.onAudioGroupCodecConf(groupId, inputConfig, outputConfig, inputSelectableCodecConfig, outputSelectableCodecConfig); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_AUDIO_GROUP_CODEC_CONFIG_CHANGED); } } Loading
android/app/src/com/android/bluetooth/le_audio/LeAudioNativeInterface.java +14 −7 Original line number Diff line number Diff line Loading @@ -111,7 +111,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onConnectionStateChanged(int state, byte[] address) { @VisibleForTesting void onConnectionStateChanged(int state, byte[] address) { LeAudioStackEvent event = new LeAudioStackEvent(LeAudioStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); event.device = getDevice(address); Loading @@ -123,7 +124,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onGroupStatus(int groupId, int groupStatus) { @VisibleForTesting void onGroupStatus(int groupId, int groupStatus) { LeAudioStackEvent event = new LeAudioStackEvent(LeAudioStackEvent.EVENT_TYPE_GROUP_STATUS_CHANGED); event.valueInt1 = groupId; Loading @@ -135,7 +137,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onGroupNodeStatus(byte[] address, int groupId, int nodeStatus) { @VisibleForTesting void onGroupNodeStatus(byte[] address, int groupId, int nodeStatus) { LeAudioStackEvent event = new LeAudioStackEvent(LeAudioStackEvent.EVENT_TYPE_GROUP_NODE_STATUS_CHANGED); event.valueInt1 = groupId; Loading @@ -148,7 +151,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onAudioConf(int direction, int groupId, int sinkAudioLocation, @VisibleForTesting void onAudioConf(int direction, int groupId, int sinkAudioLocation, int sourceAudioLocation, int availableContexts) { LeAudioStackEvent event = new LeAudioStackEvent(LeAudioStackEvent.EVENT_TYPE_AUDIO_CONF_CHANGED); Loading @@ -164,7 +168,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onSinkAudioLocationAvailable(byte[] address, int sinkAudioLocation) { @VisibleForTesting void onSinkAudioLocationAvailable(byte[] address, int sinkAudioLocation) { LeAudioStackEvent event = new LeAudioStackEvent(LeAudioStackEvent.EVENT_TYPE_SINK_AUDIO_LOCATION_AVAILABLE); event.device = getDevice(address); Loading @@ -176,7 +181,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onAudioLocalCodecCapabilities( @VisibleForTesting void onAudioLocalCodecCapabilities( BluetoothLeAudioCodecConfig[] localInputCodecCapabilities, BluetoothLeAudioCodecConfig[] localOutputCodecCapabilities) { LeAudioStackEvent event = Loading @@ -192,7 +198,8 @@ public class LeAudioNativeInterface { sendMessageToService(event); } private void onAudioGroupCodecConf(int groupId, BluetoothLeAudioCodecConfig inputCodecConfig, @VisibleForTesting void onAudioGroupCodecConf(int groupId, BluetoothLeAudioCodecConfig inputCodecConfig, BluetoothLeAudioCodecConfig outputCodecConfig, BluetoothLeAudioCodecConfig [] inputSelectableCodecConfig, BluetoothLeAudioCodecConfig [] outputSelectableCodecConfig) { Loading
android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +2 −1 Original line number Diff line number Diff line Loading @@ -406,7 +406,8 @@ public class LeAudioService extends ProfileService { return sLeAudioService; } private static synchronized void setLeAudioService(LeAudioService instance) { @VisibleForTesting static synchronized void setLeAudioService(LeAudioService instance) { if (DBG) { Log.d(TAG, "setLeAudioService(): set to: " + instance); } Loading
android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioNativeInterfaceTest.java 0 → 100644 +158 −0 Original line number Diff line number Diff line /* * Copyright 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.bluetooth.le_audio; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.bluetooth.BluetoothLeAudio; import android.bluetooth.BluetoothLeAudioCodecConfig; import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public class LeAudioNativeInterfaceTest { @Mock private LeAudioService mMockService; private LeAudioNativeInterface mNativeInterface; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); when(mMockService.isAvailable()).thenReturn(true); LeAudioService.setLeAudioService(mMockService); mNativeInterface = LeAudioNativeInterface.getInstance(); } @After public void tearDown() { LeAudioService.setLeAudioService(null); } @Test public void onConnectionStateChanged() { int state = LeAudioStackEvent.CONNECTION_STATE_CONNECTED; byte[] address = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; mNativeInterface.onConnectionStateChanged(state, address); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_CONNECTION_STATE_CHANGED); } @Test public void onGroupNodeStatus() { byte[] address = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; int groupId = 1; int nodeStatus = LeAudioStackEvent.GROUP_NODE_ADDED; mNativeInterface.onGroupNodeStatus(address, groupId, nodeStatus); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_GROUP_NODE_STATUS_CHANGED); } @Test public void onAudioConf() { int direction = 0; int groupId = 1; int sinkAudioLocation = BluetoothLeAudio.AUDIO_LOCATION_INVALID; int sourceAudioLocation = BluetoothLeAudio.AUDIO_LOCATION_INVALID; int availableContexts = 2; mNativeInterface.onAudioConf( direction, groupId, sinkAudioLocation, sourceAudioLocation, availableContexts); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_AUDIO_CONF_CHANGED); } @Test public void onSinkAudioLocationAvailable() { byte[] address = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; int sinkAudioLocation = BluetoothLeAudio.AUDIO_LOCATION_INVALID; mNativeInterface.onSinkAudioLocationAvailable(address, sinkAudioLocation); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_SINK_AUDIO_LOCATION_AVAILABLE); } @Test public void onAudioLocalCodecCapabilities() { BluetoothLeAudioCodecConfig emptyConfig = new BluetoothLeAudioCodecConfig.Builder().build(); BluetoothLeAudioCodecConfig[] localInputCodecCapabilities = new BluetoothLeAudioCodecConfig[] { emptyConfig }; BluetoothLeAudioCodecConfig[] localOutputCodecCapabilities = new BluetoothLeAudioCodecConfig[] { emptyConfig }; mNativeInterface.onAudioLocalCodecCapabilities( localInputCodecCapabilities, localOutputCodecCapabilities); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_AUDIO_LOCAL_CODEC_CONFIG_CAPA_CHANGED); } @Test public void onAudioGroupCodecConf() { int groupId = 1; BluetoothLeAudioCodecConfig inputConfig = new BluetoothLeAudioCodecConfig.Builder().build(); BluetoothLeAudioCodecConfig outputConfig = new BluetoothLeAudioCodecConfig.Builder().build(); BluetoothLeAudioCodecConfig[] inputSelectableCodecConfig = new BluetoothLeAudioCodecConfig[] { inputConfig }; BluetoothLeAudioCodecConfig[] outputSelectableCodecConfig = new BluetoothLeAudioCodecConfig[] { outputConfig }; mNativeInterface.onAudioGroupCodecConf(groupId, inputConfig, outputConfig, inputSelectableCodecConfig, outputSelectableCodecConfig); ArgumentCaptor<LeAudioStackEvent> event = ArgumentCaptor.forClass(LeAudioStackEvent.class); verify(mMockService).messageFromNative(event.capture()); assertThat(event.getValue().type).isEqualTo( LeAudioStackEvent.EVENT_TYPE_AUDIO_GROUP_CODEC_CONFIG_CHANGED); } }