Join HandlerThread if BLE is not supported
Unfortunately, in order to make the Handler constructor happy,
HandlerThread does need to be started briefly (to return a Looper
object). However, is BLE is not supported, there is no need to leave the
thread running.
Test: TH
Change-Id: I47e455544aa40654676c4154a5e28a52d1c6c05b
diff --git a/service/src/com/android/server/L2capNetworkProvider.java b/service/src/com/android/server/L2capNetworkProvider.java
index e3becd6..d0b0603 100644
--- a/service/src/com/android/server/L2capNetworkProvider.java
+++ b/service/src/com/android/server/L2capNetworkProvider.java
@@ -95,9 +95,8 @@
private final BlanketReservationOffer mBlanketOffer;
private final Set<ReservedServerOffer> mReservedServerOffers = new ArraySet<>();
private final ClientOffer mClientOffer;
- // mBluetoothManager guaranteed non-null when read on handler thread after start() is called
- @Nullable
- private BluetoothManager mBluetoothManager;
+ private final BluetoothManager mBluetoothManager;
+ private final boolean mIsSupported;
// Note: IFNAMSIZ is 16.
private static final String TUN_IFNAME = "l2cap-tun";
@@ -681,6 +680,8 @@
mProvider = mDeps.getNetworkProvider(context, mHandlerThread.getLooper());
mBlanketOffer = new BlanketReservationOffer();
mClientOffer = new ClientOffer();
+ mBluetoothManager = context.getSystemService(BluetoothManager.class);
+ mIsSupported = mContext.getPackageManager().hasSystemFeature(FEATURE_BLUETOOTH_LE);
}
/**
@@ -689,17 +690,19 @@
* Called on CS Handler thread.
*/
public void start() {
+ if (!mIsSupported) {
+ // In order to make mHandler final, the HandlerThread needs to be started before
+ // HandlerThread.getLooper() is called during the construction of the Handler.
+ mHandlerThread.quitSafely();
+ try {
+ mHandlerThread.join();
+ } catch (InterruptedException e) {
+ // join() interrupted. Do nothing.
+ }
+ return;
+ }
+
mHandler.post(() -> {
- final PackageManager pm = mContext.getPackageManager();
- if (!pm.hasSystemFeature(FEATURE_BLUETOOTH_LE)) {
- return;
- }
- mBluetoothManager = mContext.getSystemService(BluetoothManager.class);
- if (mBluetoothManager == null) {
- // Can this ever happen?
- Log.wtf(TAG, "BluetoothManager not found");
- return;
- }
mContext.getSystemService(ConnectivityManager.class).registerNetworkProvider(mProvider);
mProvider.registerNetworkOffer(BlanketReservationOffer.SCORE,
BlanketReservationOffer.CAPABILITIES, mHandler::post, mBlanketOffer);