Try BT audio connection one more time before failing
When attempting to connect to bluetooth, if connectAudio() returns
false, retry twice instead of once to account for particularly slow HFP
devices.
Bug: 62753089
Test: manual, with formerly problematic device
Change-Id: Ia984db2183d807e11e39a7dff0fb382b7c2148f5
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java b/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
index 1ee7de5..0e07922 100644
--- a/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
+++ b/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
@@ -147,6 +147,8 @@
// arg2: Runnable
public static final int RUN_RUNNABLE = 9001;
+ private static final int MAX_CONNECTION_RETRIES = 2;
+
// States
private final class AudioOffState extends State {
@Override
@@ -213,7 +215,7 @@
break;
case RETRY_HFP_CONNECTION:
Log.i(LOG_TAG, "Retrying HFP connection to %s", (String) args.arg2);
- String retryAddress = connectHfpAudio((String) args.arg2, false);
+ String retryAddress = connectHfpAudio((String) args.arg2, args.argi1);
if (retryAddress != null) {
mListener.onBluetoothStateChange(BLUETOOTH_DEVICE_CONNECTED,
@@ -339,7 +341,7 @@
if (Objects.equals(address, mDeviceAddress)) {
Log.d(LOG_TAG, "Retry message came through while connecting.");
} else {
- String retryAddress = connectHfpAudio(address, false);
+ String retryAddress = connectHfpAudio(address, args.argi1);
if (retryAddress != null) {
transitionTo(getConnectingStateForAddress(retryAddress,
"AudioConnecting/RETRY_HFP_CONNECTION"));
@@ -473,7 +475,7 @@
if (Objects.equals(address, mDeviceAddress)) {
Log.d(LOG_TAG, "Retry message came through while connected.");
} else {
- String retryAddress = connectHfpAudio(address, false);
+ String retryAddress = connectHfpAudio(address, args.argi1);
if (retryAddress != null) {
mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_CONNECTED,
BLUETOOTH_AUDIO_PENDING);
@@ -648,15 +650,15 @@
}
private String connectHfpAudio(String address) {
- return connectHfpAudio(address, true, null);
+ return connectHfpAudio(address, 0, null);
}
- private String connectHfpAudio(String address, boolean shouldRetry) {
- return connectHfpAudio(address, shouldRetry, null);
+ private String connectHfpAudio(String address, int retryCount) {
+ return connectHfpAudio(address, retryCount, null);
}
private String connectHfpAudio(String address, String excludeAddress) {
- return connectHfpAudio(address, true, excludeAddress);
+ return connectHfpAudio(address, 0, excludeAddress);
}
/**
@@ -664,13 +666,12 @@
* Note: This method is not synchronized on the Telecom lock, so don't try and call back into
* Telecom from within it.
* @param address The address that should be tried first. May be null.
- * @param shouldRetry true if there should be a retry-with-backoff if connection is
- * immediately unsuccessful, false otherwise.
+ * @param retryCount The number of times this connection attempt has been retried.
* @param excludeAddress Don't connect to this address.
* @return The address of the device that's actually being connected to, or null if no
* connection was successful.
*/
- private String connectHfpAudio(String address, boolean shouldRetry, String excludeAddress) {
+ private String connectHfpAudio(String address, int retryCount, String excludeAddress) {
BluetoothHeadsetProxy bluetoothHeadset = mDeviceManager.getHeadsetService();
if (bluetoothHeadset == null) {
Log.i(this, "connectHfpAudio: no headset service available.");
@@ -688,12 +689,14 @@
address, actualAddress);
}
if (actualAddress != null && !connectAudio(actualAddress)) {
- Log.w(LOG_TAG, "Could not connect to %s. Will %s",
- actualAddress, shouldRetry ? "retry" : "not retry");
+ boolean shouldRetry = retryCount < MAX_CONNECTION_RETRIES;
+ Log.w(LOG_TAG, "Could not connect to %s. Will %s", actualAddress,
+ shouldRetry ? "retry" : "not retry");
if (shouldRetry) {
SomeArgs args = SomeArgs.obtain();
args.arg1 = Log.createSubsession();
args.arg2 = actualAddress;
+ args.argi1 = retryCount + 1;
sendMessageDelayed(RETRY_HFP_CONNECTION, args,
mTimeoutsAdapter.getRetryBluetoothConnectAudioBackoffMillis(
mContext.getContentResolver()));