summaryrefslogtreecommitdiffstats
path: root/connected-device-lib/src
diff options
context:
space:
mode:
authorDan Harms <danharms@google.com>2020-03-11 17:44:54 -0700
committerDan Harms <danharms@google.com>2020-03-11 18:26:32 -0700
commitdccefc613db8e2f7114160f0f288985afa8b826e (patch)
treefd27c6becd469a361cddfb22c942da819001c3e8 /connected-device-lib/src
parentd33762dbfc95c6c2b2ac1724a7d0a2adf5b61167 (diff)
downloadplatform_packages_apps_Car_libs-dccefc613db8e2f7114160f0f288985afa8b826e.tar.gz
platform_packages_apps_Car_libs-dccefc613db8e2f7114160f0f288985afa8b826e.tar.bz2
platform_packages_apps_Car_libs-dccefc613db8e2f7114160f0f288985afa8b826e.zip
Stop advertising for reconect after timeout
Fixes: 151252960 Test: Unit tests and manually verify reconnect times out Change-Id: Ie1de76c871b7d0bcfc4d05b6f5993e9573d57935
Diffstat (limited to 'connected-device-lib/src')
-rw-r--r--connected-device-lib/src/com/android/car/connecteddevice/ConnectedDeviceManager.java17
-rw-r--r--connected-device-lib/src/com/android/car/connecteddevice/ble/CarBlePeripheralManager.java24
2 files changed, 33 insertions, 8 deletions
diff --git a/connected-device-lib/src/com/android/car/connecteddevice/ConnectedDeviceManager.java b/connected-device-lib/src/com/android/car/connecteddevice/ConnectedDeviceManager.java
index 8218a941..f10bb858 100644
--- a/connected-device-lib/src/com/android/car/connecteddevice/ConnectedDeviceManager.java
+++ b/connected-device-lib/src/com/android/car/connecteddevice/ConnectedDeviceManager.java
@@ -107,6 +107,8 @@ public class ConnectedDeviceManager {
private final AtomicBoolean mIsConnectingToUserDevice = new AtomicBoolean(false);
+ private final int mReconnectTimeoutSeconds;
+
private String mNameForAssociation;
private AssociationCallback mAssociationCallback;
@@ -147,7 +149,8 @@ public class ConnectedDeviceManager {
UUID.fromString(context.getString(R.string.car_association_service_uuid)),
context.getString(R.string.car_bg_mask),
UUID.fromString(context.getString(R.string.car_secure_write_uuid)),
- UUID.fromString(context.getString(R.string.car_secure_read_uuid)));
+ UUID.fromString(context.getString(R.string.car_secure_read_uuid)),
+ context.getResources().getInteger(R.integer.car_reconnect_timeout_sec));
}
private ConnectedDeviceManager(
@@ -159,19 +162,21 @@ public class ConnectedDeviceManager {
@NonNull UUID associationServiceUuid,
@NonNull String bgMask,
@NonNull UUID writeCharacteristicUuid,
- @NonNull UUID readCharacteristicUuid) {
+ @NonNull UUID readCharacteristicUuid,
+ int reconnectTimeoutSeconds) {
this(storage,
new CarBleCentralManager(context, bleCentralManager, storage, serviceUuid, bgMask,
writeCharacteristicUuid, readCharacteristicUuid),
new CarBlePeripheralManager(blePeripheralManager, storage, associationServiceUuid,
- writeCharacteristicUuid, readCharacteristicUuid));
+ writeCharacteristicUuid, readCharacteristicUuid), reconnectTimeoutSeconds);
}
@VisibleForTesting
ConnectedDeviceManager(
@NonNull ConnectedDeviceStorage storage,
@NonNull CarBleCentralManager centralManager,
- @NonNull CarBlePeripheralManager peripheralManager) {
+ @NonNull CarBlePeripheralManager peripheralManager,
+ int reconnectTimeoutSeconds) {
Executor callbackExecutor = Executors.newSingleThreadExecutor();
mStorage = storage;
mCentralManager = centralManager;
@@ -180,6 +185,7 @@ public class ConnectedDeviceManager {
mPeripheralManager.registerCallback(generateCarBleCallback(peripheralManager),
callbackExecutor);
mStorage.setAssociatedDeviceCallback(mAssociatedDeviceCallback);
+ mReconnectTimeoutSeconds = reconnectTimeoutSeconds;
}
/**
@@ -296,7 +302,8 @@ public class ConnectedDeviceManager {
}
EventLog.onStartDeviceSearchStarted();
mIsConnectingToUserDevice.set(true);
- mPeripheralManager.connectToDevice(UUID.fromString(userDevice.getDeviceId()));
+ mPeripheralManager.connectToDevice(UUID.fromString(userDevice.getDeviceId()),
+ mReconnectTimeoutSeconds);
} catch (Exception e) {
loge(TAG, "Exception while attempting connection with active user's device.", e);
}
diff --git a/connected-device-lib/src/com/android/car/connecteddevice/ble/CarBlePeripheralManager.java b/connected-device-lib/src/com/android/car/connecteddevice/ble/CarBlePeripheralManager.java
index 5dec98d1..e3584d6c 100644
--- a/connected-device-lib/src/com/android/car/connecteddevice/ble/CarBlePeripheralManager.java
+++ b/connected-device-lib/src/com/android/car/connecteddevice/ble/CarBlePeripheralManager.java
@@ -31,6 +31,8 @@ import android.bluetooth.le.AdvertiseCallback;
import android.bluetooth.le.AdvertiseData;
import android.bluetooth.le.AdvertiseSettings;
import android.car.encryptionrunner.EncryptionRunnerFactory;
+import android.os.Handler;
+import android.os.Looper;
import android.os.ParcelUuid;
import com.android.car.connecteddevice.AssociationCallback;
@@ -79,6 +81,8 @@ public class CarBlePeripheralManager extends CarBleManager {
private final BluetoothGattCharacteristic mReadCharacteristic;
+ private final Handler mTimeoutHandler;
+
// BLE default is 23, minus 3 bytes for ATT_PROTOCOL.
private int mWriteSize = 20;
@@ -117,6 +121,7 @@ public class CarBlePeripheralManager extends CarBleManager {
| BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE,
BluetoothGattCharacteristic.PERMISSION_WRITE);
mReadCharacteristic.addDescriptor(mDescriptor);
+ mTimeoutHandler = new Handler(Looper.getMainLooper());
}
@Override
@@ -143,8 +148,8 @@ public class CarBlePeripheralManager extends CarBleManager {
mConnectedDevices.clear();
}
- /** Connect to device with provided id. */
- public void connectToDevice(@NonNull UUID deviceId) {
+ /** Attempt to connect to device with provided id within set timeout period. */
+ public void connectToDevice(@NonNull UUID deviceId, int timeoutSeconds) {
for (BleDevice device : mConnectedDevices) {
if (UUID.fromString(device.mDeviceId).equals(deviceId)) {
logd(TAG, "Already connected to device " + deviceId + ".");
@@ -160,11 +165,15 @@ public class CarBlePeripheralManager extends CarBleManager {
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
super.onStartSuccess(settingsInEffect);
- logd(TAG, "Successfully started advertising for device " + deviceId + ".");
+ mTimeoutHandler.postDelayed(mTimeoutRunnable,
+ TimeUnit.SECONDS.toMillis(timeoutSeconds));
+ logd(TAG, "Successfully started advertising for device " + deviceId
+ + " for " + timeoutSeconds + " seconds.");
}
};
mBlePeripheralManager.unregisterCallback(mAssociationPeripheralCallback);
mBlePeripheralManager.registerCallback(mReconnectPeripheralCallback);
+ mTimeoutHandler.removeCallbacks(mTimeoutRunnable);
startAdvertising(deviceId, mAdvertiseCallback, /* includeDeviceName = */ false);
}
@@ -314,6 +323,7 @@ public class CarBlePeripheralManager extends CarBleManager {
private void addConnectedDevice(BluetoothDevice device, boolean isReconnect) {
EventLog.onDeviceConnected();
mBlePeripheralManager.stopAdvertising(mAdvertiseCallback);
+ mTimeoutHandler.removeCallbacks(mTimeoutRunnable);
mClientDeviceAddress = device.getAddress();
mClientDeviceName = device.getName();
if (mClientDeviceName == null) {
@@ -512,4 +522,12 @@ public class CarBlePeripheralManager extends CarBleManager {
setDeviceId(deviceId);
}
};
+
+ private final Runnable mTimeoutRunnable = new Runnable() {
+ @Override
+ public void run() {
+ logd(TAG, "Timeout period expired without a connection. Stopping advertisement.");
+ mBlePeripheralManager.stopAdvertising(mAdvertiseCallback);
+ }
+ };
}