• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.bluetooth.btservice;
2 
3 import static org.mockito.Mockito.any;
4 import static org.mockito.Mockito.anyString;
5 import static org.mockito.Mockito.never;
6 import static org.mockito.Mockito.times;
7 import static org.mockito.Mockito.verify;
8 import static org.mockito.Mockito.verifyNoMoreInteractions;
9 import static org.mockito.Mockito.when;
10 
11 import android.bluetooth.BluetoothAdapter;
12 import android.bluetooth.BluetoothAssignedNumbers;
13 import android.bluetooth.BluetoothDevice;
14 import android.bluetooth.BluetoothHeadset;
15 import android.bluetooth.BluetoothProfile;
16 import android.content.Intent;
17 import android.os.Looper;
18 import android.support.test.runner.AndroidJUnit4;
19 
20 import com.android.bluetooth.Utils;
21 import com.android.bluetooth.hfp.HeadsetHalConstants;
22 
23 import org.junit.Assert;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.mockito.ArgumentCaptor;
28 import org.mockito.Mock;
29 import org.mockito.MockitoAnnotations;
30 
31 import java.util.ArrayList;
32 
33 @RunWith(AndroidJUnit4.class)
34 public class RemoteDevicesTest {
35     private static final String TEST_BT_ADDR_1 = "00:11:22:33:44:55";
36 
37     private ArgumentCaptor<Intent> mIntentArgument = ArgumentCaptor.forClass(Intent.class);
38     private ArgumentCaptor<String> mStringArgument = ArgumentCaptor.forClass(String.class);
39     private BluetoothDevice mDevice1;
40     private RemoteDevices mRemoteDevices;
41 
42     @Mock private AdapterService mAdapterService;
43 
44     @Before
setUp()45     public void setUp() {
46         MockitoAnnotations.initMocks(this);
47         if (Looper.myLooper() == null) Looper.prepare();
48         mDevice1 = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(TEST_BT_ADDR_1);
49         mRemoteDevices = new RemoteDevices(mAdapterService);
50     }
51 
52     @Test
testSendUuidIntent()53     public void testSendUuidIntent() {
54         mRemoteDevices.updateUuids(mDevice1);
55         Looper.myLooper().quitSafely();
56         Looper.loop();
57 
58         verify(mAdapterService).sendBroadcast(any(), anyString());
59         verifyNoMoreInteractions(mAdapterService);
60     }
61 
62     @Test
testUpdateBatteryLevel_normalSequence()63     public void testUpdateBatteryLevel_normalSequence() {
64         int batteryLevel = 10;
65 
66         // Verify that device property is null initially
67         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
68 
69         // Verify that updating battery level triggers ACTION_BATTERY_LEVEL_CHANGED intent
70         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
71         verify(mAdapterService).sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
72         verifyBatteryLevelChangedIntent(mDevice1, batteryLevel, mIntentArgument);
73         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
74 
75         // Verify that user can get battery level after the update
76         Assert.assertNotNull(mRemoteDevices.getDeviceProperties(mDevice1));
77         Assert.assertEquals(
78                 mRemoteDevices.getDeviceProperties(mDevice1).getBatteryLevel(), batteryLevel);
79 
80         // Verify that update same battery level for the same device does not trigger intent
81         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
82         verify(mAdapterService).sendBroadcast(any(), anyString());
83 
84         // Verify that updating battery level to different value triggers the intent again
85         batteryLevel = 15;
86         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
87         verify(mAdapterService, times(2))
88                 .sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
89         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
90         verifyBatteryLevelChangedIntent(mDevice1, batteryLevel, mIntentArgument);
91 
92         // Verify that user can get battery level after the update
93         Assert.assertEquals(
94                 mRemoteDevices.getDeviceProperties(mDevice1).getBatteryLevel(), batteryLevel);
95 
96         verifyNoMoreInteractions(mAdapterService);
97     }
98 
99     @Test
testUpdateBatteryLevel_errorNegativeValue()100     public void testUpdateBatteryLevel_errorNegativeValue() {
101         int batteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
102 
103         // Verify that device property is null initially
104         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
105 
106         // Verify that updating with invalid battery level does not trigger the intent
107         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
108         verify(mAdapterService, never()).sendBroadcast(any(), anyString());
109 
110         // Verify that device property stays null after invalid update
111         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
112 
113         verifyNoMoreInteractions(mAdapterService);
114     }
115 
116     @Test
testUpdateBatteryLevel_errorTooLargeValue()117     public void testUpdateBatteryLevel_errorTooLargeValue() {
118         int batteryLevel = 101;
119 
120         // Verify that device property is null initially
121         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
122 
123         // Verify that updating invalid battery level does not trigger the intent
124         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
125         verify(mAdapterService, never()).sendBroadcast(any(), anyString());
126 
127         // Verify that device property stays null after invalid update
128         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
129 
130         verifyNoMoreInteractions(mAdapterService);
131     }
132 
133     @Test
testResetBatteryLevel_testResetBeforeUpdate()134     public void testResetBatteryLevel_testResetBeforeUpdate() {
135         // Verify that device property is null initially
136         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
137 
138         // Verify that resetting battery level keeps device property null
139         mRemoteDevices.resetBatteryLevel(mDevice1);
140         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
141 
142         verifyNoMoreInteractions(mAdapterService);
143     }
144 
145     @Test
testResetBatteryLevel_testResetAfterUpdate()146     public void testResetBatteryLevel_testResetAfterUpdate() {
147         int batteryLevel = 10;
148 
149         // Verify that device property is null initially
150         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
151 
152         // Verify that updating battery level triggers ACTION_BATTERY_LEVEL_CHANGED intent
153         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
154         verify(mAdapterService).sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
155         verifyBatteryLevelChangedIntent(mDevice1, batteryLevel, mIntentArgument);
156         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
157 
158         // Verify that user can get battery level after the update
159         Assert.assertNotNull(mRemoteDevices.getDeviceProperties(mDevice1));
160         Assert.assertEquals(
161                 mRemoteDevices.getDeviceProperties(mDevice1).getBatteryLevel(), batteryLevel);
162 
163         // Verify that resetting battery level changes it back to BluetoothDevice
164         // .BATTERY_LEVEL_UNKNOWN
165         mRemoteDevices.resetBatteryLevel(mDevice1);
166         // Verify BATTERY_LEVEL_CHANGED intent is sent after first reset
167         verify(mAdapterService, times(2))
168                 .sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
169         verifyBatteryLevelChangedIntent(
170                 mDevice1, BluetoothDevice.BATTERY_LEVEL_UNKNOWN, mIntentArgument);
171         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
172         // Verify value is reset in properties
173         Assert.assertNotNull(mRemoteDevices.getDeviceProperties(mDevice1));
174         Assert.assertEquals(mRemoteDevices.getDeviceProperties(mDevice1).getBatteryLevel(),
175                 BluetoothDevice.BATTERY_LEVEL_UNKNOWN);
176 
177         // Verify no intent is sent after second reset
178         mRemoteDevices.resetBatteryLevel(mDevice1);
179         verify(mAdapterService, times(2)).sendBroadcast(any(), anyString());
180 
181         // Verify that updating battery level triggers ACTION_BATTERY_LEVEL_CHANGED intent again
182         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
183         verify(mAdapterService, times(3))
184                 .sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
185         verifyBatteryLevelChangedIntent(mDevice1, batteryLevel, mIntentArgument);
186         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
187 
188         verifyNoMoreInteractions(mAdapterService);
189     }
190 
191     @Test
testResetBatteryLevelOnHeadsetStateChange()192     public void testResetBatteryLevelOnHeadsetStateChange() {
193         int batteryLevel = 10;
194 
195         // Verify that device property is null initially
196         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
197 
198         // Verify that updating battery level triggers ACTION_BATTERY_LEVEL_CHANGED intent
199         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
200         verify(mAdapterService).sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
201         verifyBatteryLevelChangedIntent(mDevice1, batteryLevel, mIntentArgument);
202         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
203 
204         // Verify that user can get battery level after the update
205         Assert.assertNotNull(mRemoteDevices.getDeviceProperties(mDevice1));
206         Assert.assertEquals(
207                 mRemoteDevices.getDeviceProperties(mDevice1).getBatteryLevel(), batteryLevel);
208 
209         // Verify that resetting battery level changes it back to BluetoothDevice
210         // .BATTERY_LEVEL_UNKNOWN
211         mRemoteDevices.onHeadsetConnectionStateChanged(
212                 getHeadsetConnectionStateChangedIntent(mDevice1,
213                         BluetoothProfile.STATE_DISCONNECTING, BluetoothProfile.STATE_DISCONNECTED));
214         // Verify BATTERY_LEVEL_CHANGED intent is sent after first reset
215         verify(mAdapterService, times(2))
216                 .sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
217         verifyBatteryLevelChangedIntent(
218                 mDevice1, BluetoothDevice.BATTERY_LEVEL_UNKNOWN, mIntentArgument);
219         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
220         // Verify value is reset in properties
221         Assert.assertNotNull(mRemoteDevices.getDeviceProperties(mDevice1));
222         Assert.assertEquals(mRemoteDevices.getDeviceProperties(mDevice1).getBatteryLevel(),
223                 BluetoothDevice.BATTERY_LEVEL_UNKNOWN);
224 
225         // Verify that updating battery level triggers ACTION_BATTERY_LEVEL_CHANGED intent again
226         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
227         verify(mAdapterService, times(3))
228                 .sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
229         verifyBatteryLevelChangedIntent(mDevice1, batteryLevel, mIntentArgument);
230         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
231 
232         verifyNoMoreInteractions(mAdapterService);
233     }
234 
235     @Test
testResetBatteryLevel_testAclStateChangeCallback()236     public void testResetBatteryLevel_testAclStateChangeCallback() {
237         int batteryLevel = 10;
238 
239         // Verify that device property is null initially
240         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
241 
242         // Verify that updating battery level triggers ACTION_BATTERY_LEVEL_CHANGED intent
243         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
244         verify(mAdapterService).sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
245         verifyBatteryLevelChangedIntent(mDevice1, batteryLevel, mIntentArgument);
246         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
247 
248         // Verify that user can get battery level after the update
249         Assert.assertNotNull(mRemoteDevices.getDeviceProperties(mDevice1));
250         Assert.assertEquals(
251                 batteryLevel, mRemoteDevices.getDeviceProperties(mDevice1).getBatteryLevel());
252 
253         // Verify that when device is completely disconnected, RemoteDevices reset battery level to
254         // BluetoothDevice.BATTERY_LEVEL_UNKNOWN
255         when(mAdapterService.getState()).thenReturn(BluetoothAdapter.STATE_ON);
256         mRemoteDevices.aclStateChangeCallback(
257                 0, Utils.getByteAddress(mDevice1), AbstractionLayer.BT_ACL_STATE_DISCONNECTED);
258         verify(mAdapterService).getState();
259         verify(mAdapterService).getConnectionState(mDevice1);
260         // Verify ACTION_ACL_DISCONNECTED and BATTERY_LEVEL_CHANGED intent are sent
261         verify(mAdapterService, times(3))
262                 .sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
263         verifyBatteryLevelChangedIntent(mDevice1, BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
264                 mIntentArgument.getAllValues().get(mIntentArgument.getAllValues().size() - 2));
265         Assert.assertEquals(AdapterService.BLUETOOTH_PERM,
266                 mStringArgument.getAllValues().get(mStringArgument.getAllValues().size() - 2));
267         Assert.assertEquals(
268                 BluetoothDevice.ACTION_ACL_DISCONNECTED, mIntentArgument.getValue().getAction());
269         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
270         // Verify value is reset in properties
271         Assert.assertNotNull(mRemoteDevices.getDeviceProperties(mDevice1));
272         Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
273                 mRemoteDevices.getDeviceProperties(mDevice1).getBatteryLevel());
274 
275         // Verify that updating battery level triggers ACTION_BATTERY_LEVEL_CHANGED intent again
276         mRemoteDevices.updateBatteryLevel(mDevice1, batteryLevel);
277         verify(mAdapterService, times(4))
278                 .sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
279         verifyBatteryLevelChangedIntent(mDevice1, batteryLevel, mIntentArgument);
280         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
281 
282         verifyNoMoreInteractions(mAdapterService);
283     }
284 
285     @Test
testHfIndicatorParser_testCorrectValue()286     public void testHfIndicatorParser_testCorrectValue() {
287         int batteryLevel = 10;
288 
289         // Verify that device property is null initially
290         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
291 
292         // Verify that ACTION_HF_INDICATORS_VALUE_CHANGED intent updates battery level
293         mRemoteDevices.onHfIndicatorValueChanged(getHfIndicatorIntent(
294                 mDevice1, batteryLevel, HeadsetHalConstants.HF_INDICATOR_BATTERY_LEVEL_STATUS));
295         verify(mAdapterService).sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
296         verifyBatteryLevelChangedIntent(mDevice1, batteryLevel, mIntentArgument);
297         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
298     }
299 
300     @Test
testHfIndicatorParser_testWrongIndicatorId()301     public void testHfIndicatorParser_testWrongIndicatorId() {
302         int batteryLevel = 10;
303 
304         // Verify that device property is null initially
305         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
306 
307         // Verify that ACTION_HF_INDICATORS_VALUE_CHANGED intent updates battery level
308         mRemoteDevices.onHfIndicatorValueChanged(getHfIndicatorIntent(mDevice1, batteryLevel, 3));
309         verify(mAdapterService, never()).sendBroadcast(any(), anyString());
310         // Verify that device property is still null after invalid update
311         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
312     }
313 
314     @Test
testOnVendorSpecificHeadsetEvent_testCorrectPlantronicsXEvent()315     public void testOnVendorSpecificHeadsetEvent_testCorrectPlantronicsXEvent() {
316         // Verify that device property is null initially
317         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
318 
319         // Verify that correct ACTION_VENDOR_SPECIFIC_HEADSET_EVENT updates battery level
320         mRemoteDevices.onVendorSpecificHeadsetEvent(getVendorSpecificHeadsetEventIntent(
321                 BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_XEVENT,
322                 BluetoothAssignedNumbers.PLANTRONICS, BluetoothHeadset.AT_CMD_TYPE_SET,
323                 getXEventArray(3, 8), mDevice1));
324         verify(mAdapterService).sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
325         verifyBatteryLevelChangedIntent(mDevice1, 37, mIntentArgument);
326         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
327     }
328 
329     @Test
testOnVendorSpecificHeadsetEvent_testCorrectAppleBatteryVsc()330     public void testOnVendorSpecificHeadsetEvent_testCorrectAppleBatteryVsc() {
331         // Verify that device property is null initially
332         Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
333 
334         // Verify that correct ACTION_VENDOR_SPECIFIC_HEADSET_EVENT updates battery level
335         mRemoteDevices.onVendorSpecificHeadsetEvent(getVendorSpecificHeadsetEventIntent(
336                 BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV,
337                 BluetoothAssignedNumbers.APPLE, BluetoothHeadset.AT_CMD_TYPE_SET,
338                 new Object[] {3,
339                         BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL, 5,
340                         2, 1, 3, 10},
341                 mDevice1));
342         verify(mAdapterService).sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
343         verifyBatteryLevelChangedIntent(mDevice1, 60, mIntentArgument);
344         Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
345     }
346 
347     @Test
testGetBatteryLevelFromXEventVsc()348     public void testGetBatteryLevelFromXEventVsc() {
349         Assert.assertEquals(37, RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(3, 8)));
350         Assert.assertEquals(100, RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(1, 1)));
351         Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
352                 RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(3, 1)));
353         Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
354                 RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(-1, 1)));
355         Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
356                 RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(-1, -1)));
357     }
358 
359     @Test
testGetBatteryLevelFromAppleBatteryVsc()360     public void testGetBatteryLevelFromAppleBatteryVsc() {
361         Assert.assertEquals(10,
362                 RemoteDevices.getBatteryLevelFromAppleBatteryVsc(new Object[] {1,
363                         BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL,
364                         0}));
365         Assert.assertEquals(100,
366                 RemoteDevices.getBatteryLevelFromAppleBatteryVsc(new Object[] {1,
367                         BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL,
368                         9}));
369         Assert.assertEquals(60,
370                 RemoteDevices.getBatteryLevelFromAppleBatteryVsc(new Object[] {3,
371                         BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL, 5,
372                         2, 1, 3, 10}));
373         Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
374                 RemoteDevices.getBatteryLevelFromAppleBatteryVsc(new Object[] {3,
375                         BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL, 5,
376                         2, 1, 3}));
377         Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
378                 RemoteDevices.getBatteryLevelFromAppleBatteryVsc(new Object[] {1,
379                         BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL,
380                         10}));
381         Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
382                 RemoteDevices.getBatteryLevelFromAppleBatteryVsc(new Object[] {1,
383                         BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL,
384                         -1}));
385         Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
386                 RemoteDevices.getBatteryLevelFromAppleBatteryVsc(new Object[] {1,
387                         BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL,
388                         "5"}));
389         Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
390                 RemoteDevices.getBatteryLevelFromAppleBatteryVsc(new Object[] {1, 35, 37}));
391         Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
392                 RemoteDevices.getBatteryLevelFromAppleBatteryVsc(
393                         new Object[] {1, "WRONG", "WRONG"}));
394     }
395 
verifyBatteryLevelChangedIntent( BluetoothDevice device, int batteryLevel, ArgumentCaptor<Intent> intentArgument)396     private static void verifyBatteryLevelChangedIntent(
397             BluetoothDevice device, int batteryLevel, ArgumentCaptor<Intent> intentArgument) {
398         verifyBatteryLevelChangedIntent(device, batteryLevel, intentArgument.getValue());
399     }
400 
verifyBatteryLevelChangedIntent( BluetoothDevice device, int batteryLevel, Intent intent)401     private static void verifyBatteryLevelChangedIntent(
402             BluetoothDevice device, int batteryLevel, Intent intent) {
403         Assert.assertEquals(BluetoothDevice.ACTION_BATTERY_LEVEL_CHANGED, intent.getAction());
404         Assert.assertEquals(device, intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE));
405         Assert.assertEquals(
406                 batteryLevel, intent.getIntExtra(BluetoothDevice.EXTRA_BATTERY_LEVEL, -15));
407         Assert.assertEquals(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT, intent.getFlags());
408     }
409 
getHeadsetConnectionStateChangedIntent( BluetoothDevice device, int oldState, int newState)410     private static Intent getHeadsetConnectionStateChangedIntent(
411             BluetoothDevice device, int oldState, int newState) {
412         Intent intent = new Intent(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
413         intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
414         intent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, oldState);
415         intent.putExtra(BluetoothProfile.EXTRA_STATE, newState);
416         return intent;
417     }
418 
getHfIndicatorIntent( BluetoothDevice device, int batteryLevel, int indicatorId)419     private static Intent getHfIndicatorIntent(
420             BluetoothDevice device, int batteryLevel, int indicatorId) {
421         Intent intent = new Intent(BluetoothHeadset.ACTION_HF_INDICATORS_VALUE_CHANGED);
422         intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
423         intent.putExtra(BluetoothHeadset.EXTRA_HF_INDICATORS_IND_ID, indicatorId);
424         intent.putExtra(BluetoothHeadset.EXTRA_HF_INDICATORS_IND_VALUE, batteryLevel);
425         return intent;
426     }
427 
getVendorSpecificHeadsetEventIntent(String command, int companyId, int commandType, Object[] arguments, BluetoothDevice device)428     private static Intent getVendorSpecificHeadsetEventIntent(String command, int companyId,
429             int commandType, Object[] arguments, BluetoothDevice device) {
430         Intent intent = new Intent(BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT);
431         intent.putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD, command);
432         intent.putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE, commandType);
433         // assert: all elements of args are Serializable
434         intent.putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS, arguments);
435         intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
436         intent.addCategory(BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY + "."
437                 + Integer.toString(companyId));
438         return intent;
439     }
440 
getXEventArray(int batteryLevel, int numLevels)441     private static Object[] getXEventArray(int batteryLevel, int numLevels) {
442         ArrayList<Object> list = new ArrayList<>();
443         list.add(BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_XEVENT_BATTERY_LEVEL);
444         list.add(batteryLevel);
445         list.add(numLevels);
446         list.add(0);
447         list.add(0);
448         return list.toArray();
449     }
450 }
451