diff options
8 files changed, 54 insertions, 11 deletions
diff --git a/src/com/android/bluetooth/btservice/AdapterService.java b/src/com/android/bluetooth/btservice/AdapterService.java index 8a0cdc9f6..451f4f415 100644 --- a/src/com/android/bluetooth/btservice/AdapterService.java +++ b/src/com/android/bluetooth/btservice/AdapterService.java @@ -1919,6 +1919,7 @@ public class AdapterService extends Service { service, attributionSource, "AdapterService setScanMode")) { return false; } + enforceBluetoothPrivilegedPermission(service); service.mAdapterProperties.setDiscoverableTimeout(duration); return service.mAdapterProperties.setScanMode(convertScanModeToHal(mode)); @@ -5069,9 +5070,7 @@ public class AdapterService extends Service { boolean isSdpCompleted(BluetoothDevice device) { DeviceProperties deviceProp = mRemoteDevices.getDeviceProperties(device); - boolean sdpCompleted = deviceProp.isSdpCompleted(); - debugLog("sdpCompleted " + sdpCompleted); - return sdpCompleted; + return (deviceProp != null ) ? deviceProp.isSdpCompleted() : false ; } private int getDeviceType(BluetoothDevice device){ diff --git a/src/com/android/bluetooth/btservice/RemoteDevices.java b/src/com/android/bluetooth/btservice/RemoteDevices.java index 471d64945..b82f492f1 100644 --- a/src/com/android/bluetooth/btservice/RemoteDevices.java +++ b/src/com/android/bluetooth/btservice/RemoteDevices.java @@ -271,6 +271,13 @@ final class RemoteDevices { return prop; } } + + BluetoothDevice newdevice = getDevice(Utils.addressToBytes(deleteKey)); + DeviceProperties deviceProperties = getDeviceProperties(newdevice); + if (deviceProperties != null && deviceProperties.isBonding()) { + debugLog("Bonding device " + deleteKey + " Don't remove from property map"); + return prop; + } debugLog("Removing device " + deleteKey + " from property map"); mDevices.remove(deleteKey); } diff --git a/src/com/android/bluetooth/gatt/AdvertiseManager.java b/src/com/android/bluetooth/gatt/AdvertiseManager.java index 5963294fe..fa2c0d7c0 100644 --- a/src/com/android/bluetooth/gatt/AdvertiseManager.java +++ b/src/com/android/bluetooth/gatt/AdvertiseManager.java @@ -32,6 +32,7 @@ import com.android.bluetooth.btservice.AdapterService; import java.util.Collections; import java.util.HashMap; +import java.util.NoSuchElementException; import java.util.Iterator; import java.util.Map; @@ -247,9 +248,13 @@ class AdvertiseManager { return; } - Integer advertiserId = adv.id; - binder.unlinkToDeath(adv.deathRecipient, 0); + try { + binder.unlinkToDeath(adv.deathRecipient, 0); + } catch (NoSuchElementException e) { + Log.i(TAG, "stopAdvertisingSet() - link does not exist"); + } + Integer advertiserId = adv.id; if (advertiserId < 0) { Log.i(TAG, "stopAdvertisingSet() - advertiser not finished registration yet"); // Advertiser will be freed once initiated in onAdvertisingSetStarted() @@ -443,7 +448,11 @@ class AdvertiseManager { Integer advertiser_id = entry.getValue().id; IAdvertisingSetCallback callback = entry.getValue().callback; IBinder binder = toBinder(callback); - binder.unlinkToDeath(entry.getValue().deathRecipient, 0); + try { + binder.unlinkToDeath(entry.getValue().deathRecipient, 0); + } catch (NoSuchElementException e) { + Log.i(TAG, "stopAdvertisingSets() - link does not exist"); + } it.remove(); if (advertiser_id < 0) { diff --git a/src/com/android/bluetooth/gatt/GattService.java b/src/com/android/bluetooth/gatt/GattService.java index 6131bdd93..d9c3bbc6b 100644 --- a/src/com/android/bluetooth/gatt/GattService.java +++ b/src/com/android/bluetooth/gatt/GattService.java @@ -525,6 +525,11 @@ public class GattService extends ProfileService { return client; } } + for (ScanClient client : mScanManager.getPendingScanQueue()) { + if (client.scannerId == clientIf) { + return client; + } + } return null; } } @@ -2487,6 +2492,7 @@ public class GattService extends ProfileService { app.recordScanStart(settings, filters, isFilteredScan, isCallbackScan, scannerId); } + mScanManager.addPendingScanToQueue(scanClient); mScanManager.startScan(scanClient); } diff --git a/src/com/android/bluetooth/gatt/ScanManager.java b/src/com/android/bluetooth/gatt/ScanManager.java index 39f804370..826d368da 100644 --- a/src/com/android/bluetooth/gatt/ScanManager.java +++ b/src/com/android/bluetooth/gatt/ScanManager.java @@ -107,6 +107,7 @@ public class ScanManager { private Set<ScanClient> mRegularScanClients; private Set<ScanClient> mBatchClients; private Set<ScanClient> mSuspendedScanClients; + private Set<ScanClient> mPendingScanClients; private HashMap<Integer, Integer> mPriorityMap = new HashMap<Integer, Integer>(); private CountDownLatch mLatch; @@ -144,6 +145,8 @@ public class ScanManager { mRegularScanClients = Collections.newSetFromMap(new ConcurrentHashMap<ScanClient, Boolean>()); mBatchClients = Collections.newSetFromMap(new ConcurrentHashMap<ScanClient, Boolean>()); + mPendingScanClients = + Collections.newSetFromMap(new ConcurrentHashMap<ScanClient, Boolean>()); mSuspendedScanClients = Collections.newSetFromMap(new ConcurrentHashMap<ScanClient, Boolean>()); mService = service; @@ -179,6 +182,7 @@ public class ScanManager { mRegularScanClients.clear(); mBatchClients.clear(); mSuspendedScanClients.clear(); + mPendingScanClients.clear(); mScanNative.cleanup(); if (mActivityManager != null) { @@ -234,6 +238,19 @@ public class ScanManager { } /** + * Returns the pending scan queue. + */ + Set<ScanClient> getPendingScanQueue() { + return mPendingScanClients; + } + + /** + * Adding the pending scan to the queue. + */ + void addPendingScanToQueue(ScanClient client) { + mPendingScanClients.add(client); + } + /** * Returns a set of full batch scan clients. */ Set<ScanClient> getFullBatchScanQueue() { @@ -385,6 +402,8 @@ public class ScanManager { return; } + if (mPendingScanClients.contains(client)) + mPendingScanClients.remove(client); // Begin scan operations. if (isBatchClient(client)) { mBatchClients.add(client); diff --git a/src/com/android/bluetooth/hfp/HeadsetService.java b/src/com/android/bluetooth/hfp/HeadsetService.java index 621c11562..07cc888a8 100644 --- a/src/com/android/bluetooth/hfp/HeadsetService.java +++ b/src/com/android/bluetooth/hfp/HeadsetService.java @@ -2954,6 +2954,7 @@ public class HeadsetService extends ProfileService { @Override public void dump(StringBuilder sb) { + boolean isScoOn = mSystemInterface.getAudioManager().isBluetoothScoOn(); synchronized (mStateMachines) { super.dump(sb); ProfileService.println(sb, "mMaxHeadsetConnections: " + mMaxHeadsetConnections); @@ -2974,9 +2975,7 @@ public class HeadsetService extends ProfileService { ProfileService.println(sb, "mForceScoAudio: " + mForceScoAudio); ProfileService.println(sb, "mCreated: " + mCreated); ProfileService.println(sb, "mStarted: " + mStarted); - ProfileService.println(sb, - "AudioManager.isBluetoothScoOn(): " + mSystemInterface.getAudioManager() - .isBluetoothScoOn()); + ProfileService.println(sb, "AudioManager.isBluetoothScoOn(): " + isScoOn); ProfileService.println(sb, "Telecom.isInCall(): " + mSystemInterface.isInCall()); ProfileService.println(sb, "Telecom.isRinging(): " + mSystemInterface.isRinging()); for (HeadsetStateMachine stateMachine : mStateMachines.values()) { diff --git a/src/com/android/bluetooth/hfp/HeadsetStateMachine.java b/src/com/android/bluetooth/hfp/HeadsetStateMachine.java index c3fc03c12..0b7feb53a 100644 --- a/src/com/android/bluetooth/hfp/HeadsetStateMachine.java +++ b/src/com/android/bluetooth/hfp/HeadsetStateMachine.java @@ -2519,7 +2519,8 @@ public class HeadsetStateMachine extends StateMachine { it.remove(); } } - mHeadsetService.getHfpA2DPSyncInterface().releaseA2DP(mDevice); + Log.d(TAG, "Resume A2DP by sending RESUME_A2DP message"); + sendMessage(RESUME_A2DP); } Log.d(TAG, "Exit processIntentA2dpPlayStateChanged()"); } diff --git a/src/com/android/bluetooth/telephony/BluetoothInCallService.java b/src/com/android/bluetooth/telephony/BluetoothInCallService.java index 1dff2104a..31fca6d5f 100644 --- a/src/com/android/bluetooth/telephony/BluetoothInCallService.java +++ b/src/com/android/bluetooth/telephony/BluetoothInCallService.java @@ -291,10 +291,10 @@ public class BluetoothInCallService extends InCallService { } public void onDetailsChanged(BluetoothCall call, Call.Details details) { - Log.i(TAG, "onDetailsChanged call: " + call + "details: " + details); if (mCallInfo.isNullCall(call)) { return; } + Log.i(TAG, "onDetailsChanged call: " + call + "details: " + details); if (call.isExternalCall()) { onCallRemoved(call); } else { @@ -339,6 +339,9 @@ public class BluetoothInCallService extends InCallService { } public void onChildrenChanged(BluetoothCall call, List<BluetoothCall> children) { + if (mCallInfo.isNullCall(call)) { + return; + } if (call.isExternalCall()) { return; } |