HFP: Only remove state machine when device is unbonded and disconnected
SUMMARY:
* Remove a state machine only when a device is both unbonded and
disconnected
* Add HeadsetServiceAndStateMachineTest to verify this behavior
* Reject API connect() attempt when device does not have headset UUIDs
DETAILS:
* A state machine is no longer useful if the associated device is no
longer bonded. However, sometimes the device may get disconnected
after it is unbonded. Therefore, we should only remove a state machine
when the device is both unbonded and disconnected.
* Also, we should only allow an HeadsetService.connect() API call when
there is at least one headset UUID present.
* HeadsetServiceAndStateMachineTest is added to integerate both
HeadsetService and HeadsetStateMachine to complete a set of
semi-integration tests. This new set of tests allows us to verify
whether a connect() API call will eventually trigger a connectHfp() to
the native interface, utilizing all logic in the middle.
* However, we do need to assume certain timing condition in such
semi-integration test. 250ms is set as a limit for any state machine
based message handling, which should be enough for most modern day
Android devices.
* We have to use AdapterService instead of BluetoothDevice to get bond
state, device name, and so on since we want to be able to mock these
methods and BluetoothDevice class is final.
* Thus, this CL also adds a new parameter to HeadsetStateMachine during
construction so that it has a reference to AdapterService suppplied
through its constructor. This is to make sure that entire HFP stack
uses the same reference of AdapterService obtained by HeadsetService.
Bug: 72529611
Test: disconnect and then quickly unpair device
Change-Id: I49ec70d60e257ffd4484e536bdb66d6da7b3b377
7 files changed
tree: faee84f2f20e7f20aefd4f56fd48e0952694ae86
- android/