diff options
| author | Dan Harms <danharms@google.com> | 2020-03-11 17:44:54 -0700 |
|---|---|---|
| committer | Dan Harms <danharms@google.com> | 2020-03-11 18:26:32 -0700 |
| commit | dccefc613db8e2f7114160f0f288985afa8b826e (patch) | |
| tree | fd27c6becd469a361cddfb22c942da819001c3e8 /connected-device-lib/src | |
| parent | d33762dbfc95c6c2b2ac1724a7d0a2adf5b61167 (diff) | |
| download | platform_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.java | 17 | ||||
| -rw-r--r-- | connected-device-lib/src/com/android/car/connecteddevice/ble/CarBlePeripheralManager.java | 24 |
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); + } + }; } |
